[lld] r312796 - Currently lld creates a single section to collect all commons. There is no way

Mikulin, Dmitry via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 12 14:45:10 PDT 2017


325 symbols is not enough to cause a degradation of 0.8 secs on a 4.5 sec link, which presumably does things other than dealing with commons. I measured a link with 100K commons and it added 0.225 secs to a link of 0.325 secs. This is very significant, but this synthetic test case was doing nothing but processing commons, there was no other code. 

Can you get profile data for your link to see more precisely where the increase is coming from?


> On Sep 12, 2017, at 2:31 PM, Shoaib Meenai <smeenai at fb.com> wrote:
> 
> It's written in C, and it has 325 common symbols.
> 
> I only read up on common symbols today, so please correct me if my
> understanding is off. From what I've read, you'll end up with a common symbol
> in your object file if you have an uninitialized non-static global variable,
> e.g. (in the global scope):
> 
> int x;
> 
> If you mark the variable static, or if you explicitly zero-initialize it,
> it'll end up in bss instead of COMMON. You can also use -fno-common to force
> the use of bss, and C++ does so by default.
> 
> I understand that COMMON symbols were originally devised to deal with people
> writing `int x` instead of `extern int x` in headers. My library doesn't have
> that problem; the `int x` form is used only in source files, and the intent is
> to define a variable and have it be automatically zero-initialized. I was
> hoping that if a variable was preceded by an extern declaration, e.g.
> 
> extern int x;
> ...
> int x;
> 
> the compiler would place it in bss instead of COMMON, but that doesn't appear
> to be the case.
> 
> I'll try compiling my sources with -fno-common. This definitely seems like
> something a lot of libraries could run into though, since it looks like all
> you need to trigger it is an uninitialized global variable.
> 
> On 9/12/17, 1:25 PM, "Rafael Avila de Espindola" <rafael.espindola at gmail.com> wrote:
> 
>    How many common symbols do you see in your library? What language is it
>    written in?
> 
>    Cheers,
>    Rafael
> 
>    Shoaib Meenai <smeenai at fb.com> writes:
> 
>> I'm seeing an 18% regression in link times for a large library from this
>> change (it increases from ~4.5 seconds to ~5.3 seconds). I'm looking into why
>> the library I'm linking has so many common symbols, since from the discussion
>> on the patch it sounds like common symbols should be relatively rare, but
>> there are probably other binaries out there which are similarly regressed.
>> 
>> On 9/8/17, 9:24 AM, "llvm-commits on behalf of Dmitry Mikulin via llvm-commits" <llvm-commits-bounces at lists.llvm.org on behalf of llvm-commits at lists.llvm.org> wrote:
>> 
>>    Author: dmikulin
>>    Date: Fri Sep  8 09:22:43 2017
>>    New Revision: 312796
>> 
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D312796-26view-3Drev&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=F0escWBl3X6bxsDuK92_UGN64Bcg7zhj2C7t3I1SJqQ&e= 
>>    Log:
>>    Currently lld creates a single section to collect all commons. There is no way
>>    to separate commons based on file name patterns. The following linker script
>>    construct does not work because commons are allocated before section placement
>>    is done and the only synthesized BssSection that holds all commons has no file
>>    associated with it:
>>    SECTIONS { .common_0 : { *file0.o(COMMON) }}
>> 
>>    This patch changes the allocation of commons to create a section per common
>>    symbol and let the section logic do the layout.
>> 
>>    Differential revision: https://urldefense.proofpoint.com/v2/url?u=https-3A__reviews.llvm.org_D37489&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=hohyhSx7Or16JdZrgLzWWM6xJR5MYfzYxT7efGbRmfM&e= 
>> 
>>    Added:
>>        lld/trunk/test/ELF/linkerscript/Inputs/common-filespec1.s
>>        lld/trunk/test/ELF/linkerscript/Inputs/common-filespec2.s
>>        lld/trunk/test/ELF/linkerscript/common-exclude.s
>>        lld/trunk/test/ELF/linkerscript/common-filespec.s
>>    Modified:
>>        lld/trunk/ELF/LinkerScript.cpp
>>        lld/trunk/ELF/MapFile.cpp
>>        lld/trunk/ELF/Symbols.cpp
>>        lld/trunk/ELF/Symbols.h
>>        lld/trunk/ELF/SyntheticSections.cpp
>>        lld/trunk/ELF/SyntheticSections.h
>>        lld/trunk/ELF/Writer.cpp
>>        lld/trunk/test/ELF/common.s
>>        lld/trunk/test/ELF/linkerscript/common.s
>>        lld/trunk/test/ELF/linkerscript/discard-section-err.s
>>        lld/trunk/test/ELF/map-file.s
>> 
>>    Modified: lld/trunk/ELF/LinkerScript.cpp
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_LinkerScript.cpp-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=aoZ7kwk46HKH2ETf1dfWh2-cXemDYt9vf9VnTnLdcuk&e= 
>>    ==============================================================================
>>    --- lld/trunk/ELF/LinkerScript.cpp (original)
>>    +++ lld/trunk/ELF/LinkerScript.cpp Fri Sep  8 09:22:43 2017
>>    @@ -174,17 +174,17 @@ bool BytesDataCommand::classof(const Bas
>>       return C->Kind == BytesDataKind;
>>     }
>> 
>>    -static std::string filename(InputSectionBase *S) {
>>    -  if (!S->File)
>>    +static std::string filename(InputFile *File) {
>>    +  if (!File)
>>         return "";
>>    -  if (S->File->ArchiveName.empty())
>>    -    return S->File->getName();
>>    -  return (S->File->ArchiveName + "(" + S->File->getName() + ")").str();
>>    +  if (File->ArchiveName.empty())
>>    +    return File->getName();
>>    +  return (File->ArchiveName + "(" + File->getName() + ")").str();
>>     }
>> 
>>     bool LinkerScript::shouldKeep(InputSectionBase *S) {
>>       for (InputSectionDescription *ID : Opt.KeptSections) {
>>    -    std::string Filename = filename(S);
>>    +    std::string Filename = filename(S->File);
>>         if (ID->FilePat.match(Filename))
>>           for (SectionPattern &P : ID->SectionPatterns)
>>             if (P.SectionPat.match(S->Name))
>>    @@ -284,7 +284,7 @@ LinkerScript::computeInputSections(const
>>           if (Sec->Type == SHT_REL || Sec->Type == SHT_RELA)
>>             continue;
>> 
>>    -      std::string Filename = filename(Sec);
>>    +      std::string Filename = filename(Sec->File);
>>           if (!Cmd->FilePat.match(Filename) ||
>>               Pat.ExcludedFilePat.match(Filename) ||
>>               !Pat.SectionPat.match(Sec->Name))
>>    @@ -328,8 +328,8 @@ LinkerScript::computeInputSections(const
>>     void LinkerScript::discard(ArrayRef<InputSectionBase *> V) {
>>       for (InputSectionBase *S : V) {
>>         S->Live = false;
>>    -    if (S == InX::ShStrTab || S == InX::Common || S == InX::Dynamic ||
>>    -        S == InX::DynSymTab || S == InX::DynStrTab)
>>    +    if (S == InX::ShStrTab || S == InX::Dynamic || S == InX::DynSymTab ||
>>    +        S == InX::DynStrTab)
>>           error("discarding " + S->Name + " section is not allowed");
>>         discard(S->DependentSections);
>>       }
>>    @@ -868,7 +868,7 @@ ExprValue LinkerScript::getSymbolValue(c
>>         if (auto *D = dyn_cast<DefinedRegular>(B))
>>           return {D->Section, D->Value, Loc};
>>         if (auto *C = dyn_cast<DefinedCommon>(B))
>>    -      return {InX::Common, C->Offset, Loc};
>>    +      return {C->Section, C->Offset, Loc};
>>       }
>>       error(Loc + ": symbol not found: " + S);
>>       return 0;
>> 
>>    Modified: lld/trunk/ELF/MapFile.cpp
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_MapFile.cpp-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=B87yHQNSR1ktCxKmP5fqTXzkkaYLMPAVfCo512EUe3U&e= 
>>    ==============================================================================
>>    --- lld/trunk/ELF/MapFile.cpp (original)
>>    +++ lld/trunk/ELF/MapFile.cpp Fri Sep  8 09:22:43 2017
>>    @@ -57,7 +57,7 @@ template <class ELFT> static std::vector
>>                 DR->Section->Live)
>>               V.push_back(DR);
>>           } else if (auto *DC = dyn_cast<DefinedCommon>(B)) {
>>    -        if (InX::Common)
>>    +        if (DC->Section)
>>               V.push_back(DC);
>>           }
>>         }
>>    @@ -71,8 +71,8 @@ static SymbolMapTy getSectionSyms(ArrayR
>>       for (Defined *S : Syms) {
>>         if (auto *DR = dyn_cast<DefinedRegular>(S))
>>           Ret[DR->Section].push_back(S);
>>    -    else
>>    -      Ret[InX::Common].push_back(S);
>>    +    else if (auto *DC = dyn_cast<DefinedCommon>(S))
>>    +      Ret[DC->Section].push_back(S);
>>       }
>> 
>>       // Sort symbols by address. We want to print out symbols in the
>> 
>>    Modified: lld/trunk/ELF/Symbols.cpp
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Symbols.cpp-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=XJ8Ntw-_OTE941EcbDm-3QfMbWAOcu1SOcgas_WsuSs&e= 
>>    ==============================================================================
>>    --- lld/trunk/ELF/Symbols.cpp (original)
>>    +++ lld/trunk/ELF/Symbols.cpp Fri Sep  8 09:22:43 2017
>>    @@ -99,11 +99,13 @@ static uint64_t getSymVA(const SymbolBod
>>         }
>>         return VA;
>>       }
>>    -  case SymbolBody::DefinedCommonKind:
>>    +  case SymbolBody::DefinedCommonKind: {
>>         if (!Config->DefineCommon)
>>           return 0;
>>    -    return InX::Common->getParent()->Addr + InX::Common->OutSecOff +
>>    -           cast<DefinedCommon>(Body).Offset;
>>    +    auto DC = cast<DefinedCommon>(Body);
>>    +    return DC.Section->getParent()->Addr + DC.Section->OutSecOff +
>>    +           DC.Offset;
>>    +  }
>>       case SymbolBody::SharedKind: {
>>         auto &SS = cast<SharedSymbol>(Body);
>>         if (SS.CopyRelSec)
>>    @@ -202,9 +204,9 @@ OutputSection *SymbolBody::getOutputSect
>>         return nullptr;
>>       }
>> 
>>    -  if (isa<DefinedCommon>(this)) {
>>    +  if (auto *S = dyn_cast<DefinedCommon>(this)) {
>>         if (Config->DefineCommon)
>>    -      return InX::Common->getParent();
>>    +      return S->Section->getParent();
>>         return nullptr;
>>       }
>> 
>> 
>>    Modified: lld/trunk/ELF/Symbols.h
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Symbols.h-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=ymRvyEWwgVa7bH65RA-PV_nwJPNRP_rdJ9CqTwXyozs&e= 
>>    ==============================================================================
>>    --- lld/trunk/ELF/Symbols.h (original)
>>    +++ lld/trunk/ELF/Symbols.h Fri Sep  8 09:22:43 2017
>>    @@ -27,6 +27,7 @@ namespace elf {
>> 
>>     class ArchiveFile;
>>     class BitcodeFile;
>>    +class BssSection;
>>     class InputFile;
>>     class LazyObjFile;
>>     template <class ELFT> class ObjFile;
>>    @@ -173,6 +174,7 @@ public:
>>       // Computed by the writer.
>>       uint64_t Offset;
>>       uint64_t Size;
>>    +  BssSection *Section = nullptr;
>>     };
>> 
>>     // Regular defined symbols read from object file symbol tables.
>> 
>>    Modified: lld/trunk/ELF/SyntheticSections.cpp
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_SyntheticSections.cpp-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=hXG_5Y3y65iZ4sqHptPXnwR-j7hIeqRhMDdIVlgHkx4&e= 
>>    ==============================================================================
>>    --- lld/trunk/ELF/SyntheticSections.cpp (original)
>>    +++ lld/trunk/ELF/SyntheticSections.cpp Fri Sep  8 09:22:43 2017
>>    @@ -54,35 +54,22 @@ uint64_t SyntheticSection::getVA() const
>>       return 0;
>>     }
>> 
>>    -template <class ELFT> static std::vector<DefinedCommon *> getCommonSymbols() {
>>    -  std::vector<DefinedCommon *> V;
>>    -  for (Symbol *S : Symtab->getSymbols())
>>    -    if (auto *B = dyn_cast<DefinedCommon>(S->body()))
>>    -      V.push_back(B);
>>    -  return V;
>>    -}
>>    -
>>    -// Find all common symbols and allocate space for them.
>>    -template <class ELFT> InputSection *elf::createCommonSection() {
>>    +std::vector<InputSection *> elf::createCommonSections() {
>>       if (!Config->DefineCommon)
>>    -    return nullptr;
>>    +    return {};
>> 
>>    -  // Sort the common symbols by alignment as an heuristic to pack them better.
>>    -  std::vector<DefinedCommon *> Syms = getCommonSymbols<ELFT>();
>>    -  if (Syms.empty())
>>    -    return nullptr;
>>    -
>>    -  std::stable_sort(Syms.begin(), Syms.end(),
>>    -                   [](const DefinedCommon *A, const DefinedCommon *B) {
>>    -                     return A->Alignment > B->Alignment;
>>    -                   });
>>    +  std::vector<InputSection *> Ret;
>>    +  for (Symbol *S : Symtab->getSymbols()) {
>>    +    auto *Sym = dyn_cast<DefinedCommon>(S->body());
>>    +    if (!Sym || !Sym->Live)
>>    +      continue;
>> 
>>    -  // Allocate space for common symbols.
>>    -  BssSection *Sec = make<BssSection>("COMMON");
>>    -  for (DefinedCommon *Sym : Syms)
>>    -    if (Sym->Live)
>>    -      Sym->Offset = Sec->reserveSpace(Sym->Size, Sym->Alignment);
>>    -  return Sec;
>>    +    Sym->Section = make<BssSection>("COMMON");
>>    +    Sym->Offset = Sym->Section->reserveSpace(Sym->Size, Sym->Alignment);
>>    +    Sym->Section->File = Sym->getFile();
>>    +    Ret.push_back(Sym->Section);
>>    +  }
>>    +  return Ret;
>>     }
>> 
>>     // Returns an LLD version string.
>>    @@ -2321,7 +2308,6 @@ InputSection *InX::ARMAttributes;
>>     BssSection *InX::Bss;
>>     BssSection *InX::BssRelRo;
>>     BuildIdSection *InX::BuildId;
>>    -InputSection *InX::Common;
>>     SyntheticSection *InX::Dynamic;
>>     StringTableSection *InX::DynStrTab;
>>     SymbolTableBaseSection *InX::DynSymTab;
>>    @@ -2349,11 +2335,6 @@ template void PltSection::addEntry<ELF32
>>     template void PltSection::addEntry<ELF64LE>(SymbolBody &Sym);
>>     template void PltSection::addEntry<ELF64BE>(SymbolBody &Sym);
>> 
>>    -template InputSection *elf::createCommonSection<ELF32LE>();
>>    -template InputSection *elf::createCommonSection<ELF32BE>();
>>    -template InputSection *elf::createCommonSection<ELF64LE>();
>>    -template InputSection *elf::createCommonSection<ELF64BE>();
>>    -
>>     template MergeInputSection *elf::createCommentSection<ELF32LE>();
>>     template MergeInputSection *elf::createCommentSection<ELF32BE>();
>>     template MergeInputSection *elf::createCommentSection<ELF64LE>();
>> 
>>    Modified: lld/trunk/ELF/SyntheticSections.h
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_SyntheticSections.h-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=lygUGc_3nqWGjJ7d0VlcIx7YSp6SrVkX4khOu7ceK8M&e= 
>>    ==============================================================================
>>    --- lld/trunk/ELF/SyntheticSections.h (original)
>>    +++ lld/trunk/ELF/SyntheticSections.h Fri Sep  8 09:22:43 2017
>>    @@ -740,7 +740,7 @@ private:
>>       size_t Size = 0;
>>     };
>> 
>>    -template <class ELFT> InputSection *createCommonSection();
>>    +std::vector<InputSection *> createCommonSections();
>>     InputSection *createInterpSection();
>>     template <class ELFT> MergeInputSection *createCommentSection();
>>     void decompressAndMergeSections();
>>    @@ -754,7 +754,6 @@ struct InX {
>>       static BssSection *Bss;
>>       static BssSection *BssRelRo;
>>       static BuildIdSection *BuildId;
>>    -  static InputSection *Common;
>>       static SyntheticSection *Dynamic;
>>       static StringTableSection *DynStrTab;
>>       static SymbolTableBaseSection *DynSymTab;
>> 
>>    Modified: lld/trunk/ELF/Writer.cpp
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_ELF_Writer.cpp-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=Fo2NoJb9mo4IFU2cCnS7j5mYcFOr2N9yV4wo1Rosz-0&e= 
>>    ==============================================================================
>>    --- lld/trunk/ELF/Writer.cpp (original)
>>    +++ lld/trunk/ELF/Writer.cpp Fri Sep  8 09:22:43 2017
>>    @@ -299,9 +299,9 @@ template <class ELFT> void Writer<ELFT>:
>>         Add(InX::BuildId);
>>       }
>> 
>>    -  InX::Common = createCommonSection<ELFT>();
>>    -  if (InX::Common)
>>    -    Add(InX::Common);
>>    +  auto Commons = createCommonSections();
>>    +  for (InputSection *S : Commons)
>>    +    Add(S);
>> 
>>       InX::Bss = make<BssSection>(".bss");
>>       Add(InX::Bss);
>> 
>>    Modified: lld/trunk/test/ELF/common.s
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_test_ELF_common.s-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=mZkHgNpDyXmZKHfqYrDVazT2K-8jzhgGbaDe_E27Jx4&e= 
>>    ==============================================================================
>>    --- lld/trunk/test/ELF/common.s (original)
>>    +++ lld/trunk/test/ELF/common.s Fri Sep  8 09:22:43 2017
>>    @@ -12,13 +12,13 @@
>>     // CHECK-NEXT: ]
>>     // CHECK-NEXT: Address: 0x201000
>>     // CHECK-NEXT: Offset:
>>    -// CHECK-NEXT: Size: 22
>>    +// CHECK-NEXT: Size: 36
>>     // CHECK-NEXT: Link: 0
>>     // CHECK-NEXT: Info: 0
>>     // CHECK-NEXT: AddressAlignment: 16
>> 
>>     // CHECK:      Name: sym1
>>    -// CHECK-NEXT: Value: 0x201004
>>    +// CHECK-NEXT: Value: 0x201000
>>     // CHECK-NEXT: Size: 8
>>     // CHECK-NEXT: Binding: Global
>>     // CHECK-NEXT: Type: Object
>>    @@ -26,7 +26,7 @@
>>     // CHECK-NEXT: Section: .bss
>> 
>>     // CHECK:      Name: sym2
>>    -// CHECK-NEXT: Value: 0x20100C
>>    +// CHECK-NEXT: Value: 0x201008
>>     // CHECK-NEXT: Size: 8
>>     // CHECK-NEXT: Binding: Global
>>     // CHECK-NEXT: Type: Object
>>    @@ -34,7 +34,7 @@
>>     // CHECK-NEXT: Section: .bss
>> 
>>     // CHECK:      Name: sym3
>>    -// CHECK-NEXT: Value: 0x201014
>>    +// CHECK-NEXT: Value: 0x201010
>>     // CHECK-NEXT: Size: 2
>>     // CHECK-NEXT: Binding: Global
>>     // CHECK-NEXT: Type: Object
>>    @@ -42,7 +42,7 @@
>>     // CHECK-NEXT: Section: .bss
>> 
>>     // CHECK:      Name: sym4
>>    -// CHECK-NEXT: Value: 0x201000
>>    +// CHECK-NEXT: Value: 0x201020
>>     // CHECK-NEXT: Size: 4
>>     // CHECK-NEXT: Binding: Global
>>     // CHECK-NEXT: Type: Object
>> 
>>    Added: lld/trunk/test/ELF/linkerscript/Inputs/common-filespec1.s
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_test_ELF_linkerscript_Inputs_common-2Dfilespec1.s-3Frev-3D312796-26view-3Dauto&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=OTi1bORibcoRGd3l3yexjTochdxrHao98pq17krBYGY&e= 
>>    ==============================================================================
>>    --- lld/trunk/test/ELF/linkerscript/Inputs/common-filespec1.s (added)
>>    +++ lld/trunk/test/ELF/linkerscript/Inputs/common-filespec1.s Fri Sep  8 09:22:43 2017
>>    @@ -0,0 +1,2 @@
>>    +.comm common_uniq_1,8,8
>>    +.comm common_multiple,16,8
>> 
>>    Added: lld/trunk/test/ELF/linkerscript/Inputs/common-filespec2.s
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_test_ELF_linkerscript_Inputs_common-2Dfilespec2.s-3Frev-3D312796-26view-3Dauto&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=L7MG3FqsEmFJk4lHR_DwrFl9wC4iy906C5ukU5K4-iI&e= 
>>    ==============================================================================
>>    --- lld/trunk/test/ELF/linkerscript/Inputs/common-filespec2.s (added)
>>    +++ lld/trunk/test/ELF/linkerscript/Inputs/common-filespec2.s Fri Sep  8 09:22:43 2017
>>    @@ -0,0 +1,2 @@
>>    +.comm common_uniq_2,16,16
>>    +.comm common_multiple,32,8
>> 
>>    Added: lld/trunk/test/ELF/linkerscript/common-exclude.s
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_test_ELF_linkerscript_common-2Dexclude.s-3Frev-3D312796-26view-3Dauto&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=b82z4zBHvvWyIABOGqEEBFCIHvF-HnzBQKeZMoUMU6E&e= 
>>    ==============================================================================
>>    --- lld/trunk/test/ELF/linkerscript/common-exclude.s (added)
>>    +++ lld/trunk/test/ELF/linkerscript/common-exclude.s Fri Sep  8 09:22:43 2017
>>    @@ -0,0 +1,86 @@
>>    +# REQUIRES: x86
>>    +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %tfile0.o
>>    +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/common-filespec1.s -o %tfile1.o
>>    +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/common-filespec2.s -o %tfile2.o
>>    +# RUN: echo "SECTIONS { .common.incl : { *(EXCLUDE_FILE (*file2.o) COMMON) } .common.excl : { *(COMMON) } }" > %t.script
>>    +# RUN: ld.lld -o %t1 --script %t.script %tfile0.o %tfile1.o %tfile2.o
>>    +# RUN: llvm-readobj -s -t %t1 | FileCheck %s
>>    +
>>    +# Commons from file0 and file1 are not excluded, so they must be in .common.incl
>>    +# Commons from file2 are excluded from the first rule and should be caught by
>>    +# the second in .common.excl
>>    +# CHECK:       Section {
>>    +# CHECK:         Index:
>>    +# CHECK:         Name: .common.incl
>>    +# CHECK-NEXT:    Type: SHT_NOBITS
>>    +# CHECK-NEXT:    Flags [
>>    +# CHECK-NEXT:      SHF_ALLOC
>>    +# CHECK-NEXT:      SHF_WRITE
>>    +# CHECK-NEXT:    ]
>>    +# CHECK-NEXT:    Address: 0x8
>>    +# CHECK-NEXT:    Offset: 0x
>>    +# CHECK-NEXT:    Size: 16
>>    +# CHECK-NEXT:    Link: 0
>>    +# CHECK-NEXT:    Info: 0
>>    +# CHECK-NEXT:    AddressAlignment: 8
>>    +# CHECK-NEXT:    EntrySize: 0
>>    +# CHECK-NEXT:  }
>>    +# CHECK:       Section {
>>    +# CHECK:         Index:
>>    +# CHECK:         Name: .common.excl
>>    +# CHECK-NEXT:    Type: SHT_NOBITS
>>    +# CHECK-NEXT:    Flags [
>>    +# CHECK-NEXT:      SHF_ALLOC
>>    +# CHECK-NEXT:      SHF_WRITE
>>    +# CHECK-NEXT:    ]
>>    +# CHECK-NEXT:    Address: 0x20
>>    +# CHECK-NEXT:    Offset: 0x
>>    +# CHECK-NEXT:    Size: 48
>>    +# CHECK-NEXT:    Link: 0
>>    +# CHECK-NEXT:    Info: 0
>>    +# CHECK-NEXT:    AddressAlignment: 16
>>    +# CHECK-NEXT:    EntrySize: 0
>>    +# CHECK-NEXT:  }
>>    +# CHECK:       Symbol {
>>    +# CHECK:         Name: common_multiple
>>    +# CHECK-NEXT:    Value: 0x20
>>    +# CHECK-NEXT:    Size: 32
>>    +# CHECK-NEXT:    Binding: Global
>>    +# CHECK-NEXT:    Type: Object
>>    +# CHECK-NEXT:    Other: 0
>>    +# CHECK-NEXT:    Section: .common.excl
>>    +# CHECK-NEXT:  }
>>    +# CHECK:       Symbol {
>>    +# CHECK:         Name: common_uniq_0
>>    +# CHECK-NEXT:    Value: 0x8
>>    +# CHECK-NEXT:    Size: 4
>>    +# CHECK-NEXT:    Binding: Global
>>    +# CHECK-NEXT:    Type: Object
>>    +# CHECK-NEXT:    Other: 0
>>    +# CHECK-NEXT:    Section: .common.incl
>>    +# CHECK-NEXT:  }
>>    +# CHECK:       Symbol {
>>    +# CHECK:         Name: common_uniq_1
>>    +# CHECK-NEXT:    Value: 0x10
>>    +# CHECK-NEXT:    Size: 8
>>    +# CHECK-NEXT:    Binding: Global
>>    +# CHECK-NEXT:    Type: Object
>>    +# CHECK-NEXT:    Other: 0
>>    +# CHECK-NEXT:    Section: .common.incl
>>    +# CHECK-NEXT:  }
>>    +# CHECK:       Symbol {
>>    +# CHECK:         Name: common_uniq_2
>>    +# CHECK-NEXT:    Value: 0x40
>>    +# CHECK-NEXT:    Size: 16
>>    +# CHECK-NEXT:    Binding: Global
>>    +# CHECK-NEXT:    Type: Object
>>    +# CHECK-NEXT:    Other: 0
>>    +# CHECK-NEXT:    Section: .common.excl
>>    +# CHECK-NEXT:  }
>>    +
>>    +.globl _start
>>    +_start:
>>    +  jmp _start
>>    +
>>    +.comm common_uniq_0,4,4
>>    +.comm common_multiple,8,8
>> 
>>    Added: lld/trunk/test/ELF/linkerscript/common-filespec.s
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_test_ELF_linkerscript_common-2Dfilespec.s-3Frev-3D312796-26view-3Dauto&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=0nWbX2M4RGRI6BW72U7yMwZSQK9ofetuuUCD8Hs--XM&e= 
>>    ==============================================================================
>>    --- lld/trunk/test/ELF/linkerscript/common-filespec.s (added)
>>    +++ lld/trunk/test/ELF/linkerscript/common-filespec.s Fri Sep  8 09:22:43 2017
>>    @@ -0,0 +1,105 @@
>>    +# REQUIRES: x86
>>    +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %tfile0.o
>>    +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/common-filespec1.s -o %tfile1.o
>>    +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %p/Inputs/common-filespec2.s -o %tfile2.o
>>    +# RUN: echo "SECTIONS { .common_0 : { *file0.o(COMMON) } .common_1 : { *file1.o(COMMON) } .common_2 : { *file2.o(COMMON) } }" > %t.script
>>    +# RUN: ld.lld -o %t1 --script %t.script %tfile0.o %tfile1.o %tfile2.o
>>    +# RUN: llvm-readobj -s -t %t1 | FileCheck %s
>>    +
>>    +# Make sure all 3 sections are allocated and they have sizes and alignments
>>    +# corresponding to the commons assigned to them
>>    +# CHECK:       Section {
>>    +# CHECK:         Index:
>>    +# CHECK:         Name: .common_0
>>    +# CHECK-NEXT:    Type: SHT_NOBITS
>>    +# CHECK-NEXT:    Flags [
>>    +# CHECK-NEXT:      SHF_ALLOC
>>    +# CHECK-NEXT:      SHF_WRITE
>>    +# CHECK-NEXT:    ]
>>    +# CHECK-NEXT:    Address: 0x4
>>    +# CHECK-NEXT:    Offset: 0x
>>    +# CHECK-NEXT:    Size: 4
>>    +# CHECK-NEXT:    Link: 0
>>    +# CHECK-NEXT:    Info: 0
>>    +# CHECK-NEXT:    AddressAlignment: 4
>>    +# CHECK-NEXT:    EntrySize: 0
>>    +# CHECK-NEXT:  }
>>    +# CHECK:       Section {
>>    +# CHECK:         Index:
>>    +# CHECK:         Name: .common_1
>>    +# CHECK-NEXT:    Type: SHT_NOBITS
>>    +# CHECK-NEXT:    Flags [
>>    +# CHECK-NEXT:      SHF_ALLOC
>>    +# CHECK-NEXT:      SHF_WRITE
>>    +# CHECK-NEXT:    ]
>>    +# CHECK-NEXT:    Address: 0x8
>>    +# CHECK-NEXT:    Offset: 0x
>>    +# CHECK-NEXT:    Size: 8
>>    +# CHECK-NEXT:    Link: 0
>>    +# CHECK-NEXT:    Info: 0
>>    +# CHECK-NEXT:    AddressAlignment: 8
>>    +# CHECK-NEXT:    EntrySize: 0
>>    +# CHECK-NEXT:  }
>>    +# CHECK:       Section {
>>    +# CHECK:         Index:
>>    +# CHECK:         Name: .common_2
>>    +# CHECK-NEXT:    Type: SHT_NOBITS
>>    +# CHECK-NEXT:    Flags [
>>    +# CHECK-NEXT:      SHF_ALLOC
>>    +# CHECK-NEXT:      SHF_WRITE
>>    +# CHECK-NEXT:    ]
>>    +# CHECK-NEXT:    Address: 0x10
>>    +# CHECK-NEXT:    Offset: 0x
>>    +# CHECK-NEXT:    Size: 48
>>    +# CHECK-NEXT:    Link: 0
>>    +# CHECK-NEXT:    Info: 0
>>    +# CHECK-NEXT:    AddressAlignment: 16
>>    +# CHECK-NEXT:    EntrySize: 0
>>    +# CHECK-NEXT:  }
>>    +
>>    +# Commons with unique name in each file must be assigned to that file's section.
>>    +# For a common with multiple definitions, the largest one wins and it must be
>>    +# assigned to the section from the file which provided the winning def
>>    +# CHECK:       Symbol {
>>    +# CHECK:         Name: common_multiple
>>    +# CHECK-NEXT:    Value: 0x10
>>    +# CHECK-NEXT:    Size: 32
>>    +# CHECK-NEXT:    Binding: Global
>>    +# CHECK-NEXT:    Type: Object
>>    +# CHECK-NEXT:    Other: 0
>>    +# CHECK-NEXT:    Section: .common_2
>>    +# CHECK-NEXT:  }
>>    +# CHECK:       Symbol {
>>    +# CHECK:         Name: common_uniq_0
>>    +# CHECK-NEXT:    Value: 0x4
>>    +# CHECK-NEXT:    Size: 4
>>    +# CHECK-NEXT:    Binding: Global
>>    +# CHECK-NEXT:    Type: Object
>>    +# CHECK-NEXT:    Other: 0
>>    +# CHECK-NEXT:    Section: .common_0
>>    +# CHECK-NEXT:  }
>>    +# CHECK:       Symbol {
>>    +# CHECK:         Name: common_uniq_1
>>    +# CHECK-NEXT:    Value: 0x8
>>    +# CHECK-NEXT:    Size: 8
>>    +# CHECK-NEXT:    Binding: Global
>>    +# CHECK-NEXT:    Type: Object
>>    +# CHECK-NEXT:    Other: 0
>>    +# CHECK-NEXT:    Section: .common_1
>>    +# CHECK-NEXT:  }
>>    +# CHECK:       Symbol {
>>    +# CHECK:         Name: common_uniq_2
>>    +# CHECK-NEXT:    Value: 0x30
>>    +# CHECK-NEXT:    Size: 16
>>    +# CHECK-NEXT:    Binding: Global
>>    +# CHECK-NEXT:    Type: Object
>>    +# CHECK-NEXT:    Other: 0
>>    +# CHECK-NEXT:    Section: .common_2
>>    +# CHECK-NEXT:  }
>>    +
>>    +.globl _start
>>    +_start:
>>    +  jmp _start
>>    +
>>    +.comm common_uniq_0,4,4
>>    +.comm common_multiple,8,8
>> 
>>    Modified: lld/trunk/test/ELF/linkerscript/common.s
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_test_ELF_linkerscript_common.s-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=vceDSQYVgZInI9HO6kBb02n0VfALTZs8ZmXemo39dYM&e= 
>>    ==============================================================================
>>    --- lld/trunk/test/ELF/linkerscript/common.s (original)
>>    +++ lld/trunk/test/ELF/linkerscript/common.s Fri Sep  8 09:22:43 2017
>>    @@ -4,8 +4,6 @@
>>     # RUN: ld.lld -o %t1 --script %t.script %t
>>     # RUN: llvm-readobj -s -t %t1 | FileCheck %s
>> 
>>    -# q2 alignment is greater than q1, so it should have smaller offset
>>    -# because of sorting
>>     # CHECK:       Section {
>>     # CHECK:         Index:
>>     # CHECK:         Name: .common
>>    @@ -16,7 +14,7 @@
>>     # CHECK-NEXT:    ]
>>     # CHECK-NEXT:    Address: 0x200
>>     # CHECK-NEXT:    Offset: 0x
>>    -# CHECK-NEXT:    Size: 256
>>    +# CHECK-NEXT:    Size: 384
>>     # CHECK-NEXT:    Link: 0
>>     # CHECK-NEXT:    Info: 0
>>     # CHECK-NEXT:    AddressAlignment: 256
>>    @@ -24,7 +22,7 @@
>>     # CHECK-NEXT:  }
>>     # CHECK:       Symbol {
>>     # CHECK:         Name: q1
>>    -# CHECK-NEXT:    Value: 0x280
>>    +# CHECK-NEXT:    Value: 0x200
>>     # CHECK-NEXT:    Size: 128
>>     # CHECK-NEXT:    Binding: Global
>>     # CHECK-NEXT:    Type: Object
>>    @@ -33,7 +31,7 @@
>>     # CHECK-NEXT:  }
>>     # CHECK-NEXT:  Symbol {
>>     # CHECK-NEXT:    Name: q2
>>    -# CHECK-NEXT:    Value: 0x200
>>    +# CHECK-NEXT:    Value: 0x300
>>     # CHECK-NEXT:    Size: 128
>>     # CHECK-NEXT:    Binding: Global
>>     # CHECK-NEXT:    Type: Object
>> 
>>    Modified: lld/trunk/test/ELF/linkerscript/discard-section-err.s
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_test_ELF_linkerscript_discard-2Dsection-2Derr.s-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=MXuje1LylNbUM26IDwE5EEYRU5bBZe69uXFDKmzKh4g&e= 
>>    ==============================================================================
>>    --- lld/trunk/test/ELF/linkerscript/discard-section-err.s (original)
>>    +++ lld/trunk/test/ELF/linkerscript/discard-section-err.s Fri Sep  8 09:22:43 2017
>>    @@ -22,9 +22,4 @@
>>     # RUN:   FileCheck -check-prefix=DYNSTR %s
>>     # DYNSTR: discarding .dynstr section is not allowed
>> 
>>    -# RUN: echo "SECTIONS { /DISCARD/ : { *(COMMON) } }" > %t.script
>>    -# RUN: not ld.lld -pie -o %t --script %t.script %t.o 2>&1 | \
>>    -# RUN:   FileCheck -check-prefix=COMMON %s
>>    -# COMMON: discarding COMMON section is not allowed
>>    -
>>     .comm foo,4,4
>> 
>>    Modified: lld/trunk/test/ELF/map-file.s
>>    URL: https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_lld_trunk_test_ELF_map-2Dfile.s-3Frev-3D312796-26r1-3D312795-26r2-3D312796-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=0Y0YxzC27SE0tTpInsY5fAZExRhv6WOmWe4YPF4EVhY&e= 
>>    ==============================================================================
>>    --- lld/trunk/test/ELF/map-file.s (original)
>>    +++ lld/trunk/test/ELF/map-file.s Fri Sep  8 09:22:43 2017
>>    @@ -47,7 +47,7 @@ labs = 0x1AB5
>>     // CHECK-NEXT: 0000000000201014 0000000000000001     4         {{.*}}{{/|\\}}map-file.s.tmp4.a(map-file.s.tmp4.o):(.text)
>>     // CHECK-NEXT: 0000000000201014 0000000000000000     0                 baz
>>     // CHECK-NEXT: 0000000000202000 0000000000000004    16 .bss
>>    -// CHECK-NEXT: 0000000000202000 0000000000000004    16         <internal>:(COMMON)
>>    +// CHECK-NEXT: 0000000000202000 0000000000000004    16         {{.*}}{{/|\\}}map-file.s.tmp1.o:(COMMON)
>>     // CHECK-NEXT: 0000000000202000 0000000000000004     0                 common
>>     // CHECK-NEXT: 0000000000000000 0000000000000008     1 .comment
>>     // CHECK-NEXT: 0000000000000000 0000000000000008     1         <internal>:(.comment)
>> 
>> 
>>    _______________________________________________
>>    llvm-commits mailing list
>>    llvm-commits at lists.llvm.org
>>    https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_llvm-2Dcommits&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=nQIMrFkM1t_gqODnbXQIOkB-BBcc2v2l4j7arjM9y4k&s=WT8EYeg7stKLcN9t6TUCBTYRJqw9w1KPiCJ8SkTI_nU&e= 
>> 
> 
> 



More information about the llvm-commits mailing list