brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 14ce162 Raw
87 lines · cpp
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-exception6//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 18using 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 24constexpr char subcommands[] =25#define LLVM_DRIVER_TOOL(tool, entry) "  " tool "\n"26#include "LLVMDriverTools.def"27    ;28 29static void printHelpMessage() {30  llvm::outs() << "OVERVIEW: llvm toolchain driver\n\n"31               << "USAGE: llvm [subcommand] [options]\n\n"32               << "SUBCOMMANDS:\n\n"33               << subcommands34               << "\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";37}38 39static 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 83int main(int Argc, char **Argv) {84  llvm::InitLLVM X(Argc, Argv);85  return findTool(Argc, Argv, Argv[0]);86}87