[lld] r312796 - Currently lld creates a single section to collect all commons. There is no way
Shoaib Meenai via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 12 14:31:12 PDT 2017
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