nemanjai created this revision.
nemanjai added reviewers: rjmccall, rsmith, craig.topper, t.p.northover, 
arsenm, kparzysz, echristo.
Herald added subscribers: usaxena95, s.egerton, kadircet, arphaman, delcypher, 
simoncook, mgorny.
nemanjai requested review of this revision.
Herald added subscribers: llvm-commits, Sanitizers, wdng.
Herald added projects: clang, Sanitizers, LLVM, clang-tools-extra.

It is likely that at least some vendors would like the ability to rename the 
clang executable to a proprietary name. That would allow a clear 
differentiation between the upstream clang and a proprietary downstream version 
of clang on the same system.

I am not sure if there are vendors that already do this downstream but it seems 
like a useful capability to allow that to be parameterized in the CMake 
configuration and an upstream buildbot to be added that builds with a different 
name. We at IBM certainly desire this capability and are willing to convert one 
of our upstream buildbots to such a build.

This patch provides a new CMake macro `CLANG_EXE_NAME` that can be used to 
specify the name of the clang executable. Then the symlinks to it (i.e. 
`clang-cl` and `clang++` will use that name and append the appropriate suffix). 
Furthermore, this patch updates test cases and utilities that use `clang` to 
use this name. The name is added to `llvm-config` so that it can be queried 
using `llvm-config --clang-exe` (which will return the full path with the 
correct name of the clang executable).

This is a work in progress because it is incomplete. Depending on the feedback 
on this review, the name change can affect the various `clang-xx` utilities, 
`libclang...` libraries, etc.

Please provide feedback if you think this is useful, not useful, a good/bad 
idea, good/bad technical direction etc.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D103125

Files:
  clang-tools-extra/clangd/test/lit.site.cfg.py.in
  clang-tools-extra/test/CMakeLists.txt
  clang-tools-extra/test/lit.site.cfg.py.in
  clang/CMakeLists.txt
  clang/include/clang/Config/config.h.cmake
  clang/runtime/CMakeLists.txt
  clang/test/Analysis/check-analyzer-fixit.py
  clang/test/Analysis/scan-build/cxx-name.test
  clang/test/CMakeLists.txt
  clang/test/Driver/baremetal.cpp
  clang/test/Driver/check-time-trace.cpp
  clang/test/lit.cfg.py
  clang/test/lit.site.cfg.py.in
  clang/test/utils/update_cc_test_checks/lit.local.cfg
  clang/tools/clang-offload-bundler/CMakeLists.txt
  clang/tools/clang-offload-wrapper/CMakeLists.txt
  clang/tools/driver/CMakeLists.txt
  clang/utils/perf-training/CMakeLists.txt
  compiler-rt/cmake/Modules/AddCompilerRT.cmake
  compiler-rt/cmake/base-config-ix.cmake
  llvm/cmake/modules/LLVMExternalProjectUtils.cmake
  llvm/include/llvm/Config/config.h.cmake
  llvm/test/lit.site.cfg.py.in
  llvm/tools/llvm-config/llvm-config.cpp
  llvm/tools/llvm-rc/llvm-rc.cpp
  llvm/utils/lit/lit/llvm/config.py
  llvm/utils/update_cc_test_checks.py

Index: llvm/utils/update_cc_test_checks.py
===================================================================
--- llvm/utils/update_cc_test_checks.py
+++ llvm/utils/update_cc_test_checks.py
@@ -114,6 +114,17 @@
 
 
 def infer_dependent_args(args):
+  if not args.llvm_bin:
+    llvm_config = 'llvm-config'
+  else:
+    llvm_config = os.path.join(args.llvm_bin, 'llvm-config')
+
+  # If the clang executable has a different name and we knoww where to
+  # get llvm-config, we can get the name that way.
+  if not args.clang and distutils.spawn.find_executable(llvm_config):
+    args.clang = subprocess.check_output(
+      [llvm_config, '--clang-exe']).decode().strip()
+
   if not args.clang:
     if not args.llvm_bin:
       args.clang = 'clang'
Index: llvm/utils/lit/lit/llvm/config.py
===================================================================
--- llvm/utils/lit/lit/llvm/config.py
+++ llvm/utils/lit/lit/llvm/config.py
@@ -502,7 +502,7 @@
 
         # Discover the 'clang' and 'clangcc' to use.
         self.config.clang = self.use_llvm_tool(
-            'clang', search_env='CLANG', required=required,
+            self.config.clang_exe_name, search_env='CLANG', required=required,
             use_installed=use_installed)
         if self.config.clang:
           self.config.available_features.add('clang')
Index: llvm/tools/llvm-rc/llvm-rc.cpp
===================================================================
--- llvm/tools/llvm-rc/llvm-rc.cpp
+++ llvm/tools/llvm-rc/llvm-rc.cpp
@@ -36,6 +36,7 @@
 #include "llvm/Support/Signals.h"
 #include "llvm/Support/StringSaver.h"
 #include "llvm/Support/raw_ostream.h"
+#include "llvm/Config/config.h"
 
 #include <algorithm>
 #include <system_error>
