Author: gulfemsavrun
Date: 2026-09-17T18:02:36Z
New Revision: e78fdeba3f9a784ceb0b198140fdc792a0b55845

URL: 
https://github.com/llvm/llvm-project/commit/e78fdeba3f9a784ceb0b198140fdc792a0b55845
DIFF: 
https://github.com/llvm/llvm-project/commit/e78fdeba3f9a784ceb0b198140fdc792a0b55845.diff

LOG: Revert "[Support] Add ToolSession for in-process tool invocation" (#224368)

Reverts llvm/llvm-project#221996 because it broke Clang driver tests.
1)
https://ci.chromium.org/ui/p/fuchsia/builders/toolchain.ci/clang-host-linux-x64/b8670408702265017009/overview
2)
https://ci.chromium.org/ui/p/fuchsia/builders/toolchain.ci/clang-mac-arm64/b8670408421098418625/overview

Added: 
    llvm/include/llvm/Support/LLVMDriver.h

Modified: 
    clang/tools/clang-installapi/ClangInstallAPI.cpp
    clang/tools/clang-scan-deps/ClangScanDeps.cpp
    clang/tools/driver/cc1gen_reproducer_main.cpp
    clang/tools/driver/driver.cpp
    lld/tools/lld/lld.cpp
    llvm/cmake/modules/llvm-driver-template.cpp.in
    llvm/lib/Support/CMakeLists.txt
    llvm/tools/dsymutil/dsymutil.cpp
    llvm/tools/llvm-ar/llvm-ar.cpp
    llvm/tools/llvm-cgdata/llvm-cgdata.cpp
    llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
    llvm/tools/llvm-debuginfod-find/llvm-debuginfod-find.cpp
    llvm/tools/llvm-debuginfod/llvm-debuginfod.cpp
    llvm/tools/llvm-driver/llvm-driver.cpp
    llvm/tools/llvm-dwp/llvm-dwp.cpp
    llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
    llvm/tools/llvm-ifs/llvm-ifs.cpp
    llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
    llvm/tools/llvm-lipo/llvm-lipo.cpp
    llvm/tools/llvm-ml/llvm-ml.cpp
    llvm/tools/llvm-mt/llvm-mt.cpp
    llvm/tools/llvm-nm/llvm-nm.cpp
    llvm/tools/llvm-objcopy/llvm-objcopy.cpp
    llvm/tools/llvm-objdump/llvm-objdump.cpp
    llvm/tools/llvm-rc/llvm-rc.cpp
    llvm/tools/llvm-readobj/llvm-readobj.cpp
    llvm/tools/llvm-readtapi/llvm-readtapi.cpp
    llvm/tools/llvm-size/llvm-size.cpp
    llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
    llvm/tools/sancov/sancov.cpp
    llvm/unittests/Support/CMakeLists.txt

Removed: 
    llvm/include/llvm/Support/Driver.h
    llvm/lib/Support/Driver.cpp
    llvm/test/tools/llvm-driver/session-dispatch.test
    llvm/unittests/Support/LLVMToolSession/CMakeLists.txt
    llvm/unittests/Support/LLVMToolSession/LLVMToolSessionTest.cpp


################################################################################
diff  --git a/clang/tools/clang-installapi/ClangInstallAPI.cpp 
b/clang/tools/clang-installapi/ClangInstallAPI.cpp
index e7251dfb2ded7..baa10ff3e2812 100644
--- a/clang/tools/clang-installapi/ClangInstallAPI.cpp
+++ b/clang/tools/clang-installapi/ClangInstallAPI.cpp
@@ -25,7 +25,7 @@
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/PrettyStackTrace.h"
 #include "llvm/Support/Process.h"

diff  --git a/clang/tools/clang-scan-deps/ClangScanDeps.cpp 
b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
index cb4d3f53ff189..83b4860c130c3 100644
--- a/clang/tools/clang-scan-deps/ClangScanDeps.cpp
+++ b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
@@ -19,11 +19,11 @@
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FileUtilities.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/JSON.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Program.h"
 #include "llvm/Support/Signals.h"

diff  --git a/clang/tools/driver/cc1gen_reproducer_main.cpp 
b/clang/tools/driver/cc1gen_reproducer_main.cpp
index 810d96363b91b..d8e4a0d470bc5 100644
--- a/clang/tools/driver/cc1gen_reproducer_main.cpp
+++ b/clang/tools/driver/cc1gen_reproducer_main.cpp
@@ -17,9 +17,9 @@
 #include "clang/Driver/Driver.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/STLExtras.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/IOSandbox.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/TargetSelect.h"
 #include "llvm/Support/VirtualFileSystem.h"
 #include "llvm/Support/YAMLTraits.h"

