<div dir="ltr">Hi Denis!<div><br></div><div>Please also ifdef the definition of <span style="font-size:12.8000001907349px">getMappingAtomName, since it's only used without NDEBUG.</span></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature">  Filipe<br></div></div>
<br><div class="gmail_quote">On Tue, Apr 7, 2015 at 8:04 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: denis-protivensky<br>
Date: Tue Apr  7 02:04:42 2015<br>
New Revision: 234301<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=234301&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=234301&view=rev</a><br>
Log:<br>
[ARM] Add mapping symbols to PLT entries<br>
<br>
Make PLT entry atoms represent mapping symbols in the Release mode,<br>
while in the Debug mode they are still function-like symbols<br>
with regular names.<br>
It's legal that mapping symbols denote unnamed parts of code,<br>
and PLT entries are not required to have function-like names.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D8819" target="_blank">http://reviews.llvm.org/D8819</a><br>
<br>
Added:<br>
    lld/trunk/test/elf/ARM/plt-mapping.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=234301&r1=234300&r2=234301&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp?rev=234301&r1=234300&r2=234301&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp (original)<br>
+++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp Tue Apr  7 02:04:42 2015<br>
@@ -62,6 +62,21 @@ static const uint8_t ARMPltVeneerAtomCon<br>
     0x00, 0x00               // nop<br>
 };<br>
<br>
+// Determine proper names for mapping symbols.<br>
+static std::string getMappingAtomName(DefinedAtom::CodeModel model,<br>
+                                      const std::string &part) {<br>
+  switch (model) {<br>
+  case DefinedAtom::codeARM_a:<br>
+    return part.empty() ? "$a" : "$a." + part;<br>
+  case DefinedAtom::codeARM_d:<br>
+    return part.empty() ? "$d" : "$d." + part;<br>
+  case DefinedAtom::codeARM_t:<br>
+    return part.empty() ? "$t" : "$t." + part;<br>
+  default:<br>
+    llvm_unreachable("Wrong code model of mapping atom");<br>
+  }<br>
+}<br>
+<br>
 /// \brief Atoms that hold veneer code.<br>
 class VeneerAtom : public SimpleELFDefinedAtom {<br>
   StringRef _section;<br>
@@ -141,23 +156,62 @@ public:<br>
   ARMGOTPLTAtom(const File &f) : ARMGOTAtom(f, ".got.plt") {}<br>
 };<br>
<br>
+/// \brief PLT entry atom.<br>
+/// Serves as a mapping symbol in the release mode.<br>
 class ARMPLTAtom : public PLTAtom {<br>
 public:<br>
-  ARMPLTAtom(const File &f) : PLTAtom(f, ".plt") {}<br>
+  ARMPLTAtom(const File &f, const std::string &name)<br>
+      : PLTAtom(f, ".plt") {<br>
+#ifndef NDEBUG<br>
+    _name = name;<br>
+#else<br>
+    // Don't move the code to any base classes since<br>
+    // virtual codeModel method would return wrong value.<br>
+    _name = getMappingAtomName(codeModel(), name);<br>
+#endif<br>
+  }<br>
+<br>
+  DefinedAtom::CodeModel codeModel() const override {<br>
+#ifndef NDEBUG<br>
+    return DefinedAtom::codeNA;<br>
+#else<br>
+    return DefinedAtom::codeARM_a;<br>
+#endif<br>
+  }<br>
<br>
   ArrayRef<uint8_t> rawContent() const override {<br>
     return llvm::makeArrayRef(ARMPltAtomContent);<br>
   }<br>
<br>
   Alignment alignment() const override { return 4; }<br>
+<br>
+  StringRef name() const override { return _name; }<br>
+<br>
+private:<br>
+  std::string _name;<br>
 };<br>
<br>
+/// \brief Veneer atom for PLT entry.<br>
+/// Serves as a mapping symbol in the release mode.<br>
 class ARMPLTVeneerAtom : public PLTAtom {<br>
 public:<br>
-  ARMPLTVeneerAtom(const File &f) : PLTAtom(f, ".plt") {}<br>
+  ARMPLTVeneerAtom(const File &f, const std::string &name)<br>
+      : PLTAtom(f, ".plt") {<br>
+#ifndef NDEBUG<br>
+    _name = name;<br>
+#else<br>
+    // Don't move the code to any base classes since<br>
+    // virtual codeModel method would return wrong value.<br>
+    _name = getMappingAtomName(codeModel(), name);<br>
+#endif<br>
+  }<br>
<br>
   DefinedAtom::CodeModel codeModel() const override {<br>
+#ifndef NDEBUG<br>
     return DefinedAtom::codeARMThumb;<br>
+#else<br>
+    return DefinedAtom::codeARM_t;<br>
+#endif<br>
   }<br>
<br>
   ArrayRef<uint8_t> rawContent() const override {<br>
@@ -165,6 +219,11 @@ public:<br>
   }<br>
<br>
   Alignment alignment() const override { return 4; }<br>
+<br>
+  StringRef name() const override { return _name; }<br>
+<br>
+private:<br>
+  std::string _name;<br>
 };<br>