@@ -130,14 +131,14 @@
   if (!Parent.empty()) {
     // First look for the tool with all potential names in the specific
     // directory of Argv0, if known
-    for (const auto *Name : {"clang", "clang-cl"}) {
+    for (const auto *Name : {"clang", "clang-cl", CLANG_EXE_NAME}) {
       Path = sys::findProgramByName(Name, Parent);
       if (Path)
         return Path;
     }
   }
   // If no parent directory known, or not found there, look everywhere in PATH
-  for (const auto *Name : {"clang", "clang-cl"}) {
+  for (const auto *Name : {"clang", "clang-cl", CLANG_EXE_NAME}) {
     Path = sys::findProgramByName(Name);
     if (Path)
       return Path;
Index: llvm/tools/llvm-config/llvm-config.cpp
===================================================================
--- llvm/tools/llvm-config/llvm-config.cpp
+++ llvm/tools/llvm-config/llvm-config.cpp
@@ -221,6 +221,7 @@
   --libdir          Directory containing LLVM libraries.\n\
   --cmakedir        Directory containing LLVM cmake modules.\n\
   --cppflags        C preprocessor flags for files that include LLVM headers.\n\
+  --clang-exe       The clang executable.\n\
   --cflags          C compiler flags for files that include LLVM headers.\n\
   --cxxflags        C++ compiler flags for files that include LLVM headers.\n\
   --ldflags         Print Linker flags.\n\
@@ -514,6 +515,8 @@
         OS << ActiveCMakeDir << '\n';
       } else if (Arg == "--cppflags") {
         OS << ActiveIncludeOption << ' ' << LLVM_CPPFLAGS << '\n';
+      } else if (Arg == "--clang-exe") {
+        OS << ActiveBinDir << DirSep << CLANG_EXE_NAME << '\n';
       } else if (Arg == "--cflags") {
         OS << ActiveIncludeOption << ' ' << LLVM_CFLAGS << '\n';
       } else if (Arg == "--cxxflags") {
Index: llvm/test/lit.site.cfg.py.in
===================================================================
--- llvm/test/lit.site.cfg.py.in
+++ llvm/test/lit.site.cfg.py.in
@@ -53,6 +53,7 @@
 config.have_tf_aot = @LLVM_HAVE_TF_AOT@
 config.have_tf_api = @LLVM_HAVE_TF_API@
 config.expensive_checks = @LLVM_ENABLE_EXPENSIVE_CHECKS@
+config.clang_exe_name = "@CLANG_EXE_NAME@"
 
 # Support substitution of the tools_dir with user parameters. This is
 # used when we can't determine the tool dir at configuration time.
Index: llvm/include/llvm/Config/config.h.cmake
===================================================================
--- llvm/include/llvm/Config/config.h.cmake
+++ llvm/include/llvm/Config/config.h.cmake
@@ -10,6 +10,9 @@
 /* Bug report URL. */
 #define BUG_REPORT_URL "${BUG_REPORT_URL}"
 
+/* Clang executable name. */
+#define CLANG_EXE_NAME "${CLANG_EXE_NAME}"
+
 /* Define to 1 to enable backtraces, and to 0 otherwise. */
 #cmakedefine01 ENABLE_BACKTRACES
 
Index: llvm/cmake/modules/LLVMExternalProjectUtils.cmake
===================================================================
--- llvm/cmake/modules/LLVMExternalProjectUtils.cmake
+++ llvm/cmake/modules/LLVMExternalProjectUtils.cmake
@@ -80,7 +80,7 @@
   is_msvc_triple(is_msvc_target ${target_triple})
 
   if(NOT ARG_TOOLCHAIN_TOOLS)
-    set(ARG_TOOLCHAIN_TOOLS clang)
+    set(ARG_TOOLCHAIN_TOOLS ${CLANG_EXE_NAME})
     # AIX 64-bit XCOFF and big AR format is not yet supported in some of these tools.
     if(NOT _cmake_system_name STREQUAL AIX)
       list(APPEND ARG_TOOLCHAIN_TOOLS lld llvm-ar llvm-ranlib llvm-nm llvm-objdump)
@@ -124,7 +124,7 @@
     set(always_clean clean)
   endif()
 
-  list(FIND TOOLCHAIN_TOOLS clang FOUND_CLANG)
+  list(FIND TOOLCHAIN_TOOLS ${CLANG_EXE_NAME} FOUND_CLANG)
   if(FOUND_CLANG GREATER -1)
     set(CLANG_IN_TOOLCHAIN On)
   endif()
@@ -160,13 +160,13 @@
   if(ARG_USE_TOOLCHAIN AND NOT CMAKE_CROSSCOMPILING)
     if(CLANG_IN_TOOLCHAIN)
       if(is_msvc_target)
-        set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}
-                          -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX}
-                          -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-cl${CMAKE_EXECUTABLE_SUFFIX})
+        set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}-cl${CMAKE_EXECUTABLE_SUFFIX}
+                          -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}-cl${CMAKE_EXECUTABLE_SUFFIX}
+                          -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}-cl${CMAKE_EXECUTABLE_SUFFIX})
       else()
-        set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${CMAKE_EXECUTABLE_SUFFIX}
-                          -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++${CMAKE_EXECUTABLE_SUFFIX}
-                          -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${CMAKE_EXECUTABLE_SUFFIX})
+        set(compiler_args -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}${CMAKE_EXECUTABLE_SUFFIX}
+                          -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}++${CMAKE_EXECUTABLE_SUFFIX}
+                          -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}${CMAKE_EXECUTABLE_SUFFIX})
       endif()
     endif()
     if(lld IN_LIST TOOLCHAIN_TOOLS)
@@ -295,6 +295,7 @@
                -DLLVM_BINARY_DIR=${PROJECT_BINARY_DIR}
                -DLLVM_CONFIG_PATH=${llvm_config_path}
                -DLLVM_ENABLE_WERROR=${LLVM_ENABLE_WERROR}
