File: llvm-driver.cpp

package info (click to toggle)
llvm-toolchain-15 1%3A15.0.6-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,554,644 kB
  • sloc: cpp: 5,922,452; ansic: 1,012,136; asm: 674,362; python: 191,568; objc: 73,855; f90: 42,327; lisp: 31,913; pascal: 11,973; javascript: 10,144; sh: 9,421; perl: 7,447; ml: 5,527; awk: 3,523; makefile: 2,520; xml: 885; cs: 573; fortran: 567
file content (74 lines) | stat: -rw-r--r-- 2,211 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//===-- 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/ADT/StringSwitch.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.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);
#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 <subcommand> --help\" to get more help on a "
                  "specific subcommand\n\n"
               << "OPTIONS:\n\n  --help - Display this message";
}

static int findTool(int Argc, char **Argv) {
  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 I = Stem.rfind_insensitive(Tool);
    return I != StringRef::npos && (I + Tool.size() == Stem.size() ||
                                    !llvm::isAlnum(Stem[I + Tool.size()]));
  };

#define LLVM_DRIVER_TOOL(tool, entry)                                          \
  if (Is(tool))                                                                \
    return entry##_main(Argc, Argv);
#include "LLVMDriverTools.def"

  if (Is("llvm"))
    return findTool(Argc - 1, Argv + 1);

  printHelpMessage();
  return 1;
}

extern bool IsLLVMDriver;

int main(int Argc, char **Argv) {
  IsLLVMDriver = true;
  return findTool(Argc, Argv);
}