// 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);
}
// 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.
//
// This function may split the current token into multiple tokens.
void ScriptLexer::maybeSplitExpr() {
- if (!InExpr || Error || atEOF())
+ if (!InExpr || ErrorCount || atEOF())
return;
std::vector<StringRef> V = tokenizeExpr(Tokens[Pos]);
StringRef ScriptLexer::next() {
maybeSplitExpr();
- if (Error)
+ if (ErrorCount)
return "";
if (atEOF()) {
setError("unexpected EOF");
StringRef ScriptLexer::peek() {
StringRef Tok = next();
- if (Error)
+ if (ErrorCount)
return "";
Pos = Pos - 1;
return Tok;
void ScriptLexer::skip() { (void)next(); }
void ScriptLexer::expect(StringRef Expect) {
- if (Error)
+ if (ErrorCount)
return;
StringRef Tok = next();
if (Tok != Expect)
return;
}
- while (!atEOF() && !Error && peek() != "}") {
+ while (!atEOF() && !ErrorCount && peek() != "}") {
StringRef VerStr = next();
if (VerStr == "{") {
setError("anonymous version definition is used in "
expect("(");
bool Orig = Config->AsNeeded;
Config->AsNeeded = true;
- while (!Error && !consume(")"))
+ while (!ErrorCount && !consume(")"))
addFile(unquote(next()));
Config->AsNeeded = Orig;
}
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
void ScriptParser::readOutputArch() {
// OUTPUT_ARCH is ignored for now.
expect("(");
- while (!Error && !consume(")"))
+ while (!ErrorCount && !consume(")"))
skip();
}
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"))
Config->SingleRoRx = true;
expect("{");
- while (!Error && !consume("}")) {
+ while (!ErrorCount && !consume("}")) {
StringRef Tok = next();
BaseCommand *Cmd = readProvideOrAssignment(Tok);
if (!Cmd) {
StringMatcher ScriptParser::readFilePatterns() {
std::vector<StringRef> V;
- while (!Error && !consume(")"))
+ while (!ErrorCount && !consume(")"))
V.push_back(next());
return StringMatcher(V);
}
// any file but a.o, and section .baz in any file but b.o.
std::vector<SectionPattern> ScriptParser::readInputSectionsList() {
std::vector<SectionPattern> Ret;
- while (!Error && peek() != ")") {
+ while (!ErrorCount && peek() != ")") {
StringMatcher ExcludeFilePat;
if (consume("EXCLUDE_FILE")) {
expect("(");
}
std::vector<StringRef> V;
- while (!Error && peek() != ")" && peek() != "EXCLUDE_FILE")
+ while (!ErrorCount && peek() != ")" && peek() != "EXCLUDE_FILE")
V.push_back(next());
if (!V.empty())
auto *Cmd = make<InputSectionDescription>(FilePattern);
expect("(");
- while (!Error && !consume(")")) {
+ while (!ErrorCount && !consume(")")) {
SortSectionPolicy Outer = readSortKind();
SortSectionPolicy Inner = SortSectionPolicy::Default;
std::vector<SectionPattern> V;
Cmd->Constraint = ConstraintKind::ReadWrite;
expect("{");
- while (!Error && !consume("}")) {
+ while (!ErrorCount && !consume("}")) {
StringRef Tok = next();
if (Tok == ";") {
// Empty commands are allowed. Do nothing here.
// 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);
std::vector<StringRef> ScriptParser::readOutputSectionPhdrs() {
std::vector<StringRef> Phdrs;
- while (!Error && peek().startswith(":")) {
+ while (!ErrorCount && peek().startswith(":")) {
StringRef Tok = next();
Phdrs.push_back((Tok.size() == 1) ? next() : Tok.substr(1));
}
std::vector<SymbolVersion> Globals;
std::vector<SymbolVersion> *V = &Globals;
- while (!Error) {
+ while (!ErrorCount) {
if (consume("}"))
break;
if (consumeLabel("local")) {
expect("{");
std::vector<SymbolVersion> Ret;
- while (!Error && peek() != "}") {
+ while (!ErrorCount && peek() != "}") {
StringRef Tok = next();
bool HasWildcard = !Tok.startswith("\"") && hasWildcard(Tok);
Ret.push_back({unquote(Tok), IsCXX, HasWildcard});
// MEMORY { name [(attr)] : ORIGIN = origin, LENGTH = len ... }
void ScriptParser::readMemory() {
expect("{");
- while (!Error && !consume("}")) {
+ while (!ErrorCount && !consume("}")) {
StringRef Name = next();
uint32_t Flags = 0;