[lld] r234301 - [ARM] Add mapping symbols to PLT entries

Filipe Cabecinhas filcab at gmail.com
Tue Apr 7 01:46:41 PDT 2015


Hi Denis!

Please also ifdef the definition of getMappingAtomName, since it's only
used without NDEBUG.

  Filipe

On Tue, Apr 7, 2015 at 8:04 AM, Denis Protivensky <
dprotivensky at accesssoftek.com> wrote:

> Author: denis-protivensky
> Date: Tue Apr  7 02:04:42 2015
> New Revision: 234301
>
> URL: http://llvm.org/viewvc/llvm-project?rev=234301&view=rev
> Log:
> [ARM] Add mapping symbols to PLT entries
>
> Make PLT entry atoms represent mapping symbols in the Release mode,
> while in the Debug mode they are still function-like symbols
> with regular names.
> It's legal that mapping symbols denote unnamed parts of code,
> and PLT entries are not required to have function-like names.
>
> Differential Revision: http://reviews.llvm.org/D8819
>
> Added:
>     lld/trunk/test/elf/ARM/plt-mapping.test
> Modified:
>     lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp
>
> Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp?rev=234301&r1=234300&r2=234301&view=diff
>
> ==============================================================================
> --- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp (original)
> +++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMRelocationPass.cpp Tue Apr  7
> 02:04:42 2015
> @@ -62,6 +62,21 @@ static const uint8_t ARMPltVeneerAtomCon
>      0x00, 0x00               // nop
>  };
>
> +// Determine proper names for mapping symbols.
> +static std::string getMappingAtomName(DefinedAtom::CodeModel model,
> +                                      const std::string &part) {
> +  switch (model) {
> +  case DefinedAtom::codeARM_a:
> +    return part.empty() ? "$a" : "$a." + part;
> +  case DefinedAtom::codeARM_d:
> +    return part.empty() ? "$d" : "$d." + part;
> +  case DefinedAtom::codeARM_t:
> +    return part.empty() ? "$t" : "$t." + part;
> +  default:
> +    llvm_unreachable("Wrong code model of mapping atom");
> +  }
> +}
> +
>  /// \brief Atoms that hold veneer code.
>  class VeneerAtom : public SimpleELFDefinedAtom {
>    StringRef _section;
> @@ -141,23 +156,62 @@ public:
>    ARMGOTPLTAtom(const File &f) : ARMGOTAtom(f, ".got.plt") {}
>  };
>
> +/// \brief PLT entry atom.
> +/// Serves as a mapping symbol in the release mode.
>  class ARMPLTAtom : public PLTAtom {
>  public:
> -  ARMPLTAtom(const File &f) : PLTAtom(f, ".plt") {}
> +  ARMPLTAtom(const File &f, const std::string &name)
> +      : PLTAtom(f, ".plt") {
> +#ifndef NDEBUG
> +    _name = name;
> +#else
> +    // Don't move the code to any base classes since
> +    // virtual codeModel method would return wrong value.
> +    _name = getMappingAtomName(codeModel(), name);
> +#endif
> +  }
> +
> +  DefinedAtom::CodeModel codeModel() const override {
> +#ifndef NDEBUG
> +    return DefinedAtom::codeNA;
> +#else
> +    return DefinedAtom::codeARM_a;
> +#endif
> +  }
>
>    ArrayRef<uint8_t> rawContent() const override {
>      return llvm::makeArrayRef(ARMPltAtomContent);
>    }
>
>    Alignment alignment() const override { return 4; }
> +
> +  StringRef name() const override { return _name; }
> +
> +private:
> +  std::string _name;
>  };
>
> +/// \brief Veneer atom for PLT entry.
> +/// Serves as a mapping symbol in the release mode.
>  class ARMPLTVeneerAtom : public PLTAtom {
>  public:
> -  ARMPLTVeneerAtom(const File &f) : PLTAtom(f, ".plt") {}
> +  ARMPLTVeneerAtom(const File &f, const std::string &name)
> +      : PLTAtom(f, ".plt") {
> +#ifndef NDEBUG
> +    _name = name;
> +#else
> +    // Don't move the code to any base classes since
> +    // virtual codeModel method would return wrong value.
> +    _name = getMappingAtomName(codeModel(), name);
> +#endif
> +  }
>
>    DefinedAtom::CodeModel codeModel() const override {
> +#ifndef NDEBUG
>      return DefinedAtom::codeARMThumb;
> +#else
> +    return DefinedAtom::codeARM_t;
> +#endif
>    }
>
>    ArrayRef<uint8_t> rawContent() const override {
> @@ -165,6 +219,11 @@ public:
>    }
>
>    Alignment alignment() const override { return 4; }
> +
> +  StringRef name() const override { return _name; }
> +
> +private:
> +  std::string _name;
>  };
>
>  class ELFPassFile : public SimpleFile {
> @@ -295,14 +354,14 @@ protected:
>    /// \brief get a veneer for a PLT entry.
>    const PLTAtom *getPLTVeneer(const DefinedAtom *da, PLTAtom *pa,
>                                StringRef source) {
> -    auto va = new (_file._alloc) ARMPLTVeneerAtom(_file);
> +    std::string name = "__plt_from_thumb";
> +    name += source;
> +    name += da->name();
> +    // Create veneer for PLT entry.
> +    auto va = new (_file._alloc) ARMPLTVeneerAtom(_file, name);
>      // Fake reference to show connection between veneer and PLT entry.
>      va->addReferenceELF_ARM(R_ARM_NONE, 0, pa, 0);
> -#ifndef NDEBUG
> -    va->_name = "__plt_from_thumb";
> -    va->_name += source;
> -    va->_name += da->name();
> -#endif
> +
>      _pltAtoms[da] = PLTWithVeneer(pa, va);
>      return va;
>    }
> @@ -335,16 +394,15 @@ protected:
>      assert(ga->customSectionName() == ".got.plt" &&
>             "GOT entry should be in a special section");
>
> +    std::string name = "__plt";
> +    name += source;
> +    name += da->name();
>      // Create PLT entry for the GOT entry.
> -    auto pa = new (_file._alloc) ARMPLTAtom(_file);
> +    auto pa = new (_file._alloc) ARMPLTAtom(_file, name);
>      pa->addReferenceELF_ARM(R_ARM_ALU_PC_G0_NC, 0, ga, -8);
>      pa->addReferenceELF_ARM(R_ARM_ALU_PC_G1_NC, 4, ga, -4);
>      pa->addReferenceELF_ARM(R_ARM_LDR_PC_G2, 8, ga, 0);
> -#ifndef NDEBUG
> -    pa->_name = "__plt";
> -    pa->_name += source;
> -    pa->_name += da->name();
> -#endif
> +
>      // Since all PLT entries are in ARM code, Thumb to ARM
>      // switching should be added if the relocated place contais Thumb
> code.
>      if (fromThumb)
> @@ -371,11 +429,7 @@ protected:
>
>    /// \brief get the PLT entry for a given IFUNC Atom.
>    const PLTAtom *getIFUNCPLTEntry(const DefinedAtom *da, bool fromThumb) {
> -    StringRef source;
> -#ifndef NDEBUG
> -    source = "_ifunc_";
> -#endif
> -    return getPLTEntry(da, fromThumb, &Derived::createIFUNCGOTEntry,
> source);
> +    return getPLTEntry(da, fromThumb, &Derived::createIFUNCGOTEntry,
> "_ifunc_");
>    }
>
>    /// \brief Redirect the call to the PLT stub for the target IFUNC.
>
> Added: lld/trunk/test/elf/ARM/plt-mapping.test
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf/ARM/plt-mapping.test?rev=234301&view=auto
>
> ==============================================================================
> --- lld/trunk/test/elf/ARM/plt-mapping.test (added)
> +++ lld/trunk/test/elf/ARM/plt-mapping.test Tue Apr  7 02:04:42 2015
> @@ -0,0 +1,111 @@
> +# Check that mapping symbols are properly generated for PLT entries.
> +
> +# RUN: yaml2obj -format=elf -docnum 1 %s > %t-arm.o
> +# RUN: yaml2obj -format=elf -docnum 2 %s > %t-thm.o
> +# RUN: lld -flavor gnu -target arm-linux-gnu \
> +# RUN: -Bstatic --noinhibit-exec %t-arm.o %t-thm.o -o %t
> +# RUN: llvm-readobj -symbols %t | FileCheck %s
> +
> +# CHECK: Name: {{[$]?[at]?[.]?}}__plt_ifunc_f1
> +# CHECK: Name: {{[$]?[at]?[.]?}}__plt_from_thumb_ifunc_f2
> +# CHECK: Name: {{[$]?[at]?[.]?}}__plt_ifunc_f2
> +
> +# arm.o
> +---
> +FileHeader:
> +  Class:           ELFCLASS32
> +  Data:            ELFDATA2LSB
> +  Type:            ET_REL
> +  Machine:         EM_ARM
> +  Flags:           [ EF_ARM_EABI_VER5 ]
> +Sections:
> +  - Name:            .text
> +    Type:            SHT_PROGBITS
> +    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
> +    AddressAlign:    0x0000000000000004
> +    Content:
>  04B02DE500B08DE2003000E3003040E30300A0E100D04BE204B09DE41EFF2FE100482DE904B08DE2FEFFFFEB0030A0E10300A0E10088BDE8
> +  - Name:            .rel.text
> +    Type:            SHT_REL
> +    Link:            .symtab
> +    AddressAlign:    0x0000000000000004
> +    Info:            .text
> +    Relocations:
> +      - Offset:          0x0000000000000008
> +        Symbol:          main
> +        Type:            R_ARM_MOVW_ABS_NC
> +      - Offset:          0x000000000000000C
> +        Symbol:          main
> +        Type:            R_ARM_MOVT_ABS
> +      - Offset:          0x0000000000000028
> +        Symbol:          f1
> +        Type:            R_ARM_CALL
> +  - Name:            .data
> +    Type:            SHT_PROGBITS
> +    Flags:           [ SHF_WRITE, SHF_ALLOC ]
> +    AddressAlign:    0x0000000000000001
> +    Content:         ''
> +  - Name:            .bss
> +    Type:            SHT_NOBITS
> +    Flags:           [ SHF_WRITE, SHF_ALLOC ]
> +    AddressAlign:    0x0000000000000001
> +    Content:         ''
> +Symbols:
> +  Global:
> +    - Name:            f1
> +      Type:            STT_GNU_IFUNC
> +      Section:         .text
> +    - Name:            main
> +      Type:            STT_FUNC
> +      Section:         .text
> +      Value:           0x0000000000000020
> +
> +# thm.o
> +---
> +FileHeader:
> +  Class:           ELFCLASS32
> +  Data:            ELFDATA2LSB
> +  Type:            ET_REL
> +  Machine:         EM_ARM
> +  Flags:           [ EF_ARM_EABI_VER5 ]
> +Sections:
> +  - Name:            .text
> +    Type:            SHT_PROGBITS
> +    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
> +    AddressAlign:    0x0000000000000004
> +    Content:
>  80B400AF40F20003C0F200031846BD465DF8047B704700BF80B500AFFFF7FEFF0346184680BD00BF
> +  - Name:            .rel.text
> +    Type:            SHT_REL
> +    Link:            .symtab
> +    AddressAlign:    0x0000000000000004
> +    Info:            .text
> +    Relocations:
> +      - Offset:          0x0000000000000004
> +        Symbol:          f
> +        Type:            R_ARM_THM_MOVW_ABS_NC
> +      - Offset:          0x0000000000000008
> +        Symbol:          f
> +        Type:            R_ARM_THM_MOVT_ABS
> +      - Offset:          0x000000000000001C
> +        Symbol:          f2
> +        Type:            R_ARM_THM_CALL
> +  - Name:            .data
> +    Type:            SHT_PROGBITS
> +    Flags:           [ SHF_WRITE, SHF_ALLOC ]
> +    AddressAlign:    0x0000000000000001
> +    Content:         ''
> +  - Name:            .bss
> +    Type:            SHT_NOBITS
> +    Flags:           [ SHF_WRITE, SHF_ALLOC ]
> +    AddressAlign:    0x0000000000000001
> +    Content:         ''
> +Symbols:
> + Global:
> +    - Name:            f2
> +      Type:            STT_GNU_IFUNC
> +      Section:         .text
> +      Value:           0x0000000000000001
> +    - Name:            f
> +      Type:            STT_FUNC
> +      Section:         .text
> +      Value:           0x0000000000000019
> +...
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150407/00e31d78/attachment.html>


More information about the llvm-commits mailing list