Index: ELF/LinkerScript.cpp =================================================================== --- ELF/LinkerScript.cpp +++ ELF/LinkerScript.cpp @@ -89,6 +89,8 @@ void run(); private: + void init(); + void setError(const Twine &Msg); static std::vector tokenize(StringRef S); static StringRef skipSpace(StringRef S); @@ -114,38 +116,35 @@ StringSaver Saver; std::vector Tokens; - bool Error = false; + llvm::StringMap> Cmd; size_t Pos = 0; bool IsUnderSysroot; + bool Error = false; }; +void ScriptParser::init() { + 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 ScriptParser::run() { + init(); 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(); - } else { + auto C = Cmd.find(Tok); + if (Cmd.find(Tok) != Cmd.end()) + C->second(*this); + else setError("unknown directive: " + Tok); - return; - } } }