summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2016-02-19 10:45:45 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2016-02-19 10:45:45 +0000
commitf23b23200d70fae36aaec5db03ec3cebbdc8a064 (patch)
treedee977c9e34f25ebe2317911a935f3bdf9f48fc8
parent31088a9d58a76b3b09c130b7c309048708ee9c06 (diff)
downloadbcm5719-llvm-f23b23200d70fae36aaec5db03ec3cebbdc8a064.tar.gz
bcm5719-llvm-f23b23200d70fae36aaec5db03ec3cebbdc8a064.zip
[ELF] - Minor refactor of LinkerScript file
* Else-ifs in ScriptParser::run() replaced with std::function + map * Reordered members of ScriptParser Differential revision: http://reviews.llvm.org/D17256 llvm-svn: 261317
-rw-r--r--lld/ELF/LinkerScript.cpp43
1 files changed, 20 insertions, 23 deletions
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index f43f99debe4..7cec67a6448 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -85,7 +85,20 @@ template <class ELFT> bool SectionRule::match(InputSectionBase<ELFT> *S) {
class elf2::ScriptParser {
public:
ScriptParser(BumpPtrAllocator *A, StringRef S, bool B)
- : Saver(*A), Tokens(tokenize(S)), IsUnderSysroot(B) {}
+ : Saver(*A), Tokens(tokenize(S)), IsUnderSysroot(B) {
+ Cmd["ENTRY"] = &ScriptParser::readEntry;
+ Cmd["EXTERN"] = &ScriptParser::readExtern;
+ Cmd["GROUP"] = &ScriptParser::readGroup;
+ Cmd["INCLUDE"] = &ScriptParser::readInclude;
+ Cmd["INPUT"] = &ScriptParser::readGroup;
+ Cmd["OUTPUT"] = &ScriptParser::readOutput;
+ Cmd["OUTPUT_ARCH"] = &ScriptParser::readOutputArch;
+ Cmd["OUTPUT_FORMAT"] = &ScriptParser::readOutputFormat;
+ Cmd["SEARCH_DIR"] = &ScriptParser::readSearchDir;
+ Cmd["SECTIONS"] = &ScriptParser::readSections;
+ Cmd[";"] = [](ScriptParser &) {};
+ }
+
void run();
private:
@@ -114,37 +127,21 @@ private:
StringSaver Saver;
std::vector<StringRef> Tokens;
- bool Error = false;
+ llvm::StringMap<std::function<void(ScriptParser &)>> Cmd;
size_t Pos = 0;
bool IsUnderSysroot;
+ bool Error = false;
};
void ScriptParser::run() {
while (!atEOF()) {
StringRef Tok = next();
- if (Tok == ";")
- continue;
- if (Tok == "ENTRY") {
- readEntry();
- } else if (Tok == "EXTERN") {
- readExtern();
- } else if (Tok == "GROUP" || Tok == "INPUT") {
- readGroup();
- } else if (Tok == "INCLUDE") {
- readInclude();
- } else if (Tok == "OUTPUT") {
- readOutput();
- } else if (Tok == "OUTPUT_ARCH") {
- readOutputArch();
- } else if (Tok == "OUTPUT_FORMAT") {
- readOutputFormat();
- } else if (Tok == "SEARCH_DIR") {
- readSearchDir();
- } else if (Tok == "SECTIONS") {
- readSections();
+ auto It = Cmd.find(Tok);
+ if (It != Cmd.end()) {
+ std::function<void(ScriptParser &)> &Handler = It->second;
+ Handler(*this);
} else {
setError("unknown directive: " + Tok);
- return;
}
}
}
OpenPOWER on IntegriCloud