[lld] r317447 - ELF: Remove DefinedCommon.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 15 10:59:05 PST 2017


Thanks!

Peter Collingbourne via llvm-commits <llvm-commits at lists.llvm.org>
writes:

> Author: pcc
> Date: Sun Nov  5 20:33:58 2017
> New Revision: 317447
>
> URL: http://llvm.org/viewvc/llvm-project?rev=317447&view=rev
> Log:
> ELF: Remove DefinedCommon.
>
> Common symbols are now represented with a DefinedRegular that points
> to a BssSection, even during symbol resolution.
>
> Differential Revision: https://reviews.llvm.org/D39666
>
> Modified:
>     lld/trunk/ELF/Driver.cpp
>     lld/trunk/ELF/InputSection.h
>     lld/trunk/ELF/SymbolTable.cpp
>     lld/trunk/ELF/Symbols.cpp
>     lld/trunk/ELF/Symbols.h
>     lld/trunk/ELF/SyntheticSections.cpp
>     lld/trunk/ELF/SyntheticSections.h
>     lld/trunk/test/ELF/relocatable-common.s
>
> Modified: lld/trunk/ELF/Driver.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Driver.cpp?rev=317447&r1=317446&r2=317447&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Driver.cpp (original)
> +++ lld/trunk/ELF/Driver.cpp Sun Nov  5 20:33:58 2017
> @@ -1121,14 +1121,6 @@ template <class ELFT> void LinkerDriver:
>    if (!Config->Relocatable)
>      InputSections.push_back(createCommentSection<ELFT>());
>  
> -  // Create a .bss section for each common symbol and then replace the common
> -  // symbol with a DefinedRegular symbol. As a result, all common symbols are
> -  // "instantiated" as regular defined symbols, so that we don't need to care
> -  // about common symbols beyond this point. Note that if -r is given, we just
> -  // need to pass through common symbols as-is.
> -  if (Config->DefineCommon)
> -    createCommonSections<ELFT>();
> -
>    // Do size optimizations: garbage collection, merging of SHF_MERGE sections
>    // and identical code folding.
>    markLive<ELFT>();
>
> Modified: lld/trunk/ELF/InputSection.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.h?rev=317447&r1=317446&r2=317447&view=diff
> ==============================================================================
> --- lld/trunk/ELF/InputSection.h (original)
> +++ lld/trunk/ELF/InputSection.h Sun Nov  5 20:33:58 2017
> @@ -24,7 +24,6 @@
>  namespace lld {
>  namespace elf {
>  
> -class DefinedCommon;
>  class Symbol;
>  struct SectionPiece;
>  
> @@ -55,6 +54,8 @@ public:
>    // If GC is disabled, all sections are considered live by default.
>    unsigned Live : 1;
>  
> +  unsigned Bss : 1;
> +
>    // These corresponds to the fields in Elf_Shdr.
>    uint32_t Alignment;
>    uint64_t Flags;
> @@ -78,7 +79,7 @@ protected:
>    SectionBase(Kind SectionKind, StringRef Name, uint64_t Flags,
>                uint64_t Entsize, uint64_t Alignment, uint32_t Type,
>                uint32_t Info, uint32_t Link)
> -      : Name(Name), SectionKind(SectionKind), Live(false),
> +      : Name(Name), SectionKind(SectionKind), Live(false), Bss(false),
>          Alignment(Alignment), Flags(Flags), Entsize(Entsize), Type(Type),
>          Link(Link), Info(Info) {}
>  };
>
> Modified: lld/trunk/ELF/SymbolTable.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=317447&r1=317446&r2=317447&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SymbolTable.cpp (original)
> +++ lld/trunk/ELF/SymbolTable.cpp Sun Nov  5 20:33:58 2017
> @@ -19,6 +19,7 @@
>  #include "LinkerScript.h"
>  #include "Memory.h"
>  #include "Symbols.h"
> +#include "SyntheticSections.h"
>  #include "lld/Common/ErrorHandler.h"
>  #include "llvm/ADT/STLExtras.h"
>  
> @@ -365,13 +366,13 @@ static int compareDefinedNonCommon(Symbo
>        S->Binding = Binding;
>      return Cmp;
>    }
> -  if (isa<DefinedCommon>(S)) {
> -    // Non-common symbols take precedence over common symbols.
> -    if (Config->WarnCommon)
> -      warn("common " + S->getName() + " is overridden");
> -    return 1;
> -  }
>    if (auto *R = dyn_cast<DefinedRegular>(S)) {
> +    if (R->Section && isa<BssSection>(R->Section)) {
> +      // Non-common symbols take precedence over common symbols.
> +      if (Config->WarnCommon)
> +        warn("common " + S->getName() + " is overridden");
> +      return 1;
> +    }
>      if (R->Section == nullptr && Binding == STB_GLOBAL && IsAbsolute &&
>          R->Value == Value)
>        return -1;
> @@ -388,11 +389,18 @@ Symbol *SymbolTable::addCommon(StringRef
>                                      /*CanOmitFromDynSym*/ false, File);
>    int Cmp = compareDefined(S, WasInserted, Binding, N);
>    if (Cmp > 0) {
> +    auto *Bss = make<BssSection>("COMMON", Size, Alignment);
> +    Bss->File = File;
> +    Bss->Live = !Config->GcSections;
> +    InputSections.push_back(Bss);
> +
>      S->Binding = Binding;
> -    replaceSymbol<DefinedCommon>(S, File, N, Size, Alignment, StOther, Type);
> +    replaceSymbol<DefinedRegular>(S, File, N, /*IsLocal=*/false, StOther, Type,
> +                                  0, Size, Bss);
>    } else if (Cmp == 0) {
> -    auto *C = dyn_cast<DefinedCommon>(S);
> -    if (!C) {
> +    auto *D = cast<DefinedRegular>(S);
> +    auto *Bss = dyn_cast_or_null<BssSection>(D->Section);
> +    if (!Bss) {
>        // Non-common symbols take precedence over common symbols.
>        if (Config->WarnCommon)
>          warn("common " + S->getName() + " is overridden");
> @@ -400,11 +408,13 @@ Symbol *SymbolTable::addCommon(StringRef
>      }
>  
>      if (Config->WarnCommon)
> -      warn("multiple common of " + S->getName());
> +      warn("multiple common of " + D->getName());
>  
> -    Alignment = C->Alignment = std::max(C->Alignment, Alignment);
> -    if (Size > C->Size)
> -      replaceSymbol<DefinedCommon>(S, File, N, Size, Alignment, StOther, Type);
> +    Bss->Alignment = std::max(Bss->Alignment, Alignment);
> +    if (Size > Bss->Size) {
> +      D->File = Bss->File = File;
> +      D->Size = Bss->Size = Size;
> +    }
>    }
>    return S;
>  }
>
> Modified: lld/trunk/ELF/Symbols.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=317447&r1=317446&r2=317447&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.cpp (original)
> +++ lld/trunk/ELF/Symbols.cpp Sun Nov  5 20:33:58 2017
> @@ -99,8 +99,6 @@ static uint64_t getSymVA(const Symbol &S
>      }
>      return VA;
>    }
> -  case Symbol::DefinedCommonKind:
> -    llvm_unreachable("common are converted to bss");
>    case Symbol::SharedKind: {
>      auto &SS = cast<SharedSymbol>(Sym);
>      if (SS.CopyRelSec)
> @@ -182,8 +180,6 @@ uint64_t Symbol::getPltVA() const {
>  }
>  
>  uint64_t Symbol::getSize() const {
> -  if (const auto *C = dyn_cast<DefinedCommon>(this))
> -    return C->Size;
>    if (const auto *DR = dyn_cast<DefinedRegular>(this))
>      return DR->Size;
>    if (const auto *S = dyn_cast<SharedSymbol>(this))
> @@ -204,12 +200,6 @@ OutputSection *Symbol::getOutputSection(
>      return nullptr;
>    }
>  
> -  if (auto *S = dyn_cast<DefinedCommon>(this)) {
> -    if (Config->DefineCommon)
> -      return S->Section->getParent();
> -    return nullptr;
> -  }
> -
>    return nullptr;
>  }
>  
> @@ -321,12 +311,12 @@ void elf::printTraceSymbol(Symbol *Sym)
>    std::string S;
>    if (Sym->isUndefined())
>      S = ": reference to ";
> -  else if (Sym->isCommon())
> -    S = ": common definition of ";
>    else if (Sym->isLazy())
>      S = ": lazy definition of ";
>    else if (Sym->isShared())
>      S = ": shared definition of ";
> +  else if (dyn_cast_or_null<BssSection>(cast<DefinedRegular>(Sym)->Section))
> +    S = ": common definition of ";
>    else
>      S = ": definition of ";
>  
>
> Modified: lld/trunk/ELF/Symbols.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=317447&r1=317446&r2=317447&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.h (original)
> +++ lld/trunk/ELF/Symbols.h Sun Nov  5 20:33:58 2017
> @@ -40,8 +40,7 @@ public:
>    enum Kind {
>      DefinedFirst,
>      DefinedRegularKind = DefinedFirst,
> -    DefinedCommonKind,
> -    DefinedLast = DefinedCommonKind,
> +    DefinedLast = DefinedRegularKind,
>      SharedKind,
>      UndefinedKind,
>      LazyArchiveKind,
> @@ -97,7 +96,6 @@ public:
>  
>    bool isUndefined() const { return SymbolKind == UndefinedKind; }
>    bool isDefined() const { return SymbolKind <= DefinedLast; }
> -  bool isCommon() const { return SymbolKind == DefinedCommonKind; }
>    bool isShared() const { return SymbolKind == SharedKind; }
>    bool isLocal() const { return IsLocal; }
>  
> @@ -106,7 +104,7 @@ public:
>    }
>  
>    bool isInCurrentOutput() const {
> -    return SymbolKind == DefinedRegularKind || SymbolKind == DefinedCommonKind;
> +    return SymbolKind == DefinedRegularKind;
>    }
>  
>    // True is this is an undefined weak symbol. This only works once
> @@ -199,26 +197,6 @@ public:
>    static bool classof(const Symbol *S) { return S->isDefined(); }
>  };
>  
> -class DefinedCommon : public Defined {
> -public:
> -  DefinedCommon(StringRef Name, uint64_t Size, uint32_t Alignment,
> -                uint8_t StOther, uint8_t Type)
> -      : Defined(DefinedCommonKind, Name, /*IsLocal=*/false, StOther, Type),
> -        Alignment(Alignment), Size(Size) {}
> -
> -  static bool classof(const Symbol *S) {
> -    return S->kind() == DefinedCommonKind;
> -  }
> -
> -  // The maximum alignment we have seen for this symbol.
> -  uint32_t Alignment;
> -
> -  // The output offset of this common symbol in the output bss.
> -  // Computed by the writer.
> -  uint64_t Size;
> -  BssSection *Section = nullptr;
> -};
> -
>  // Regular defined symbols read from object file symbol tables.
>  class DefinedRegular : public Defined {
>  public:
> @@ -378,7 +356,6 @@ struct ElfSym {
>  // using the placement new.
>  union SymbolUnion {
>    alignas(DefinedRegular) char A[sizeof(DefinedRegular)];
> -  alignas(DefinedCommon) char B[sizeof(DefinedCommon)];
>    alignas(Undefined) char C[sizeof(Undefined)];
>    alignas(SharedSymbol) char D[sizeof(SharedSymbol)];
>    alignas(LazyArchive) char E[sizeof(LazyArchive)];
>
> Modified: lld/trunk/ELF/SyntheticSections.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=317447&r1=317446&r2=317447&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SyntheticSections.cpp (original)
> +++ lld/trunk/ELF/SyntheticSections.cpp Sun Nov  5 20:33:58 2017
> @@ -63,29 +63,6 @@ uint64_t SyntheticSection::getVA() const
>    return 0;
>  }
>  
> -// Create a .bss section for each common symbol and replace the common symbol
> -// with a DefinedRegular symbol.
> -template <class ELFT> void elf::createCommonSections() {
> -  for (Symbol *S : Symtab->getSymbols()) {
> -    auto *Sym = dyn_cast<DefinedCommon>(S);
> -
> -    if (!Sym)
> -      continue;
> -
> -    // Create a synthetic section for the common data.
> -    auto *Section = make<BssSection>("COMMON", Sym->Size, Sym->Alignment);
> -    Section->File = Sym->getFile();
> -    Section->Live = !Config->GcSections;
> -    InputSections.push_back(Section);
> -
> -    // Replace all DefinedCommon symbols with DefinedRegular symbols so that we
> -    // don't have to care about DefinedCommon symbols beyond this point.
> -    replaceSymbol<DefinedRegular>(
> -        S, Sym->getFile(), Sym->getName(), static_cast<bool>(Sym->isLocal()),
> -        Sym->StOther, Sym->Type, 0, Sym->getSize(), Section);
> -  }
> -}
> -
>  // Returns an LLD version string.
>  static ArrayRef<uint8_t> getVersion() {
>    // Check LLD_VERSION first for ease of testing.
> @@ -367,6 +344,7 @@ void BuildIdSection::computeHash(
>  
>  BssSection::BssSection(StringRef Name, uint64_t Size, uint32_t Alignment)
>      : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_NOBITS, Alignment, Name) {
> +  this->Bss = true;
>    if (OutputSection *Sec = getParent())
>      Sec->Alignment = std::max(Sec->Alignment, Alignment);
>    this->Size = Size;
> @@ -1596,12 +1574,16 @@ template <class ELFT> void SymbolTableSe
>      ESym->st_name = Ent.StrTabOffset;
>  
>      // Set a section index.
> -    if (const OutputSection *OutSec = Sym->getOutputSection())
> +    BssSection *CommonSec = nullptr;
> +    if (!Config->DefineCommon)
> +      if (auto *D = dyn_cast<DefinedRegular>(Sym))
> +        CommonSec = dyn_cast_or_null<BssSection>(D->Section);
> +    if (CommonSec)
> +      ESym->st_shndx = SHN_COMMON;
> +    else if (const OutputSection *OutSec = Sym->getOutputSection())
>        ESym->st_shndx = OutSec->SectionIndex;
>      else if (isa<DefinedRegular>(Sym))
>        ESym->st_shndx = SHN_ABS;
> -    else if (isa<DefinedCommon>(Sym))
> -      ESym->st_shndx = SHN_COMMON;
>      else
>        ESym->st_shndx = SHN_UNDEF;
>  
> @@ -1618,8 +1600,8 @@ template <class ELFT> void SymbolTableSe
>      // st_value is usually an address of a symbol, but that has a
>      // special meaining for uninstantiated common symbols (this can
>      // occur if -r is given).
> -    if (!Config->DefineCommon && isa<DefinedCommon>(Sym))
> -      ESym->st_value = cast<DefinedCommon>(Sym)->Alignment;
> +    if (CommonSec)
> +      ESym->st_value = CommonSec->Alignment;
>      else
>        ESym->st_value = Sym->getVA();
>  
> @@ -2642,11 +2624,6 @@ template void PltSection::addEntry<ELF32
>  template void PltSection::addEntry<ELF64LE>(Symbol &Sym);
>  template void PltSection::addEntry<ELF64BE>(Symbol &Sym);
>  
> -template void elf::createCommonSections<ELF32LE>();
> -template void elf::createCommonSections<ELF32BE>();
> -template void elf::createCommonSections<ELF64LE>();
> -template void elf::createCommonSections<ELF64BE>();
> -
>  template MergeInputSection *elf::createCommentSection<ELF32LE>();
>  template MergeInputSection *elf::createCommentSection<ELF32BE>();
>  template MergeInputSection *elf::createCommentSection<ELF64LE>();
>
> Modified: lld/trunk/ELF/SyntheticSections.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.h?rev=317447&r1=317446&r2=317447&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SyntheticSections.h (original)
> +++ lld/trunk/ELF/SyntheticSections.h Sun Nov  5 20:33:58 2017
> @@ -159,7 +159,7 @@ public:
>    bool empty() const override { return getSize() == 0; }
>    size_t getSize() const override { return Size; }
>  
> -private:
> +  static bool classof(const SectionBase *S) { return S->Bss; }
>    uint64_t Size;
>  };
>  
> @@ -821,7 +821,6 @@ private:
>    size_t Size = 0;
>  };
>  
> -template <class ELFT> void createCommonSections();
>  InputSection *createInterpSection();
>  template <class ELFT> MergeInputSection *createCommentSection();
>  void decompressSections();
>
> Modified: lld/trunk/test/ELF/relocatable-common.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/relocatable-common.s?rev=317447&r1=317446&r2=317447&view=diff
> ==============================================================================
> --- lld/trunk/test/ELF/relocatable-common.s (original)
> +++ lld/trunk/test/ELF/relocatable-common.s Sun Nov  5 20:33:58 2017
> @@ -30,7 +30,7 @@
>  # DEFCOMM-NEXT:   Binding: Global
>  # DEFCOMM-NEXT:   Type: Object
>  # DEFCOMM-NEXT:   Other: 0
> -# DEFCOMM-NEXT:   Section: COMMON (0x2)
> +# DEFCOMM-NEXT:   Section: COMMON
>  # DEFCOMM-NEXT: }
>  
>  .comm common,4,4
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list