[PATCH] D36266: [ELF] - Remove ScriptLexer::Error field and check ErrorCount instead.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 3 16:22:08 PDT 2017


LGTM

George Rimar via Phabricator <reviews at reviews.llvm.org> writes:

> grimar created this revision.
> Herald added a subscriber: emaste.
>
> https://reviews.llvm.org/D35945 introduces change when there is useless to check `Error` flag
> in few places, but ErrorCount must be checked instead.
>
> But then we probably can just check ErrorCount always. That should simplify
> things. Patch do that.
>
>
> https://reviews.llvm.org/D36266
>
> Files:
>   ELF/ScriptLexer.cpp
>   ELF/ScriptLexer.h
>   ELF/ScriptParser.cpp
>   test/ELF/version-script-err.s
>
> Index: test/ELF/version-script-err.s
> ===================================================================
> --- test/ELF/version-script-err.s
> +++ 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
> Index: ELF/ScriptParser.cpp
> ===================================================================
> --- ELF/ScriptParser.cpp
> +++ ELF/ScriptParser.cpp
> @@ -190,7 +190,7 @@
>      return;
>    }
>  
> -  while (!atEOF() && !Error && peek() != "}") {
> +  while (!atEOF() && !ErrorCount && peek() != "}") {
>      StringRef VerStr = next();
>      if (VerStr == "{") {
>        setError("anonymous version definition is used in "
> @@ -282,7 +282,7 @@
>    expect("(");
>    bool Orig = Config->AsNeeded;
>    Config->AsNeeded = true;
> -  while (!Error && !consume(")"))
> +  while (!ErrorCount && !consume(")"))
>      addFile(unquote(next()));
>    Config->AsNeeded = Orig;
>  }
> @@ -298,13 +298,13 @@
>  
>  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
> @@ -343,7 +343,7 @@
>  void ScriptParser::readOutputArch() {
>    // OUTPUT_ARCH is ignored for now.
>    expect("(");
> -  while (!Error && !consume(")"))
> +  while (!ErrorCount && !consume(")"))
>      skip();
>  }
>  
> @@ -362,14 +362,14 @@
>  
>  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"))
> @@ -401,7 +401,7 @@
>    Config->SingleRoRx = true;
>  
>    expect("{");
> -  while (!Error && !consume("}")) {
> +  while (!ErrorCount && !consume("}")) {
>      StringRef Tok = next();
>      BaseCommand *Cmd = readProvideOrAssignment(Tok);
>      if (!Cmd) {
> @@ -426,7 +426,7 @@
>  
>  StringMatcher ScriptParser::readFilePatterns() {
>    std::vector<StringRef> V;
> -  while (!Error && !consume(")"))
> +  while (!ErrorCount && !consume(")"))
>      V.push_back(next());
>    return StringMatcher(V);
>  }
> @@ -458,15 +458,15 @@
>  // 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("(");
>        ExcludeFilePat = readFilePatterns();
>      }
>  
>      std::vector<StringRef> V;
> -    while (!Error && peek() != ")" && peek() != "EXCLUDE_FILE")
> +    while (!ErrorCount && peek() != ")" && peek() != "EXCLUDE_FILE")
>        V.push_back(next());
>  
>      if (!V.empty())
> @@ -493,7 +493,7 @@
>    auto *Cmd = make<InputSectionDescription>(FilePattern);
>    expect("(");
>  
> -  while (!Error && !consume(")")) {
> +  while (!ErrorCount && !consume(")")) {
>      SortSectionPolicy Outer = readSortKind();
>      SortSectionPolicy Inner = SortSectionPolicy::Default;
>      std::vector<SectionPattern> V;
> @@ -623,7 +623,7 @@
>      Cmd->Constraint = ConstraintKind::ReadWrite;
>    expect("{");
>  
> -  while (!Error && !consume("}")) {
> +  while (!ErrorCount && !consume("}")) {
>      StringRef Tok = next();
>      if (Tok == ";") {
>        // Empty commands are allowed. Do nothing here.
> @@ -767,7 +767,7 @@
>  // 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);
> @@ -1021,7 +1021,7 @@
>  
>  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));
>    }
> @@ -1124,7 +1124,7 @@
>    std::vector<SymbolVersion> Globals;
>    std::vector<SymbolVersion> *V = &Globals;
>  
> -  while (!Error) {
> +  while (!ErrorCount) {
>      if (consume("}"))
>        break;
>      if (consumeLabel("local")) {
> @@ -1158,7 +1158,7 @@
>    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});
> @@ -1185,7 +1185,7 @@
>  // MEMORY { name [(attr)] : ORIGIN = origin, LENGTH = len ... }
>  void ScriptParser::readMemory() {
>    expect("{");
> -  while (!Error && !consume("}")) {
> +  while (!ErrorCount && !consume("}")) {
>      StringRef Name = next();
>  
>      uint32_t Flags = 0;
> Index: ELF/ScriptLexer.h
> ===================================================================
> --- ELF/ScriptLexer.h
> +++ ELF/ScriptLexer.h
> @@ -39,7 +39,6 @@
>    std::vector<StringRef> Tokens;
>    bool InExpr = false;
>    size_t Pos = 0;
> -  bool Error = false;
>  
>  private:
>    void maybeSplitExpr();
> Index: ELF/ScriptLexer.cpp
> ===================================================================
> --- ELF/ScriptLexer.cpp
> +++ ELF/ScriptLexer.cpp
> @@ -75,9 +75,8 @@
>  
>  // 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 @@
>  }
>  
>  // 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 @@
>  //
>  // 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]);
> @@ -220,7 +219,7 @@
>  StringRef ScriptLexer::next() {
>    maybeSplitExpr();
>  
> -  if (Error)
> +  if (ErrorCount)
>      return "";
>    if (atEOF()) {
>      setError("unexpected EOF");
> @@ -231,7 +230,7 @@
>  
>  StringRef ScriptLexer::peek() {
>    StringRef Tok = next();
> -  if (Error)
> +  if (ErrorCount)
>      return "";
>    Pos = Pos - 1;
>    return Tok;
> @@ -260,7 +259,7 @@
>  void ScriptLexer::skip() { (void)next(); }
>  
>  void ScriptLexer::expect(StringRef Expect) {
> -  if (Error)
> +  if (ErrorCount)
>      return;
>    StringRef Tok = next();
>    if (Tok != Expect)


More information about the llvm-commits mailing list