[clang] f06abbb - LLVM Driver Multicall tool

Michael Spencer via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 6 15:46:42 PDT 2022


Hmm, I'm not able to reproduce this with upstream. Sorry for the noise.

- Michael Spencer


On Mon, Jun 6, 2022 at 2:44 PM Michael Spencer <bigcheesegs at gmail.com>
wrote:

> I believe this broke the shared library build. CMake complains with a
> cycle:
>
> CMake Error: The inter-target dependency graph contains the following strongly connected component (cycle):
>
>
> I'm verifying that this occurs with a clean upstream build.
>
> - Michael Spencer
>
>
> On Sun, Jun 5, 2022 at 9:28 PM Alex Brachet via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>>
>> Author: Chris Bieneman
>> Date: 2022-06-06T04:27:32Z
>> New Revision: f06abbb393800b0d466c88e283c06f75561c432c
>>
>> URL:
>> https://github.com/llvm/llvm-project/commit/f06abbb393800b0d466c88e283c06f75561c432c
>> DIFF:
>> https://github.com/llvm/llvm-project/commit/f06abbb393800b0d466c88e283c06f75561c432c.diff
>>
>> LOG: LLVM Driver Multicall tool
>>
>> This patch adds an llvm-driver multicall tool that can combine multiple
>> LLVM-based tools. The build infrastructure is enabled for a tool by
>> adding the GENERATE_DRIVER option to the add_llvm_executable CMake
>> call, and changing the tool's main function to a canonicalized
>> tool_name_main format (i.e. llvm_ar_main, clang_main, etc...).
>>
>> As currently implemented llvm-driver contains dsymutil, llvm-ar,
>> llvm-cxxfilt, llvm-objcopy, and clang (if clang is included in the
>> build).
>>
>> llvm-driver can be enabled from builds by setting
>> LLVM_TOOL_LLVM_DRIVER_BUILD=On.
>>
>> There are several limitations in the current implementation, which can
>> be addressed in subsequent patches:
>>
>> (1) the multicall binary cannot currently properly handle
>> multi-dispatch tools. This means symlinking llvm-ranlib to llvm-driver
>> will not properly result in llvm-ar's main being called.
>> (2) the multicall binary cannot be comprised of tools containing
>> conflicting cl::opt options as the global cl::opt option list cannot
>> contain duplicates.
>>
>> These limitations can be addressed in subsequent patches.
>>
>> Differential revision: https://reviews.llvm.org/D109977
>>
>> Added:
>>     llvm/cmake/driver-template.cpp.in
>>     llvm/test/tools/llvm-driver/help-passthrough.test
>>     llvm/test/tools/llvm-driver/help.test
>>     llvm/test/tools/llvm-driver/symlink-call.test
>>     llvm/tools/llvm-driver/CMakeLists.txt
>>     llvm/tools/llvm-driver/llvm-driver.cpp
>>
>> Modified:
>>     clang/cmake/modules/AddClang.cmake
>>     clang/tools/driver/CMakeLists.txt
>>     clang/tools/driver/driver.cpp
>>     llvm/CMakeLists.txt
>>     llvm/cmake/modules/AddLLVM.cmake
>>     llvm/lib/Support/Path.cpp
>>     llvm/lib/Support/Unix/Path.inc
>>     llvm/lib/Support/Windows/Path.inc
>>     llvm/test/CMakeLists.txt
>>     llvm/test/lit.cfg.py
>>     llvm/test/lit.site.cfg.py.in
>>     llvm/tools/CMakeLists.txt
>>     llvm/tools/dsymutil/CMakeLists.txt
>>     llvm/tools/dsymutil/dsymutil.cpp
>>     llvm/tools/llvm-ar/CMakeLists.txt
>>     llvm/tools/llvm-ar/llvm-ar.cpp
>>     llvm/tools/llvm-cxxfilt/CMakeLists.txt
>>     llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
>>     llvm/tools/llvm-objcopy/CMakeLists.txt
>>     llvm/tools/llvm-objcopy/llvm-objcopy.cpp
>>     utils/bazel/llvm-project-overlay/clang/BUILD.bazel
>>     utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
>>
>> Removed:
>>
>>
>>
>>
>> ################################################################################
>> diff  --git a/clang/cmake/modules/AddClang.cmake
>> b/clang/cmake/modules/AddClang.cmake
>> index 9bbbfc032b7df..299f8ce6e2fb4 100644
>> --- a/clang/cmake/modules/AddClang.cmake
>> +++ b/clang/cmake/modules/AddClang.cmake
>> @@ -184,5 +184,8 @@ function(clang_target_link_libraries target type)
>>    else()
>>      target_link_libraries(${target} ${type} ${ARGN})
>>    endif()
>> +  if (TARGET obj.${target})
>> +    target_link_libraries(obj.${target} ${ARGN})
>> +  endif()
>>
>>  endfunction()
>>
>> diff  --git a/clang/tools/driver/CMakeLists.txt
>> b/clang/tools/driver/CMakeLists.txt
>> index 6b3e159d1b648..d05b71db13f21 100644
>> --- a/clang/tools/driver/CMakeLists.txt
>> +++ b/clang/tools/driver/CMakeLists.txt
>> @@ -31,6 +31,7 @@ add_clang_tool(clang
>>    DEPENDS
>>    intrinsics_gen
>>    ${support_plugins}
>> +  GENERATE_DRIVER
>>    )
>>
>>  clang_target_link_libraries(clang
>>
>> diff  --git a/clang/tools/driver/driver.cpp
>> b/clang/tools/driver/driver.cpp
>> index d361457f8cecd..fa1f09b44f4da 100644
>> --- a/clang/tools/driver/driver.cpp
>> +++ b/clang/tools/driver/driver.cpp
>> @@ -327,7 +327,7 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char
>> *> &ArgV) {
>>    return 1;
>>  }
>>
>> -int main(int Argc, const char **Argv) {
>> +int clang_main(int Argc, char **Argv) {
>>    noteBottomOfStack();
>>    llvm::InitLLVM X(Argc, Argv);
>>    llvm::setBugReportMsg("PLEASE submit a bug report to " BUG_REPORT_URL
>>
>> diff  --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt
>> index 1effbde06b80e..fab16edd7d532 100644
>> --- a/llvm/CMakeLists.txt
>> +++ b/llvm/CMakeLists.txt
>> @@ -269,6 +269,8 @@ include(VersionFromVCS)
>>  option(LLVM_APPEND_VC_REV
>>    "Embed the version control system revision in LLVM" ON)
>>
>> +option(LLVM_TOOL_LLVM_DRIVER_BUILD "Enables building the llvm multicall
>> tool" OFF)
>> +
>>  set(PACKAGE_NAME LLVM)
>>  set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
>>  set(PACKAGE_BUGREPORT "https://github.com/llvm/llvm-project/issues/")
>>
>> diff  --git a/llvm/cmake/driver-template.cpp.in b/llvm/cmake/
>> driver-template.cpp.in
>> new file mode 100644
>> index 0000000000000..2164fb00d168f
>> --- /dev/null
>> +++ b/llvm/cmake/driver-template.cpp.in
>> @@ -0,0 +1,11 @@
>> +//===-- driver-template.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
>> +//
>>
>> +//===----------------------------------------------------------------------===//
>> +
>> +int @TOOL_NAME at _main(int argc, char **argv);
>> +
>> +int main(int argc, char **argv) { return @TOOL_NAME at _main(argc, argv); }
>>
>> diff  --git a/llvm/cmake/modules/AddLLVM.cmake
>> b/llvm/cmake/modules/AddLLVM.cmake
>> index f798243a80b22..64d719f2626c9 100644
>> --- a/llvm/cmake/modules/AddLLVM.cmake
>> +++ b/llvm/cmake/modules/AddLLVM.cmake
>> @@ -859,7 +859,7 @@ endmacro(add_llvm_library name)
>>
>>  macro(add_llvm_executable name)
>>    cmake_parse_arguments(ARG
>> -
>> "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS"
>> +
>> "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS;GENERATE_DRIVER"
>>      "ENTITLEMENTS;BUNDLE_PATH"
>>      "DEPENDS"
>>      ${ARGN})
>> @@ -869,7 +869,7 @@ macro(add_llvm_executable name)
>>    list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
>>
>>    # Generate objlib
>> -  if(LLVM_ENABLE_OBJLIB)
>> +  if(LLVM_ENABLE_OBJLIB OR ARG_GENERATE_DRIVER)
>>      # Generate an obj library for both targets.
>>      set(obj_name "obj.${name}")
>>      add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL
>> @@ -884,6 +884,23 @@ macro(add_llvm_executable name)
>>      set_target_properties(${obj_name} PROPERTIES FOLDER "Object
>> Libraries")
>>    endif()
>>
>> +  if (ARG_GENERATE_DRIVER)
>> +    string(REPLACE "-" "_" TOOL_NAME ${name})
>> +    configure_file(
>> +      ${LLVM_MAIN_SRC_DIR}/cmake/driver-template.cpp.in
>> +      ${CMAKE_CURRENT_BINARY_DIR}/${name}-driver.cpp)
>> +
>> +    list(APPEND ALL_FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}-driver.cpp)
>> +
>> +    set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_COMPONENTS
>> ${LLVM_LINK_COMPONENTS})
>> +    set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_DEPS ${ARG_DEPENDS}
>> ${LLVM_COMMON_DEPENDS})
>> +    set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_OBJLIBS
>> "${obj_name}")
>> +
>> +    set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOLS ${name})
>> +    target_link_libraries(${obj_name} ${LLVM_PTHREAD_LIB})
>> +    llvm_config(${obj_name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} )
>> +  endif()
>> +
>>    add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
>>
>>    if(XCODE)
>> @@ -1449,6 +1466,12 @@ function(llvm_add_implicit_projects project)
>>    foreach(dir ${sub-dirs})
>>      if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt")
>>        canonicalize_tool_name(${dir} name)
>> +      # I don't like special casing things by order, but the llvm-driver
>> ends up
>> +      # linking the object libraries from all the tools that opt-in, so
>> adding
>> +      # it separately at the end is probably the simplest case.
>> +      if("${name}" STREQUAL "LLVM_DRIVER")
>> +        continue()
>> +      endif()
>>        if (${project}_TOOL_${name}_BUILD)
>>          get_filename_component(fn "${dir}" NAME)
>>          list(APPEND list_of_implicit_subdirs "${fn}")
>> @@ -1998,6 +2021,16 @@ endfunction()
>>
>>  function(add_llvm_tool_symlink link_name target)
>>    cmake_parse_arguments(ARG "ALWAYS_GENERATE" "OUTPUT_DIR" "" ${ARGN})
>> +
>> +  get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
>> +
>> +  if (${target} IN_LIST LLVM_DRIVER_TOOLS)
>> +    string(REPLACE "-" "_" tool_entry ${target})
>> +    string(REPLACE "-" "_" key ${link_name})
>> +    string(REPLACE "llvm-" "" tool_name ${link_name})
>> +    set_property(GLOBAL APPEND_STRING PROPERTY
>> +                 LLVM_EXTRA_DRIVER_ENTRIES
>> "LLVM_DRIVER_TOOL(\"${tool_name}\", ${tool_entry})\n")
>> +  endif()
>>    set(dest_binary "$<TARGET_FILE:${target}>")
>>
>>    # This got a bit gross... For multi-configuration generators the target
>>
>> diff  --git a/llvm/lib/Support/Path.cpp b/llvm/lib/Support/Path.cpp
>> index 9575e34b81c63..283dc70f2bc9a 100644
>> --- a/llvm/lib/Support/Path.cpp
>> +++ b/llvm/lib/Support/Path.cpp
>> @@ -1202,9 +1202,18 @@ Error readNativeFileToEOF(file_t FileHandle,
>> SmallVectorImpl<char> &Buffer,
>>  #include "Windows/Path.inc"
>>  #endif
>>
>> +bool IsLLVMDriver = false;
>> +
>>  namespace llvm {
>>  namespace sys {
>>  namespace fs {
>> +
>> +std::string getMainExecutable(const char *Argv0, void *MainAddr) {
>> +  if (IsLLVMDriver)
>> +    return sys::path::stem(Argv0).str();
>> +  return getMainExecutableImpl(Argv0, MainAddr);
>> +}
>> +
>>  TempFile::TempFile(StringRef Name, int FD)
>>      : TmpName(std::string(Name)), FD(FD) {}
>>  TempFile::TempFile(TempFile &&Other) { *this = std::move(Other); }
>>
>> diff  --git a/llvm/lib/Support/Unix/Path.inc
>> b/llvm/lib/Support/Unix/Path.inc
>> index c4345f13f0a6e..2ae7c6dc47e07 100644
>> --- a/llvm/lib/Support/Unix/Path.inc
>> +++ b/llvm/lib/Support/Unix/Path.inc
>> @@ -194,7 +194,7 @@ getprogpath(char ret[PATH_MAX], const char *bin)
>>
>>  /// GetMainExecutable - Return the path to the main executable, given the
>>  /// value of argv[0] from program startup.
>> -std::string getMainExecutable(const char *argv0, void *MainAddr) {
>> +std::string getMainExecutableImpl(const char *argv0, void *MainAddr) {
>>  #if defined(__APPLE__)
>>    // On OS X the executable path is saved to the stack by dyld. Reading
>> it
>>    // from there is much faster than calling dladdr, especially for large
>>
>> diff  --git a/llvm/lib/Support/Windows/Path.inc
>> b/llvm/lib/Support/Windows/Path.inc
>> index 5f1a364ea1a8e..433c62900a3f6 100644
>> --- a/llvm/lib/Support/Windows/Path.inc
>> +++ b/llvm/lib/Support/Windows/Path.inc
>> @@ -130,7 +130,7 @@ namespace fs {
>>
>>  const file_t kInvalidFile = INVALID_HANDLE_VALUE;
>>
>> -std::string getMainExecutable(const char *argv0, void *MainExecAddr) {
>> +std::string getMainExecutableImpl(const char *argv0, void *MainExecAddr)
>> {
>>    SmallVector<wchar_t, MAX_PATH> PathName;
>>    PathName.resize_for_overwrite(PathName.capacity());
>>    DWORD Size = ::GetModuleFileNameW(NULL, PathName.data(),
>> PathName.size());
>>
>> diff  --git a/llvm/test/CMakeLists.txt b/llvm/test/CMakeLists.txt
>> index 50a4a982ec4d2..bc2869dc536b5 100644
>> --- a/llvm/test/CMakeLists.txt
>> +++ b/llvm/test/CMakeLists.txt
>> @@ -21,6 +21,7 @@ llvm_canonicalize_cmake_booleans(
>>    LLVM_RAEVICT_MODEL_AUTOGENERATED
>>    LLVM_ENABLE_EXPENSIVE_CHECKS
>>    LLVM_INCLUDE_DXIL_TESTS
>> +  LLVM_TOOL_LLVM_DRIVER_BUILD
>>    )
>>
>>  configure_lit_site_cfg(
>> @@ -144,6 +145,10 @@ if(TARGET llvm-lto)
>>    set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} llvm-lto)
>>  endif()
>>
>> +if(TARGET llvm-driver)
>> +  set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} llvm-driver)
>> +endif()
>> +
>>  # If Intel JIT events are supported, depend on a tool that tests the
>> listener.
>>  if( LLVM_USE_INTEL_JITEVENTS )
>>    set(LLVM_TEST_DEPENDS ${LLVM_TEST_DEPENDS} llvm-jitlistener)
>>
>> diff  --git a/llvm/test/lit.cfg.py b/llvm/test/lit.cfg.py
>> index b6fb8aa9fab76..a1f4f86b84562 100644
>> --- a/llvm/test/lit.cfg.py
>> +++ b/llvm/test/lit.cfg.py
>> @@ -139,6 +139,7 @@ def get_asan_rtlib():
>>  config.llvm_locstats_used = os.path.exists(llvm_locstats_tool)
>>
>>  tools = [
>> +    ToolSubst('%llvm', FindTool('llvm')),
>>      ToolSubst('%lli', FindTool('lli'), post='.', extra_args=lli_args),
>>      ToolSubst('%llc_dwarf', FindTool('llc'), extra_args=llc_args),
>>      ToolSubst('%go', config.go_executable, unresolved='ignore'),
>> @@ -350,6 +351,9 @@ def have_cxx_shared_library():
>>      if not config.target_triple.startswith(("nvptx", "xcore")):
>>          config.available_features.add('object-emission')
>>
>> +if config.have_llvm_driver:
>> +  config.available_features.add('llvm-driver')
>> +
>>  import subprocess
>>
>>
>>
>> diff  --git a/llvm/test/lit.site.cfg.py.in b/llvm/test/lit.site.cfg.py.in
>> index 266f93232ed61..c3f6cb6dd3ca1 100644
>> --- a/llvm/test/lit.site.cfg.py.in
>> +++ b/llvm/test/lit.site.cfg.py.in
>> @@ -59,6 +59,7 @@ config.llvm_inliner_model_autogenerated =
>> @LLVM_INLINER_MODEL_AUTOGENERATED@
>>  config.llvm_raevict_model_autogenerated =
>> @LLVM_RAEVICT_MODEL_AUTOGENERATED@
>>  config.expensive_checks = @LLVM_ENABLE_EXPENSIVE_CHECKS@
>>  config.dxil_tests = @LLVM_INCLUDE_DXIL_TESTS@
>> +config.have_llvm_driver = @LLVM_TOOL_LLVM_DRIVER_BUILD@
>>
>>  import lit.llvm
>>  lit.llvm.initialize(lit_config, config)
>>
>> diff  --git a/llvm/test/tools/llvm-driver/help-passthrough.test
>> b/llvm/test/tools/llvm-driver/help-passthrough.test
>> new file mode 100644
>> index 0000000000000..93f6146cdbbbe
>> --- /dev/null
>> +++ b/llvm/test/tools/llvm-driver/help-passthrough.test
>> @@ -0,0 +1,3 @@
>> +# REQUIRES: llvm-driver
>> +# RUN: %llvm cxxfilt --help | FileCheck %s
>> +# CHECK: USAGE: cxxfilt
>>
>> diff  --git a/llvm/test/tools/llvm-driver/help.test
>> b/llvm/test/tools/llvm-driver/help.test
>> new file mode 100644
>> index 0000000000000..c16a30833c65d
>> --- /dev/null
>> +++ b/llvm/test/tools/llvm-driver/help.test
>> @@ -0,0 +1,3 @@
>> +# REQUIRES: llvm-driver
>> +# RUN: %llvm --help | FileCheck %s
>> +# CHECK: USAGE: llvm [subcommand]
>>
>> diff  --git a/llvm/test/tools/llvm-driver/symlink-call.test
>> b/llvm/test/tools/llvm-driver/symlink-call.test
>> new file mode 100644
>> index 0000000000000..eeedf9edc73f2
>> --- /dev/null
>> +++ b/llvm/test/tools/llvm-driver/symlink-call.test
>> @@ -0,0 +1,23 @@
>> +## Don't make symlinks on Windows.
>> +# UNSUPPORTED: system-windows
>> +# REQUIRES: llvm-driver
>> +
>> +# RUN: rm -rf %t
>> +# RUN: mkdir %t
>> +# RUN: ln -s %llvm %t/llvm-cxxfilt
>> +# RUN: %t/llvm-cxxfilt --help | FileCheck %s
>> +# RUN: ln -s %llvm %t/llvm-cxxfilt-15
>> +# RUN: %t/llvm-cxxfilt-15 --help | FileCheck %s
>> +# RUN: ln -s %llvm %t/cxxfilt
>> +# RUN: %t/cxxfilt --help | FileCheck %s
>> +# RUN: ln -s %llvm %t/cxxfilt-15
>> +# RUN: %t/cxxfilt-15 --help | FileCheck %s
>> +# RUN: ln -s %llvm %t/cxxfilt-15.exe
>> +# RUN: %t/cxxfilt-15.exe --help | FileCheck %s
>> +
>> +# RUN: ln -s %llvm %t/llvm-15
>> +# RUN: %t/llvm-15 cxxfilt --help | FileCheck %s
>> +# RUN: ln -s %llvm %t/llvm-15.exe
>> +# RUN: %t/llvm-15.exe cxxfilt --help | FileCheck %s
>> +
>> +# CHECK: OVERVIEW: LLVM symbol undecoration tool
>>
>> diff  --git a/llvm/tools/CMakeLists.txt b/llvm/tools/CMakeLists.txt
>> index 770e46c4806f5..ef5edb195317b 100644
>> --- a/llvm/tools/CMakeLists.txt
>> +++ b/llvm/tools/CMakeLists.txt
>> @@ -53,3 +53,9 @@ foreach(p ${LLVM_EXTERNAL_PROJECTS})
>>  endforeach(p)
>>
>>  set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE)
>> +
>> +if (LLVM_TOOL_LLVM_DRIVER_BUILD)
>> +  # This is explicitly added at the end _after_ all tool projects so
>> that it can
>> +  # scrape up tools from other projects into itself.
>> +  add_subdirectory(llvm-driver)
>> +endif()
>>
>> diff  --git a/llvm/tools/dsymutil/CMakeLists.txt
>> b/llvm/tools/dsymutil/CMakeLists.txt
>> index 1efc58d19e92c..a255c1c5daf51 100644
>> --- a/llvm/tools/dsymutil/CMakeLists.txt
>> +++ b/llvm/tools/dsymutil/CMakeLists.txt
>> @@ -32,6 +32,8 @@ add_llvm_tool(dsymutil
>>    DEPENDS
>>    intrinsics_gen
>>    ${tablegen_deps}
>> +  DsymutilTableGen
>> +  GENERATE_DRIVER
>>    )
>>
>>  if(APPLE)
>>
>> diff  --git a/llvm/tools/dsymutil/dsymutil.cpp
>> b/llvm/tools/dsymutil/dsymutil.cpp
>> index df50432368471..abdb4ca4d48ce 100644
>> --- a/llvm/tools/dsymutil/dsymutil.cpp
>> +++ b/llvm/tools/dsymutil/dsymutil.cpp
>> @@ -521,7 +521,7 @@ getOutputFileName(StringRef InputFile, const
>> DsymutilOptions &Options) {
>>    return OutputLocation(std::string(Path.str()), ResourceDir);
>>  }
>>
>> -int main(int argc, char **argv) {
>> +int dsymutil_main(int argc, char **argv) {
>>    InitLLVM X(argc, argv);
>>
>>    // Parse arguments.
>>
>> diff  --git a/llvm/tools/llvm-ar/CMakeLists.txt
>> b/llvm/tools/llvm-ar/CMakeLists.txt
>> index 602b4a46ea055..166d670017159 100644
>> --- a/llvm/tools/llvm-ar/CMakeLists.txt
>> +++ b/llvm/tools/llvm-ar/CMakeLists.txt
>> @@ -15,6 +15,7 @@ add_llvm_tool(llvm-ar
>>
>>    DEPENDS
>>    intrinsics_gen
>> +  GENERATE_DRIVER
>>    )
>>
>>  add_llvm_tool_symlink(llvm-ranlib llvm-ar)
>>
>> diff  --git a/llvm/tools/llvm-ar/llvm-ar.cpp
>> b/llvm/tools/llvm-ar/llvm-ar.cpp
>> index a93943295cf93..abd10f1b500b0 100644
>> --- a/llvm/tools/llvm-ar/llvm-ar.cpp
>> +++ b/llvm/tools/llvm-ar/llvm-ar.cpp
>> @@ -1265,7 +1265,7 @@ static int ranlib_main(int argc, char **argv) {
>>    return performOperation(CreateSymTab, nullptr);
>>  }
>>
>> -int main(int argc, char **argv) {
>> +int llvm_ar_main(int argc, char **argv) {
>>    InitLLVM X(argc, argv);
>>    ToolName = argv[0];
>>
>>
>> diff  --git a/llvm/tools/llvm-cxxfilt/CMakeLists.txt
>> b/llvm/tools/llvm-cxxfilt/CMakeLists.txt
>> index 07ba9f9e9b1d0..367744beb9b60 100644
>> --- a/llvm/tools/llvm-cxxfilt/CMakeLists.txt
>> +++ b/llvm/tools/llvm-cxxfilt/CMakeLists.txt
>> @@ -13,6 +13,7 @@ add_llvm_tool(llvm-cxxfilt
>>
>>    DEPENDS
>>    CxxfiltOptsTableGen
>> +  GENERATE_DRIVER
>>    )
>>
>>  if(LLVM_INSTALL_BINUTILS_SYMLINKS)
>>
>> diff  --git a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
>> b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
>> index ccfaaa96deb21..1cea9e29faa4f 100644
>> --- a/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
>> +++ b/llvm/tools/llvm-cxxfilt/llvm-cxxfilt.cpp
>> @@ -140,7 +140,7 @@ static void demangleLine(llvm::raw_ostream &OS,
>> StringRef Mangled, bool Split) {
>>    OS.flush();
>>  }
>>
>> -int main(int argc, char **argv) {
>> +int llvm_cxxfilt_main(int argc, char **argv) {
>>    InitLLVM X(argc, argv);
>>    BumpPtrAllocator A;
>>    StringSaver Saver(A);
>>
>> diff  --git a/llvm/tools/llvm-driver/CMakeLists.txt
>> b/llvm/tools/llvm-driver/CMakeLists.txt
>> new file mode 100644
>> index 0000000000000..7cbeaf398eb4b
>> --- /dev/null
>> +++ b/llvm/tools/llvm-driver/CMakeLists.txt
>> @@ -0,0 +1,31 @@
>> +get_property(LLVM_COMMON_DEPENDS GLOBAL PROPERTY LLVM_DRIVER_DEPS)
>> +get_property(LLVM_DRIVER_OBJLIBS GLOBAL PROPERTY LLVM_DRIVER_OBJLIBS)
>> +
>> +get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS)
>> +
>> +foreach(tool ${LLVM_DRIVER_TOOLS})
>> +  string(REPLACE "-" "_" tool_entry ${tool})
>> +  string(REPLACE "llvm-" "" tool ${tool})
>> +  set(def_decl "${def_decl}LLVM_DRIVER_TOOL(\"${tool}\",
>> ${tool_entry})\n")
>> +endforeach()
>> +
>> +get_property(LLVM_EXTRA_DRIVER_ENTRIES GLOBAL PROPERTY
>> LLVM_EXTRA_DRIVER_ENTRIES)
>> +
>> +file(WRITE
>> +          "${CMAKE_CURRENT_BINARY_DIR}/LLVMDriverTools.def"
>> +          "${def_decl}${LLVM_EXTRA_DRIVER_ENTRIES}#undef
>> LLVM_DRIVER_TOOL\n")
>> +
>> +include_directories(${CMAKE_CURRENT_BINARY_DIR})
>> +
>> +add_llvm_tool(llvm-driver
>> +  llvm-driver.cpp
>> +  )
>> +
>> +set_target_properties(llvm-driver PROPERTIES OUTPUT_NAME llvm)
>> +
>> +target_link_libraries(llvm-driver PUBLIC ${LLVM_DRIVER_OBJLIBS})
>> +
>> +if(APPLE)
>> +  # dsymutil uses some CoreFoundation stuff on Darwin...
>> +  target_link_libraries(llvm-driver PRIVATE "-framework CoreFoundation")
>> +endif(APPLE)
>>
>> diff  --git a/llvm/tools/llvm-driver/llvm-driver.cpp
>> b/llvm/tools/llvm-driver/llvm-driver.cpp
>> new file mode 100644
>> index 0000000000000..3f543360ffbc4
>> --- /dev/null
>> +++ b/llvm/tools/llvm-driver/llvm-driver.cpp
>> @@ -0,0 +1,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);
>> +}
>>
>> diff  --git a/llvm/tools/llvm-objcopy/CMakeLists.txt
>> b/llvm/tools/llvm-objcopy/CMakeLists.txt
>> index 493cc87b0768c..ca94d4a477406 100644
>> --- a/llvm/tools/llvm-objcopy/CMakeLists.txt
>> +++ b/llvm/tools/llvm-objcopy/CMakeLists.txt
>> @@ -30,6 +30,7 @@ add_llvm_tool(llvm-objcopy
>>    ObjcopyOptsTableGen
>>    InstallNameToolOptsTableGen
>>    StripOptsTableGen
>> +  GENERATE_DRIVER
>>    )
>>
>>  add_llvm_tool_symlink(llvm-install-name-tool llvm-objcopy)
>>
>> diff  --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
>> b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
>> index 117a63cd9d8fb..aa262152ed646 100644
>> --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
>> +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
>> @@ -223,7 +223,7 @@ static Error executeObjcopy(ConfigManager &ConfigMgr)
>> {
>>    return Error::success();
>>  }
>>
>> -int main(int argc, char **argv) {
>> +int llvm_objcopy_main(int argc, char **argv) {
>>    InitLLVM X(argc, argv);
>>    ToolName = argv[0];
>>
>>
>> diff  --git a/utils/bazel/llvm-project-overlay/clang/BUILD.bazel
>> b/utils/bazel/llvm-project-overlay/clang/BUILD.bazel
>> index 702547e87df37..5e93d9ebe71be 100644
>> --- a/utils/bazel/llvm-project-overlay/clang/BUILD.bazel
>> +++ b/utils/bazel/llvm-project-overlay/clang/BUILD.bazel
>> @@ -5,6 +5,7 @@
>>  load("//llvm:tblgen.bzl", "gentbl")
>>  load("//llvm:binary_alias.bzl", "binary_alias")
>>  load("//llvm:cc_plugin_library.bzl", "cc_plugin_library")
>> +load("//llvm:template_rule.bzl", "template_rule")
>>
>>  package(
>>      default_visibility = ["//visibility:public"],
>> @@ -1925,12 +1926,21 @@ cc_binary(
>>      ],
>>  )
>>
>> +template_rule(
>> +    name = "clang_main",
>> +    src = "//llvm:cmake/driver-template.cpp.in",
>> +    out = "clang_main.cpp",
>> +    substitutions = {
>> +        "@TOOL_NAME@": "clang"
>> +    },
>> +)
>> +
>>  cc_library(
>>      name = "clang-driver",
>>      srcs = glob([
>>          "tools/driver/*.cpp",
>>          "tools/driver/*.h",
>> -    ]),
>> +    ]) + ["clang_main.cpp"],
>>      copts = [
>>          # Disable stack frame size checks in the driver because
>>          # clang::ensureStackAddressSpace allocates a large array on the
>> stack.
>>
>> diff  --git a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
>> b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
>> index 2e9faad29af96..8ffd63b4bd996 100644
>> --- a/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
>> +++ b/utils/bazel/llvm-project-overlay/llvm/BUILD.bazel
>> @@ -2594,12 +2594,21 @@ gentbl(
>>      td_srcs = ["include/llvm/Option/OptParser.td"],
>>  )
>>
>> +template_rule(
>> +    name = "dsymutil_main",
>> +    src = "cmake/driver-template.cpp.in",
>> +    out = "dsymutil_main.cpp",
>> +    substitutions = {
>> +        "@TOOL_NAME@": "dsymutil"
>> +    },
>> +)
>> +
>>  cc_binary(
>>      name = "dsymutil",
>>      srcs = glob([
>>          "tools/dsymutil/*.cpp",
>>          "tools/dsymutil/*.h",
>> -    ]),
>> +    ]) + ["dsymutil_main.cpp"],
>>      copts = llvm_copts,
>>      stamp = 0,
>>      deps = [
>> @@ -2689,12 +2698,21 @@ cc_binary(
>>      ],
>>  )
>>
>> +template_rule(
>> +    name = "ar_main",
>> +    src = "cmake/driver-template.cpp.in",
>> +    out = "ar_main.cpp",
>> +    substitutions = {
>> +        "@TOOL_NAME@": "llvm_ar"
>> +    },
>> +)
>> +
>>  cc_binary(
>>      name = "llvm-ar",
>>      srcs = glob([
>>          "tools/llvm-ar/*.cpp",
>>          "tools/llvm-ar/*.h",
>> -    ]),
>> +    ]) + ["ar_main.cpp"],
>>      copts = llvm_copts,
>>      stamp = 0,
>>      deps = [
>> @@ -2882,12 +2900,21 @@ gentbl(
>>      td_srcs = ["include/llvm/Option/OptParser.td"],
>>  )
>>
>> +template_rule(
>> +    name = "cxxfilt_main",
>> +    src = "cmake/driver-template.cpp.in",
>> +    out = "cxxfilt_main.cpp",
>> +    substitutions = {
>> +        "@TOOL_NAME@": "llvm_cxxfilt"
>> +    },
>> +)
>> +
>>  cc_binary(
>>      name = "llvm-cxxfilt",
>>      srcs = glob([
>>          "tools/llvm-cxxfilt/*.cpp",
>>          "tools/llvm-cxxfilt/*.h",
>> -    ]),
>> +    ]) + ["cxxfilt_main.cpp"],
>>      copts = llvm_copts,
>>      stamp = 0,
>>      deps = [
>> @@ -3416,12 +3443,22 @@ cc_binary(
>>      ],
>>  )
>>
>> +template_rule(
>> +    name = "objcopy_main",
>> +    src = "cmake/driver-template.cpp.in",
>> +    out = "objcopy_main.cpp",
>> +    substitutions = {
>> +        "@TOOL_NAME@": "llvm_objcopy"
>> +    },
>> +)
>> +
>> +
>>  cc_binary(
>>      name = "llvm-objcopy",
>>      srcs = glob([
>>          "tools/llvm-objcopy/*.cpp",
>>          "tools/llvm-objcopy/*.h",
>> -    ]),
>> +    ]) + ["objcopy_main.cpp"],
>>      copts = llvm_copts,
>>      stamp = 0,
>>      deps = [
>>
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220606/272ef5f5/attachment-0001.html>


More information about the cfe-commits mailing list