+               -DCLANG_EXE_NAME=${CLANG_EXE_NAME}
                -DLLVM_HOST_TRIPLE=${LLVM_HOST_TRIPLE}
                -DLLVM_HAVE_LINK_VERSION_SCRIPT=${LLVM_HAVE_LINK_VERSION_SCRIPT}
                -DLLVM_USE_RELATIVE_PATHS_IN_DEBUG_INFO=${LLVM_USE_RELATIVE_PATHS_IN_DEBUG_INFO}
Index: compiler-rt/cmake/base-config-ix.cmake
===================================================================
--- compiler-rt/cmake/base-config-ix.cmake
+++ compiler-rt/cmake/base-config-ix.cmake
@@ -59,9 +59,9 @@
     set(_host_executable_suffix ${CMAKE_EXECUTABLE_SUFFIX})
   endif()
   set(COMPILER_RT_TEST_COMPILER
-    ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${_host_executable_suffix})
+    ${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}${_host_executable_suffix})
   set(COMPILER_RT_TEST_CXX_COMPILER
-    ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++${_host_executable_suffix})
+    ${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}++${_host_executable_suffix})
 else()
     # Take output dir and install path from the user.
   set(COMPILER_RT_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH
@@ -77,7 +77,7 @@
   set(COMPILER_RT_TEST_CXX_COMPILER ${CMAKE_CXX_COMPILER} CACHE PATH "C++ Compiler to use for testing")
 endif()
 
-if("${COMPILER_RT_TEST_COMPILER}" MATCHES "clang[+]*$")
+if("${COMPILER_RT_TEST_COMPILER}" MATCHES "${CLANG_EXE_NAME}[+]*$")
   set(COMPILER_RT_TEST_COMPILER_ID Clang)
 elseif("${COMPILER_RT_TEST_COMPILER}" MATCHES "clang.*.exe$")
   set(COMPILER_RT_TEST_COMPILER_ID Clang)
Index: compiler-rt/cmake/Modules/AddCompilerRT.cmake
===================================================================
--- compiler-rt/cmake/Modules/AddCompilerRT.cmake
+++ compiler-rt/cmake/Modules/AddCompilerRT.cmake
@@ -460,7 +460,7 @@
 
   # Use host compiler in a standalone build, and just-built Clang otherwise.
   if(NOT COMPILER_RT_STANDALONE_BUILD)
-    list(APPEND TEST_DEPS clang)
+    list(APPEND TEST_DEPS ${CLANG_EXE_NAME})
   endif()
 
   get_target_flags_for_arch(${arch} TARGET_LINK_FLAGS)
Index: clang/utils/perf-training/CMakeLists.txt
===================================================================
--- clang/utils/perf-training/CMakeLists.txt
+++ clang/utils/perf-training/CMakeLists.txt
@@ -16,10 +16,10 @@
     ${CMAKE_CURRENT_BINARY_DIR}/pgo-data/lit.site.cfg
     )
 
