Index: llvm/tools/llvm-driver/llvm-driver.cpp =================================================================== --- llvm/tools/llvm-driver/llvm-driver.cpp +++ llvm/tools/llvm-driver/llvm-driver.cpp @@ -15,6 +15,8 @@ #include "llvm/Support/Path.h" #include "llvm/Support/WithColor.h" +#include + using namespace llvm; #define LLVM_DRIVER_TOOL(tool, entry) \ @@ -26,6 +28,12 @@ #include "LLVMDriverTools.def" ; +using ToolEntry = int(int, char **, const llvm::ToolContext &); +std::map> ToolMap{ +#define LLVM_DRIVER_TOOL(tool, entry) {tool, entry##_main}, +#include "LLVMDriverTools.def" +}; + static void printHelpMessage() { llvm::outs() << "OVERVIEW: llvm toolchain driver\n\n" << "USAGE: llvm [subcommand] [options]\n\n" @@ -68,10 +76,9 @@ return {Argv0, sys::path::filename(Argv0).data(), false}; }; -#define LLVM_DRIVER_TOOL(tool, entry) \ - if (Is(tool)) \ - return entry##_main(Argc, Argv, MakeDriverArgs()); -#include "LLVMDriverTools.def" + for (auto &[tool, entry] : ToolMap) + if (Is(tool)) + return entry(Argc, Argv, MakeDriverArgs()); if (Is("llvm") || Argv0 == Argv[0]) return findTool(Argc - 1, Argv + 1, Argv0);