Produce a R_X86_64_32 when the value is >=0.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114339 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2010-09-20 19:20:47 +00:00
parent 7af6dc47a5
commit 43779dcfef
3 changed files with 19 additions and 4 deletions

View File

@ -541,10 +541,13 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
case X86::reloc_pcrel_4byte:
case FK_Data_4:
// check that the offset fits within a signed long
if (isInt<32>(Target.getConstant()))
if (Target.getConstant() < 0) {
assert(isInt<32>(Target.getConstant()));
Type = ELF::R_X86_64_32S;
else
} else {
assert(isUInt<32>(Target.getConstant()));
Type = ELF::R_X86_64_32;
}
break;
case FK_Data_2: Type = ELF::R_X86_64_16; break;
case X86::reloc_pcrel_1byte:

View File

@ -72,7 +72,7 @@ declare i32 @puts(i8* nocapture) nounwind
; 64: ('_relocations', [
; 64: # Relocation 0
; 64: (('r_offset', 5)
; 64: ('r_type', 11)
; 64: ('r_type', 10)
; 64: ('r_addend', 0)
; 64: ),
; 64: # Relocation 1
@ -82,7 +82,7 @@ declare i32 @puts(i8* nocapture) nounwind
; 64: ),
; 64: # Relocation 2
; 64: (('r_offset', 15)
; 64: ('r_type', 11)
; 64: ('r_type', 10)
; 64: ('r_addend', 6)
; 64: ),
; 64: # Relocation 3

12
test/MC/ELF/relocation.s Normal file
View File

@ -0,0 +1,12 @@
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump --dump-section-data | FileCheck %s
// Test that we produce a R_X86_64_32.
.long Lset1
// CHECK: # Relocation 0
// CHECK-NEXT: (('r_offset', 0)
// CHECK-NEXT: ('r_sym', 4)
// CHECK-NEXT: ('r_type', 10)
// CHECK-NEXT: ('r_addend', 0)