-  add_lit_testsuite(generate-profraw "Generating clang PGO data"
+  add_lit_testsuite(generate-profraw "Generating ${CLANG_EXE_NAME} PGO data"
     ${CMAKE_CURRENT_BINARY_DIR}/pgo-data/
     EXCLUDE_FROM_CHECK_ALL
-    DEPENDS clang clear-profraw
+    DEPENDS ${CLANG_EXE_NAME} clear-profraw
     )
 
   add_custom_target(clear-profraw
@@ -47,11 +47,11 @@
     ${CMAKE_CURRENT_BINARY_DIR}/order-files/lit.site.cfg
     )
 
-  add_lit_testsuite(generate-dtrace-logs "Generating clang dtrace data"
+  add_lit_testsuite(generate-dtrace-logs "Generating ${CLANG_EXE_NAME} dtrace data"
     ${CMAKE_CURRENT_BINARY_DIR}/order-files/
     EXCLUDE_FROM_CHECK_ALL
     ARGS -j 1
-    DEPENDS clang clear-dtrace-logs
+    DEPENDS ${CLANG_EXE_NAME} clear-dtrace-logs
     )
 
   add_custom_target(clear-dtrace-logs
@@ -59,11 +59,11 @@
     COMMENT "Clearing old dtrace data")
 
   if(NOT CLANG_ORDER_FILE)
-    message(FATAL_ERROR "Output clang order file is not set")
+    message(FATAL_ERROR "Output ${CLANG_EXE_NAME} order file is not set")
   endif()
 
   add_custom_target(generate-order-file
-    COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py gen-order-file --binary $<TARGET_FILE:clang> --output ${CLANG_ORDER_FILE} ${CMAKE_CURRENT_BINARY_DIR}
+    COMMAND "${Python3_EXECUTABLE}" ${CMAKE_CURRENT_SOURCE_DIR}/perf-helper.py gen-order-file --binary $<TARGET_FILE:${CLANG_EXE_NAME}> --output ${CLANG_ORDER_FILE} ${CMAKE_CURRENT_BINARY_DIR}
     COMMENT "Generating order file"
     DEPENDS generate-dtrace-logs)
 endif()
Index: clang/tools/driver/CMakeLists.txt
===================================================================
--- clang/tools/driver/CMakeLists.txt
+++ clang/tools/driver/CMakeLists.txt
@@ -17,14 +17,14 @@
   Vectorize
   )
 
-option(CLANG_PLUGIN_SUPPORT "Build clang with plugin support" ON)
+option(CLANG_PLUGIN_SUPPORT "Build ${CLANG_EXE_NAME} with plugin support" ON)
 
 # Support plugins.
 if(CLANG_PLUGIN_SUPPORT)
   set(support_plugins SUPPORT_PLUGINS)
 endif()
 
-add_clang_tool(clang
+add_clang_tool(${CLANG_EXE_NAME}
   driver.cpp
   cc1_main.cpp
   cc1as_main.cpp
@@ -35,7 +35,7 @@
   ${support_plugins}
   )
 
-clang_target_link_libraries(clang
+clang_target_link_libraries(${CLANG_EXE_NAME}
   PRIVATE
   clangBasic
   clangCodeGen
@@ -48,31 +48,31 @@
 if(WIN32 AND NOT CYGWIN)
   # Prevent versioning if the buildhost is targeting for Win32.
 else()
-  set_target_properties(clang PROPERTIES VERSION ${CLANG_EXECUTABLE_VERSION})
+  set_target_properties(${CLANG_EXE_NAME} PROPERTIES VERSION ${CLANG_EXECUTABLE_VERSION})
 endif()
 
 # Support plugins.
 if(CLANG_PLUGIN_SUPPORT)
-  export_executable_symbols_for_plugins(clang)
+  export_executable_symbols_for_plugins(${CLANG_EXE_NAME})
 endif()
 
-add_dependencies(clang clang-resource-headers)
+add_dependencies(${CLANG_EXE_NAME} clang-resource-headers)
 
 if(NOT CLANG_LINKS_TO_CREATE)
-  set(CLANG_LINKS_TO_CREATE clang++ clang-cl clang-cpp)
+  set(CLANG_LINKS_TO_CREATE ${CLANG_EXE_NAME}++ ${CLANG_EXE_NAME}-cl ${CLANG_EXE_NAME}-cpp)
 endif()
 
 foreach(link ${CLANG_LINKS_TO_CREATE})
-  add_clang_symlink(${link} clang)
+  add_clang_symlink(${link} ${CLANG_EXE_NAME})
 endforeach()
 
 # Configure plist creation for OS X.
 set (TOOL_INFO_PLIST "Info.plist" CACHE STRING "Plist name")
 if (APPLE)
   if (CLANG_VENDOR)
-    set(TOOL_INFO_NAME "${CLANG_VENDOR} clang")
+    set(TOOL_INFO_NAME "${CLANG_VENDOR} ${CLANG_EXE_NAME}")
   else()
-    set(TOOL_INFO_NAME "clang")
+    set(TOOL_INFO_NAME "${CLANG_EXE_NAME}")
   endif()
 
   set(TOOL_INFO_UTI "${CLANG_VENDOR_UTI}")
@@ -80,7 +80,7 @@
   set(TOOL_INFO_BUILD_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
 
   set(TOOL_INFO_PLIST_OUT "${CMAKE_CURRENT_BINARY_DIR}/${TOOL_INFO_PLIST}")
-  target_link_libraries(clang
+  target_link_libraries(${CLANG_EXE_NAME}
     PRIVATE
     "-Wl,-sectcreate,__TEXT,__info_plist,${TOOL_INFO_PLIST_OUT}")
   configure_file("${TOOL_INFO_PLIST}.in" "${TOOL_INFO_PLIST_OUT}" @ONLY)
@@ -114,7 +114,7 @@
   if("${ORDER_FILE}" STREQUAL "\n")
     set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${CLANG_ORDER_FILE})
   elseif(LINKER_ORDER_FILE_WORKS)
-    target_link_libraries(clang PRIVATE ${LINKER_ORDER_FILE_OPTION})
-    set_target_properties(clang PROPERTIES LINK_DEPENDS ${CLANG_ORDER_FILE})
+    target_link_libraries(${CLANG_EXE_NAME} PRIVATE ${LINKER_ORDER_FILE_OPTION})
+    set_target_properties(${CLANG_EXE_NAME} PROPERTIES LINK_DEPENDS ${CLANG_ORDER_FILE})
   endif()
 endif()
Index: clang/tools/clang-offload-wrapper/CMakeLists.txt
===================================================================
--- clang/tools/clang-offload-wrapper/CMakeLists.txt
+++ clang/tools/clang-offload-wrapper/CMakeLists.txt
@@ -11,7 +11,7 @@
   clangBasic
   )
 
-add_dependencies(clang clang-offload-wrapper)
+add_dependencies(${CLANG_EXE_NAME} clang-offload-wrapper)
 
 clang_target_link_libraries(clang-offload-wrapper
   PRIVATE
Index: clang/tools/clang-offload-bundler/CMakeLists.txt
===================================================================
--- clang/tools/clang-offload-bundler/CMakeLists.txt
+++ clang/tools/clang-offload-bundler/CMakeLists.txt
@@ -11,7 +11,7 @@
   clangBasic
   )
   
-add_dependencies(clang clang-offload-bundler)
+add_dependencies(${CLANG_EXE_NAME} clang-offload-bundler)
 
 clang_target_link_libraries(clang-offload-bundler
   PRIVATE
Index: clang/test/utils/update_cc_test_checks/lit.local.cfg
===================================================================
--- clang/test/utils/update_cc_test_checks/lit.local.cfg
+++ clang/test/utils/update_cc_test_checks/lit.local.cfg
@@ -12,7 +12,7 @@
 config.test_format = lit.formats.ShTest(execute_external=False)
 config.suffixes = ['.test']
 
-clang_path = os.path.join(config.clang_tools_dir, 'clang')
+clang_path = os.path.join(config.clang_tools_dir, config.clang_exe_name)
 extra_args = '--clang ' + shell_quote(clang_path)
 opt_path = os.path.join(config.llvm_tools_dir, 'opt')
 extra_args += ' --opt ' + shell_quote(opt_path)
Index: clang/test/lit.site.cfg.py.in
===================================================================
--- clang/test/lit.site.cfg.py.in
+++ clang/test/lit.site.cfg.py.in
@@ -33,6 +33,7 @@
 config.use_z3_solver = lit_config.params.get('USE_Z3_SOLVER', "@USE_Z3_SOLVER@")
 config.has_plugins = @LLVM_ENABLE_PLUGINS@
 config.clang_vendor_uti = "@CLANG_VENDOR_UTI@"
+config.clang_exe_name = "@CLANG_EXE_NAME@"
 
 # Support substitution of the tools and libs dirs with user parameters. This is
 # used when we can't determine the tool dir at configuration time.
Index: clang/test/lit.cfg.py
===================================================================
--- clang/test/lit.cfg.py
+++ clang/test/lit.cfg.py
@@ -106,7 +106,8 @@
         config.test_source_root, "Analysis", "check-analyzer-fixit.py")
     config.substitutions.append(
         ('%check_analyzer_fixit',
-         '"%s" %s' % (config.python_executable, check_analyzer_fixit_path)))
+         '"%s" %s "%s"' % (config.python_executable, check_analyzer_fixit_path,
+                           config.clang_exe_name)))
 
 llvm_config.add_tool_substitutions(tools, tool_dirs)
 
Index: clang/test/Driver/check-time-trace.cpp
===================================================================
--- clang/test/Driver/check-time-trace.cpp
+++ clang/test/Driver/check-time-trace.cpp
@@ -1,6 +1,6 @@
 // RUN: %clangxx -S -ftime-trace -ftime-trace-granularity=0 -o %T/check-time-trace %s
 // RUN: cat %T/check-time-trace.json \
-// RUN:   | %python -c 'import json, sys; json.dump(json.loads(sys.stdin.read()), sys.stdout, sort_keys=True, indent=2)' \
+// RUN:   | %python -c 'import json, sys; json.dump(json.loads(sys.stdin.read()), sys.stdout, sort_keys=True, indent=">>")' \
 // RUN:   | FileCheck %s
 
 // CHECK:      "beginningOfTime": {{[0-9]{16},}}
@@ -13,7 +13,7 @@
 // CHECK-NEXT: "pid":
 // CHECK-NEXT: "tid":
 // CHECK-NEXT: "ts":
-// CHECK:      "name": "clang{{.*}}"
+// CHECK:      >>>>>>>>"name":
 // CHECK:      "name": "process_name"
 // CHECK:      "name": "thread_name"
 
Index: clang/test/Driver/baremetal.cpp
===================================================================
--- clang/test/Driver/baremetal.cpp
+++ clang/test/Driver/baremetal.cpp
@@ -4,7 +4,7 @@
 // RUN:     -L some/directory/user/asked/for \
 // RUN:     --sysroot=%S/Inputs/baremetal_arm \
 // RUN:   | FileCheck --check-prefix=CHECK-V6M-C %s
-// CHECK-V6M-C: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}clang{{.*}}" "-cc1" "-triple" "thumbv6m-none-unknown-eabi"
+// CHECK-V6M-C: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}{{[^/^\\]+}}" "-cc1" "-triple" "thumbv6m-none-unknown-eabi"
 // CHECK-V6M-C-SAME: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
 // CHECK-V6M-C-SAME: "-isysroot" "[[SYSROOT:[^"]*]]"
 // CHECK-V6M-C-SAME: "-internal-isystem" "[[SYSROOT]]{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
@@ -107,7 +107,7 @@
 // RUN:     -L some/directory/user/asked/for \
 // RUN:     --sysroot=%S/Inputs/basic_riscv64_tree/riscv64-unknown-elf \
 // RUN:   | FileCheck --check-prefix=CHECK-RV64 %s
-// CHECK-RV64: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}clang{{.*}}" "-cc1" "-triple" "riscv64-unknown-unknown-elf"
+// CHECK-RV64: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}{{[^/^\\]+}}" "-cc1" "-triple" "riscv64-unknown-unknown-elf"
 // CHECK-RV64-SAME: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
 // CHECK-RV64-SAME: "-isysroot" "[[SYSROOT:[^"]*]]"
 // CHECK-RV64-SAME: "-internal-isystem" "[[SYSROOT]]{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
@@ -167,7 +167,7 @@
 // RUN:     -L some/directory/user/asked/for \
 // RUN:     --sysroot=%S/Inputs/basic_riscv32_tree/riscv32-unknown-elf \
 // RUN:   | FileCheck --check-prefix=CHECK-RV32 %s
-// CHECK-RV32: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}clang{{.*}}" "-cc1" "-triple" "riscv32-unknown-unknown-elf"
+// CHECK-RV32: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}{{[^/^\\]+}}" "-cc1" "-triple" "riscv32-unknown-unknown-elf"
 // CHECK-RV32-SAME: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
 // CHECK-RV32-SAME: "-isysroot" "[[SYSROOT:[^"]*]]"
 // CHECK-RV32-SAME: "-internal-isystem" "[[SYSROOT]]{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
@@ -258,7 +258,7 @@
 // RUN:     --sysroot=%S/Inputs/basic_riscv64_tree/riscv64-unknown-elf \
 // RUN:   | FileCheck --check-prefix=CHECK-RV64FD %s
 
-// CHECK-RV64FD: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}clang{{.*}}" "-cc1" "-triple" "riscv64-unknown-unknown-elf"
+// CHECK-RV64FD: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}{{[^/^\\]+}}" "-cc1" "-triple" "riscv64-unknown-unknown-elf"
 // CHECK-RV64FD-SAME: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
 // CHECK-RV64FD-SAME: "-isysroot" "[[SYSROOT:[^"]*]]"
 // CHECK-RV64FD-SAME: "-internal-isystem" "[[SYSROOT]]{{[/\\]+}}rv64imafdc{{[/\\]+}}lp64d{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
@@ -280,7 +280,7 @@
 // RUN:     --sysroot=%S/Inputs/basic_riscv32_tree/riscv32-unknown-elf \
 // RUN:   | FileCheck --check-prefix=CHECK-RV32I %s
 
-// CHECK-RV32I: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}clang{{.*}}" "-cc1" "-triple" "riscv32-unknown-unknown-elf"
+// CHECK-RV32I: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}{{[^/^\\]+}}" "-cc1" "-triple" "riscv32-unknown-unknown-elf"
 // CHECK-RV32I-SAME: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
 // CHECK-RV32I-SAME: "-isysroot" "[[SYSROOT:[^"]*]]"
 // CHECK-RV32I-SAME: "-internal-isystem" "[[SYSROOT]]{{[/\\]+}}rv32i{{[/\\]+}}ilp32{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
@@ -302,7 +302,7 @@
 // RUN:     --sysroot=%S/Inputs/basic_riscv32_tree/riscv32-unknown-elf \
 // RUN:   | FileCheck --check-prefix=CHECK-RV32IM %s
 
-// CHECK-RV32IM: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}clang{{.*}}" "-cc1" "-triple" "riscv32-unknown-unknown-elf"
+// CHECK-RV32IM: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}{{[^/^\\]+}}" "-cc1" "-triple" "riscv32-unknown-unknown-elf"
 // CHECK-RV32IM-SAME: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
 // CHECK-RV32IM-SAME: "-isysroot" "[[SYSROOT:[^"]*]]"
 // CHECK-RV32IM-SAME: "-internal-isystem" "[[SYSROOT]]{{[/\\]+}}rv32im{{[/\\]+}}ilp32{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
@@ -318,7 +318,7 @@
 // RUN:     --sysroot=%S/Inputs/basic_riscv32_tree/riscv32-unknown-elf \
 // RUN:   | FileCheck --check-prefix=CHECK-RV32IAC %s
 
-// CHECK-RV32IAC: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}clang{{.*}}" "-cc1" "-triple" "riscv32-unknown-unknown-elf"
+// CHECK-RV32IAC: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}{{[^/^\\]+}}" "-cc1" "-triple" "riscv32-unknown-unknown-elf"
 // CHECK-RV32IAC-SAME: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
 // CHECK-RV32IAC-SAME: "-isysroot" "[[SYSROOT:[^"]*]]"
 // CHECK-RV32IAC-SAME: "-internal-isystem" "[[SYSROOT]]{{[/\\]+}}rv32iac{{[/\\]+}}ilp32{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
@@ -346,7 +346,7 @@
 // RUN:     --sysroot=%S/Inputs/basic_riscv32_tree/riscv32-unknown-elf \
 // RUN:   | FileCheck --check-prefix=CHECK-RV32IMAFC %s
 
-// CHECK-RV32IMAFC: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}clang{{.*}}" "-cc1" "-triple" "riscv32-unknown-unknown-elf"
+// CHECK-RV32IMAFC: "[[PREFIX_DIR:.*]]{{[/\\]+}}{{[^/^\\]+}}{{[/\\]+}}{{[^/^\\]+}}" "-cc1" "-triple" "riscv32-unknown-unknown-elf"
 // CHECK-RV32IMAFC-SAME: "-resource-dir" "[[RESOURCE_DIR:[^"]+]]"
 // CHECK-RV32IMAFC-SAME: "-isysroot" "[[SYSROOT:[^"]*]]"
 // CHECK-RV32IMAFC-SAME: "-internal-isystem" "[[SYSROOT]]{{[/\\]+}}rv32imafc{{[/\\]+}}ilp32f{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1"
Index: clang/test/CMakeLists.txt
===================================================================
--- clang/test/CMakeLists.txt
+++ clang/test/CMakeLists.txt
@@ -60,7 +60,7 @@
 list(APPEND CLANG_TEST_DEPS
   apinotes-test
   c-index-test
-  clang
+  ${CLANG_EXE_NAME}
   clang-resource-headers
   clang-format
   clang-tblgen
Index: clang/test/Analysis/scan-build/cxx-name.test
===================================================================
--- clang/test/Analysis/scan-build/cxx-name.test
+++ clang/test/Analysis/scan-build/cxx-name.test
@@ -6,4 +6,5 @@
 consumed by ccc-analyzer) to an appropriate pathname for the clang++ executable,
 derived from the pathname of the clang executable:
 
-CHECK: CLANG_CXX=/clang++{{(\.exe)?}}/
+CHECK: Using {{.*}}/[[CLANG:[^ -]+]]
+CHECK: CLANG_CXX=/[[CLANG]]++/
Index: clang/test/Analysis/check-analyzer-fixit.py
===================================================================
--- clang/test/Analysis/check-analyzer-fixit.py
+++ clang/test/Analysis/check-analyzer-fixit.py
@@ -38,6 +38,7 @@
 
 
 def run_test_once(args, extra_args):
+    clang_exe_name = args.clang_exe_name
     input_file_name = args.input_file_name
     temp_file_name = args.temp_file_name
     clang_analyzer_extra_args = extra_args
@@ -63,13 +64,13 @@
 
     try:
         builtin_include_dir = subprocess.check_output(
-            ['clang', '-print-file-name=include'], stderr=subprocess.STDOUT).decode()
+            [clang_exe_name, '-print-file-name=include'], stderr=subprocess.STDOUT).decode()
     except subprocess.CalledProcessError as e:
         print('Cannot print Clang include directory: ' + e.output.decode())
 
     builtin_include_dir = os.path.normpath(builtin_include_dir)
 
-    args = (['clang', '-cc1', '-internal-isystem', builtin_include_dir,
+    args = ([clang_exe_name, '-cc1', '-internal-isystem', builtin_include_dir,
              '-nostdsysteminc', '-analyze', '-analyzer-constraints=range',
              '-analyzer-config', 'apply-fixits=true']
             + clang_analyzer_extra_args + ['-verify', temp_file_name])
@@ -110,6 +111,7 @@
 
 def main():
     parser = argparse.ArgumentParser()
+    parser.add_argument('clang_exe_name')
     parser.add_argument('input_file_name')
     parser.add_argument('temp_file_name')
 
Index: clang/runtime/CMakeLists.txt
===================================================================
--- clang/runtime/CMakeLists.txt
+++ clang/runtime/CMakeLists.txt
@@ -67,15 +67,15 @@
   endif()
 
   ExternalProject_Add(compiler-rt
-    DEPENDS llvm-config clang ${compiler_rt_configure_deps}
+    DEPENDS llvm-config ${CLANG_EXE_NAME} ${compiler_rt_configure_deps}
     PREFIX ${COMPILER_RT_PREFIX}
     SOURCE_DIR ${COMPILER_RT_SRC_ROOT}
     STAMP_DIR ${STAMP_DIR}
     BINARY_DIR ${BINARY_DIR}
     CMAKE_ARGS ${CLANG_COMPILER_RT_CMAKE_ARGS}
-               -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang
-               -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++
-               -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang
+               -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}
+               -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}++
+               -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CLANG_EXE_NAME}
                -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
                -DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
                -DLLVM_CONFIG_PATH=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-config
@@ -105,7 +105,7 @@
     COMMENT "Cleaning compiler-rt..."
     DEPENDEES configure
     DEPENDERS build
-    DEPENDS clang
+    DEPENDS ${CLANG_EXE_NAME}
     WORKING_DIRECTORY ${BINARY_DIR}
     )
 
