Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -604,9 +604,9 @@ OutputSectionCommand *readOutputSectionDescription(StringRef OutSec); std::vector readOutputSectionFiller(); std::vector readOutputSectionPhdrs(); - InputSectionDescription *readInputSectionDescription(); + InputSectionDescription *readInputSectionDescription(StringRef Tok); std::vector readInputFilePatterns(); - InputSectionDescription *readInputSectionRules(); + InputSectionDescription *readInputSectionRules(StringRef FilePattern); unsigned readPhdrType(); SortKind readSortKind(); SymbolAssignment *readProvideHidden(bool Provide, bool Hidden); @@ -844,9 +844,10 @@ return SortNone; } -InputSectionDescription *ScriptParser::readInputSectionRules() { +InputSectionDescription * +ScriptParser::readInputSectionRules(StringRef FilePattern) { auto *Cmd = new InputSectionDescription; - Cmd->FilePattern = next(); + Cmd->FilePattern = FilePattern; expect("("); // Read EXCLUDE_FILE(). @@ -876,19 +877,21 @@ return Cmd; } -InputSectionDescription *ScriptParser::readInputSectionDescription() { +InputSectionDescription * +ScriptParser::readInputSectionDescription(StringRef Tok) { // Input section wildcard can be surrounded by KEEP. // https://sourceware.org/binutils/docs/ld/Input-Section-Keep.html#Input-Section-Keep - if (skip("KEEP")) { + if (Tok == "KEEP") { expect("("); - InputSectionDescription *Cmd = readInputSectionRules(); + StringRef FilePattern = next(); + InputSectionDescription *Cmd = readInputSectionRules(FilePattern); expect(")"); Opt.KeptSections.insert(Opt.KeptSections.end(), Cmd->SectionPatterns.begin(), Cmd->SectionPatterns.end()); return Cmd; } - return readInputSectionRules(); + return readInputSectionRules(Tok); } void ScriptParser::readSort() { @@ -937,18 +940,13 @@ expect("{"); while (!Error && !skip("}")) { - if (peek().startswith("*") || peek() == "KEEP") { - Cmd->Commands.emplace_back(readInputSectionDescription()); - continue; - } - StringRef Tok = next(); if (SymbolAssignment *Assignment = readProvideOrAssignment(Tok)) Cmd->Commands.emplace_back(Assignment); else if (Tok == "SORT") readSort(); else - setError("unknown command " + Tok); + Cmd->Commands.emplace_back(readInputSectionDescription(Tok)); } Cmd->Phdrs = readOutputSectionPhdrs(); Cmd->Filler = readOutputSectionFiller(); Index: test/ELF/linkerscript/linkerscript-filename-spec.s =================================================================== --- test/ELF/linkerscript/linkerscript-filename-spec.s +++ test/ELF/linkerscript/linkerscript-filename-spec.s @@ -33,6 +33,24 @@ # RUN: ld.lld -o %t4 --script %t4.script %tfirst.o %tsecond.o # RUN: llvm-objdump -s %t4 | FileCheck --check-prefix=SECONDFIRST %s +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %T/linkerscript-filename-spec1.o +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux \ +# RUN: %p/Inputs/linkerscript-filename-spec.s -o %T/linkerscript-filename-spec2.o + +# RUN: echo "SECTIONS { .foo : { \ +# RUN: linkerscript-filename-spec2.o(.foo) \ +# RUN: linkerscript-filename-spec1.o(.foo) } }" > %t5.script +# RUN: ld.lld -o %t5 --script %t5.script \ +# RUN: %T/linkerscript-filename-spec1.o %T/linkerscript-filename-spec2.o +# RUN: llvm-objdump -s %t5 | FileCheck --check-prefix=SECONDFIRST %s + +# RUN: echo "SECTIONS { .foo : { \ +# RUN: linkerscript-filename-spec1.o(.foo) \ +# RUN: linkerscript-filename-spec2.o(.foo) } }" > %t6.script +# RUN: ld.lld -o %t6 --script %t6.script \ +# RUN: %T/linkerscript-filename-spec1.o %T/linkerscript-filename-spec2.o +# RUN: llvm-objdump -s %t6 | FileCheck --check-prefix=FIRSTSECOND %s + .global _start _start: nop