<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>