Index: clang/include/clang/Config/config.h.cmake
===================================================================
--- clang/include/clang/Config/config.h.cmake
+++ clang/include/clang/Config/config.h.cmake
@@ -8,6 +8,9 @@
 /* Bug report URL. */
 #define BUG_REPORT_URL "${BUG_REPORT_URL}"
 
+/* Clang executable name. */
+#define CLANG_EXE_NAME "${CLANG_EXE_NAME}"
+
 /* Default linker to use. */
 #define CLANG_DEFAULT_LINKER "${CLANG_DEFAULT_LINKER}"
 
Index: clang/CMakeLists.txt
===================================================================
--- clang/CMakeLists.txt
+++ clang/CMakeLists.txt
@@ -106,7 +106,7 @@
 
   option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
     "Set to ON to force using an old, unsupported host toolchain." OFF)
-  option(CLANG_ENABLE_BOOTSTRAP "Generate the clang bootstrap target" OFF)
+  option(CLANG_ENABLE_BOOTSTRAP "Generate the ${CLANG_EXE_NAME} bootstrap target" OFF)
   option(LLVM_ENABLE_LIBXML2 "Use libxml2 if available." ON)
 
   include(AddLLVM)
@@ -218,7 +218,7 @@
   "Relative directory from the Clang binary to its resource files.")
 
 set(C_INCLUDE_DIRS "" CACHE STRING
-  "Colon separated list of directories clang will search for headers.")
+  "Colon separated list of directories ${CLANG_EXE_NAME} will search for headers.")
 
 set(GCC_INSTALL_PREFIX "" CACHE PATH "Directory where gcc is installed." )
 set(DEFAULT_SYSROOT "" CACHE STRING
@@ -230,7 +230,7 @@
     "enable x86 relax relocations by default")
 
 set(CLANG_SPAWN_CC1 OFF CACHE BOOL
-    "Whether clang should use a new process for the CC1 invocation")
+    "Whether ${CLANG_EXE_NAME} should use a new process for the CC1 invocation")
 
 # TODO: verify the values against LangStandards.def?
 set(CLANG_DEFAULT_STD_C "" CACHE STRING
@@ -349,6 +349,11 @@
 "`CMakeFiles'. Please delete them.")
 endif()
 
