[ELF] - Fix for: bug 29115 - linkerscript does not support non-wildcard filename spec.

FreeBSD/mips script has non-wildcard filename specifications:
.text :
{
 start.o(.text*)

Patch adds support for that, this is PR29115.

Differential revision: https://reviews.llvm.org/D23839

llvm-svn: 280069
This commit is contained in:
George Rimar 2016-08-30 09:46:59 +00:00
parent 7af6452927
commit a2496cbed4
2 changed files with 31 additions and 13 deletions

View File

@ -604,9 +604,9 @@ private:
OutputSectionCommand *readOutputSectionDescription(StringRef OutSec); OutputSectionCommand *readOutputSectionDescription(StringRef OutSec);
std::vector<uint8_t> readOutputSectionFiller(); std::vector<uint8_t> readOutputSectionFiller();
std::vector<StringRef> readOutputSectionPhdrs(); std::vector<StringRef> readOutputSectionPhdrs();
InputSectionDescription *readInputSectionDescription(); InputSectionDescription *readInputSectionDescription(StringRef Tok);
std::vector<StringRef> readInputFilePatterns(); std::vector<StringRef> readInputFilePatterns();
InputSectionDescription *readInputSectionRules(); InputSectionDescription *readInputSectionRules(StringRef FilePattern);
unsigned readPhdrType(); unsigned readPhdrType();
SortKind readSortKind(); SortKind readSortKind();
SymbolAssignment *readProvideHidden(bool Provide, bool Hidden); SymbolAssignment *readProvideHidden(bool Provide, bool Hidden);
@ -845,9 +845,10 @@ SortKind ScriptParser::readSortKind() {
return SortNone; return SortNone;
} }
InputSectionDescription *ScriptParser::readInputSectionRules() { InputSectionDescription *
ScriptParser::readInputSectionRules(StringRef FilePattern) {
auto *Cmd = new InputSectionDescription; auto *Cmd = new InputSectionDescription;
Cmd->FilePattern = next(); Cmd->FilePattern = FilePattern;
expect("("); expect("(");
// Read EXCLUDE_FILE(). // Read EXCLUDE_FILE().
@ -877,19 +878,21 @@ InputSectionDescription *ScriptParser::readInputSectionRules() {
return Cmd; return Cmd;
} }
InputSectionDescription *ScriptParser::readInputSectionDescription() { InputSectionDescription *
ScriptParser::readInputSectionDescription(StringRef Tok) {
// Input section wildcard can be surrounded by KEEP. // Input section wildcard can be surrounded by KEEP.
// https://sourceware.org/binutils/docs/ld/Input-Section-Keep.html#Input-Section-Keep // https://sourceware.org/binutils/docs/ld/Input-Section-Keep.html#Input-Section-Keep
if (skip("KEEP")) { if (Tok == "KEEP") {
expect("("); expect("(");
InputSectionDescription *Cmd = readInputSectionRules(); StringRef FilePattern = next();
InputSectionDescription *Cmd = readInputSectionRules(FilePattern);
expect(")"); expect(")");
Opt.KeptSections.insert(Opt.KeptSections.end(), Opt.KeptSections.insert(Opt.KeptSections.end(),
Cmd->SectionPatterns.begin(), Cmd->SectionPatterns.begin(),
Cmd->SectionPatterns.end()); Cmd->SectionPatterns.end());
return Cmd; return Cmd;
} }
return readInputSectionRules(); return readInputSectionRules(Tok);
} }
void ScriptParser::readSort() { void ScriptParser::readSort() {
@ -938,16 +941,13 @@ ScriptParser::readOutputSectionDescription(StringRef OutSec) {
expect("{"); expect("{");
while (!Error && !skip("}")) { while (!Error && !skip("}")) {
if (peek().startswith("*") || peek() == "KEEP") {
Cmd->Commands.emplace_back(readInputSectionDescription());
continue;
}
StringRef Tok = next(); StringRef Tok = next();
if (SymbolAssignment *Assignment = readProvideOrAssignment(Tok)) if (SymbolAssignment *Assignment = readProvideOrAssignment(Tok))
Cmd->Commands.emplace_back(Assignment); Cmd->Commands.emplace_back(Assignment);
else if (Tok == "SORT") else if (Tok == "SORT")
readSort(); readSort();
else if (peek() == "(")
Cmd->Commands.emplace_back(readInputSectionDescription(Tok));
else else
setError("unknown command " + Tok); setError("unknown command " + Tok);
} }

View File

@ -33,6 +33,24 @@
# RUN: ld.lld -o %t4 --script %t4.script %tfirst.o %tsecond.o # RUN: ld.lld -o %t4 --script %t4.script %tfirst.o %tsecond.o
# RUN: llvm-objdump -s %t4 | FileCheck --check-prefix=SECONDFIRST %s # 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 .global _start
_start: _start:
nop nop