diff  --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp
index af96812e9ebd9..d4d913a8977a4 100644
--- a/clang/tools/driver/driver.cpp
+++ b/clang/tools/driver/driver.cpp
@@ -36,10 +36,10 @@
 #include "llvm/Support/BuryPointer.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/CrashRecoveryContext.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/IOSandbox.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/PrettyStackTrace.h"
 #include "llvm/Support/Process.h"

diff  --git a/lld/tools/lld/lld.cpp b/lld/tools/lld/lld.cpp
index 53f0cbc6d9814..d6800fa1eea4b 100644
--- a/lld/tools/lld/lld.cpp
+++ b/lld/tools/lld/lld.cpp
@@ -33,7 +33,7 @@
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/CrashRecoveryContext.h"
-#include "llvm/Support/Driver.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/PluginLoader.h"
 #include "llvm/Support/Process.h"

diff  --git a/llvm/cmake/modules/llvm-driver-template.cpp.in 
b/llvm/cmake/modules/llvm-driver-template.cpp.in
index f51b21104afb0..d4c385c8cf412 100644
--- a/llvm/cmake/modules/llvm-driver-template.cpp.in
+++ b/llvm/cmake/modules/llvm-driver-template.cpp.in
@@ -8,7 +8,7 @@
 
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/Support/InitLLVM.h"
-#include "llvm/Support/Driver.h"
+#include "llvm/Support/LLVMDriver.h"
 
 int @TOOL_NAME@_main(int argc, char **, const llvm::ToolContext &);
 

diff  --git a/llvm/include/llvm/Support/Driver.h 
b/llvm/include/llvm/Support/Driver.h
deleted file mode 100644
index 174e9425fc13b..0000000000000
--- a/llvm/include/llvm/Support/Driver.h
+++ /dev/null
@@ -1,96 +0,0 @@
-//===- Driver.h -------------------------------------------------*- C++ 
-*-===//
-//
-// 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
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_SUPPORT_DRIVER_H
-#define LLVM_SUPPORT_DRIVER_H
-
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Compiler.h"
-#include "llvm/Support/ErrorOr.h"
-
-#include <functional>
-#include <memory>
-
-namespace llvm {
-
-class ToolSession;
-class ToolContext;
-
-using ToolMainFn = std::function<int(int, char **, const ToolContext &)>;
-
-/// An LLVM command-line tool that can be invoked without creating a process.
-struct CallableTool {
-  StringRef Name;
-  ToolMainFn Main;
-
-  explicit operator bool() const { return static_cast<bool>(Main); }
-};
-
-/// Describes how a tool was invoked and provides access to its host session.
-class ToolContext {
-  ToolSession *Session = nullptr;
-
-  friend class ToolSession;
-
-public:
-  const char *Path;
-  const char *PrependArg;
-  // PrependArg will be added unconditionally by the llvm-driver, but
-  // NeedsPrependArg will be false if Path is adequate to reinvoke the tool.
-  // This is useful if realpath is ever called on Path, in which case it will
-  // point to the llvm-driver executable, where PrependArg will be needed to
-  // invoke the correct tool.
-  bool NeedsPrependArg;
-
-  ToolContext(const char *Path, const char *PrependArg, bool NeedsPrependArg)
-      : Path(Path), PrependArg(PrependArg), NeedsPrependArg(NeedsPrependArg) {}
-
-  /// Finds a tool registered with the session that owns this context.
-  LLVM_ABI ErrorOr<CallableTool> getCallableTool(StringRef Name) const;
-
-  /// Invokes another tool registered with the same host session.
-  LLVM_ABI ErrorOr<int> callTool(ArrayRef<const char *> Args) const;
-};
-
-/// Owns LLVM process initialization and an in-process tool registry.
-///
-/// A long-lived host constructs one session and uses it for every embedded
-/// tool invocation. The individual tools borrow a ToolContext and therefore do
-/// not initialize or shut down LLVM themselves.
-///
-/// LLVM tools may use process-global state. Tool invocations must be 
externally
-/// serialized; concurrent calls are not supported.
-class LLVM_ABI ToolSession {
-public:
-  ToolSession(int &Argc, char **&Argv, ArrayRef<CallableTool> Tools,
-              bool InstallPipeSignalExitHandler = true,
-              bool NeedsPOSIXUtilitySignalHandling = false);
-  ~ToolSession();
-
-  ToolSession(const ToolSession &) = delete;
-  ToolSession &operator=(const ToolSession &) = delete;
-
-  /// Invokes the tool named by Args[0]. Args may instead contain a
-  /// process-style argv beginning with the session executable or an LLVM
-  /// multicall name.
-  ErrorOr<int> callTool(ArrayRef<const char *> Args);
-
-private:
-  struct Impl;
-  std::unique_ptr<Impl> PImpl;
-
-  ErrorOr<CallableTool> findTool(StringRef Name) const;
-  ToolContext makeContext(StringRef InvokedName, const char *PrependArg);
-
-  friend class ToolContext;
-};
-
-} // namespace llvm
-
-#endif

