[lld] r352068 - Partial support of SHT_GROUP without flag

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 25 09:01:28 PST 2019


Merged to 8.0 in r352218.

On Thu, Jan 24, 2019 at 9:56 AM Serge Guelton via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
>
> Author: serge_sans_paille
> Date: Thu Jan 24 09:56:08 2019
> New Revision: 352068
>
> URL: http://llvm.org/viewvc/llvm-project?rev=352068&view=rev
> Log:
> Partial support of SHT_GROUP without flag
>
> This does *not* implement full SHT_GROUP semantic, yet it is a simple step forward:
> Sections within a group are still considered valid, but they do not behave as
> specified by the standard in case of garbage collection.
>
> Differential Revision: https://reviews.llvm.org/D56437
>
> Added:
>     lld/trunk/test/ELF/sht-group-empty.test
> Modified:
>     lld/trunk/ELF/InputFiles.cpp
>
> Modified: lld/trunk/ELF/InputFiles.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputFiles.cpp?rev=352068&r1=352067&r2=352068&view=diff
> ==============================================================================
> --- lld/trunk/ELF/InputFiles.cpp (original)
> +++ lld/trunk/ELF/InputFiles.cpp Thu Jan 24 09:56:08 2019
> @@ -319,17 +319,6 @@ StringRef ObjFile<ELFT>::getShtGroupSign
>    return Signature;
>  }
>
> -template <class ELFT>
> -ArrayRef<typename ObjFile<ELFT>::Elf_Word>
> -ObjFile<ELFT>::getShtGroupEntries(const Elf_Shdr &Sec) {
> -  const ELFFile<ELFT> &Obj = this->getObj();
> -  ArrayRef<Elf_Word> Entries =
> -      CHECK(Obj.template getSectionContentsAsArray<Elf_Word>(&Sec), this);
> -  if (Entries.empty() || Entries[0] != GRP_COMDAT)
> -    fatal(toString(this) + ": unsupported SHT_GROUP format");
> -  return Entries.slice(1);
> -}
> -
>  template <class ELFT> bool ObjFile<ELFT>::shouldMerge(const Elf_Shdr &Sec) {
>    // On a regular link we don't merge sections if -O0 (default is -O1). This
>    // sometimes makes the linker significantly faster, although the output will
> @@ -439,26 +428,34 @@ void ObjFile<ELFT>::initializeSections(
>      case SHT_GROUP: {
>        // De-duplicate section groups by their signatures.
>        StringRef Signature = getShtGroupSignature(ObjSections, Sec);
> -      bool IsNew = ComdatGroups.insert(CachedHashStringRef(Signature)).second;
>        this->Sections[I] = &InputSection::Discarded;
>
> -      // We only support GRP_COMDAT type of group. Get the all entries of the
> -      // section here to let getShtGroupEntries to check the type early for us.
> -      ArrayRef<Elf_Word> Entries = getShtGroupEntries(Sec);
> -
> -      // If it is a new section group, we want to keep group members.
> -      // Group leader sections, which contain indices of group members, are
> -      // discarded because they are useless beyond this point. The only
> -      // exception is the -r option because in order to produce re-linkable
> -      // object files, we want to pass through basically everything.
> +
> +      ArrayRef<Elf_Word> Entries =
> +          CHECK(Obj.template getSectionContentsAsArray<Elf_Word>(&Sec), this);
> +      if (Entries.empty())
> +        fatal(toString(this) + ": empty SHT_GROUP");
> +
> +      // The first word of a SHT_GROUP section contains flags. Currently,
> +      // the standard defines only "GRP_COMDAT" flag for the COMDAT group.
> +      // An group with the empty flag doesn't define anything; such sections
> +      // are just skipped.
> +      if (Entries[0] == 0)
> +        continue;
> +
> +      if (Entries[0] != GRP_COMDAT)
> +        fatal(toString(this) + ": unsupported SHT_GROUP format");
> +
> +      bool IsNew = ComdatGroups.insert(CachedHashStringRef(Signature)).second;
>        if (IsNew) {
>          if (Config->Relocatable)
>            this->Sections[I] = createInputSection(Sec);
> -        continue;
> +       continue;
>        }
>
> +
>        // Otherwise, discard group members.
> -      for (uint32_t SecIndex : Entries) {
> +      for (uint32_t SecIndex : Entries.slice(1)) {
>          if (SecIndex >= Size)
>            fatal(toString(this) +
>                  ": invalid section index in group: " + Twine(SecIndex));
>
> Added: lld/trunk/test/ELF/sht-group-empty.test
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/sht-group-empty.test?rev=352068&view=auto
> ==============================================================================
> --- lld/trunk/test/ELF/sht-group-empty.test (added)
> +++ lld/trunk/test/ELF/sht-group-empty.test Thu Jan 24 09:56:08 2019
> @@ -0,0 +1,55 @@
> +# RUN: yaml2obj %s -o %t.o
> +# RUN: ld.lld %t.o %t.o -o %t -r
> +# RUN: llvm-readobj -s %t | FileCheck %s
> +
> +# CHECK:     Name: .text.foo
> +# CHECK:     Name: .rela.text.foo
> +
> +--- !ELF
> +FileHeader:
> +  Class:           ELFCLASS64
> +  Data:            ELFDATA2LSB
> +  Type:            ET_REL
> +  Machine:         EM_X86_64
> +Sections:
> +  - Name:            .group
> +    Type:            SHT_GROUP
> +    Link:            .symtab
> +    Info:            foo
> +    Members:
> +      - SectionOrType:    GRP_COMDAT
> +      - SectionOrType:    .text.foo
> +      - SectionOrType:    .text.bar
> +      - SectionOrType:    .note
> +  - Name:            .note
> +    Type:            SHT_NOTE
> +    Flags:           [ SHF_GROUP ]
> +  - Name:            .text.foo
> +    Type:            SHT_PROGBITS
> +    Flags:           [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
> +  - Name:            .text.bar
> +    Type:            SHT_PROGBITS
> +    Flags:           [ SHF_ALLOC, SHF_EXECINSTR, SHF_GROUP ]
> +  - Name:            .rela.text.foo
> +    Type:            SHT_RELA
> +    Flags:           [ SHF_INFO_LINK, SHF_GROUP ]
> +    Link:            .symtab
> +    Info:            .text.foo
> +    Relocations:
> +      - Offset:          0x0000000000000000
> +        Symbol:          foo
> +        Type:            R_X86_64_64
> +  - Name:            .rela.text.bar
> +    Type:            SHT_RELA
> +    Flags:           [ SHF_INFO_LINK, SHF_GROUP ]
> +    Link:            .symtab
> +    Info:            .text.bar
> +    Relocations:
> +      - Offset:          0x0000000000000000
> +        Symbol:          bar
> +        Type:            R_X86_64_64
> +Symbols:
> +  Global:
> +    - Name:            foo
> +    - Name:            bar
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list