Index: lld/trunk/ELF/InputSection.h =================================================================== --- lld/trunk/ELF/InputSection.h +++ lld/trunk/ELF/InputSection.h @@ -54,22 +54,9 @@ unsigned sectionKind : 3; - // The next three bit fields are only used by InputSectionBase, but we + // The next two bit fields are only used by InputSectionBase, but we // put them here so the struct packs better. - // True if this section has already been placed to a linker script - // output section. This is needed because, in a linker script, you - // can refer to the same section more than once. For example, in - // the following linker script, - // - // .foo : { *(.text) } - // .bar : { *(.text) } - // - // .foo takes all .text sections, and .bar becomes empty. To achieve - // this, we need to memorize whether a section has been placed or - // not for each input section. - unsigned assigned : 1; - unsigned bss : 1; // Set for sections that should not be folded by ICF. @@ -108,9 +95,9 @@ 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), repl(this), sectionKind(sectionKind), assigned(false), - bss(false), keepUnique(false), partition(0), alignment(alignment), - flags(flags), entsize(entsize), type(type), link(link), info(info) {} + : name(name), repl(this), sectionKind(sectionKind), bss(false), + keepUnique(false), partition(0), alignment(alignment), flags(flags), + entsize(entsize), type(type), link(link), info(info) {} }; // This corresponds to a section of an input file. Index: lld/trunk/ELF/LinkerScript.cpp =================================================================== --- lld/trunk/ELF/LinkerScript.cpp +++ lld/trunk/ELF/LinkerScript.cpp @@ -414,7 +414,7 @@ size_t sizeBefore = ret.size(); for (InputSectionBase *sec : inputSections) { - if (!sec->isLive() || sec->assigned) + if (!sec->isLive() || sec->parent) continue; // For -emit-relocs we have to ignore entries like @@ -433,7 +433,6 @@ continue; ret.push_back(sec); - sec->assigned = true; } sortInputSections( @@ -455,6 +454,7 @@ mainPart->hashTab = nullptr; s->markDead(); + s->parent = nullptr; for (InputSection *ds : s->dependentSections) discard(ds); } @@ -466,6 +466,8 @@ for (BaseCommand *base : outCmd.sectionCommands) { if (auto *cmd = dyn_cast(base)) { cmd->sectionBases = computeInputSections(cmd); + for (InputSectionBase *s : cmd->sectionBases) + s->parent = &outCmd; ret.insert(ret.end(), cmd->sectionBases.begin(), cmd->sectionBases.end()); } } @@ -497,7 +499,7 @@ // way to "make it as if it wasn't present" is to make it empty. if (!matchConstraints(v, sec->constraint)) { for (InputSectionBase *s : v) - s->assigned = false; + s->parent = nullptr; sec->sectionCommands.clear(); continue; } @@ -512,8 +514,6 @@ } sec->sectionIndex = i++; - for (InputSectionBase *s : v) - s->parent = sec; } } }