Get the linker version and pass the it to compiler-rt tests on Darwin. (#86220)
The HOST_LINK_VERSION is a hardcoded string in Darwin clang that detects the linker version at configure time. The driver uses this information to build the correct set of arguments for the linker. This patch detects the linker version again during compiler-rt configuration and passes it to the tests. This allows a clang built on a machine with a new linker to run compiler-rt tests on a machine with an old linker. rdar://125198603pull/86360/head
parent
51268a57fd
commit
3bc71c2abf
|
@ -15,6 +15,7 @@ endif()
|
|||
|
||||
# Must go below project(..)
|
||||
include(GNUInstallDirs)
|
||||
include(GetDarwinLinkerVersion)
|
||||
|
||||
if(CLANG_BUILT_STANDALONE)
|
||||
set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
|
||||
|
@ -346,20 +347,7 @@ endif ()
|
|||
# Determine HOST_LINK_VERSION on Darwin.
|
||||
set(HOST_LINK_VERSION)
|
||||
if (APPLE AND NOT CMAKE_LINKER MATCHES ".*lld.*")
|
||||
set(LD_V_OUTPUT)
|
||||
execute_process(
|
||||
COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1"
|
||||
RESULT_VARIABLE HAD_ERROR
|
||||
OUTPUT_VARIABLE LD_V_OUTPUT
|
||||
)
|
||||
if (HAD_ERROR)
|
||||
message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}")
|
||||
endif()
|
||||
if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*")
|
||||
string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
|
||||
elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*")
|
||||
string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
|
||||
endif()
|
||||
get_darwin_linker_version(HOST_LINK_VERSION)
|
||||
message(STATUS "Host linker version: ${HOST_LINK_VERSION}")
|
||||
endif()
|
||||
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
# Get the linker version on Darwin
|
||||
function(get_darwin_linker_version variable)
|
||||
set(LINK_VERSION)
|
||||
set(LD_V_OUTPUT)
|
||||
execute_process(
|
||||
COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1"
|
||||
RESULT_VARIABLE HAD_ERROR
|
||||
OUTPUT_VARIABLE LD_V_OUTPUT
|
||||
)
|
||||
if (HAD_ERROR)
|
||||
message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}")
|
||||
endif()
|
||||
if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*")
|
||||
string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" LINK_VERSION ${LD_V_OUTPUT})
|
||||
elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*")
|
||||
string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" LINK_VERSION ${LD_V_OUTPUT})
|
||||
endif()
|
||||
set(${variable} ${LINK_VERSION} PARENT_SCOPE)
|
||||
endfunction()
|
|
@ -36,6 +36,7 @@ include(SetPlatformToolchainTools)
|
|||
include(base-config-ix)
|
||||
include(CompilerRTUtils)
|
||||
include(CMakeDependentOption)
|
||||
include(GetDarwinLinkerVersion)
|
||||
|
||||
option(COMPILER_RT_BUILD_BUILTINS "Build builtins" ON)
|
||||
mark_as_advanced(COMPILER_RT_BUILD_BUILTINS)
|
||||
|
@ -444,6 +445,15 @@ else()
|
|||
set(SANITIZER_USE_SYMBOLS FALSE)
|
||||
endif()
|
||||
|
||||
# Get the linker version while configuring compiler-rt and explicitly pass it
|
||||
# in cflags during testing. This fixes the compiler/linker version mismatch
|
||||
# issue when running a clang built with a newer Xcode in an older Xcode
|
||||
set(COMPILER_RT_DARWIN_LINKER_VERSION)
|
||||
if (APPLE AND NOT CMAKE_LINKER MATCHES ".*lld.*")
|
||||
get_darwin_linker_version(COMPILER_RT_DARWIN_LINKER_VERSION)
|
||||
message(STATUS "Host linker version: ${COMPILER_RT_DARWIN_LINKER_VERSION}")
|
||||
endif()
|
||||
|
||||
# Build sanitizer runtimes with debug info.
|
||||
if(MSVC)
|
||||
# Use /Z7 instead of /Zi for the asan runtime. This avoids the LNK4099
|
||||
|
|
|
@ -882,6 +882,10 @@ if config.use_lld and config.has_lld and not config.use_lto:
|
|||
elif config.use_lld and (not config.has_lld):
|
||||
config.unsupported = True
|
||||
|
||||
if config.host_os == "Darwin":
|
||||
if getattr(config, "darwin_linker_version", None):
|
||||
extra_cflags += ["-mlinker-version=" + config.darwin_linker_version]
|
||||
|
||||
# Append any extra flags passed in lit_config
|
||||
append_target_cflags = lit_config.params.get("append_target_cflags", None)
|
||||
if append_target_cflags:
|
||||
|
|
|
@ -51,6 +51,7 @@ set_default("expensive_checks", @LLVM_ENABLE_EXPENSIVE_CHECKS_PYBOOL@)
|
|||
set_default("test_standalone_build_libs", @COMPILER_RT_TEST_STANDALONE_BUILD_LIBS_PYBOOL@)
|
||||
set_default("has_compiler_rt_libatomic", @COMPILER_RT_BUILD_STANDALONE_LIBATOMIC_PYBOOL@)
|
||||
set_default("aarch64_sme", @COMPILER_RT_HAS_AARCH64_SME_PYBOOL@)
|
||||
set_default("darwin_linker_version", "@COMPILER_RT_DARWIN_LINKER_VERSION@")
|
||||
# True iff the test suite supports ignoring the test compiler's runtime library path
|
||||
# and using `config.compiler_rt_libdir` instead. This only matters when the runtime
|
||||
# library paths differ.
|
||||
|
|
Loading…
Reference in New Issue