<br>
 class ELFPassFile : public SimpleFile {<br>
@@ -295,14 +354,14 @@ protected:<br>
   /// \brief get a veneer for a PLT entry.<br>
   const PLTAtom *getPLTVeneer(const DefinedAtom *da, PLTAtom *pa,<br>
                               StringRef source) {<br>
-    auto va = new (_file._alloc) ARMPLTVeneerAtom(_file);<br>
+    std::string name = "__plt_from_thumb";<br>
+    name += source;<br>
+    name += da->name();<br>
+    // Create veneer for PLT entry.<br>
+    auto va = new (_file._alloc) ARMPLTVeneerAtom(_file, name);<br>
     // Fake reference to show connection between veneer and PLT entry.<br>
     va->addReferenceELF_ARM(R_ARM_NONE, 0, pa, 0);<br>
-#ifndef NDEBUG<br>
-    va->_name = "__plt_from_thumb";<br>
-    va->_name += source;<br>
-    va->_name += da->name();<br>
-#endif<br>
+<br>
     _pltAtoms[da] = PLTWithVeneer(pa, va);<br>
     return va;<br>
   }<br>
@@ -335,16 +394,15 @@ protected:<br>
     assert(ga->customSectionName() == ".got.plt" &&<br>
            "GOT entry should be in a special section");<br>
<br>
+    std::string name = "__plt";<br>
+    name += source;<br>
+    name += da->name();<br>
     // Create PLT entry for the GOT entry.<br>
-    auto pa = new (_file._alloc) ARMPLTAtom(_file);<br>
+    auto pa = new (_file._alloc) ARMPLTAtom(_file, name);<br>
     pa->addReferenceELF_ARM(R_ARM_ALU_PC_G0_NC, 0, ga, -8);<br>
     pa->addReferenceELF_ARM(R_ARM_ALU_PC_G1_NC, 4, ga, -4);<br>
     pa->addReferenceELF_ARM(R_ARM_LDR_PC_G2, 8, ga, 0);<br>
-#ifndef NDEBUG<br>
-    pa->_name = "__plt";<br>
-    pa->_name += source;<br>
-    pa->_name += da->name();<br>
-#endif<br>
+<br>
     // Since all PLT entries are in ARM code, Thumb to ARM<br>
     // switching should be added if the relocated place contais Thumb code.<br>
     if (fromThumb)<br>
@@ -371,11 +429,7 @@ protected:<br>
<br>
   /// \brief get the PLT entry for a given IFUNC Atom.<br>
   const PLTAtom *getIFUNCPLTEntry(const DefinedAtom *da, bool fromThumb) {<br>
-    StringRef source;<br>
-#ifndef NDEBUG<br>
-    source = "_ifunc_";<br>
-#endif<br>
-    return getPLTEntry(da, fromThumb, &Derived::createIFUNCGOTEntry, source);<br>
+    return getPLTEntry(da, fromThumb, &Derived::createIFUNCGOTEntry, "_ifunc_");<br>
   }<br>
<br>
   /// \brief Redirect the call to the PLT stub for the target IFUNC.<br>
<br>
Added: lld/trunk/test/elf/ARM/plt-mapping.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/plt-mapping.test?rev=234301&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/plt-mapping.test?rev=234301&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/elf/ARM/plt-mapping.test (added)<br>
+++ lld/trunk/test/elf/ARM/plt-mapping.test Tue Apr  7 02:04:42 2015<br>
@@ -0,0 +1,111 @@<br>
+# Check that mapping symbols are properly generated for PLT entries.<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-linux-gnu \<br>
+# RUN: -Bstatic --noinhibit-exec %t-arm.o %t-thm.o -o %t<br>
+# RUN: llvm-readobj -symbols %t | FileCheck %s<br>
+<br>
+# CHECK: Name: {{[$]?[at]?[.]?}}__plt_ifunc_f1<br>
+# CHECK: Name: {{[$]?[at]?[.]?}}__plt_from_thumb_ifunc_f2<br>
+# CHECK: Name: {{[$]?[at]?[.]?}}__plt_ifunc_f2<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:         04B02DE500B08DE2003000E3003040E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEB0030A0E10300A0E10088BDE8<br>
+  - Name:            .rel.text<br>
+    Type:            SHT_REL<br>
+    Link:            .symtab<br>
+    AddressAlign:    0x0000000000000004<br>
+    Info:            .text<br>
+    Relocations:<br>
+      - Offset:          0x0000000000000008<br>
+        Symbol:          main<br>
+        Type:            R_ARM_MOVW_ABS_NC<br>
+      - Offset:          0x000000000000000C<br>
+        Symbol:          main<br>
+        Type:            R_ARM_MOVT_ABS<br>
+      - Offset:          0x0000000000000028<br>
+        Symbol:          f1<br>
+        Type:            R_ARM_CALL<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:            f1<br>
+      Type:            STT_GNU_IFUNC<br>
+      Section:         .text<br>
+    - Name:            main<br>
+      Type:            STT_FUNC<br>
+      Section:         .text<br>
+      Value:           0x0000000000000020<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:         80B400AF40F20003C0F200031846BD465DF8047B704700BF80B500AFFFF7FEFF0346184680BD00BF<br>
+  - Name:            .rel.text<br>
+    Type:            SHT_REL<br>
+    Link:            .symtab<br>
+    AddressAlign:    0x0000000000000004<br>
+    Info:            .text<br>
+    Relocations:<br>
+      - Offset:          0x0000000000000004<br>
+        Symbol:          f<br>
+        Type:            R_ARM_THM_MOVW_ABS_NC<br>
+      - Offset:          0x0000000000000008<br>
+        Symbol:          f<br>
+        Type:            R_ARM_THM_MOVT_ABS<br>
+      - Offset:          0x000000000000001C<br>
+        Symbol:          f2<br>
+        Type:            R_ARM_THM_CALL<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:            f2<br>
+      Type:            STT_GNU_IFUNC<br>
+      Section:         .text<br>
+      Value:           0x0000000000000001<br>
+    - Name:            f<br>
+      Type:            STT_FUNC<br>
+      Section:         .text<br>
+      Value:           0x0000000000000019<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>