[lld] r281754 - Recommit r281721 "[ELF] - Linkerscript: implement EXCLUDE_FILE in the middle of a input section description."
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 16 12:23:55 PDT 2016
On Fri, Sep 16, 2016 at 10:42 AM, George Rimar via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: grimar
> Date: Fri Sep 16 12:42:10 2016
> New Revision: 281754
>
> URL: http://llvm.org/viewvc/llvm-project?rev=281754&view=rev
> Log:
> Recommit r281721 "[ELF] - Linkerscript: implement EXCLUDE_FILE in the
> middle of a input section description."
>
> With fix for 2 bots. Details about the fix performed is on a review page.
>
> Initial commit message:
> This is PR30387:
>
> From PR description:
> We fail to parse
>
> SECTIONS
> {
> foo :
> {
> *(sec0 EXCLUDE_FILE (zed1.o) sec1 EXCLUDE_FILE (zed2.o) sec2 )
> }
> }
> The semantics according to bfd are:
>
> Include sec1 from every file but zed1.o
> Include sec2 from every file but zed2.o
> Include sec0 from every file
>
> Patch implements the support.
>
> Differential revision: https://reviews.llvm.org/D24650
>
> Added:
> lld/trunk/test/ELF/linkerscript/Inputs/exclude-multiple1.s
> - copied unchanged from r281722, lld/trunk/test/ELF/linkerscrip
> t/Inputs/exclude-multiple1.s
> lld/trunk/test/ELF/linkerscript/Inputs/exclude-multiple2.s
> - copied unchanged from r281722, lld/trunk/test/ELF/linkerscrip
> t/Inputs/exclude-multiple2.s
> lld/trunk/test/ELF/linkerscript/exclude-multiple.s
> - copied unchanged from r281722, lld/trunk/test/ELF/linkerscrip
> t/exclude-multiple.s
> Modified:
> lld/trunk/ELF/LinkerScript.cpp
> lld/trunk/ELF/LinkerScript.h
>
> Modified: lld/trunk/ELF/LinkerScript.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScri
> pt.cpp?rev=281754&r1=281753&r2=281754&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/LinkerScript.cpp (original)
> +++ lld/trunk/ELF/LinkerScript.cpp Fri Sep 16 12:42:10 2016
> @@ -109,10 +109,10 @@ bool LinkerScript<ELFT>::shouldKeep(Inpu
> return false;
> }
>
> -static bool fileMatches(const InputSectionDescription *Desc,
> - StringRef Filename) {
> - return const_cast<Regex &>(Desc->FileRe).match(Filename) &&
> - !const_cast<Regex &>(Desc->ExcludedFileRe).match(Filename);
> +static bool fileMatches(const llvm::Regex &FileRe,
> + const llvm::Regex &ExcludedFileRe, StringRef
> Filename) {
> + return const_cast<Regex &>(FileRe).match(Filename) &&
> + !const_cast<Regex &>(ExcludedFileRe).match(Filename);
> }
>
> static bool comparePriority(InputSectionData *A, InputSectionData *B) {
> @@ -161,16 +161,19 @@ static bool matchConstraints(ArrayRef<In
> template <class ELFT>
> void LinkerScript<ELFT>::computeInputSections(InputSectionDescription *I,
> ConstraintKind Constraint) {
> - const Regex &Re = I->SectionRe;
> - for (ObjectFile<ELFT> *F : Symtab<ELFT>::X->getObjectFiles())
> - if (fileMatches(I, sys::path::filename(F->getName())))
> - for (InputSectionBase<ELFT> *S : F->getSections())
> - if (!isDiscarded(S) && !S->OutSec &&
> - const_cast<Regex &>(Re).match(S->Name))
> - I->Sections.push_back(S);
> + for (const std::pair<llvm::Regex, llvm::Regex> &V : I->SectionsVec) {
> + for (ObjectFile<ELFT> *F : Symtab<ELFT>::X->getObjectFiles()) {
> + if (fileMatches(I->FileRe, V.first, sys::path::filename(F->getName())))
> {
> + Regex &Re = const_cast<Regex &>(V.second);
> + for (InputSectionBase<ELFT> *S : F->getSections())
> + if (!isDiscarded(S) && !S->OutSec && Re.match(S->Name))
> + I->Sections.push_back(S);
>
> - if (const_cast<Regex &>(Re).match("COMMON"))
> - I->Sections.push_back(CommonInputSection<ELFT>::X);
> + if (Re.match("COMMON"))
> + I->Sections.push_back(CommonInputSection<ELFT>::X);
> + }
> + }
> + }
>
> if (!matchConstraints<ELFT>(I->Sections, Constraint)) {
> I->Sections.clear();
> @@ -698,6 +701,7 @@ private:
> std::vector<StringRef> readOutputSectionPhdrs();
> InputSectionDescription *readInputSectionDescription(StringRef Tok);
> Regex readFilePatterns();
> + void readSectionExcludes(InputSectionDescription *Cmd);
> InputSectionDescription *readInputSectionRules(StringRef FilePattern);
> unsigned readPhdrType();
> SortKind readSortKind();
> @@ -991,17 +995,41 @@ SortKind ScriptParser::readSortKind() {
> return SortNone;
> }
>
> +// Method reads a list of sequence of excluded files and section globs
> given in
> +// a following form: ((EXCLUDE_FILE(file_pattern+))? section_pattern+)+
> +// Example: *(.foo.1 EXCLUDE_FILE (*a.o) .foo.2 EXCLUDE_FILE (*b.o)
> .foo.3)
> +void ScriptParser::readSectionExcludes(InputSectionDescription *Cmd) {
> + llvm::Regex ExcludeFileRe;
> + std::vector<StringRef> V;
> +
> + while (!Error) {
> + if (skip(")")) {
> + Cmd->SectionsVec.push_back(
> + {std::move(ExcludeFileRe), compileGlobPatterns(V)});
> + return;
> + }
> +
> + if (skip("EXCLUDE_FILE")) {
> + if (!V.empty()) {
> + Cmd->SectionsVec.push_back(
> + {std::move(ExcludeFileRe), compileGlobPatterns(V)});
> + V.clear();
> + }
> +
> + expect("(");
> + ExcludeFileRe = readFilePatterns();
> + continue;
> + }
> +
> + V.push_back(next());
> + }
> +}
> +
> InputSectionDescription *
> ScriptParser::readInputSectionRules(StringRef FilePattern) {
> auto *Cmd = new InputSectionDescription(FilePattern);
> expect("(");
>
> - // Read EXCLUDE_FILE().
> - if (skip("EXCLUDE_FILE")) {
> - expect("(");
> - Cmd->ExcludedFileRe = readFilePatterns();
> - }
> -
> // Read SORT().
> if (SortKind K1 = readSortKind()) {
> Cmd->SortOuter = K1;
> @@ -1009,16 +1037,16 @@ ScriptParser::readInputSectionRules(Stri
> if (SortKind K2 = readSortKind()) {
> Cmd->SortInner = K2;
> expect("(");
> - Cmd->SectionRe = readFilePatterns();
> + Cmd->SectionsVec.push_back({llvm::Regex(), readFilePatterns()});
> expect(")");
> } else {
> - Cmd->SectionRe = readFilePatterns();
> + Cmd->SectionsVec.push_back({llvm::Regex(), readFilePatterns()});
> }
> expect(")");
> return Cmd;
> }
>
> - Cmd->SectionRe = readFilePatterns();
> + readSectionExcludes(Cmd);
> return Cmd;
> }
>
> @@ -1031,7 +1059,8 @@ ScriptParser::readInputSectionDescriptio
> StringRef FilePattern = next();
> InputSectionDescription *Cmd = readInputSectionRules(FilePattern);
> expect(")");
> - Opt.KeptSections.push_back(&Cmd->SectionRe);
> + for (std::pair<llvm::Regex, llvm::Regex> &Regex : Cmd->SectionsVec)
> + Opt.KeptSections.push_back(&Regex.second);
> return Cmd;
> }
> return readInputSectionRules(Tok);
>
> Modified: lld/trunk/ELF/LinkerScript.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScri
> pt.h?rev=281754&r1=281753&r2=281754&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/LinkerScript.h (original)
> +++ lld/trunk/ELF/LinkerScript.h Fri Sep 16 12:42:10 2016
> @@ -20,6 +20,7 @@
> #include "llvm/Support/MemoryBuffer.h"
> #include "llvm/Support/Regex.h"
> #include <functional>
> +#include <list>
>
> namespace lld {
> namespace elf {
> @@ -106,8 +107,8 @@ struct InputSectionDescription : BaseCom
> llvm::Regex FileRe;
> SortKind SortOuter = SortNone;
> SortKind SortInner = SortNone;
> - llvm::Regex ExcludedFileRe;
> - llvm::Regex SectionRe;
> + // Pairs of section regex and files excluded.
> + std::list<std::pair<llvm::Regex, llvm::Regex>> SectionsVec;
> std::vector<InputSectionData *> Sections;
> };
>
I didn't read the entire patch yet, but why did you use <list>? It is a
doubly-linked list and slower than the vector, so you don't want to use it
unless you really want doubly-linked lists.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160916/84e754b0/attachment.html>
More information about the llvm-commits
mailing list