1 //===-- llvm-driver.cpp ---------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "llvm/ADT/StringExtras.h"
10 #include "llvm/ADT/StringRef.h"
11 #include "llvm/ADT/StringSwitch.h"
12 #include "llvm/Support/CommandLine.h"
13 #include "llvm/Support/ErrorHandling.h"
14 #include "llvm/Support/Path.h"
15 #include "llvm/Support/WithColor.h"
16
17 using namespace llvm;
18
19 #define LLVM_DRIVER_TOOL(tool, entry) int entry##_main(int argc, char **argv);
20 #include "LLVMDriverTools.def"
21
22 constexpr char subcommands[] =
23 #define LLVM_DRIVER_TOOL(tool, entry) " " tool "\n"
24 #include "LLVMDriverTools.def"
25 ;
26
printHelpMessage()27 static void printHelpMessage() {
28 llvm::outs() << "OVERVIEW: llvm toolchain driver\n\n"
29 << "USAGE: llvm [subcommand] [options]\n\n"
30 << "SUBCOMMANDS:\n\n"
31 << subcommands
32 << "\n Type \"llvm <subcommand> --help\" to get more help on a "
33 "specific subcommand\n\n"
34 << "OPTIONS:\n\n --help - Display this message";
35 }
36
findTool(int Argc,char ** Argv)37 static int findTool(int Argc, char **Argv) {
38 if (!Argc) {
39 printHelpMessage();
40 return 1;
41 }
42
43 StringRef ToolName = Argv[0];
44
45 if (ToolName == "--help") {
46 printHelpMessage();
47 return 0;
48 }
49
50 StringRef Stem = sys::path::stem(ToolName);
51 auto Is = [=](StringRef Tool) {
52 auto I = Stem.rfind_insensitive(Tool);
53 return I != StringRef::npos && (I + Tool.size() == Stem.size() ||
54 !llvm::isAlnum(Stem[I + Tool.size()]));
55 };
56
57 #define LLVM_DRIVER_TOOL(tool, entry) \
58 if (Is(tool)) \
59 return entry##_main(Argc, Argv);
60 #include "LLVMDriverTools.def"
61
62 if (Is("llvm"))
63 return findTool(Argc - 1, Argv + 1);
64
65 printHelpMessage();
66 return 1;
67 }
68
69 extern bool IsLLVMDriver;
70
main(int Argc,char ** Argv)71 int main(int Argc, char **Argv) {
72 IsLLVMDriver = true;
73 return findTool(Argc, Argv);
74 }
75