llvm-project

Форк
0
86 строк · 2.7 Кб
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/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"
17

18
using namespace llvm;
19

20
#define LLVM_DRIVER_TOOL(tool, entry)                                          \
21
  int entry##_main(int argc, char **argv, const llvm::ToolContext &);
22
#include "LLVMDriverTools.def"
23

24
constexpr char subcommands[] =
25
#define LLVM_DRIVER_TOOL(tool, entry) "  " tool "\n"
26
#include "LLVMDriverTools.def"
27
    ;
28

29
static void printHelpMessage() {
30
  llvm::outs() << "OVERVIEW: llvm toolchain driver\n\n"
31
               << "USAGE: llvm [subcommand] [options]\n\n"
32
               << "SUBCOMMANDS:\n\n"
33
               << subcommands
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";
37
}
38

39
static int findTool(int Argc, char **Argv, const char *Argv0) {
40
  if (!Argc) {
41
    printHelpMessage();
42
    return 1;
43
  }
44

45
  StringRef ToolName = Argv[0];
46

47
  if (ToolName == "--help") {
48
    printHelpMessage();
49
    return 0;
50
  }
51

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()]));
58
    };
59
    for (StringRef S : {Stem, sys::path::filename(ToolName)})
60
      if (IsImpl(S))
61
        return true;
62
    return false;
63
  };
64

65
  auto MakeDriverArgs = [=]() -> llvm::ToolContext {
66
    if (ToolName != Argv0)
67
      return {Argv0, ToolName.data(), true};
68
    return {Argv0, sys::path::filename(Argv0).data(), false};
69
  };
70

71
#define LLVM_DRIVER_TOOL(tool, entry)                                          \
72
  if (Is(tool))                                                                \
73
    return entry##_main(Argc, Argv, MakeDriverArgs());
74
#include "LLVMDriverTools.def"
75

76
  if (Is("llvm") || Argv0 == Argv[0])
77
    return findTool(Argc - 1, Argv + 1, Argv0);
78

79
  printHelpMessage();
80
  return 1;
81
}
82

83
int main(int Argc, char **Argv) {
84
  llvm::InitLLVM X(Argc, Argv);
85
  return findTool(Argc, Argv, Argv[0]);
86
}
87

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.