<html>
  <head>
    
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Thanks, Filipe! Done.<br>
    <br>
    <div class="moz-cite-prefix">On 04/07/2015 11:46 AM, Filipe
      Cabecinhas wrote:<br>
    </div>
    <blockquote
cite="mid:CAEDE850mMFpwm7N-4j-=s8RF2YJP4aiTxU1giuYx5946oKe4zg@mail.gmail.com"
      type="cite">
      <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 moz-do-not-send="true"
                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 moz-do-not-send="true"
                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 moz-do-not-send="true"
                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 moz-do-not-send="true"
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 moz-do-not-send="true"
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 moz-do-not-send="true"
                href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
              <a moz-do-not-send="true"
                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>
    </blockquote>
    <br>
  </body>
</html>