ADD64ri32 sign extends its argument, so we need to use a R_X86_64_32S.

Fixes PR9934.

We really need to start tblgening the relocation info :-(

llvm-svn: 131669
This commit is contained in:
Rafael Espindola 2011-05-19 20:32:34 +00:00
parent 9e6a8cca5d
commit 0fc5e89c82
2 changed files with 9 additions and 1 deletions

View File

@ -1015,7 +1015,8 @@ EncodeInstruction(const MCInst &MI, raw_ostream &OS,
} else {
unsigned FixupKind;
// FIXME: Is there a better way to know that we need a signed relocation?
if (MI.getOpcode() == X86::MOV64ri32 ||
if (MI.getOpcode() == X86::ADD64ri32 ||
MI.getOpcode() == X86::MOV64ri32 ||
MI.getOpcode() == X86::MOV64mi32 ||
MI.getOpcode() == X86::PUSH64i32)
FixupKind = X86::reloc_signed_4byte;

View File

@ -17,6 +17,7 @@ bar:
pushq $bar
movq foo(%rip), %rdx
leaq foo-bar(%r14),%r14
addq $bar,%rax # R_X86_64_32S
// CHECK: # Section 0x00000001
@ -106,6 +107,12 @@ bar:
// CHECK-NEXT: ('r_type', 0x00000002)
// CHECK-NEXT: ('r_addend', 0x0000005c)
// CHECK: # Relocation 0x0000000e
// CHECK-NEXT: (('r_offset', 0x00000063)
// CHECK-NEXT: ('r_sym', 0x00000002)
// CHECK-NEXT: ('r_type', 0x0000000b)
// CHECK-NEXT: ('r_addend', 0x00000000)
// CHECK: # Symbol 0x00000002
// CHECK: (('st_name', 0x00000000) # ''
// CHECK: ('st_bind', 0x00000000)