Include line number in error message for linker scripts.

This patch is based on http://reviews.llvm.org/D18545 written
by George Rimar.

llvm-svn: 264878
This commit is contained in:
Rui Ueyama 2016-03-30 16:51:57 +00:00
parent 1d5e6d4bdc
commit 38dc83417b
2 changed files with 61 additions and 2 deletions

View File

@ -106,7 +106,7 @@ class elf::ScriptParser {
public:
ScriptParser(BumpPtrAllocator *A, StringRef S, bool B)
: Saver(*A), Tokens(tokenize(S)), IsUnderSysroot(B) {}
: Saver(*A), Input(S), Tokens(tokenize(S)), IsUnderSysroot(B) {}
void run();
@ -137,9 +137,11 @@ private:
void readOutputSectionDescription();
void readSectionPatterns(StringRef OutSec, bool Keep);
size_t getPos();
std::vector<uint8_t> parseHex(StringRef S);
StringSaver Saver;
StringRef Input;
std::vector<StringRef> Tokens;
const static StringMap<Handler> Cmd;
size_t Pos = 0;
@ -174,7 +176,7 @@ void ScriptParser::run() {
void ScriptParser::setError(const Twine &Msg) {
if (Error)
return;
error(Msg);
error("line " + Twine(getPos()) + ": " + Msg);
Error = true;
}
@ -412,6 +414,15 @@ void ScriptParser::readSectionPatterns(StringRef OutSec, bool Keep) {
Script->Sections.emplace_back(OutSec, next(), Keep);
}
// Returns the current line number.
size_t ScriptParser::getPos() {
if (Pos == 0)
return 1;
const char *Begin = Input.data();
const char *Tok = Tokens[Pos - 1].data();
return StringRef(Begin, Tok - Begin).count('\n') + 1;
}
std::vector<uint8_t> ScriptParser::parseHex(StringRef S) {
std::vector<uint8_t> Hex;
while (!S.empty()) {

View File

@ -0,0 +1,48 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
## Take some valid script with multiline comments
## and check it actually works:
# RUN: rm -f %t.script
# RUN: echo "SECTIONS {" >> %t.script
# RUN: echo ".text : { *(.text) }" >> %t.script
# RUN: echo ".keep : { *(.keep) } /*" >> %t.script
# RUN: echo "comment line 1" >> %t.script
# RUN: echo "comment line 2 */" >> %t.script
# RUN: echo ".temp : { *(.temp) } }" >> %t.script
# RUN: ld.lld -shared %t -o %t1 --script %t.script
## Change ":" to "+" at line 2, check that error
## message starts from correct line number:
# RUN: rm -f %t.script
# RUN: echo "SECTIONS {" >> %t.script
# RUN: echo ".text + { *(.text) }" >> %t.script
# RUN: echo ".keep : { *(.keep) } /*" >> %t.script
# RUN: echo "comment line 1" >> %t.script
# RUN: echo "comment line 2 */" >> %t.script
# RUN: echo ".temp : { *(.temp) } }" >> %t.script
# RUN: not ld.lld -shared %t -o %t1 --script %t.script 2>&1 | FileCheck -check-prefix=ERR1 %s
# ERR1: line 2:
## Change ":" to "+" at line 3 now, check correct error line number:
# RUN: rm -f %t.script
# RUN: echo "SECTIONS {" >> %t.script
# RUN: echo ".text : { *(.text) }" >> %t.script
# RUN: echo ".keep + { *(.keep) } /*" >> %t.script
# RUN: echo "comment line 1" >> %t.script
# RUN: echo "comment line 2 */" >> %t.script
# RUN: echo ".temp : { *(.temp) } }" >> %t.script
# RUN: not ld.lld -shared %t -o %t1 --script %t.script 2>&1 | FileCheck -check-prefix=ERR2 %s
# ERR2: line 3:
## Change ":" to "+" at line 6, after multiline comment,
## check correct error line number:
# RUN: rm -f %t.script
# RUN: echo "SECTIONS {" >> %t.script
# RUN: echo ".text : { *(.text) }" >> %t.script
# RUN: echo ".keep : { *(.keep) } /*" >> %t.script
# RUN: echo "comment line 1" >> %t.script
# RUN: echo "comment line 2 */" >> %t.script
# RUN: echo ".temp + { *(.temp) } }" >> %t.script
# RUN: not ld.lld -shared %t -o %t1 --script %t.script 2>&1 | FileCheck -check-prefix=ERR5 %s
# ERR5: line 6: