From: Rafael Espindola Date: Fri, 11 Apr 2014 19:18:01 +0000 (+0000) Subject: Don't lose the thumb bit by using relocations with sections. X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=0a3dcf2c5133b6cb6774e39e7b6414d868f8ffc6 Don't lose the thumb bit by using relocations with sections. This fixes a regression from r205076. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206047 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index e802c01fea1..cd92b75a7f0 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -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; diff --git a/test/MC/ARM/elf-thumbfunc-reloc.s b/test/MC/ARM/elf-thumbfunc-reloc.s index 614702012f0..ea7d507a7e8 100644 --- a/test/MC/ARM/elf-thumbfunc-reloc.s +++ b/test/MC/ARM/elf-thumbfunc-reloc.s @@ -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: ]