[PATCH] D17499: [ELF] - replaced std::function with raw pointers in LinkerScript.cpp

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 23 08:23:07 PST 2016


On Tue, Feb 23, 2016 at 12:16 AM, George Rimar via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> grimar updated this revision to Diff 48785.
> grimar added a comment.
>
> Addressed David's and Rui's review comments.
>
>
> http://reviews.llvm.org/D17499
>
> Files:
>   ELF/LinkerScript.cpp
>
> Index: ELF/LinkerScript.cpp
> ===================================================================
> --- ELF/LinkerScript.cpp
> +++ ELF/LinkerScript.cpp
> @@ -94,21 +94,11 @@
>  }
>
>  class elf2::ScriptParser {
> +  typedef void (ScriptParser::*Handler)();
> +
>  public:
>    ScriptParser(BumpPtrAllocator *A, StringRef S, bool B)
> -      : Saver(*A), Tokens(tokenize(S)), IsUnderSysroot(B) {
> -    Cmd["ENTRY"] = std::mem_fn(&ScriptParser::readEntry);
> -    Cmd["EXTERN"] = std::mem_fn(&ScriptParser::readExtern);
> -    Cmd["GROUP"] = std::mem_fn(&ScriptParser::readGroup);
> -    Cmd["INCLUDE"] = std::mem_fn(&ScriptParser::readInclude);
> -    Cmd["INPUT"] = std::mem_fn(&ScriptParser::readGroup);
> -    Cmd["OUTPUT"] = std::mem_fn(&ScriptParser::readOutput);
> -    Cmd["OUTPUT_ARCH"] = std::mem_fn(&ScriptParser::readOutputArch);
> -    Cmd["OUTPUT_FORMAT"] = std::mem_fn(&ScriptParser::readOutputFormat);
> -    Cmd["SEARCH_DIR"] = std::mem_fn(&ScriptParser::readSearchDir);
> -    Cmd["SECTIONS"] = std::mem_fn(&ScriptParser::readSections);
> -    Cmd[";"] = [](ScriptParser &) {};
> -  }
> +      : Saver(*A), Tokens(tokenize(S)), IsUnderSysroot(B) {}
>
>    void run();
>
> @@ -128,6 +118,7 @@
>    void readExtern();
>    void readGroup();
>    void readInclude();
> +  void readNothing() {}
>    void readOutput();
>    void readOutputArch();
>    void readOutputFormat();
> @@ -139,22 +130,30 @@
>
>    StringSaver Saver;
>    std::vector<StringRef> Tokens;
> -  llvm::StringMap<std::function<void(ScriptParser &)>> Cmd;
> +  const llvm::StringMap<Handler> Cmd{
>

Presumably static, too (which means you'll need to have a separate
definition) - no point having a copy of this in every instance of this
class, right?


> +      {"ENTRY", &ScriptParser::readEntry},
> +      {"EXTERN", &ScriptParser::readExtern},
> +      {"GROUP", &ScriptParser::readGroup},
> +      {"INCLUDE", &ScriptParser::readInclude},
> +      {"INPUT", &ScriptParser::readGroup},
> +      {"OUTPUT", &ScriptParser::readOutput},
> +      {"OUTPUT_ARCH", &ScriptParser::readOutputArch},
> +      {"OUTPUT_FORMAT", &ScriptParser::readOutputFormat},
> +      {"SEARCH_DIR", &ScriptParser::readSearchDir},
> +      {"SECTIONS", &ScriptParser::readSections},
> +      {";", &ScriptParser::readNothing}};
>    size_t Pos = 0;
>    bool IsUnderSysroot;
>    bool Error = false;
>  };
>
>  void ScriptParser::run() {
>    while (!atEOF()) {
>      StringRef Tok = next();
> -    auto It = Cmd.find(Tok);
> -    if (It != Cmd.end()) {
> -      std::function<void(ScriptParser &)> &Handler = It->second;
> -      Handler(*this);
> -    } else {
> +    if (Handler Fn = Cmd.lookup(Tok))
> +      (this->*Fn)();
> +    else
>        setError("unknown directive: " + Tok);
> -    }
>    }
>  }
>
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160223/58555382/attachment.html>


More information about the llvm-commits mailing list