diff  --git a/llvm/include/llvm/Support/LLVMDriver.h 
b/llvm/include/llvm/Support/LLVMDriver.h
new file mode 100644
index 0000000000000..0b2e265d50b42
--- /dev/null
+++ b/llvm/include/llvm/Support/LLVMDriver.h
@@ -0,0 +1,27 @@
+//===- LLVMDriver.h ---------------------------------------------*- C++ 
-*-===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_SUPPORT_LLVMDRIVER_H
+#define LLVM_SUPPORT_LLVMDRIVER_H
+
+namespace llvm {
+
+struct ToolContext {
+  const char *Path;
+  const char *PrependArg;
+  // PrependArg will be added unconditionally by the llvm-driver, but
+  // NeedsPrependArg will be false if Path is adequate to reinvoke the tool.
+  // This is useful if realpath is ever called on Path, in which case it will
+  // point to the llvm-driver executable, where PrependArg will be needed to
+  // invoke the correct tool.
+  bool NeedsPrependArg;
+};
+
+} // namespace llvm
+
+#endif

diff  --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt
index 6e4cd15025206..e7dfcb0dcd891 100644
--- a/llvm/lib/Support/CMakeLists.txt
+++ b/llvm/lib/Support/CMakeLists.txt
@@ -227,7 +227,6 @@ add_llvm_component_library(LLVMSupport
   KnownFPClass.cpp
   LEB128.cpp
   LineIterator.cpp
-  Driver.cpp
   Locale.cpp
   LockFileManager.cpp
   ManagedStatic.cpp

diff  --git a/llvm/lib/Support/Driver.cpp b/llvm/lib/Support/Driver.cpp
deleted file mode 100644
index dab4a0b2d3bd9..0000000000000
--- a/llvm/lib/Support/Driver.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-//===-- 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/Support/Driver.h"
-
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringExtras.h"
-#include "llvm/Support/InitLLVM.h"
-#include "llvm/Support/Path.h"
-
-#include <cassert>
-#include <string>
-#include <system_error>
-#include <utility>
-#include <vector>
-
-using namespace llvm;
-
-namespace {
-
-bool matchesToolName(StringRef RegisteredName, StringRef InvokedName) {
-  StringRef Stem = sys::path::stem(InvokedName);
-  StringRef Filename = sys::path::filename(InvokedName);
-  auto Matches = [RegisteredName](StringRef Candidate) {
-    size_t Position = Candidate.rfind_insensitive(RegisteredName);
-    return Position != StringRef::npos &&
-           (Position + RegisteredName.size() == Candidate.size() ||
-            !llvm::isAlnum(Candidate[Position + RegisteredName.size()]));
-  };
-  return Matches(Stem) || Matches(Filename);
-}
-
-bool isMulticallName(StringRef Name) { return matchesToolName("llvm", Name); }
-
-} // namespace
-
-struct ToolSession::Impl {
-  InitLLVM Initialization;
-  std::string ExecutablePath;
-  std::vector<std::pair<std::string, ToolMainFn>> Tools;
-
-  Impl(int &Argc, char **&Argv, ArrayRef<CallableTool> RegisteredTools,
-       bool InstallPipeSignalExitHandler, bool NeedsPOSIXUtilitySignalHandling)
-      : Initialization(Argc, Argv, InstallPipeSignalExitHandler,
-                       NeedsPOSIXUtilitySignalHandling),
-        ExecutablePath(Argv[0]) {
-    Tools.reserve(RegisteredTools.size());
-    for (const CallableTool &Tool : RegisteredTools)
-      Tools.emplace_back(Tool.Name.str(), Tool.Main);
-  }
-};
-
-ToolSession::ToolSession(int &Argc, char **&Argv, ArrayRef<CallableTool> Tools,
-                         bool InstallPipeSignalExitHandler,
-                         bool NeedsPOSIXUtilitySignalHandling) {
-  assert(Argc > 0 && Argv && Argv[0] && "ToolSession requires a valid 
argv[0]");
-  PImpl =
-      std::make_unique<Impl>(Argc, Argv, Tools, InstallPipeSignalExitHandler,
-                             NeedsPOSIXUtilitySignalHandling);
-}
-
-ToolSession::~ToolSession() = default;
-
-ErrorOr<CallableTool> ToolSession::findTool(StringRef Name) const {
-  StringRef Stem = sys::path::stem(Name);
-  StringRef Filename = sys::path::filename(Name);
-  for (const auto &[RegisteredName, Main] : PImpl->Tools)
-    if (Stem.equals_insensitive(RegisteredName) ||
-        Filename.equals_insensitive(RegisteredName))
-      return CallableTool{RegisteredName, Main};
-
-  for (const auto &[RegisteredName, Main] : PImpl->Tools)
-    if (matchesToolName(RegisteredName, Name))
-      return CallableTool{RegisteredName, Main};
-  return make_error_code(std::errc::no_such_file_or_directory);
-}
-
-ToolContext ToolSession::makeContext(StringRef InvokedName,
-                                     const char *PrependArg) {
-  bool NeedsPrependArg = !matchesToolName(InvokedName, PImpl->ExecutablePath);
-  ToolContext Context(PImpl->ExecutablePath.c_str(), PrependArg,
-                      NeedsPrependArg);
-  Context.Session = this;
-  return Context;
-}
-
-ErrorOr<int> ToolSession::callTool(ArrayRef<const char *> Args) {
-  if (Args.empty())
-    return make_error_code(std::errc::invalid_argument);
-
-  StringRef InvokedName = Args.front();
-  ErrorOr<CallableTool> Tool = findTool(InvokedName);
-  if (!Tool) {
-    if (InvokedName != PImpl->ExecutablePath && !isMulticallName(InvokedName))
-      return make_error_code(std::errc::no_such_file_or_directory);
-    Args = Args.drop_front();
-    if (Args.empty())
-      return make_error_code(std::errc::invalid_argument);
-    InvokedName = Args.front();
-    Tool = findTool(InvokedName);
-  }
-
-  if (!Tool)
-    return Tool.getError();
-
-  std::string PrependArg = sys::path::stem(InvokedName).str();
-  ToolContext Context = makeContext(InvokedName, PrependArg.c_str());
-  SmallVector<char *, 16> MutableArgs;
-  MutableArgs.reserve(Args.size() + 1);
-  for (const char *Arg : Args)
-    MutableArgs.push_back(const_cast<char *>(Arg));
-  MutableArgs.push_back(nullptr);
-  return Tool->Main(Args.size(), MutableArgs.data(), Context);
-}
-
-ErrorOr<CallableTool> ToolContext::getCallableTool(StringRef Name) const {
-  if (!Session)
-    return make_error_code(std::errc::operation_not_permitted);
-  return Session->findTool(Name);
-}
-
-ErrorOr<int> ToolContext::callTool(ArrayRef<const char *> Args) const {
-  if (!Session)
-    return make_error_code(std::errc::operation_not_permitted);
-  return Session->callTool(Args);
-}

diff  --git a/llvm/test/tools/llvm-driver/session-dispatch.test 
b/llvm/test/tools/llvm-driver/session-dispatch.test
deleted file mode 100644
index a8e627f5a1305..0000000000000
--- a/llvm/test/tools/llvm-driver/session-dispatch.test
+++ /dev/null
@@ -1,9 +0,0 @@
-# REQUIRES: llvm-driver
-
-## Exercise a real LLVM tool entry point through ToolSession rather than
-## only testing the registry with synthetic callbacks.
-# RUN: %llvm cxxfilt _Z3foov | FileCheck %s --check-prefix=CXXFILT
-# RUN: %llvm --help | FileCheck %s --check-prefix=HELP
-
-# CXXFILT: foo()
-# HELP: OVERVIEW: llvm toolchain driver

diff  --git a/llvm/tools/dsymutil/dsymutil.cpp 
b/llvm/tools/dsymutil/dsymutil.cpp
index 244eb0cc9eb39..76c4d4140488c 100644
--- a/llvm/tools/dsymutil/dsymutil.cpp
+++ b/llvm/tools/dsymutil/dsymutil.cpp
@@ -35,10 +35,10 @@
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/CrashRecoveryContext.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/FileCollector.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/Program.h"

diff  --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
index 6ab53375509c8..38f929f63b39f 100644
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -22,11 +22,11 @@
 #include "llvm/Support/Chrono.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ConvertUTF.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Errc.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/LineIterator.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"

diff  --git a/llvm/tools/llvm-cgdata/llvm-cgdata.cpp 
b/llvm/tools/llvm-cgdata/llvm-cgdata.cpp
index 1212cab0b5e13..66a7410782922 100644
--- a/llvm/tools/llvm-cgdata/llvm-cgdata.cpp
+++ b/llvm/tools/llvm-cgdata/llvm-cgdata.cpp
@@ -21,7 +21,7 @@
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/VirtualFileSystem.h"
 #include "llvm/Support/WithColor.h"

diff  --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp 
b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
index d4b8c23bd02be..1467093e78c0b 100644
--- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
+++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
@@ -13,7 +13,7 @@
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/WithColor.h"
 #include "llvm/Support/raw_ostream.h"
 #include "llvm/TargetParser/Host.h"

diff  --git a/llvm/tools/llvm-debuginfod-find/llvm-debuginfod-find.cpp 
b/llvm/tools/llvm-debuginfod-find/llvm-debuginfod-find.cpp
index 9f515d444565a..9aeda9f55bb96 100644
--- a/llvm/tools/llvm-debuginfod-find/llvm-debuginfod-find.cpp
+++ b/llvm/tools/llvm-debuginfod-find/llvm-debuginfod-find.cpp
@@ -23,8 +23,8 @@
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/InitLLVM.h"
+#include "llvm/Support/LLVMDriver.h"
 
 using namespace llvm;
 

diff  --git a/llvm/tools/llvm-debuginfod/llvm-debuginfod.cpp 
b/llvm/tools/llvm-debuginfod/llvm-debuginfod.cpp
index e24fa29718887..c44bf915361f1 100644
--- a/llvm/tools/llvm-debuginfod/llvm-debuginfod.cpp
+++ b/llvm/tools/llvm-debuginfod/llvm-debuginfod.cpp
@@ -22,7 +22,7 @@
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/ThreadPool.h"
 
 using namespace llvm;

diff  --git a/llvm/tools/llvm-driver/llvm-driver.cpp 
b/llvm/tools/llvm-driver/llvm-driver.cpp
index 9cbe750fc563b..14ce162faee46 100644
--- a/llvm/tools/llvm-driver/llvm-driver.cpp
+++ b/llvm/tools/llvm-driver/llvm-driver.cpp
@@ -6,11 +6,14 @@
 //
 
//===----------------------------------------------------------------------===//
 
-#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Driver.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/ErrorHandling.h"
+#include "llvm/Support/InitLLVM.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/Path.h"
-#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/WithColor.h"
 
 using namespace llvm;
 
@@ -33,26 +36,51 @@ static void printHelpMessage() {
                << "OPTIONS:\n\n  --help - Display this message\n";
 }
 
-int main(int Argc, char **Argv) {
-  const CallableTool Tools[] = {
-#define LLVM_DRIVER_TOOL(tool, entry) {tool, entry##_main},
-#include "LLVMDriverTools.def"
-  };
-
-  ToolSession Session(Argc, Argv, Tools);
-
-  StringRef Stem = sys::path::stem(Argv[0]);
-  if (Stem.equals_insensitive("llvm") &&
-      (Argc == 1 || (Argc == 2 && StringRef(Argv[1]) == "--help"))) {
+static int findTool(int Argc, char **Argv, const char *Argv0) {
+  if (!Argc) {
     printHelpMessage();
-    return Argc == 1 ? 1 : 0;
+    return 1;
   }
 
-  SmallVector<const char *, 16> Args(Argv, Argv + Argc);
-  ErrorOr<int> Result = Session.callTool(Args);
-  if (!Result) {
+  StringRef ToolName = Argv[0];
+
+  if (ToolName == "--help") {
     printHelpMessage();
-    return 1;
+    return 0;
   }
-  return *Result;
+
+  StringRef Stem = sys::path::stem(ToolName);
+  auto Is = [=](StringRef Tool) {
+    auto IsImpl = [=](StringRef Stem) {
+      auto I = Stem.rfind_insensitive(Tool);
+      return I != StringRef::npos && (I + Tool.size() == Stem.size() ||
+                                      !llvm::isAlnum(Stem[I + Tool.size()]));
+    };
+    for (StringRef S : {Stem, sys::path::filename(ToolName)})
+      if (IsImpl(S))
+        return true;
+    return false;
+  };
+
+  auto MakeDriverArgs = [=]() -> llvm::ToolContext {
+    if (ToolName != Argv0)
+      return {Argv0, ToolName.data(), true};
+    return {Argv0, sys::path::filename(Argv0).data(), false};
+  };
+
+#define LLVM_DRIVER_TOOL(tool, entry)                                          
\
+  if (Is(tool))                                                                
\
+    return entry##_main(Argc, Argv, MakeDriverArgs());
+#include "LLVMDriverTools.def"
+
+  if (Is("llvm") || Argv0 == Argv[0])
+    return findTool(Argc - 1, Argv + 1, Argv0);
+
+  printHelpMessage();
+  return 1;
+}
+
+int main(int Argc, char **Argv) {
+  llvm::InitLLVM X(Argc, Argv);
+  return findTool(Argc, Argv, Argv[0]);
 }

diff  --git a/llvm/tools/llvm-dwp/llvm-dwp.cpp 
b/llvm/tools/llvm-dwp/llvm-dwp.cpp
index afe7997cab883..b8c3f6e3d754a 100644
--- a/llvm/tools/llvm-dwp/llvm-dwp.cpp
+++ b/llvm/tools/llvm-dwp/llvm-dwp.cpp
@@ -16,8 +16,8 @@
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/ToolOutputFile.h"
 #include <optional>

diff  --git a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp 
b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
index 7aff2cd0481a1..ab1eb70e780e9 100644
--- a/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
+++ b/llvm/tools/llvm-gsymutil/llvm-gsymutil.cpp
@@ -17,11 +17,11 @@
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/JSON.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/MathExtras.h"
 #include "llvm/Support/MemoryBuffer.h"

diff  --git a/llvm/tools/llvm-ifs/llvm-ifs.cpp 
b/llvm/tools/llvm-ifs/llvm-ifs.cpp
index e80a507b9f934..3e9014b7f52f9 100644
--- a/llvm/tools/llvm-ifs/llvm-ifs.cpp
+++ b/llvm/tools/llvm-ifs/llvm-ifs.cpp
@@ -19,10 +19,10 @@
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Errc.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/FileOutputBuffer.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/VersionTuple.h"

diff  --git a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp 
b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
index 25a5d021cfc3c..40065270fb7ef 100644
--- a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
+++ b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp
@@ -23,7 +23,7 @@
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/LineIterator.h"
 #include "llvm/Support/TargetSelect.h"
 #include "llvm/Support/VirtualFileSystem.h"

diff  --git a/llvm/tools/llvm-lipo/llvm-lipo.cpp 
b/llvm/tools/llvm-lipo/llvm-lipo.cpp
index 0296067f2cf49..66ac0eecb8396 100644
--- a/llvm/tools/llvm-lipo/llvm-lipo.cpp
+++ b/llvm/tools/llvm-lipo/llvm-lipo.cpp
@@ -24,9 +24,9 @@
 #include "llvm/Option/Arg.h"
 #include "llvm/Option/ArgList.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/FileOutputBuffer.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/TargetSelect.h"
 #include "llvm/Support/WithColor.h"
 #include "llvm/TargetParser/Triple.h"

diff  --git a/llvm/tools/llvm-ml/llvm-ml.cpp b/llvm/tools/llvm-ml/llvm-ml.cpp
index b3e53f7eb316c..21fdb010bab83 100644
--- a/llvm/tools/llvm-ml/llvm-ml.cpp
+++ b/llvm/tools/llvm-ml/llvm-ml.cpp
@@ -31,10 +31,10 @@
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/Compression.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/FileUtilities.h"
 #include "llvm/Support/FormatVariadic.h"
 #include "llvm/Support/FormattedStream.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/Process.h"

diff  --git a/llvm/tools/llvm-mt/llvm-mt.cpp b/llvm/tools/llvm-mt/llvm-mt.cpp
index 4c40a6564e0db..3bd1bc786f86d 100644
--- a/llvm/tools/llvm-mt/llvm-mt.cpp
+++ b/llvm/tools/llvm-mt/llvm-mt.cpp
@@ -15,9 +15,9 @@
 #include "llvm/Option/Arg.h"
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/FileOutputBuffer.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/PrettyStackTrace.h"

diff  --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp
index a425e8c5ad4a7..170bf0b7fc22e 100644
--- a/llvm/tools/llvm-nm/llvm-nm.cpp
+++ b/llvm/tools/llvm-nm/llvm-nm.cpp
@@ -42,9 +42,9 @@
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Format.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Program.h"
 #include "llvm/Support/Signals.h"

diff  --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp 
b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 1b98b4bc1a772..482249f67d38c 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -27,11 +27,11 @@
 #include "llvm/Option/Option.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/ErrorOr.h"
 #include "llvm/Support/FileUtilities.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/Memory.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/Process.h"

diff  --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp 
b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 2d670fd338309..92c1c2da3d025 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -64,10 +64,10 @@
 #include "llvm/Option/Option.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/Debug.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Errc.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Format.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/SourceMgr.h"
 #include "llvm/Support/StringSaver.h"

diff  --git a/llvm/tools/llvm-rc/llvm-rc.cpp b/llvm/tools/llvm-rc/llvm-rc.cpp
index 6f10fed300f96..7afecf667fed0 100644
--- a/llvm/tools/llvm-rc/llvm-rc.cpp
+++ b/llvm/tools/llvm-rc/llvm-rc.cpp
@@ -23,10 +23,10 @@
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/OptTable.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FileUtilities.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/PrettyStackTrace.h"

diff  --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp 
b/llvm/tools/llvm-readobj/llvm-readobj.cpp
index 57ad26f0f2a70..d06221fbfd5b8 100644
--- a/llvm/tools/llvm-readobj/llvm-readobj.cpp
+++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp
@@ -39,10 +39,10 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/DataTypes.h"
 #include "llvm/Support/Debug.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Errc.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/ScopedPrinter.h"
 #include "llvm/Support/WithColor.h"

diff  --git a/llvm/tools/llvm-readtapi/llvm-readtapi.cpp 
b/llvm/tools/llvm-readtapi/llvm-readtapi.cpp
index b541e0d7fc214..312f298a86256 100644
--- a/llvm/tools/llvm-readtapi/llvm-readtapi.cpp
+++ b/llvm/tools/llvm-readtapi/llvm-readtapi.cpp
@@ -15,9 +15,9 @@
 #include "llvm/Option/ArgList.h"
 #include "llvm/Option/Option.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Error.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/raw_ostream.h"

diff  --git a/llvm/tools/llvm-size/llvm-size.cpp 
b/llvm/tools/llvm-size/llvm-size.cpp
index 1192dcf101bd4..77058368bf4c3 100644
--- a/llvm/tools/llvm-size/llvm-size.cpp
+++ b/llvm/tools/llvm-size/llvm-size.cpp
@@ -23,9 +23,9 @@
 #include "llvm/Option/Option.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Format.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/WithColor.h"
 #include "llvm/Support/raw_ostream.h"

diff  --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp 
b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
index b49514823e189..0496df84fc8eb 100644
--- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -32,9 +32,9 @@
 #include "llvm/Support/COM.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Errc.h"
 #include "llvm/Support/FileSystem.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/StringSaver.h"
 #include "llvm/Support/WithColor.h"

diff  --git a/llvm/tools/sancov/sancov.cpp b/llvm/tools/sancov/sancov.cpp
index 450163c5723b3..d6fdac2583d5d 100644
--- a/llvm/tools/sancov/sancov.cpp
+++ b/llvm/tools/sancov/sancov.cpp
@@ -34,11 +34,11 @@
 #include "llvm/Option/Option.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
 #include "llvm/Support/Errc.h"
 #include "llvm/Support/ErrorOr.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/JSON.h"
+#include "llvm/Support/LLVMDriver.h"
 #include "llvm/Support/MD5.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"

diff  --git a/llvm/unittests/Support/CMakeLists.txt 
b/llvm/unittests/Support/CMakeLists.txt
index f9732ff4e0e4b..cc88a6c5670ca 100644
--- a/llvm/unittests/Support/CMakeLists.txt
+++ b/llvm/unittests/Support/CMakeLists.txt
@@ -162,4 +162,3 @@ if(NOT LLVM_INTEGRATED_CRT_ALLOC)
 endif()
 
 add_subdirectory(CommandLineInit)
-add_subdirectory(LLVMToolSession)

diff  --git a/llvm/unittests/Support/LLVMToolSession/CMakeLists.txt 
b/llvm/unittests/Support/LLVMToolSession/CMakeLists.txt
deleted file mode 100644
index 2c61f3c535615..0000000000000
--- a/llvm/unittests/Support/LLVMToolSession/CMakeLists.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-set(test_name LLVMToolSessionTests)
-set(test_suite UnitTests)
-
-# This test supplies its own main() so a single ToolSession can own
-# InitLLVM for the complete test process.
-if (NOT LLVM_BUILD_TESTS)
-  set(EXCLUDE_FROM_ALL ON)
-endif()
-
-list(APPEND LLVM_LINK_COMPONENTS Support)
-
-add_llvm_executable(${test_name}
-  IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH
-  LLVMToolSessionTest.cpp)
-
-target_link_libraries(${test_name} PRIVATE llvm_gtest)
-add_dependencies(${test_suite} ${test_name})
-
-set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
-set_output_directory(${test_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir})

diff  --git a/llvm/unittests/Support/LLVMToolSession/LLVMToolSessionTest.cpp 
b/llvm/unittests/Support/LLVMToolSession/LLVMToolSessionTest.cpp
deleted file mode 100644
index 88fef63edf751..0000000000000
--- a/llvm/unittests/Support/LLVMToolSession/LLVMToolSessionTest.cpp
+++ /dev/null
@@ -1,127 +0,0 @@
-//===- LLVMToolSessionTest.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/Support/CommandLine.h"
-#include "llvm/Support/Driver.h"
-#include "gtest/gtest.h"
-
-#include <memory>
-
-using namespace llvm;
-
-namespace {
-
-std::unique_ptr<ToolSession> Session;
-unsigned CompilerCalls;
-unsigned LinkerCalls;
-unsigned WrapperCalls;
-
-int linkerMain(int Argc, char **Argv, const ToolContext &Context) {
-  ++LinkerCalls;
-  EXPECT_EQ(Argc, 3);
-  EXPECT_STREQ(Argv[0], "wasm-ld");
-  EXPECT_TRUE(Context.getCallableTool("clang"));
-  return 0;
-}
-
-int compilerMain(int Argc, char **Argv, const ToolContext &Context) {
-  ++CompilerCalls;
-  EXPECT_EQ(Argc, 2);
-  EXPECT_STREQ(Argv[0], "clang");
-  const char *LinkArgs[] = {"wasm-ld", Argv[1], "out.wasm"};
-  ErrorOr<int> Result = Context.callTool(LinkArgs);
-  EXPECT_TRUE(Result);
-  return Result ? *Result : 1;
-}
-
-int clangWrapperMain(int Argc, char **Argv, const ToolContext &Context) {
-  ++WrapperCalls;
-  EXPECT_EQ(Argc, 1);
-  EXPECT_STREQ(Argv[0], "/tmp/clang-wrapper.exe");
-  EXPECT_STREQ(Context.PrependArg, "clang-wrapper");
-  return 0;
-}
-
-int resetOptionsMain(int, char **, const ToolContext &) {
-  cl::ResetAllOptionOccurrences();
-  return 0;
-}
-
-TEST(LLVMToolSessionTest, SupportsSequentialNestedToolCalls) {
-  unsigned CompilerCallsBefore = CompilerCalls;
-  unsigned LinkerCallsBefore = LinkerCalls;
-  const char *First[] = {"clang", "first.cpp"};
-  const char *Second[] = {"clang", "second.cpp"};
-
-  ErrorOr<int> FirstResult = Session->callTool(First);
-  ASSERT_TRUE(FirstResult);
-  EXPECT_EQ(*FirstResult, 0);
-  ErrorOr<int> SecondResult = Session->callTool(Second);
-  ASSERT_TRUE(SecondResult);
-  EXPECT_EQ(*SecondResult, 0);
-  EXPECT_EQ(CompilerCalls, CompilerCallsBefore + 2);
-  EXPECT_EQ(LinkerCalls, LinkerCallsBefore + 2);
-}
-
-TEST(LLVMToolSessionTest, ReportsUnknownTools) {
-  const char *Args[] = {"not-a-tool"};
-  ErrorOr<int> Result = Session->callTool(Args);
-  EXPECT_FALSE(Result);
-  EXPECT_EQ(Result.getError(),
-            make_error_code(std::errc::no_such_file_or_directory));
-}
-
-TEST(LLVMToolSessionTest, SupportsStatefulCallableTools) {
-  const char *Args[] = {"stateful-tool"};
-  ErrorOr<int> Result = Session->callTool(Args);
-  ASSERT_TRUE(Result);
-  EXPECT_EQ(*Result, 42);
-}
-
-TEST(LLVMToolSessionTest, PrefersExactToolNameBeforeFuzzyMatch) {
-  const char *Args[] = {"/tmp/clang-wrapper.exe"};
-  ErrorOr<int> Result = Session->callTool(Args);
-  ASSERT_TRUE(Result);
-  EXPECT_EQ(*Result, 0);
-  EXPECT_EQ(WrapperCalls, 1u);
-}
-
-TEST(LLVMToolSessionTest, SurvivesCommandLineOptionReset) {
-  const char *ResetArgs[] = {"reset-options"};
-  ErrorOr<int> ResetResult = Session->callTool(ResetArgs);
-  ASSERT_TRUE(ResetResult);
-  EXPECT_EQ(*ResetResult, 0);
-
-  unsigned CompilerCallsBefore = CompilerCalls;
-  const char *CompilerArgs[] = {"clang", "after-reset.cpp"};
-  ErrorOr<int> CompilerResult = Session->callTool(CompilerArgs);
-  ASSERT_TRUE(CompilerResult);
-  EXPECT_EQ(*CompilerResult, 0);
-  EXPECT_EQ(CompilerCalls, CompilerCallsBefore + 1);
-}
-
-} // namespace
-
-int main(int Argc, char **Argv) {
-  int StatefulResult = 42;
-  const CallableTool Tools[] = {
-      {"clang", compilerMain},
-      {"clang-wrapper", clangWrapperMain},
-      {"reset-options", resetOptionsMain},
-      {"stateful-tool",
-       [&StatefulResult](int, char **, const ToolContext &) {
-         return StatefulResult;
-       }},
-      {"wasm-ld", linkerMain},
-  };
-  Session = std::make_unique<ToolSession>(Argc, Argv, Tools);
-  testing::InitGoogleTest(&Argc, Argv);
-  int Result = RUN_ALL_TESTS();
-  Session.reset();
-  return Result;
-}


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to