diff options
author | George Rimar <grimar@accesssoftek.com> | 2016-02-24 09:21:47 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2016-02-24 09:21:47 +0000 |
commit | c3794e5834c865d35dda5a58991355b9c0a49015 (patch) | |
tree | 704fad4c35eb9b30e2261414034c8d4b7725ed88 /lld/ELF/LinkerScript.cpp | |
parent | cb35474ba5e24381120e17ad68f56006f3f6d5bf (diff) | |
download | bcm5719-llvm-c3794e5834c865d35dda5a58991355b9c0a49015.tar.gz bcm5719-llvm-c3794e5834c865d35dda5a58991355b9c0a49015.zip |
[ELF] - replaced std::function with raw pointers in LinkerScript.cpp
Change as was proposed by David Blaikie.
Differential revision: http://reviews.llvm.org/D17499
llvm-svn: 261729
Diffstat (limited to 'lld/ELF/LinkerScript.cpp')
-rw-r--r-- | lld/ELF/LinkerScript.cpp | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp index af9704a4d39..7194fd4ab51 100644 --- a/lld/ELF/LinkerScript.cpp +++ b/lld/ELF/LinkerScript.cpp @@ -95,21 +95,11 @@ template <class ELFT> bool SectionRule::match(InputSectionBase<ELFT> *S) { } 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(); @@ -129,6 +119,7 @@ private: void readExtern(); void readGroup(); void readInclude(); + void readNothing() {} void readOutput(); void readOutputArch(); void readOutputFormat(); @@ -140,22 +131,32 @@ private: StringSaver Saver; std::vector<StringRef> Tokens; - llvm::StringMap<std::function<void(ScriptParser &)>> Cmd; + const static StringMap<Handler> Cmd; size_t Pos = 0; bool IsUnderSysroot; bool Error = false; }; +const StringMap<elf2::ScriptParser::Handler> elf2::ScriptParser::Cmd = { + {"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}}; + 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); - } } } |