1 //===-- llvm-driver.cpp ---------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 #include "llvm/ADT/StringExtras.h"
10 #include "llvm/ADT/StringRef.h"
11 #include "llvm/Support/CommandLine.h"
12 #include "llvm/Support/ErrorHandling.h"
13 #include "llvm/Support/InitLLVM.h"
14 #include "llvm/Support/LLVMDriver.h"
15 #include "llvm/Support/Path.h"
16 #include "llvm/Support/WithColor.h"
20 #define LLVM_DRIVER_TOOL(tool, entry) \
21 int entry##_main(int argc, char **argv, const llvm::ToolContext &);
22 #include "LLVMDriverTools.def"
24 constexpr char subcommands
[] =
25 #define LLVM_DRIVER_TOOL(tool, entry) " " tool "\n"
26 #include "LLVMDriverTools.def"
29 static void printHelpMessage() {
30 llvm::outs() << "OVERVIEW: llvm toolchain driver\n\n"
31 << "USAGE: llvm [subcommand] [options]\n\n"
34 << "\n Type \"llvm <subcommand> --help\" to get more help on a "
35 "specific subcommand\n\n"
36 << "OPTIONS:\n\n --help - Display this message\n";
39 static int findTool(int Argc
, char **Argv
, const char *Argv0
) {
45 StringRef ToolName
= Argv
[0];
47 if (ToolName
== "--help") {
52 StringRef Stem
= sys::path::stem(ToolName
);
53 auto Is
= [=](StringRef Tool
) {
54 auto IsImpl
= [=](StringRef Stem
) {
55 auto I
= Stem
.rfind_insensitive(Tool
);
56 return I
!= StringRef::npos
&& (I
+ Tool
.size() == Stem
.size() ||
57 !llvm::isAlnum(Stem
[I
+ Tool
.size()]));
59 for (StringRef S
: {Stem
, sys::path::filename(ToolName
)})
65 auto MakeDriverArgs
= [=]() -> llvm::ToolContext
{
66 if (ToolName
!= Argv0
)
67 return {Argv0
, ToolName
.data(), true};
68 return {Argv0
, sys::path::filename(Argv0
).data(), false};
71 #define LLVM_DRIVER_TOOL(tool, entry) \
73 return entry##_main(Argc, Argv, MakeDriverArgs());
74 #include "LLVMDriverTools.def"
76 if (Is("llvm") || Argv0
== Argv
[0])
77 return findTool(Argc
- 1, Argv
+ 1, Argv0
);
83 int main(int Argc
, char **Argv
) {
84 llvm::InitLLVM
X(Argc
, Argv
);
85 return findTool(Argc
, Argv
, Argv
[0]);