From 3ee33aa6f9b961e1c7b6dbb57df6fd53b68fbac4 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 16 Dec 2010 22:50:01 +0000 Subject: [PATCH] Make pushq produce signed relocations. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122005 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86MCCodeEmitter.cpp | 5 ++++- test/MC/ELF/relocation.s | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) 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)