diff options
-rw-r--r-- | lib/Target/X86/X86MCCodeEmitter.cpp | 5 | ||||
-rw-r--r-- | test/MC/ELF/relocation.s | 8 |
2 files changed, 12 insertions, 1 deletions
diff --git a/lib/Target/X86/X86MCCodeEmitter.cpp b/lib/Target/X86/X86MCCodeEmitter.cpp index 208a6805e4..e6dc74e65d 100644 --- a/lib/Target/X86/X86MCCodeEmitter.cpp +++ b/lib/Target/X86/X86MCCodeEmitter.cpp @@ -996,7 +996,10 @@ EncodeInstruction(const MCInst &MI, raw_ostream &OS, Fixups); } else { unsigned FixupKind; - if (MI.getOpcode() == X86::MOV64ri32 || MI.getOpcode() == X86::MOV64mi32) + // FIXME: Is there a better way to know that we need a signed relocation? + if (MI.getOpcode() == X86::MOV64ri32 || + MI.getOpcode() == X86::MOV64mi32 || + MI.getOpcode() == X86::PUSH64i32) FixupKind = X86::reloc_signed_4byte; else FixupKind = getImmFixupKind(TSFlags); diff --git a/test/MC/ELF/relocation.s b/test/MC/ELF/relocation.s index 663c91e8c1..a3ad5268b4 100644 --- a/test/MC/ELF/relocation.s +++ b/test/MC/ELF/relocation.s @@ -14,6 +14,8 @@ bar: leaq foo@TPOFF(%rax), %rax # R_X86_64_TPOFF32 leaq foo@TLSLD(%rip), %rdi # R_X86_64_TLSLD leaq foo@DTPOFF(%rax), %rcx # R_X86_64_DTPOFF32 + pushq $bar + // CHECK: # Section 0x00000001 // CHECK: (('sh_name', 0x00000001) # '.text' @@ -90,3 +92,9 @@ bar: // CHECK-NEXT: ('r_sym', 0x00000006) // CHECK-NEXT: ('r_type', 0x00000015) // CHECK-NEXT: ('r_addend', 0x00000000) + +// CHECK: # Relocation 0x0000000b +// CHECK-NEXT: (('r_offset', 0x0000004e) +// CHECK-NEXT: ('r_sym', 0x00000002) +// CHECK-NEXT: ('r_type', 0x0000000b) +// CHECK-NEXT: ('r_addend', 0x00000000) |