+# If CLANG_EXE_NAME is specified, use it, otherwise make it clang
+if(NOT DEFINED CLANG_EXE_NAME)
+  set(CLANG_EXE_NAME "clang" CACHE STRING
+      "The name of the clang executable")
+endif()
 # If CLANG_VERSION_* is specified, use it, if not use LLVM_VERSION_*.
 if(NOT DEFINED CLANG_VERSION_MAJOR)
   set(CLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
@@ -463,7 +468,7 @@
 
 option(CLANG_ENABLE_ARCMT "Build ARCMT." ON)
 option(CLANG_ENABLE_STATIC_ANALYZER
-  "Include static analyzer in clang binary." ON)
+  "Include static analyzer in ${CLANG_EXE_NAME} binary." ON)
 
 option(CLANG_ENABLE_PROTO_FUZZER "Build Clang protobuf fuzzer." OFF)
 
@@ -485,7 +490,7 @@
 # Clang version information
 set(CLANG_EXECUTABLE_VERSION
     "${CLANG_VERSION_MAJOR}" CACHE STRING
-    "Major version number that will be appended to the clang executable name")
+    "Major version number that will be appended to the ${CLANG_EXE_NAME} executable name")
 set(LIBCLANG_LIBRARY_VERSION
     "${CLANG_VERSION_MAJOR}" CACHE STRING
     "Major version number that will be appended to the libclang library")
