Don't lose the thumb bit by using relocations with sections.

This fixes a regression from r205076.

llvm-svn: 206047
This commit is contained in:
Rafael Espindola 2014-04-11 19:18:01 +00:00
parent c9f12875f7
commit 4115bca87c
2 changed files with 19 additions and 1 deletions

View File

@ -813,6 +813,13 @@ bool ELFObjectWriter::shouldRelocateWithSymbol(const MCSymbolRefExpr *RefA,
if (Flags & ELF::SHF_TLS)
return true;
// If the symbol is a thumb function the final relocation must set the lowest
// bit. With a symbol that is done by just having the symbol have that bit
// set, so we would lose the bit if we relocated with the section.
// FIXME: We could use the section but add the bit to the relocation value.
if (SD->getFlags() & ELF_Other_ThumbFunc)
return true;
if (TargetObjectWriter->needsRelocateWithSymbol(Type))
return true;
return false;

View File

@ -5,7 +5,6 @@
.syntax unified
.text
.globl f
.align 2
.type f,%function
.code 16
@ -16,9 +15,21 @@ f:
bl g
pop {r7, pc}
.section .data.rel.local,"aw",%progbits
ptr:
.long f
@@ make sure an R_ARM_THM_CALL relocation is generated for the call to g
@CHECK: Relocations [
@CHECK-NEXT: Section (2) .rel.text {
@CHECK-NEXT: 0x4 R_ARM_THM_CALL g 0x0
@CHECK-NEXT: }
@@ make sure the relocation is with f. That is one way to make sure it includes
@@ the thumb bit.
@CHECK-NEXT: Section (6) .rel.data.rel.local {
@CHECK-NEXT: 0x0 R_ARM_ABS32 f 0x0
@CHECK-NEXT: }
@CHECK-NEXT: ]