summaryrefslogtreecommitdiffstats
path: root/lld/ELF/LinkerScript.cpp
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2016-02-24 09:21:47 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2016-02-24 09:21:47 +0000
commitc3794e5834c865d35dda5a58991355b9c0a49015 (patch)
tree704fad4c35eb9b30e2261414034c8d4b7725ed88 /lld/ELF/LinkerScript.cpp
parentcb35474ba5e24381120e17ad68f56006f3f6d5bf (diff)
downloadbcm5719-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.cpp41
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);
- }
}
}
OpenPOWER on IntegriCloud