@@ -532,7 +537,7 @@
 
 
   set(CLANG_ORDER_FILE ${CMAKE_CURRENT_BINARY_DIR}/clang.order CACHE FILEPATH
-    "Order file to use when compiling clang in order to improve startup time (Darwin Only - requires ld64).")
+    "Order file to use when compiling ${CLANG_EXE_NAME} in order to improve startup time (Darwin Only - requires ld64).")
 
   if(NOT EXISTS ${CLANG_ORDER_FILE})
     string(FIND "${CLANG_ORDER_FILE}" "${CMAKE_CURRENT_BINARY_DIR}" PATH_START)
@@ -607,13 +612,13 @@
 add_subdirectory(cmake/modules)
 
 if(CLANG_STAGE)
-  message(STATUS "Setting current clang stage to: ${CLANG_STAGE}")
+  message(STATUS "Setting current ${CLANG_EXE_NAME} stage to: ${CLANG_STAGE}")
 endif()
 
 if (CLANG_ENABLE_BOOTSTRAP)
   include(ExternalProject)
 
-  add_custom_target(clang-bootstrap-deps DEPENDS clang)
+  add_custom_target(clang-bootstrap-deps DEPENDS ${CLANG_EXE_NAME})
 
   if(NOT CLANG_STAGE)
     set(CLANG_STAGE stage1)
