<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Feb 19, 2016 at 2:45 AM, George Rimar via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: grimar<br>
Date: Fri Feb 19 04:45:45 2016<br>
New Revision: 261317<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=261317&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=261317&view=rev</a><br>
Log:<br>
[ELF] - Minor refactor of LinkerScript file<br>
<br>
* Else-ifs in ScriptParser::run() replaced with std::function + map<br>
* Reordered members of ScriptParser<br>
<br>
Differential revision: <a href="http://reviews.llvm.org/D17256" rel="noreferrer" target="_blank">http://reviews.llvm.org/D17256</a><br>
<br>
Modified:<br>
    lld/trunk/ELF/LinkerScript.cpp<br>
<br>
Modified: lld/trunk/ELF/LinkerScript.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=261317&r1=261316&r2=261317&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=261317&r1=261316&r2=261317&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/LinkerScript.cpp (original)<br>
+++ lld/trunk/ELF/LinkerScript.cpp Fri Feb 19 04:45:45 2016<br>
@@ -85,7 +85,20 @@ template <class ELFT> bool SectionRule::<br>
 class elf2::ScriptParser {<br>
 public:<br>
   ScriptParser(BumpPtrAllocator *A, StringRef S, bool B)<br>
-      : Saver(*A), Tokens(tokenize(S)), IsUnderSysroot(B) {}<br>
+      : Saver(*A), Tokens(tokenize(S)), IsUnderSysroot(B) {<br>
+    Cmd["ENTRY"] = &ScriptParser::readEntry;<br>
+    Cmd["EXTERN"] = &ScriptParser::readExtern;<br>
+    Cmd["GROUP"] = &ScriptParser::readGroup;<br>
+    Cmd["INCLUDE"] = &ScriptParser::readInclude;<br>
+    Cmd["INPUT"] = &ScriptParser::readGroup;<br>
+    Cmd["OUTPUT"] = &ScriptParser::readOutput;<br>
+    Cmd["OUTPUT_ARCH"] = &ScriptParser::readOutputArch;<br>
+    Cmd["OUTPUT_FORMAT"] = &ScriptParser::readOutputFormat;<br>
+    Cmd["SEARCH_DIR"] = &ScriptParser::readSearchDir;<br>
+    Cmd["SECTIONS"] = &ScriptParser::readSections;<br>
+    Cmd[";"] = [](ScriptParser &) {};<br></blockquote><div><br></div><div>Looks like these are all just function pointers (including the last one, actually) - would be more efficient, probably, to use a map to function pointer, instead of std::function, to avoid all the extra std::function overhead?<br><br>(also, you might be able to initialize this with something like: Cmd({{"Entry", &ScriptParser::readEntry}, {"EXTERN", ...}, ...}) in the init list, which might be a little more terse)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+  }<br>
+<br>
   void run();<br>
<br>
 private:<br>
@@ -114,37 +127,21 @@ private:<br>
<br>
   StringSaver Saver;<br>
   std::vector<StringRef> Tokens;<br>
-  bool Error = false;<br>
+  llvm::StringMap<std::function<void(ScriptParser &)>> Cmd;<br>
   size_t Pos = 0;<br>
   bool IsUnderSysroot;<br>
+  bool Error = false;<br>
 };<br>
<br>
 void ScriptParser::run() {<br>
   while (!atEOF()) {<br>
     StringRef Tok = next();<br>
-    if (Tok == ";")<br>
-      continue;<br>
-    if (Tok == "ENTRY") {<br>
-      readEntry();<br>
-    } else if (Tok == "EXTERN") {<br>
-      readExtern();<br>
-    } else if (Tok == "GROUP" || Tok == "INPUT") {<br>
-      readGroup();<br>
-    } else if (Tok == "INCLUDE") {<br>
-      readInclude();<br>
-    } else if (Tok == "OUTPUT") {<br>
-      readOutput();<br>
-    } else if (Tok == "OUTPUT_ARCH") {<br>
-      readOutputArch();<br>
-    } else if (Tok == "OUTPUT_FORMAT") {<br>
-      readOutputFormat();<br>
-    } else if (Tok == "SEARCH_DIR") {<br>
-      readSearchDir();<br>
-    } else if (Tok == "SECTIONS") {<br>
-      readSections();<br>
+    auto It = Cmd.find(Tok);<br>
+    if (It != Cmd.end()) {<br>
+      std::function<void(ScriptParser &)> &Handler = It->second;<br>
+      Handler(*this);<br>
     } else {<br>
       setError("unknown directive: " + Tok);<br>
-      return;<br>
     }<br>
   }<br>
 }<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>