<div dir="ltr">Hi Denis!<div><br></div><div>This broke our Windows-based builder. Can you fix it or revert it, please?</div><div>The three tests you added fail with the same kind of problem: objdump doesn't have the …_from_{arm,thumb} symbol.</div><div><br></div><div>Here's the output of one of the tests:</div><div>----------------------------------------</div><div><div>********************</div><div> FAIL: lld :: elf/ARM/rel-arm-jump24-veneer-b.test (20610 of 21176)</div><div> ******************** TEST 'lld :: elf/ARM/rel-arm-jump24-veneer-b.test' FAILED ********************</div><div> Script:</div><div> --</div><div> yaml2obj -format=elf -docnum 1 C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test > C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-arm.o</div><div> yaml2obj -format=elf -docnum 2 C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test > C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-thm.o</div><div> lld -flavor gnu -target arm -m armelf_linux_eabi -Bstatic --noinhibit-exec C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-arm.o C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-thm.o -o C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp</div><div> llvm-objdump -s -t C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp | FileCheck -check-prefix=B-VENEER C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test</div><div> llvm-objdump -s -t C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp | FileCheck -check-prefix=B-ADDR C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test</div><div> --</div><div> Exit Code: 1</div><div> </div><div> Command Output (stdout):</div><div> --</div><div> Command 0: "yaml2obj" "-format=elf" "-docnum" "1" "C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test"</div><div> Command 0 Result: 0</div><div> Command 0 Output:</div><div> None</div><div> </div><div> Command 0 Stderr:</div><div> </div><div> </div><div> Command 1: "yaml2obj" "-format=elf" "-docnum" "2" "C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test"</div><div> Command 1 Result: 0</div><div> Command 1 Output:</div><div> None</div><div> </div><div> Command 1 Stderr:</div><div> </div><div> </div><div> Command 2: "lld" "-flavor" "gnu" "-target" "arm" "-m" "armelf_linux_eabi" "-Bstatic" "--noinhibit-exec" "C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-arm.o" "C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp-thm.o" "-o" "C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp"</div><div> Command 2 Result: 0</div><div> Command 2 Output:</div><div> </div><div> </div><div> Command 2 Stderr:</div><div> Undefined symbol: C runtime: _start</div><div> </div><div> symbol(s) not found</div><div> </div><div> </div><div> </div><div> Command 3: "llvm-objdump" "-s" "-t" "C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp"</div><div> Command 3 Result: 0</div><div> Command 3 Output:</div><div> </div><div> </div><div> Command 3 Stderr:</div><div> </div><div> </div><div> Command 4: "FileCheck" "-check-prefix=B-VENEER" "C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test"</div><div> Command 4 Result: 0</div><div> Command 4 Output:</div><div> </div><div> </div><div> Command 4 Stderr:</div><div> </div><div> </div><div> Command 5: "llvm-objdump" "-s" "-t" "C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.obj\tools\lld\test\elf\ARM\Output\rel-arm-jump24-veneer-b.test.tmp"</div><div> Command 5 Result: 0</div><div> Command 5 Output:</div><div> </div><div> </div><div> Command 5 Stderr:</div><div> </div><div> </div><div> Command 6: "FileCheck" "-check-prefix=B-ADDR" "C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test"</div><div> Command 6 Result: 1</div><div> Command 6 Output:</div><div> </div><div> </div><div> Command 6 Stderr:</div><div> C:\Buildbot\Slave\builds\1.LLVM.Windows.Phase.3\llvm.src\tools\lld\test\elf\ARM\rel-arm-jump24-veneer-b.test:26:11: error: expected string not found in input</div><div> </div><div> # B-ADDR: 00400080 l F .text {{[0-9a-f]+}} ___Z1fv_from_arm</div><div> </div><div> ^</div><div> </div><div> <stdin>:43:1: note: scanning from here</div><div> </div><div> 00000000 *UND* 00000000 </div><div> </div><div> ^</div><div> </div><div> <stdin>:45:1: note: possible intended match here</div><div> </div><div> 00400078 g F .text 00000008 _Z1fv</div><div> </div><div> ^</div></div><div>---------------------------------------</div><div><br></div><div>Thanks,</div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"> Filipe<br></div></div>
<br><div class="gmail_quote">On Tue, Feb 10, 2015 at 1:31 AM, Denis Protivensky <span dir="ltr"><<a href="mailto:dprotivensky@accesssoftek.com" target="_blank">dprotivensky@accesssoftek.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: denis-protivensky<br>
Date: Tue Feb 10 03:31:42 2015<br>
New Revision: 228680<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=228680&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=228680&view=rev</a><br>
Log:<br>
[ELF][ARM] Add veneer generation to branch instructions<br>
<br>
When calling ARM code from Thumb and vice versa,<br>
a veneer that switches instruction set should be generated.<br>
Added veneer generation for ARM_JUMP24 ARM_THM_JUMP24 instructions.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D7502" target="_blank">http://reviews.llvm.org/D7502</a><br>
<br>
Added:<br>
lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test<br>
lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test<br>
lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test<br>
Modified:<br>
lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp<br>
<br>
Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp?rev=228680&r1=228679&r2=228680&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp?rev=228680&r1=228679&r2=228680&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp Tue Feb 10 03:31:42 2015<br>
@@ -31,6 +31,85 @@ using namespace lld::elf;<br>
using namespace llvm::ELF;<br>
<br>
namespace {<br>
+// ARM B/BL instructions of static relocation veneer.<br>
+// TODO: consider different instruction set for archs below ARMv5<br>
+// (one as for Thumb may be used though it's less optimal).<br>
+const uint8_t Veneer_ARM_B_BL_StaticAtomContent[8] = {<br>
+ 0x04, 0xf0, 0x1f, 0xe5, // ldr pc, [pc, #-4]<br>
+ 0x00, 0x00, 0x00, 0x00 // <target_symbol_address><br>
+};<br>
+<br>
+// Thumb B/BL instructions of static relocation veneer.<br>
+// TODO: consider different instruction set for archs above ARMv5<br>
+// (one as for ARM may be used since it's more optimal).<br>
+const uint8_t Veneer_THM_B_BL_StaticAtomContent[8] = {<br>
+ 0x78, 0x47, // bx pc<br>
+ 0x00, 0x00, // nop<br>
+ 0xfe, 0xff, 0xff, 0xea // b <target_symbol_address><br>
+};<br>
+<br>
+/// \brief Atoms that hold veneer code.<br>
+class VeneerAtom : public SimpleELFDefinedAtom {<br>
+ StringRef _section;<br>
+<br>
+public:<br>
+ VeneerAtom(const File &f, StringRef secName)<br>
+ : SimpleELFDefinedAtom(f), _section(secName) {}<br>
+<br>
+ Scope scope() const override { return DefinedAtom::scopeTranslationUnit; }<br>
+<br>
+ SectionChoice sectionChoice() const override {<br>
+ return DefinedAtom::sectionBasedOnContent;<br>
+ }<br>
+<br>
+ StringRef customSectionName() const override { return _section; }<br>
+<br>
+ ContentType contentType() const override {<br>
+ return DefinedAtom::typeCode;<br>
+ }<br>
+<br>
+ uint64_t size() const override { return rawContent().size(); }<br>
+<br>
+ ContentPermissions permissions() const override { return permR_X; }<br>
+<br>
+ Alignment alignment() const override { return Alignment(2); }<br>
+<br>
+#ifndef NDEBUG<br>
+ StringRef name() const override { return _name; }<br>
+ std::string _name;<br>
+#else<br>
+ StringRef name() const override { return ""; }<br>
+#endif<br>
+};<br>
+<br>
+/// \brief Atoms that hold veneer for statically relocated<br>
+/// ARM B/BL instructions.<br>
+class Veneer_ARM_B_BL_StaticAtom : public VeneerAtom {<br>
+public:<br>
+ Veneer_ARM_B_BL_StaticAtom(const File &f, StringRef secName)<br>
+ : VeneerAtom(f, secName) {}<br>
+<br>
+ ArrayRef<uint8_t> rawContent() const override {<br>
+ return llvm::makeArrayRef(Veneer_ARM_B_BL_StaticAtomContent);<br>
+ }<br>
+};<br>
+<br>
+/// \brief Atoms that hold veneer for statically relocated<br>
+/// Thumb B/BL instructions.<br>
+class Veneer_THM_B_BL_StaticAtom : public VeneerAtom {<br>
+public:<br>
+ Veneer_THM_B_BL_StaticAtom(const File &f, StringRef secName)<br>
+ : VeneerAtom(f, secName) {}<br>
+<br>
+ DefinedAtom::CodeModel codeModel() const override {<br>
+ return DefinedAtom::codeARMThumb;<br>
+ }<br>
+<br>
+ ArrayRef<uint8_t> rawContent() const override {<br>
+ return llvm::makeArrayRef(Veneer_THM_B_BL_StaticAtomContent);<br>
+ }<br>
+};<br>
+<br>
class ELFPassFile : public SimpleFile {<br>
public:<br>
ELFPassFile(const ELFLinkingContext &eti) : SimpleFile("ELFPassFile") {<br>
@@ -51,12 +130,67 @@ template <class Derived> class ARMReloca<br>
if (ref.kindNamespace() != Reference::KindNamespace::ELF)<br>
return;<br>
assert(ref.kindArch() == Reference::KindArch::ARM);<br>
+ switch (ref.kindValue()) {<br>
+ case R_ARM_JUMP24:<br>
+ case R_ARM_THM_JUMP24:<br>
+ static_cast<Derived *>(this)->handleVeneer(atom, ref);<br>
+ break;<br>
+ }<br>
}<br>
<br>
protected:<br>
+ std::error_code handleVeneer(const DefinedAtom &atom, const Reference &ref) {<br>
+ // Target symbol and relocated place should have different<br>
+ // instruction sets in order a veneer to be generated in between.<br>
+ const auto *target = dyn_cast_or_null<DefinedAtom>(ref.target());<br>
+ if (!target || target->codeModel() == atom.codeModel())<br>
+ return std::error_code();<br>
+<br>
+ // TODO: For unconditional jump instructions (R_ARM_CALL and R_ARM_THM_CALL)<br>
+ // fixup isn't possible without veneer generation for archs below ARMv5.<br>
+<br>
+ // Veneers may only be generated for STT_FUNC target symbols<br>
+ // or for symbols located in sections different to the place of relocation.<br>
+ const auto kindValue = ref.kindValue();<br>
+ StringRef secName = atom.customSectionName();<br>
+ if (DefinedAtom::typeCode != target->contentType() &&<br>
+ !target->customSectionName().equals(secName)) {<br>
+ StringRef kindValStr;<br>
+ if (!this->_ctx.registry().referenceKindToString(<br>
+ ref.kindNamespace(), ref.kindArch(), kindValue, kindValStr)) {<br>
+ kindValStr = "unknown";<br>
+ }<br>
+<br>
+ std::string errStr =<br>
+ (Twine("Reference of type ") + Twine(kindValue) + " (" + kindValStr +<br>
+ ") from " + <a href="http://atom.name" target="_blank">atom.name</a>() + "+" + Twine(ref.offsetInAtom()) + " to " +<br>
+ ref.target()->name() + "+" + Twine(ref.addend()) +<br>
+ " cannot be effected without a veneer").str();<br>
+<br>
+ llvm_unreachable(errStr.c_str());<br>
+ }<br>
+<br>
+ const Atom *veneer = nullptr;<br>
+ switch (kindValue) {<br>
+ case R_ARM_JUMP24:<br>
+ veneer = static_cast<Derived *>(this)<br>
+ ->getVeneer_ARM_B_BL(target, secName);<br>
+ break;<br>
+ case R_ARM_THM_JUMP24:<br>
+ veneer = static_cast<Derived *>(this)<br>
+ ->getVeneer_THM_B_BL(target, secName);<br>
+ break;<br>
+ default:<br>
+ llvm_unreachable("Unhandled reference type for veneer generation");<br>
+ }<br>
+<br>
+ assert(veneer && "The veneer is not set");<br>
+ const_cast<Reference &>(ref).setTarget(veneer);<br>
+ return std::error_code();<br>
+ }<br>
+<br>
public:<br>
- ARMRelocationPass(const ELFLinkingContext &ctx)<br>
- : _file(ctx), _ctx(ctx) {}<br>
+ ARMRelocationPass(const ELFLinkingContext &ctx) : _file(ctx), _ctx(ctx) {}<br>
<br>
/// \brief Do the pass.<br>
///<br>
@@ -99,12 +233,25 @@ public:<br>
handleReference(*atom, *ref);<br>
}<br>
}<br>
+<br>
+ // Add all created atoms to the link.<br>
+ uint64_t ordinal = 0;<br>
+ for (auto &veneer : _veneerVector) {<br>
+ veneer->setOrdinal(ordinal++);<br>
+ mf->addAtom(*veneer);<br>
+ }<br>
}<br>
<br>
protected:<br>
/// \brief Owner of all the Atoms created by this pass.<br>
ELFPassFile _file;<br>
const ELFLinkingContext &_ctx;<br>
+<br>
+ /// \brief Map Atoms to their veneers.<br>
+ llvm::DenseMap<const Atom *, VeneerAtom *> _veneerMap;<br>
+<br>
+ /// \brief the list of veneer atoms.<br>
+ std::vector<VeneerAtom *> _veneerVector;<br>
};<br>
<br>
/// This implements the static relocation model. Meaning GOT and PLT entries are<br>
@@ -118,6 +265,44 @@ class ARMStaticRelocationPass final<br>
public:<br>
ARMStaticRelocationPass(const elf::ARMLinkingContext &ctx)<br>
: ARMRelocationPass(ctx) {}<br>
+<br>
+ /// \brief Get the veneer for ARM B/BL instructions.<br>
+ const VeneerAtom *getVeneer_ARM_B_BL(const DefinedAtom *da,<br>
+ StringRef secName) {<br>
+ auto veneer = _veneerMap.find(da);<br>
+ if (_veneerMap.end() != veneer)<br>
+ return veneer->second;<br>
+<br>
+ auto v = new (_file._alloc) Veneer_ARM_B_BL_StaticAtom(_file, secName);<br>
+ v->addReferenceELF_ARM(R_ARM_ABS32, 4, da, 0);<br>
+#ifndef NDEBUG<br>
+ v->_name = "__";<br>
+ v->_name += da->name();<br>
+ v->_name += "_from_arm";<br>
+#endif<br>
+ _veneerMap[da] = v;<br>
+ _veneerVector.push_back(v);<br>
+ return v;<br>
+ }<br>
+<br>
+ /// \brief Get the veneer for Thumb B/BL instructions.<br>
+ const VeneerAtom *getVeneer_THM_B_BL(const DefinedAtom *da,<br>
+ StringRef secName) {<br>
+ auto veneer = _veneerMap.find(da);<br>
+ if (_veneerMap.end() != veneer)<br>
+ return veneer->second;<br>
+<br>
+ auto v = new (_file._alloc) Veneer_THM_B_BL_StaticAtom(_file, secName);<br>
+ v->addReferenceELF_ARM(R_ARM_JUMP24, 4, da, 0);<br>
+#ifndef NDEBUG<br>
+ v->_name = "__";<br>
+ v->_name += da->name();<br>
+ v->_name += "_from_thumb";<br>
+#endif<br>
+ _veneerMap[da] = v;<br>
+ _veneerVector.push_back(v);<br>
+ return v;<br>
+ }<br>
};<br>
<br>
} // end of anon namespace<br>
<br>
Added: lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test?rev=228680&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test?rev=228680&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test (added)<br>
+++ lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-b.test Tue Feb 10 03:31:42 2015<br>
@@ -0,0 +1,101 @@<br>
+# Check veneer generation for R_ARM_JUMP24 relocation (B instruction call).<br>
+<br>
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o<br>
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o<br>
+# RUN: lld -flavor gnu -target arm -m armelf_linux_eabi -Bstatic \<br>
+# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t<br>
+<br>
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=B-VENEER %s<br>
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=B-ADDR %s<br>
+<br>
+# B-VENEER: Contents of section .text:<br>
+# B-VENEER: 400074 010000ea<br>
+# Call from main:<br>
+# offset = 0x4 ^^<br>
+# call site offset PC(arm) ___Z1fv_from_arm addr<br>
+# 0x400074 + 0x4 + 0x8 = 0x400080<br>
+#<br>
+# Code of the veneer:<br>
+# B-VENEER: {{[0-9a-f]+}} {{[0-9a-f]+}} 04f01fe5<br>
+# B-VENEER: 400084 79004000<br>
+# call addr = 0x400079 ^^<br>
+# call addr _Z1fv addr Thumb mode<br>
+# 0x400079 = 0x400078 | 0x1<br>
+#<br>
+# B-ADDR: SYMBOL TABLE:<br>
+# B-ADDR: 00400080 l F .text {{[0-9a-f]+}} ___Z1fv_from_arm<br>
+# B-ADDR: 00400074 g F .text {{[0-9a-f]+}} main<br>
+# B-ADDR: 00400078 g F .text {{[0-9a-f]+}} _Z1fv<br>
+<br>
+# arm.o<br>
+---<br>
+FileHeader:<br>
+ Class: ELFCLASS32<br>
+ Data: ELFDATA2LSB<br>
+ Type: ET_REL<br>
+ Machine: EM_ARM<br>
+ Flags: [ EF_ARM_EABI_VER5 ]<br>
+Sections:<br>
+ - Name: .text<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]<br>
+ AddressAlign: 0x0000000000000004<br>
+ Content: FEFFFFEA<br>
+ - Name: .rel.text<br>
+ Type: SHT_REL<br>
+ Link: .symtab<br>
+ AddressAlign: 0x0000000000000004<br>
+ Info: .text<br>
+ Relocations:<br>
+ - Offset: 0x0000000000000000<br>
+ Symbol: _Z1fv<br>
+ Type: R_ARM_JUMP24<br>
+ Addend: 0<br>
+ - Name: .data<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+ - Name: .bss<br>
+ Type: SHT_NOBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+Symbols:<br>
+ Global:<br>
+ - Name: main<br>
+ Type: STT_FUNC<br>
+ Section: .text<br>
+ - Name: _Z1fv<br>
+<br>
+# thm.o<br>
+---<br>
+FileHeader:<br>
+ Class: ELFCLASS32<br>
+ Data: ELFDATA2LSB<br>
+ Type: ET_REL<br>
+ Machine: EM_ARM<br>
+ Flags: [ EF_ARM_EABI_VER5 ]<br>
+Sections:<br>
+ - Name: .text<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]<br>
+ AddressAlign: 0x0000000000000004<br>
+ Content: 4FF0000318467047<br>
+ - Name: .data<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+ - Name: .bss<br>
+ Type: SHT_NOBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+Symbols:<br>
+ Global:<br>
+ - Name: _Z1fv<br>
+ Type: STT_FUNC<br>
+ Section: .text<br>
+ Value: 0x0000000000000001<br>
+...<br>
<br>
Added: lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test?rev=228680&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test?rev=228680&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test (added)<br>
+++ lld/trunk/test/elf/ARM/rel-arm-jump24-veneer-bl.test Tue Feb 10 03:31:42 2015<br>
@@ -0,0 +1,100 @@<br>
+# Check veneer generation for R_ARM_JUMP24 relocation (BL<c> instruction call).<br>
+<br>
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o<br>
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o<br>
+# RUN: lld -flavor gnu -target arm -m armelf_linux_eabi -Bstatic \<br>
+# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t<br>
+<br>
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=BL-VENEER %s<br>
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=BL-ADDR %s<br>
+<br>
+# BL-VENEER: Contents of section .text:<br>
+# BL-VENEER: 400084 0400000b<br>
+# Call from main:<br>
+# offset = 0x10 ^^<br>
+# call site offset PC(arm) ___Z1fv_from_arm addr<br>
+# 0x400084 + 0x10 + 0x8 = 0x40009c<br>
+#<br>
+# Code of the veneer:<br>
+# BL-VENEER: 400094 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 95004000<br>
+# call addr = 0x400095 ^^<br>
+# call addr _Z1fv addr Thumb mode<br>
+# 0x400095 = 0x400094 | 0x1<br>
+#<br>
+# BL-ADDR: SYMBOL TABLE:<br>
+# BL-ADDR: 0040009c l F .text {{[0-9a-f]+}} ___Z1fv_from_arm<br>
+# BL-ADDR: 00400074 g F .text {{[0-9a-f]+}} main<br>
+# BL-ADDR: 00400094 g F .text {{[0-9a-f]+}} _Z1fv<br>
+<br>
+# arm.o<br>
+---<br>
+FileHeader:<br>
+ Class: ELFCLASS32<br>
+ Data: ELFDATA2LSB<br>
+ Type: ET_REL<br>
+ Machine: EM_ARM<br>
+ Flags: [ EF_ARM_EABI_VER5 ]<br>
+Sections:<br>
+ - Name: .text<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]<br>
+ AddressAlign: 0x0000000000000004<br>
+ Content: 00482DE904B08DE20030A0E3000053E3FEFFFF0B0030A0E30300A0E10088BDE8<br>
+ - Name: .rel.text<br>
+ Type: SHT_REL<br>
+ Link: .symtab<br>
+ AddressAlign: 0x0000000000000004<br>
+ Info: .text<br>
+ Relocations:<br>
+ - Offset: 0x0000000000000010<br>
+ Symbol: _Z1fv<br>
+ Type: R_ARM_JUMP24<br>
+ Addend: 0<br>
+ - Name: .data<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+ - Name: .bss<br>
+ Type: SHT_NOBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+Symbols:<br>
+ Global:<br>
+ - Name: main<br>
+ Type: STT_FUNC<br>
+ Section: .text<br>
+ - Name: _Z1fv<br>
+<br>
+# thm.o<br>
+---<br>
+FileHeader:<br>
+ Class: ELFCLASS32<br>
+ Data: ELFDATA2LSB<br>
+ Type: ET_REL<br>
+ Machine: EM_ARM<br>
+ Flags: [ EF_ARM_EABI_VER5 ]<br>
+Sections:<br>
+ - Name: .text<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]<br>
+ AddressAlign: 0x0000000000000004<br>
+ Content: 4FF0000318467047<br>
+ - Name: .data<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+ - Name: .bss<br>
+ Type: SHT_NOBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+Symbols:<br>
+ Global:<br>
+ - Name: _Z1fv<br>
+ Type: STT_FUNC<br>
+ Section: .text<br>
+ Value: 0x0000000000000001<br>
+...<br>
<br>
Added: lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test?rev=228680&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test?rev=228680&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test (added)<br>
+++ lld/trunk/test/elf/ARM/rel-thm-jump24-veneer.test Tue Feb 10 03:31:42 2015<br>
@@ -0,0 +1,100 @@<br>
+# Check veneer generation for R_ARM_THM_JUMP24 relocation (B instruction call).<br>
+<br>
+# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o<br>
+# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o<br>
+# RUN: lld -flavor gnu -target arm -m armelf_linux_eabi -Bstatic \<br>
+# RUN: --noinhibit-exec %t-arm.o %t-thm.o -o %t<br>
+<br>
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=B-VENEER %s<br>
+# RUN: llvm-objdump -s -t %t | FileCheck -check-prefix=B-ADDR %s<br>
+<br>
+# B-VENEER: Contents of section .text:<br>
+# B-VENEER: 400074 {{[0-9a-f]+}} {{[0-9a-f]+}} {{[0-9a-f]+}} 00f000b8<br>
+# Call from main:<br>
+# offset = 0x0 ^^<br>
+# call site offset PC(thm) ___Z1fv_from_thumb addr<br>
+# 0x400080 + 0x0 + 0x4 = 0x400084<br>
+#<br>
+# Code of the veneer:<br>
+# B-VENEER: 400084 78470000 f9ffffea<br>
+# offset = -0x1C ^^<br>
+# call site offset PC(arm) _Z1fv<br>
+# 0x400088 + (-0x1C) + 0x8 = 0x400074<br>
+#<br>
+# B-ADDR: SYMBOL TABLE:<br>
+# B-ADDR: 00400084 l F .text {{[0-9a-f]+}} ___Z1fv_from_thumb<br>
+# B-ADDR: 00400074 g F .text {{[0-9a-f]+}} _Z1fv<br>
+# B-ADDR: 00400080 g F .text {{[0-9a-f]+}} main<br>
+<br>
+# arm.o<br>
+---<br>
+FileHeader:<br>
+ Class: ELFCLASS32<br>
+ Data: ELFDATA2LSB<br>
+ Type: ET_REL<br>
+ Machine: EM_ARM<br>
+ Flags: [ EF_ARM_EABI_VER5 ]<br>
+Sections:<br>
+ - Name: .text<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]<br>
+ AddressAlign: 0x0000000000000004<br>
+ Content: 0030A0E30300A0E11EFF2FE1<br>
+ - Name: .data<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+ - Name: .bss<br>
+ Type: SHT_NOBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+Symbols:<br>
+ Global:<br>
+ - Name: _Z1fv<br>
+ Type: STT_FUNC<br>
+ Section: .text<br>
+<br>
+# thm.o<br>
+---<br>
+FileHeader:<br>
+ Class: ELFCLASS32<br>
+ Data: ELFDATA2LSB<br>
+ Type: ET_REL<br>
+ Machine: EM_ARM<br>
+ Flags: [ EF_ARM_EABI_VER5 ]<br>
+Sections:<br>
+ - Name: .text<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]<br>
+ AddressAlign: 0x0000000000000004<br>
+ Content: FFF7FEBF<br>
+ - Name: .rel.text<br>
+ Type: SHT_REL<br>
+ Link: .symtab<br>
+ AddressAlign: 0x0000000000000004<br>
+ Info: .text<br>
+ Relocations:<br>
+ - Offset: 0x0000000000000000<br>
+ Symbol: _Z1fv<br>
+ Type: R_ARM_THM_JUMP24<br>
+ Addend: 0<br>
+ - Name: .data<br>
+ Type: SHT_PROGBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+ - Name: .bss<br>
+ Type: SHT_NOBITS<br>
+ Flags: [ SHF_WRITE, SHF_ALLOC ]<br>
+ AddressAlign: 0x0000000000000001<br>
+ Content: ''<br>
+Symbols:<br>
+ Global:<br>
+ - Name: main<br>
+ Type: STT_FUNC<br>
+ Section: .text<br>
+ Value: 0x0000000000000001<br>
+ - Name: _Z1fv<br>
+...<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>