@@ -634,7 +639,7 @@
   if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED)
     set(NEXT_CLANG_STAGE ${NEXT_CLANG_STAGE}-instrumented)
   endif()
-  message(STATUS "Setting next clang stage to: ${NEXT_CLANG_STAGE}")
+  message(STATUS "Setting next ${CLANG_EXE_NAME} stage to: ${NEXT_CLANG_STAGE}")
 
 
   set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-stamps/)
@@ -725,11 +730,11 @@
     endif()
   endif()
 
-  set(C_COMPILER "clang")
-  set(CXX_COMPILER "clang++")
+  set(C_COMPILER "${CLANG_EXE_NAME}")
+  set(CXX_COMPILER "${CLANG_EXE_NAME}++")
   if(WIN32)
-    set(C_COMPILER "clang-cl.exe")
-    set(CXX_COMPILER "clang-cl.exe")
+    set(C_COMPILER "${CLANG_EXE_NAME}-cl.exe")
+    set(CXX_COMPILER "${CLANG_EXE_NAME}-cl.exe")
   endif()
 
   set(COMPILER_OPTIONS
Index: clang-tools-extra/test/lit.site.cfg.py.in
===================================================================
--- clang-tools-extra/test/lit.site.cfg.py.in
+++ clang-tools-extra/test/lit.site.cfg.py.in
@@ -11,6 +11,7 @@
 config.python_executable = "@Python3_EXECUTABLE@"
 config.target_triple = "@TARGET_TRIPLE@"
 config.clang_tidy_staticanalyzer = @CLANG_TIDY_ENABLE_STATIC_ANALYZER@
+config.clang_exe_name = "@CLANG_EXE_NAME@"
 
 # Support substitution of the tools and libs dirs with user parameters. This is
 # used when we can't determine the tool dir at configuration time.
Index: clang-tools-extra/test/CMakeLists.txt
===================================================================
--- clang-tools-extra/test/CMakeLists.txt
+++ clang-tools-extra/test/CMakeLists.txt
@@ -65,7 +65,7 @@
 
   clang-tidy
   # Clang-tidy tests need clang for building modules.
-  clang
+  ${CLANG_EXE_NAME}
 )
 
 # Add lit test dependencies.
Index: clang-tools-extra/clangd/test/lit.site.cfg.py.in
===================================================================
--- clang-tools-extra/clangd/test/lit.site.cfg.py.in
+++ clang-tools-extra/clangd/test/lit.site.cfg.py.in
@@ -9,6 +9,7 @@
 config.target_triple = "@TARGET_TRIPLE@"
 config.host_triple = "@LLVM_HOST_TRIPLE@"
 config.python_executable = "@Python3_EXECUTABLE@"
+config.clang_exe_name = "@CLANG_EXE_NAME@"
 
 # Support substitution of the tools and libs dirs with user parameters. This is
 # used when we can't determine the tool dir at configuration time.
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to