diff --git a/lld/ELF/ScriptLexer.cpp b/lld/ELF/ScriptLexer.cpp index 86720de3527cb..8514c2524a3fd 100644 --- a/lld/ELF/ScriptLexer.cpp +++ b/lld/ELF/ScriptLexer.cpp @@ -75,9 +75,8 @@ ScriptLexer::ScriptLexer(MemoryBufferRef MB) { tokenize(MB); } // We don't want to record cascading errors. Keep only the first one. void ScriptLexer::setError(const Twine &Msg) { - if (Error) + if (ErrorCount) return; - Error = true; if (!Pos) { error(getCurrentLocation() + ": " + Msg); @@ -164,7 +163,7 @@ StringRef ScriptLexer::skipSpace(StringRef S) { } // An erroneous token is handled as if it were the last token before EOF. -bool ScriptLexer::atEOF() { return Error || Tokens.size() == Pos; } +bool ScriptLexer::atEOF() { return ErrorCount || Tokens.size() == Pos; } // Split a given string as an expression. // This function returns "3", "*" and "5" for "3*5" for example. @@ -207,7 +206,7 @@ static std::vector tokenizeExpr(StringRef S) { // // This function may split the current token into multiple tokens. void ScriptLexer::maybeSplitExpr() { - if (!InExpr || Error || atEOF()) + if (!InExpr || ErrorCount || atEOF()) return; std::vector V = tokenizeExpr(Tokens[Pos]); @@ -220,7 +219,7 @@ void ScriptLexer::maybeSplitExpr() { StringRef ScriptLexer::next() { maybeSplitExpr(); - if (Error) + if (ErrorCount) return ""; if (atEOF()) { setError("unexpected EOF"); @@ -231,7 +230,7 @@ StringRef ScriptLexer::next() { StringRef ScriptLexer::peek() { StringRef Tok = next(); - if (Error) + if (ErrorCount) return ""; Pos = Pos - 1; return Tok; @@ -260,7 +259,7 @@ bool ScriptLexer::consumeLabel(StringRef Tok) { void ScriptLexer::skip() { (void)next(); } void ScriptLexer::expect(StringRef Expect) { - if (Error) + if (ErrorCount) return; StringRef Tok = next(); if (Tok != Expect) diff --git a/lld/ELF/ScriptLexer.h b/lld/ELF/ScriptLexer.h index 64d6d9204864a..da0a5e962360d 100644 --- a/lld/ELF/ScriptLexer.h +++ b/lld/ELF/ScriptLexer.h @@ -39,7 +39,6 @@ class ScriptLexer { std::vector Tokens; bool InExpr = false; size_t Pos = 0; - bool Error = false; private: void maybeSplitExpr(); diff --git a/lld/ELF/ScriptParser.cpp b/lld/ELF/ScriptParser.cpp index 226c67dd20386..dee2a02410b1e 100644 --- a/lld/ELF/ScriptParser.cpp +++ b/lld/ELF/ScriptParser.cpp @@ -192,7 +192,7 @@ void ScriptParser::readVersionScriptCommand() { return; } - while (!atEOF() && !Error && peek() != "}") { + while (!atEOF() && !ErrorCount && peek() != "}") { StringRef VerStr = next(); if (VerStr == "{") { setError("anonymous version definition is used in " @@ -284,7 +284,7 @@ void ScriptParser::readAsNeeded() { expect("("); bool Orig = Config->AsNeeded; Config->AsNeeded = true; - while (!Error && !consume(")")) + while (!ErrorCount && !consume(")")) addFile(unquote(next())); Config->AsNeeded = Orig; } @@ -300,13 +300,13 @@ void ScriptParser::readEntry() { void ScriptParser::readExtern() { expect("("); - while (!Error && !consume(")")) + while (!ErrorCount && !consume(")")) Config->Undefined.push_back(next()); } void ScriptParser::readGroup() { expect("("); - while (!Error && !consume(")")) { + while (!ErrorCount && !consume(")")) { if (consume("AS_NEEDED")) readAsNeeded(); else @@ -345,7 +345,7 @@ void ScriptParser::readOutput() { void ScriptParser::readOutputArch() { // OUTPUT_ARCH is ignored for now. expect("("); - while (!Error && !consume(")")) + while (!ErrorCount && !consume(")")) skip(); } @@ -364,14 +364,14 @@ void ScriptParser::readOutputFormat() { void ScriptParser::readPhdrs() { expect("{"); - while (!Error && !consume("}")) { + while (!ErrorCount && !consume("}")) { Script->Opt.PhdrsCommands.push_back( {next(), PT_NULL, false, false, UINT_MAX, nullptr}); PhdrsCommand &PhdrCmd = Script->Opt.PhdrsCommands.back(); PhdrCmd.Type = readPhdrType(); - while (!Error && !consume(";")) { + while (!ErrorCount && !consume(";")) { if (consume("FILEHDR")) PhdrCmd.HasFilehdr = true; else if (consume("PHDRS")) @@ -403,7 +403,7 @@ void ScriptParser::readSections() { Config->SingleRoRx = true; expect("{"); - while (!Error && !consume("}")) { + while (!ErrorCount && !consume("}")) { StringRef Tok = next(); BaseCommand *Cmd = readProvideOrAssignment(Tok); if (!Cmd) { @@ -428,7 +428,7 @@ static int precedence(StringRef Op) { StringMatcher ScriptParser::readFilePatterns() { std::vector V; - while (!Error && !consume(")")) + while (!ErrorCount && !consume(")")) V.push_back(next()); return StringMatcher(V); } @@ -460,7 +460,7 @@ SortSectionPolicy ScriptParser::readSortKind() { // any file but a.o, and section .baz in any file but b.o. std::vector ScriptParser::readInputSectionsList() { std::vector Ret; - while (!Error && peek() != ")") { + while (!ErrorCount && peek() != ")") { StringMatcher ExcludeFilePat; if (consume("EXCLUDE_FILE")) { expect("("); @@ -468,7 +468,7 @@ std::vector ScriptParser::readInputSectionsList() { } std::vector V; - while (!Error && peek() != ")" && peek() != "EXCLUDE_FILE") + while (!ErrorCount && peek() != ")" && peek() != "EXCLUDE_FILE") V.push_back(next()); if (!V.empty()) @@ -495,7 +495,7 @@ ScriptParser::readInputSectionRules(StringRef FilePattern) { auto *Cmd = make(FilePattern); expect("("); - while (!Error && !consume(")")) { + while (!ErrorCount && !consume(")")) { SortSectionPolicy Outer = readSortKind(); SortSectionPolicy Inner = SortSectionPolicy::Default; std::vector V; @@ -625,7 +625,7 @@ OutputSection *ScriptParser::readOutputSectionDescription(StringRef OutSec) { Cmd->Constraint = ConstraintKind::ReadWrite; expect("{"); - while (!Error && !consume("}")) { + while (!ErrorCount && !consume("}")) { StringRef Tok = next(); if (Tok == ";") { // Empty commands are allowed. Do nothing here. @@ -769,7 +769,7 @@ static Expr combine(StringRef Op, Expr L, Expr R) { // This is a part of the operator-precedence parser. This function // assumes that the remaining token stream starts with an operator. Expr ScriptParser::readExpr1(Expr Lhs, int MinPrec) { - while (!atEOF() && !Error) { + while (!atEOF() && !ErrorCount) { // Read an operator and an expression. if (consume("?")) return readTernary(Lhs); @@ -1033,7 +1033,7 @@ Expr ScriptParser::readParenExpr() { std::vector ScriptParser::readOutputSectionPhdrs() { std::vector Phdrs; - while (!Error && peek().startswith(":")) { + while (!ErrorCount && peek().startswith(":")) { StringRef Tok = next(); Phdrs.push_back((Tok.size() == 1) ? next() : Tok.substr(1)); } @@ -1136,7 +1136,7 @@ ScriptParser::readSymbols() { std::vector Globals; std::vector *V = &Globals; - while (!Error) { + while (!ErrorCount) { if (consume("}")) break; if (consumeLabel("local")) { @@ -1170,7 +1170,7 @@ std::vector ScriptParser::readVersionExtern() { expect("{"); std::vector Ret; - while (!Error && peek() != "}") { + while (!ErrorCount && peek() != "}") { StringRef Tok = next(); bool HasWildcard = !Tok.startswith("\"") && hasWildcard(Tok); Ret.push_back({unquote(Tok), IsCXX, HasWildcard}); @@ -1197,7 +1197,7 @@ uint64_t ScriptParser::readMemoryAssignment(StringRef S1, StringRef S2, // MEMORY { name [(attr)] : ORIGIN = origin, LENGTH = len ... } void ScriptParser::readMemory() { expect("{"); - while (!Error && !consume("}")) { + while (!ErrorCount && !consume("}")) { StringRef Name = next(); uint32_t Flags = 0; diff --git a/lld/test/ELF/version-script-err.s b/lld/test/ELF/version-script-err.s index ea3f664ea6ce5..bd786d9133693 100644 --- a/lld/test/ELF/version-script-err.s +++ b/lld/test/ELF/version-script-err.s @@ -8,4 +8,3 @@ // RUN: not ld.lld --version-script %terr1.script -shared %t.o -o %t.so 2>&1 | \ // RUN: FileCheck -check-prefix=ERR1 %s // ERR1: {{.*}}:1: unclosed quote -// ERR1-NEXT: {{.*}}: unexpected EOF