//===-- llvm-driver.cpp ---------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/InitLLVM.h" #include "llvm/Support/LLVMDriver.h" #include "llvm/Support/Path.h" #include "llvm/Support/WithColor.h" using namespace llvm; #define LLVM_DRIVER_TOOL(tool, entry) \ int entry##_main(int argc, char **argv, const llvm::ToolContext &); #include "LLVMDriverTools.def" constexpr char subcommands[] = #define LLVM_DRIVER_TOOL(tool, entry) " " tool "\n" #include "LLVMDriverTools.def" ; static void printHelpMessage() { llvm::outs() << "OVERVIEW: llvm toolchain driver\n\n" << "USAGE: llvm [subcommand] [options]\n\n" << "SUBCOMMANDS:\n\n" << subcommands << "\n Type \"llvm --help\" to get more help on a " "specific subcommand\n\n" << "OPTIONS:\n\n --help - Display this message\n"; } static int findTool(int Argc, char **Argv, const char *Argv0) { if (!Argc) { printHelpMessage(); return 1; } StringRef ToolName = Argv[0]; if (ToolName == "--help") { printHelpMessage(); return 0; } StringRef Stem = sys::path::stem(ToolName); auto Is = [=](StringRef Tool) { auto IsImpl = [=](StringRef Stem) { auto I = Stem.rfind_insensitive(Tool); return I != StringRef::npos && (I + Tool.size() == Stem.size() || !llvm::isAlnum(Stem[I + Tool.size()])); }; for (StringRef S : {Stem, sys::path::filename(ToolName)}) if (IsImpl(S)) return true; return false; }; auto MakeDriverArgs = [=]() -> llvm::ToolContext { if (ToolName != Argv0) return {Argv0, ToolName.data(), true}; 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" if (Is("llvm") || Argv0 == Argv[0]) return findTool(Argc - 1, Argv + 1, Argv0); printHelpMessage(); return 1; } int main(int Argc, char **Argv) { llvm::InitLLVM X(Argc, Argv); return findTool(Argc, Argv, Argv[0]); }