[llvm] r317646 - Reapply: Allow yaml2obj to order implicit sections for ELF

Dave Lee via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 7 17:27:45 PST 2017


Not intentional. I'll revert (again) and look into it. Apologies for the
thrash.

On Tue, Nov 7, 2017 at 5:20 PM, Rafael Avila de Espindola <
rafael.espindola at gmail.com> wrote:

> Sorry, the test still fails, but it is not a crash, it is lld producing
> a different error message.
>
> This shows that yaml2obj is producing a different output on that input
> now. Is that intentional?
>
> Cheers,
> Rafael
>
> Rafael Avila de Espindola <rafael.espindola at gmail.com> writes:
>
> > The same test still crashes.
> >
> >
> > Dave Lee via llvm-commits <llvm-commits at lists.llvm.org> writes:
> >
> >> Author: kastiglione
> >> Date: Tue Nov  7 16:58:50 2017
> >> New Revision: 317646
> >>
> >> URL: http://llvm.org/viewvc/llvm-project?rev=317646&view=rev
> >> Log:
> >> Reapply: Allow yaml2obj to order implicit sections for ELF
> >>
> >> Summary:
> >> This change allows yaml input to control the order of implicitly added
> sections
> >> (`.symtab`, `.strtab`, `.shstrtab`). The order is controlled by adding a
> >> placeholder section of the given name to the Sections field.
> >>
> >> This change is to support changes in D39582, where it is desirable to
> control
> >> the location of the `.dynsym` section.
> >>
> >> This reapplied version fixes:
> >>   1. use of a function call within an assert
> >>   2. failing lld test which has an unnamed section
> >>
> >> Additionally, one more test to cover the unnamed section failure.
> >>
> >> Reviewers: compnerd, jakehehrlich
> >>
> >> Reviewed By: jakehehrlich
> >>
> >> Subscribers: llvm-commits
> >>
> >> Differential Revision: https://reviews.llvm.org/D39749
> >>
> >> Added:
> >>     llvm/trunk/test/tools/yaml2obj/section-ordering.yaml
> >>     llvm/trunk/test/tools/yaml2obj/unnamed-section.yaml
> >> Modified:
> >>     llvm/trunk/lib/ObjectYAML/ELFYAML.cpp
> >>     llvm/trunk/tools/yaml2obj/yaml2elf.cpp
> >>
> >> Modified: llvm/trunk/lib/ObjectYAML/ELFYAML.cpp
> >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/
> ObjectYAML/ELFYAML.cpp?rev=317646&r1=317645&r2=317646&view=diff
> >> ============================================================
> ==================
> >> --- llvm/trunk/lib/ObjectYAML/ELFYAML.cpp (original)
> >> +++ llvm/trunk/lib/ObjectYAML/ELFYAML.cpp Tue Nov  7 16:58:50 2017
> >> @@ -388,7 +388,7 @@ void ScalarEnumerationTraits<ELFYAML::EL
> >>  #define ECase(X) IO.enumCase(Value, #X, ELF::X)
> >>    ECase(SHT_NULL);
> >>    ECase(SHT_PROGBITS);
> >> -  // No SHT_SYMTAB. Use the top-level `Symbols` key instead.
> >> +  ECase(SHT_SYMTAB);
> >>    // FIXME: Issue a diagnostic with this information.
> >>    ECase(SHT_STRTAB);
> >>    ECase(SHT_RELA);
> >>
> >> Added: llvm/trunk/test/tools/yaml2obj/section-ordering.yaml
> >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/
> yaml2obj/section-ordering.yaml?rev=317646&view=auto
> >> ============================================================
> ==================
> >> --- llvm/trunk/test/tools/yaml2obj/section-ordering.yaml (added)
> >> +++ llvm/trunk/test/tools/yaml2obj/section-ordering.yaml Tue Nov  7
> 16:58:50 2017
> >> @@ -0,0 +1,29 @@
> >> +# Ensures that implicitly added sections can be ordered within
> Sections.
> >> +# RUN: yaml2obj %s -o %t
> >> +# RUN: llvm-readobj -sections %t | FileCheck %s
> >> +
> >> +!ELF
> >> +FileHeader:
> >> +  Class:           ELFCLASS64
> >> +  Data:            ELFDATA2LSB
> >> +  Type:            ET_EXEC
> >> +  Machine:         EM_X86_64
> >> +Sections:
> >> +  - Name:            .text
> >> +    Type:            SHT_PROGBITS
> >> +    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
> >> +  - Name:            .symtab
> >> +    Type:            SHT_SYMTAB
> >> +  - Name:            .data
> >> +    Type:            SHT_PROGBITS
> >> +    Flags:           [ SHF_ALLOC, SHF_WRITE ]
> >> +  - Name:            .shstrtab
> >> +    Type:            SHT_STRTAB
> >> +  - Name:            .strtab
> >> +    Type:            SHT_STRTAB
> >> +
> >> +# CHECK: Name: .text
> >> +# CHECK: Name: .symtab
> >> +# CHECK: Name: .data
> >> +# CHECK: Name: .shstrtab
> >> +# CHECK: Name: .strtab
> >>
> >> Added: llvm/trunk/test/tools/yaml2obj/unnamed-section.yaml
> >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/
> yaml2obj/unnamed-section.yaml?rev=317646&view=auto
> >> ============================================================
> ==================
> >> --- llvm/trunk/test/tools/yaml2obj/unnamed-section.yaml (added)
> >> +++ llvm/trunk/test/tools/yaml2obj/unnamed-section.yaml Tue Nov  7
> 16:58:50 2017
> >> @@ -0,0 +1,14 @@
> >> +# Ensure yaml2obj doesn't crash on unnamed sections
> >> +# RUN: yaml2obj %s
> >> +
> >> +!ELF
> >> +FileHeader:
> >> +  Class:           ELFCLASS64
> >> +  Data:            ELFDATA2LSB
> >> +  Type:            ET_EXEC
> >> +  Machine:         EM_X86_64
> >> +Sections:
> >> +  - Type:            SHT_PROGBITS
> >> +  - Name:            .text
> >> +    Type:            SHT_PROGBITS
> >> +    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
> >>
> >> Modified: llvm/trunk/tools/yaml2obj/yaml2elf.cpp
> >> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/
> yaml2obj/yaml2elf.cpp?rev=317646&r1=317645&r2=317646&view=diff
> >> ============================================================
> ==================
> >> --- llvm/trunk/tools/yaml2obj/yaml2elf.cpp (original)
> >> +++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp Tue Nov  7 16:58:50 2017
> >> @@ -74,6 +74,14 @@ public:
> >>      Idx = I->getValue();
> >>      return false;
> >>    }
> >> +  /// asserts if name is not present in the map
> >> +  unsigned get(StringRef Name) const {
> >> +    unsigned Idx = 0;
> >> +    auto missing = lookup(Name, Idx);
> >> +    assert(!missing && "Expected section not found in index");
> >> +    return Idx;
> >> +  }
> >> +  unsigned size() const { return Map.size(); }
> >>  };
> >>  } // end anonymous namespace
> >>
> >> @@ -144,19 +152,21 @@ class ELFState {
> >>                             ContiguousBlobAccumulator &CBA);
> >>
> >>    // - SHT_NULL entry (placed first, i.e. 0'th entry)
> >> -  // - symbol table (.symtab) (placed third to last)
> >> -  // - string table (.strtab) (placed second to last)
> >> -  // - section header string table (.shstrtab) (placed last)
> >> -  unsigned getDotSymTabSecNo() const { return Doc.Sections.size() + 1;
> }
> >> -  unsigned getDotStrTabSecNo() const { return Doc.Sections.size() + 2;
> }
> >> -  unsigned getDotShStrTabSecNo() const { return Doc.Sections.size() +
> 3; }
> >> -  unsigned getSectionCount() const { return Doc.Sections.size() + 4; }
> >> +  // - symbol table (.symtab) (defaults to third to last)
> >> +  // - string table (.strtab) (defaults to second to last)
> >> +  // - section header string table (.shstrtab) (defaults to last)
> >> +  unsigned getDotSymTabSecNo() const { return SN2I.get(".symtab"); }
> >> +  unsigned getDotStrTabSecNo() const { return SN2I.get(".strtab"); }
> >> +  unsigned getDotShStrTabSecNo() const { return SN2I.get(".shstrtab");
> }
> >> +  unsigned getSectionCount() const { return SN2I.size() + 1; }
> >>
> >>    ELFState(const ELFYAML::Object &D) : Doc(D) {}
> >>
> >>  public:
> >>    static int writeELF(raw_ostream &OS, const ELFYAML::Object &Doc);
> >>  };
> >> +
> >> +static const char * const ImplicitSecNames[] = {".symtab", ".strtab",
> ".shstrtab"};
> >>  } // end anonymous namespace
> >>
> >>  template <class ELFT>
> >> @@ -211,10 +221,6 @@ bool ELFState<ELFT>::initSectionHeaders(
> >>    zero(SHeader);
> >>    SHeaders.push_back(SHeader);
> >>
> >> -  for (const auto &Sec : Doc.Sections)
> >> -    DotShStrtab.add(Sec->Name);
> >> -  DotShStrtab.finalize();
> >> -
> >>    for (const auto &Sec : Doc.Sections) {
> >>      zero(SHeader);
> >>      SHeader.sh_name = DotShStrtab.getOffset(Sec->Name);
> >> @@ -547,12 +553,9 @@ bool ELFState<ELFT>::writeSectionContent
> >>  }
> >>
> >>  template <class ELFT> bool ELFState<ELFT>::buildSectionIndex() {
> >> -  SN2I.addName(".symtab", getDotSymTabSecNo());
> >> -  SN2I.addName(".strtab", getDotStrTabSecNo());
> >> -  SN2I.addName(".shstrtab", getDotShStrTabSecNo());
> >> -
> >>    for (unsigned i = 0, e = Doc.Sections.size(); i != e; ++i) {
> >>      StringRef Name = Doc.Sections[i]->Name;
> >> +    DotShStrtab.add(Name);
> >>      if (Name.empty())
> >>        continue;
> >>      // "+ 1" to take into account the SHT_NULL entry.
> >> @@ -562,6 +565,17 @@ template <class ELFT> bool ELFState<ELFT
> >>        return false;
> >>      }
> >>    }
> >> +
> >> +  auto SecNo = 1 + Doc.Sections.size();
> >> +  // Add special sections after input sections, if necessary.
> >> +  for (const auto &Name : ImplicitSecNames)
> >> +    if (!SN2I.addName(Name, SecNo)) {
> >> +      // Account for this section, since it wasn't in the Doc
> >> +      ++SecNo;
> >> +      DotShStrtab.add(Name);
> >> +    }
> >> +
> >> +  DotShStrtab.finalize();
> >>    return true;
> >>  }
> >>
> >> @@ -608,32 +622,23 @@ int ELFState<ELFT>::writeELF(raw_ostream
> >>                                             Header.e_shentsize *
> Header.e_shnum;
> >>    ContiguousBlobAccumulator CBA(SectionContentBeginOffset);
> >>
> >> -  // Doc might not contain .symtab, .strtab and .shstrtab sections,
> >> -  // but we will emit them, so make sure to add them to
> ShStrTabSHeader.
> >> -  State.DotShStrtab.add(".symtab");
> >> -  State.DotShStrtab.add(".strtab");
> >> -  State.DotShStrtab.add(".shstrtab");
> >> -
> >>    std::vector<Elf_Shdr> SHeaders;
> >> +  SHeaders.reserve(State.SN2I.size());
> >>    if(!State.initSectionHeaders(SHeaders, CBA))
> >>      return 1;
> >>
> >> -  // .symtab section.
> >> -  Elf_Shdr SymtabSHeader;
> >> -  State.initSymtabSectionHeader(SymtabSHeader, CBA);
> >> -  SHeaders.push_back(SymtabSHeader);
> >> -
> >> -  // .strtab string table header.
> >> -  Elf_Shdr DotStrTabSHeader;
> >> -  State.initStrtabSectionHeader(DotStrTabSHeader, ".strtab",
> State.DotStrtab,
> >> -                                CBA);
> >> -  SHeaders.push_back(DotStrTabSHeader);
> >> -
> >> -  // .shstrtab string table header.
> >> -  Elf_Shdr ShStrTabSHeader;
> >> -  State.initStrtabSectionHeader(ShStrTabSHeader, ".shstrtab",
> State.DotShStrtab,
> >> -                                CBA);
> >> -  SHeaders.push_back(ShStrTabSHeader);
> >> +  // Populate SHeaders with implicit sections not present in the Doc
> >> +  for (const auto &Name : ImplicitSecNames)
> >> +    if (State.SN2I.get(Name) >= SHeaders.size())
> >> +      SHeaders.push_back({});
> >> +
> >> +  // Initialize the implicit sections
> >> +  auto Index = State.SN2I.get(".symtab");
> >> +  State.initSymtabSectionHeader(SHeaders[Index], CBA);
> >> +  Index = State.SN2I.get(".strtab");
> >> +  State.initStrtabSectionHeader(SHeaders[Index], ".strtab",
> State.DotStrtab, CBA);
> >> +  Index = State.SN2I.get(".shstrtab");
> >> +  State.initStrtabSectionHeader(SHeaders[Index], ".shstrtab",
> State.DotShStrtab, CBA);
> >>
> >>    // Now we can decide segment offsets
> >>    State.setProgramHeaderLayout(PHeaders, SHeaders);
> >>
> >>
> >> _______________________________________________
> >> llvm-commits mailing list
> >> llvm-commits at lists.llvm.org
> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171107/32548f0a/attachment.html>


More information about the llvm-commits mailing list