From: Rafael Espindola Date: Thu, 16 Dec 2010 22:50:01 +0000 (+0000) Subject: Make pushq produce signed relocations. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=3ee33aa6f9b961e1c7b6dbb57df6fd53b68fbac4;p=oota-llvm.git Make pushq produce signed relocations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122005 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86MCCodeEmitter.cpp b/lib/Target/X86/X86MCCodeEmitter.cpp index 208a6805e40..e6dc74e65d7 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 663c91e8c1a..a3ad5268b40 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)