From 7c4dbff05d363d262a4a246b9a9726401652f268 Mon Sep 17 00:00:00 2001 From: Petr Hosek Date: Tue, 11 Jul 2023 15:32:49 +0000 Subject: [PATCH] Revert "[compiler-rt] Move crt into builtins" This reverts commit dae9d1b52469daca88a968e7b99a26420aef657c since it caused https://github.com/llvm/llvm-project/issues/63799. --- compiler-rt/CMakeLists.txt | 4 + compiler-rt/cmake/builtin-config-ix.cmake | 17 ---- compiler-rt/lib/CMakeLists.txt | 4 + compiler-rt/lib/builtins/CMakeLists.txt | 52 ++-------- compiler-rt/lib/crt/CMakeLists.txt | 63 ++++++++++++ compiler-rt/lib/{builtins => crt}/crtbegin.c | 0 compiler-rt/lib/{builtins => crt}/crtend.c | 0 compiler-rt/test/CMakeLists.txt | 3 + compiler-rt/test/builtins/CMakeLists.txt | 4 - compiler-rt/test/builtins/Unit/lit.cfg.py | 57 ----------- .../test/builtins/Unit/lit.site.cfg.py.in | 1 - compiler-rt/test/crt/CMakeLists.txt | 41 ++++++++ .../test/{builtins/Unit => crt}/ctor_dtor.c | 2 - .../{builtins/Unit => crt}/dso_handle.cpp | 6 +- compiler-rt/test/crt/lit.cfg.py | 95 +++++++++++++++++++ compiler-rt/test/crt/lit.site.cfg.py.in | 14 +++ 16 files changed, 234 insertions(+), 129 deletions(-) create mode 100644 compiler-rt/lib/crt/CMakeLists.txt rename compiler-rt/lib/{builtins => crt}/crtbegin.c (100%) rename compiler-rt/lib/{builtins => crt}/crtend.c (100%) create mode 100644 compiler-rt/test/crt/CMakeLists.txt rename compiler-rt/test/{builtins/Unit => crt}/ctor_dtor.c (97%) rename compiler-rt/test/{builtins/Unit => crt}/dso_handle.cpp (79%) create mode 100644 compiler-rt/test/crt/lit.cfg.py create mode 100644 compiler-rt/test/crt/lit.site.cfg.py.in diff --git a/compiler-rt/CMakeLists.txt b/compiler-rt/CMakeLists.txt index d004474028ab3..6489aa17c2292 100644 --- a/compiler-rt/CMakeLists.txt +++ b/compiler-rt/CMakeLists.txt @@ -39,6 +39,10 @@ option(COMPILER_RT_BUILD_BUILTINS "Build builtins" ON) mark_as_advanced(COMPILER_RT_BUILD_BUILTINS) option(COMPILER_RT_DISABLE_AARCH64_FMV "Disable AArch64 Function Multi Versioning support" OFF) mark_as_advanced(COMPILER_RT_DISABLE_AARCH64_FMV) +option(COMPILER_RT_BUILD_CRT "Build crtbegin.o/crtend.o" ON) +mark_as_advanced(COMPILER_RT_BUILD_CRT) +option(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY "Use eh_frame in crtbegin.o/crtend.o" ON) +mark_as_advanced(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY) option(COMPILER_RT_BUILD_SANITIZERS "Build sanitizers" ON) mark_as_advanced(COMPILER_RT_BUILD_SANITIZERS) option(COMPILER_RT_BUILD_XRAY "Build xray" ON) diff --git a/compiler-rt/cmake/builtin-config-ix.cmake b/compiler-rt/cmake/builtin-config-ix.cmake index 9cf4877baf489..3638cff56eb08 100644 --- a/compiler-rt/cmake/builtin-config-ix.cmake +++ b/compiler-rt/cmake/builtin-config-ix.cmake @@ -13,11 +13,6 @@ builtin_check_c_compiler_flag(-fvisibility=hidden COMPILER_RT_HAS_VISIBILITY_H builtin_check_c_compiler_flag(-fomit-frame-pointer COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG) builtin_check_c_compiler_flag(-ffreestanding COMPILER_RT_HAS_FFREESTANDING_FLAG) builtin_check_c_compiler_flag(-fxray-instrument COMPILER_RT_HAS_XRAY_COMPILER_FLAG) -builtin_check_c_compiler_flag(-fno-lto COMPILER_RT_HAS_FNO_LTO_FLAG) -builtin_check_c_compiler_flag(-fno-profile-generate COMPILER_RT_HAS_FNO_PROFILE_GENERATE_FLAG) -builtin_check_c_compiler_flag(-fno-profile-instr-generate COMPILER_RT_HAS_FNO_PROFILE_INSTR_GENERATE_FLAG) -builtin_check_c_compiler_flag(-fno-profile-instr-use COMPILER_RT_HAS_FNO_PROFILE_INSTR_USE_FLAG) -builtin_check_c_compiler_flag(-Wno-pedantic COMPILER_RT_HAS_WNO_PEDANTIC) builtin_check_c_compiler_source(COMPILER_RT_HAS_ATOMIC_KEYWORD " @@ -33,12 +28,6 @@ asm(\".arch armv8-a+lse\"); asm(\"cas w0, w1, [x2]\"); ") -if(ANDROID) - set(OS_NAME "Android") -else() - set(OS_NAME "${CMAKE_SYSTEM_NAME}") -endif() - set(ARM64 aarch64) set(ARM32 arm armhf armv4t armv5te armv6 armv6m armv7m armv7em armv7 armv7s armv7k armv8m.base armv8m.main armv8.1m.main) set(AVR avr) @@ -225,10 +214,4 @@ else() ${ALL_BUILTIN_SUPPORTED_ARCH}) endif() -if (OS_NAME MATCHES "Linux" AND NOT LLVM_USE_SANITIZER) - set(COMPILER_RT_HAS_CRT TRUE) -else() - set(COMPILER_RT_HAS_CRT FALSE) -endif() - message(STATUS "Builtin supported architectures: ${BUILTIN_SUPPORTED_ARCH}") diff --git a/compiler-rt/lib/CMakeLists.txt b/compiler-rt/lib/CMakeLists.txt index 43ba9a102c848..a9a5b1c100905 100644 --- a/compiler-rt/lib/CMakeLists.txt +++ b/compiler-rt/lib/CMakeLists.txt @@ -17,6 +17,10 @@ if(COMPILER_RT_BUILD_BUILTINS) add_subdirectory(builtins) endif() +if(COMPILER_RT_BUILD_CRT) + add_subdirectory(crt) +endif() + function(compiler_rt_build_runtime runtime) string(TOUPPER ${runtime} runtime_uppercase) if(COMPILER_RT_HAS_${runtime_uppercase}) diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt index 45d68fdc841db..66d11938d38ac 100644 --- a/compiler-rt/lib/builtins/CMakeLists.txt +++ b/compiler-rt/lib/builtins/CMakeLists.txt @@ -51,9 +51,12 @@ if (COMPILER_RT_STANDALONE_BUILD) endif() include(builtin-config-ix) -include(CMakeDependentOption) include(CMakePushCheckState) +if(${CMAKE_SYSTEM_NAME} MATCHES "AIX") + include(CompilerRTAIXUtils) +endif() + option(COMPILER_RT_BUILTINS_HIDE_SYMBOLS "Do not export any symbols from the static library." ON) @@ -687,7 +690,7 @@ set(powerpc64_SOURCES ${GENERIC_SOURCES} ) # These routines require __int128, which isn't supported on AIX. -if (NOT OS_NAME MATCHES "AIX") +if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "AIX") set(powerpc64_SOURCES ppc/floattitf.c ppc/fixtfti.c @@ -852,8 +855,6 @@ else () endforeach () endif () -add_dependencies(compiler-rt builtins) - option(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC "Build standalone shared atomic library." OFF) @@ -861,8 +862,7 @@ option(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC if(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC) add_custom_target(builtins-standalone-atomic) set(BUILTIN_TYPE SHARED) - if(OS_NAME MATCHES "AIX") - include(CompilerRTAIXUtils) + if(${CMAKE_SYSTEM_NAME} MATCHES "AIX") if(NOT COMPILER_RT_LIBATOMIC_LINK_FLAGS) get_aix_libatomic_default_link_flags(COMPILER_RT_LIBATOMIC_LINK_FLAGS "${CMAKE_CURRENT_SOURCE_DIR}/ppc/atomic.exp") @@ -887,7 +887,7 @@ if(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC) # FIXME: On AIX, we have to archive built shared libraries into a static # archive, i.e., libatomic.a. Once cmake adds support of such usage for AIX, # this ad-hoc part can be removed. - if(OS_NAME MATCHES "AIX") + if(${CMAKE_SYSTEM_NAME} MATCHES "AIX") archive_aix_libatomic(clang_rt.atomic libatomic ARCHS ${BUILTIN_SUPPORTED_ARCH} PARENT_TARGET builtins-standalone-atomic) @@ -895,40 +895,4 @@ if(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC) add_dependencies(compiler-rt builtins-standalone-atomic) endif() -cmake_dependent_option(COMPILER_RT_BUILD_CRT "Build crtbegin.o/crtend.o" ON "COMPILER_RT_HAS_CRT" OFF) - -if(COMPILER_RT_BUILD_CRT) - add_compiler_rt_component(crt) - - option(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY "Use eh_frame in crtbegin.o/crtend.o" ON) - - include(CheckSectionExists) - check_section_exists(".init_array" COMPILER_RT_HAS_INITFINI_ARRAY - SOURCE "volatile int x;\n__attribute__((constructor)) void f(void) {x = 0;}\nint main(void) { return 0; }\n") - - append_list_if(COMPILER_RT_HAS_STD_C11_FLAG -std=c11 CRT_CFLAGS) - append_list_if(COMPILER_RT_HAS_INITFINI_ARRAY -DCRT_HAS_INITFINI_ARRAY CRT_CFLAGS) - append_list_if(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY -DEH_USE_FRAME_REGISTRY CRT_CFLAGS) - append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC CRT_CFLAGS) - append_list_if(COMPILER_RT_HAS_WNO_PEDANTIC -Wno-pedantic CRT_CFLAGS) - if (COMPILER_RT_HAS_FCF_PROTECTION_FLAG) - append_list_if(COMPILER_RT_ENABLE_CET -fcf-protection=full CRT_CFLAGS) - endif() - - foreach(arch ${BUILTIN_SUPPORTED_ARCH}) - add_compiler_rt_runtime(clang_rt.crtbegin - OBJECT - ARCHS ${arch} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/crtbegin.c - CFLAGS ${CRT_CFLAGS} - PARENT_TARGET crt) - add_compiler_rt_runtime(clang_rt.crtend - OBJECT - ARCHS ${arch} - SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/crtend.c - CFLAGS ${CRT_CFLAGS} - PARENT_TARGET crt) - endforeach() - - add_dependencies(compiler-rt crt) -endif() +add_dependencies(compiler-rt builtins) diff --git a/compiler-rt/lib/crt/CMakeLists.txt b/compiler-rt/lib/crt/CMakeLists.txt new file mode 100644 index 0000000000000..32fd61b1fa11e --- /dev/null +++ b/compiler-rt/lib/crt/CMakeLists.txt @@ -0,0 +1,63 @@ +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + cmake_minimum_required(VERSION 3.20.0) + + set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) + project(CompilerRTCRT C) + set(COMPILER_RT_STANDALONE_BUILD TRUE) + set(COMPILER_RT_CRT_STANDALONE_BUILD TRUE) + + set(COMPILER_RT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../..") + + set(LLVM_COMMON_CMAKE_UTILS "${COMPILER_RT_SOURCE_DIR}/../cmake") + + # Add path for custom modules + list(INSERT CMAKE_MODULE_PATH 0 + "${COMPILER_RT_SOURCE_DIR}/cmake" + "${COMPILER_RT_SOURCE_DIR}/cmake/Modules" + "${LLVM_COMMON_CMAKE_UTILS}" + "${LLVM_COMMON_CMAKE_UTILS}/Modules" + ) + + include(base-config-ix) + include(CompilerRTUtils) + + load_llvm_config() + construct_compiler_rt_default_triple() + + include(SetPlatformToolchainTools) + include(AddCompilerRT) +endif() + +include(crt-config-ix) + +if(COMPILER_RT_HAS_CRT) + add_compiler_rt_component(crt) + + include(CheckSectionExists) + check_section_exists(".init_array" COMPILER_RT_HAS_INITFINI_ARRAY + SOURCE "volatile int x;\n__attribute__((constructor)) void f(void) {x = 0;}\nint main(void) { return 0; }\n") + + append_list_if(COMPILER_RT_HAS_STD_C11_FLAG -std=c11 CRT_CFLAGS) + append_list_if(COMPILER_RT_HAS_INITFINI_ARRAY -DCRT_HAS_INITFINI_ARRAY CRT_CFLAGS) + append_list_if(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY -DEH_USE_FRAME_REGISTRY CRT_CFLAGS) + append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC CRT_CFLAGS) + append_list_if(COMPILER_RT_HAS_WNO_PEDANTIC -Wno-pedantic CRT_CFLAGS) + if (COMPILER_RT_HAS_FCF_PROTECTION_FLAG) + append_list_if(COMPILER_RT_ENABLE_CET -fcf-protection=full CRT_CFLAGS) + endif() + + foreach(arch ${CRT_SUPPORTED_ARCH}) + add_compiler_rt_runtime(clang_rt.crtbegin + OBJECT + ARCHS ${arch} + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/crtbegin.c + CFLAGS ${CRT_CFLAGS} + PARENT_TARGET crt) + add_compiler_rt_runtime(clang_rt.crtend + OBJECT + ARCHS ${arch} + SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/crtend.c + CFLAGS ${CRT_CFLAGS} + PARENT_TARGET crt) + endforeach() +endif() diff --git a/compiler-rt/lib/builtins/crtbegin.c b/compiler-rt/lib/crt/crtbegin.c similarity index 100% rename from compiler-rt/lib/builtins/crtbegin.c rename to compiler-rt/lib/crt/crtbegin.c diff --git a/compiler-rt/lib/builtins/crtend.c b/compiler-rt/lib/crt/crtend.c similarity index 100% rename from compiler-rt/lib/builtins/crtend.c rename to compiler-rt/lib/crt/crtend.c diff --git a/compiler-rt/test/CMakeLists.txt b/compiler-rt/test/CMakeLists.txt index bc37c85a140ad..3106ab73e9c22 100644 --- a/compiler-rt/test/CMakeLists.txt +++ b/compiler-rt/test/CMakeLists.txt @@ -103,6 +103,9 @@ if(COMPILER_RT_CAN_EXECUTE_TESTS) if(COMPILER_RT_BUILD_ORC) compiler_rt_Test_runtime(orc) endif() + if(COMPILER_RT_BUILD_CRT) + add_subdirectory(crt) + endif() # ShadowCallStack does not yet provide a runtime with compiler-rt, the tests # include their own minimal runtime add_subdirectory(shadowcallstack) diff --git a/compiler-rt/test/builtins/CMakeLists.txt b/compiler-rt/test/builtins/CMakeLists.txt index 2d0cc24ac6e74..466a715dbbcfe 100644 --- a/compiler-rt/test/builtins/CMakeLists.txt +++ b/compiler-rt/test/builtins/CMakeLists.txt @@ -13,10 +13,6 @@ configure_lit_site_cfg( include(builtin-config-ix) -if (COMPILER_RT_HAS_CRT) - list(APPEND BUILTINS_TEST_DEPS crt) -endif() - # Indicate if this is an MSVC environment. pythonize_bool(MSVC) diff --git a/compiler-rt/test/builtins/Unit/lit.cfg.py b/compiler-rt/test/builtins/Unit/lit.cfg.py index 16d5a466248f4..12a77436983b8 100644 --- a/compiler-rt/test/builtins/Unit/lit.cfg.py +++ b/compiler-rt/test/builtins/Unit/lit.cfg.py @@ -2,8 +2,6 @@ import os import platform -import shlex -import subprocess import lit.formats @@ -30,40 +28,6 @@ def get_required_attr(config, attr_name): return attr_value -def get_library_path(file): - cmd = subprocess.Popen( - [config.clang.strip(), "-print-file-name=%s" % file] - + shlex.split(config.target_cflags), - stdout=subprocess.PIPE, - env=config.environment, - universal_newlines=True, - ) - if not cmd.stdout: - lit_config.fatal("Couldn't find the library path for '%s'" % file) - dir = cmd.stdout.read().strip() - if sys.platform in ["win32"] and execute_external: - # Don't pass dosish path separator to msys bash.exe. - dir = dir.replace("\\", "/") - return dir - - -def get_libgcc_file_name(): - cmd = subprocess.Popen( - [config.clang.strip(), "-print-libgcc-file-name"] - + shlex.split(config.target_cflags), - stdout=subprocess.PIPE, - env=config.environment, - universal_newlines=True, - ) - if not cmd.stdout: - lit_config.fatal("Couldn't find the library path for '%s'" % file) - dir = cmd.stdout.read().strip() - if sys.platform in ["win32"] and execute_external: - # Don't pass dosish path separator to msys bash.exe. - dir = dir.replace("\\", "/") - return dir - - # Setup config name. config.name = "Builtins" + config.name_suffix @@ -106,27 +70,6 @@ def get_libgcc_file_name(): base_lib = base_lib.replace("\\", "/") config.substitutions.append(("%librt ", base_lib + " -lc -lm ")) - if config.host_os == "Linux": - base_obj = os.path.join( - config.compiler_rt_libdir, "clang_rt.%%s%s.o" % config.target_suffix - ) - if sys.platform in ["win32"] and execute_external: - # Don't pass dosish path separator to msys bash.exe. - base_obj = base_obj.replace("\\", "/") - - config.substitutions.append(("%crtbegin", base_obj % "crtbegin")) - config.substitutions.append(("%crtend", base_obj % "crtend")) - - config.substitutions.append(("%crt1", get_library_path("crt1.o"))) - config.substitutions.append(("%crti", get_library_path("crti.o"))) - config.substitutions.append(("%crtn", get_library_path("crtn.o"))) - - config.substitutions.append(("%libgcc", get_libgcc_file_name())) - - config.substitutions.append( - ("%libstdcxx", "-l" + config.sanitizer_cxx_lib.lstrip("lib")) - ) - builtins_source_dir = os.path.join( get_required_attr(config, "compiler_rt_src_root"), "lib", "builtins" ) diff --git a/compiler-rt/test/builtins/Unit/lit.site.cfg.py.in b/compiler-rt/test/builtins/Unit/lit.site.cfg.py.in index 920c915feb08b..e55dd5d51f3dc 100644 --- a/compiler-rt/test/builtins/Unit/lit.site.cfg.py.in +++ b/compiler-rt/test/builtins/Unit/lit.site.cfg.py.in @@ -4,7 +4,6 @@ config.name_suffix = "@BUILTINS_TEST_CONFIG_SUFFIX@" config.builtins_lit_source_dir = "@BUILTINS_LIT_SOURCE_DIR@/Unit" config.target_cflags = "@BUILTINS_TEST_TARGET_CFLAGS@" config.target_arch = "@BUILTINS_TEST_TARGET_ARCH@" -config.sanitizer_cxx_lib = "@SANITIZER_TEST_CXX_LIBNAME@" config.is_msvc = @MSVC_PYBOOL@ config.builtins_is_msvc = @BUILTINS_IS_MSVC_PYBOOL@ config.builtins_lit_source_features = "@BUILTINS_LIT_SOURCE_FEATURES@" diff --git a/compiler-rt/test/crt/CMakeLists.txt b/compiler-rt/test/crt/CMakeLists.txt new file mode 100644 index 0000000000000..f539be34f6ca2 --- /dev/null +++ b/compiler-rt/test/crt/CMakeLists.txt @@ -0,0 +1,41 @@ +include(crt-config-ix) + +if (COMPILER_RT_HAS_CRT) + set(CRT_LIT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + + if(NOT COMPILER_RT_STANDALONE_BUILD) + list(APPEND CRT_TEST_DEPS crt) + endif() + if(NOT COMPILER_RT_STANDALONE_BUILD AND NOT LLVM_RUNTIMES_BUILD) + # Use LLVM utils and Clang from the same build tree. + list(APPEND CRT_TEST_DEPS + clang clang-resource-headers FileCheck not llvm-config) + endif() + + set(CRT_TEST_ARCH ${CRT_SUPPORTED_ARCH}) + foreach(arch ${CRT_TEST_ARCH}) + set(CRT_TEST_TARGET_ARCH ${arch}) + string(TOLOWER "-${arch}-${OS_NAME}" CRT_TEST_CONFIG_SUFFIX) + get_test_cc_for_arch(${arch} CRT_TEST_TARGET_CC CRT_TEST_TARGET_CFLAGS) + string(TOUPPER ${arch} ARCH_UPPER_CASE) + set(CONFIG_NAME ${ARCH_UPPER_CASE}${OS_NAME}Config) + + if (COMPILER_RT_ENABLE_CET) + if (${arch} MATCHES "i386|x86_64") + list(APPEND CRT_TEST_TARGET_CFLAGS -fcf-protection=full) + string(REPLACE ";" " " CRT_TEST_TARGET_CFLAGS "${CRT_TEST_TARGET_CFLAGS}") + else() + message(FATAL_ERROR "The target arch ${arch} doesn't support CET") + endif() + endif() + configure_lit_site_cfg( + ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in + ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}/lit.site.cfg.py) + list(APPEND CRT_TESTSUITES ${CMAKE_CURRENT_BINARY_DIR}/${CONFIG_NAME}) + endforeach() + + add_lit_testsuite(check-crt "Running the CRT tests" + ${CRT_TESTSUITES} + DEPENDS ${CRT_TEST_DEPS}) + set_target_properties(check-crt PROPERTIES FOLDER "Compiler-RT Misc") +endif() diff --git a/compiler-rt/test/builtins/Unit/ctor_dtor.c b/compiler-rt/test/crt/ctor_dtor.c similarity index 97% rename from compiler-rt/test/builtins/Unit/ctor_dtor.c rename to compiler-rt/test/crt/ctor_dtor.c index 2fdd2f7bea237..2bea05073b4d2 100644 --- a/compiler-rt/test/builtins/Unit/ctor_dtor.c +++ b/compiler-rt/test/crt/ctor_dtor.c @@ -1,5 +1,3 @@ -// REQUIRES: linux - // RUN: %clang -fno-use-init-array -g -c %s -o %t.o // RUN: %clang -o %t -no-pie -nostdlib %crt1 %crti %crtbegin %t.o -lc %libgcc %crtend %crtn // RUN: %run %t 2>&1 | FileCheck %s diff --git a/compiler-rt/test/builtins/Unit/dso_handle.cpp b/compiler-rt/test/crt/dso_handle.cpp similarity index 79% rename from compiler-rt/test/builtins/Unit/dso_handle.cpp rename to compiler-rt/test/crt/dso_handle.cpp index 00c54915c8166..46d36531386a8 100644 --- a/compiler-rt/test/builtins/Unit/dso_handle.cpp +++ b/compiler-rt/test/crt/dso_handle.cpp @@ -1,7 +1,5 @@ -// REQUIRES: linux - -// RUN: %clangxx -g -fno-exceptions -DCRT_SHARED -c %s -fPIC -o %tshared.o -// RUN: %clangxx -g -fno-exceptions -c %s -fPIC -o %t.o +// RUN: %clangxx -g -DCRT_SHARED -c %s -fPIC -o %tshared.o +// RUN: %clangxx -g -c %s -fPIC -o %t.o // RUN: %clangxx -g -shared -o %t.so -nostdlib %crti %crtbegin %tshared.o %libstdcxx -lc -lm %libgcc %crtend %crtn // RUN: %clangxx -g -o %t -fno-pic -no-pie -nostdlib %crt1 %crti %crtbegin %t.o %libstdcxx -lc -lm %libgcc %t.so %crtend %crtn // RUN: %run %t 2>&1 | FileCheck %s diff --git a/compiler-rt/test/crt/lit.cfg.py b/compiler-rt/test/crt/lit.cfg.py new file mode 100644 index 0000000000000..7024c7e80dae8 --- /dev/null +++ b/compiler-rt/test/crt/lit.cfg.py @@ -0,0 +1,95 @@ +# -*- Python -*- + +import os +import subprocess +import shlex + +# Setup config name. +config.name = "CRT" + config.name_suffix + +# Setup source root. +config.test_source_root = os.path.dirname(__file__) + + +# Choose between lit's internal shell pipeline runner and a real shell. If +# LIT_USE_INTERNAL_SHELL is in the environment, we use that as an override. +use_lit_shell = os.environ.get("LIT_USE_INTERNAL_SHELL") +if use_lit_shell: + # 0 is external, "" is default, and everything else is internal. + execute_external = use_lit_shell == "0" +else: + # Otherwise we default to internal on Windows and external elsewhere, as + # bash on Windows is usually very slow. + execute_external = not sys.platform in ["win32"] + + +def get_library_path(file): + cmd = subprocess.Popen( + [config.clang.strip(), "-print-file-name=%s" % file] + + shlex.split(config.target_cflags), + stdout=subprocess.PIPE, + env=config.environment, + universal_newlines=True, + ) + if not cmd.stdout: + lit_config.fatal("Couldn't find the library path for '%s'" % file) + dir = cmd.stdout.read().strip() + if sys.platform in ["win32"] and execute_external: + # Don't pass dosish path separator to msys bash.exe. + dir = dir.replace("\\", "/") + return dir + + +def get_libgcc_file_name(): + cmd = subprocess.Popen( + [config.clang.strip(), "-print-libgcc-file-name"] + + shlex.split(config.target_cflags), + stdout=subprocess.PIPE, + env=config.environment, + universal_newlines=True, + ) + if not cmd.stdout: + lit_config.fatal("Couldn't find the library path for '%s'" % file) + dir = cmd.stdout.read().strip() + if sys.platform in ["win32"] and execute_external: + # Don't pass dosish path separator to msys bash.exe. + dir = dir.replace("\\", "/") + return dir + + +def build_invocation(compile_flags): + return " " + " ".join([config.clang] + compile_flags) + " " + + +# Setup substitutions. +config.substitutions.append(("%clang ", build_invocation([config.target_cflags]))) +config.substitutions.append( + ("%clangxx ", build_invocation(config.cxx_mode_flags + [config.target_cflags])) +) + +base_lib = os.path.join( + config.compiler_rt_libdir, "clang_rt.%%s%s.o" % config.target_suffix +) + +if sys.platform in ["win32"] and execute_external: + # Don't pass dosish path separator to msys bash.exe. + base_lib = base_lib.replace("\\", "/") + +config.substitutions.append(("%crtbegin", base_lib % "crtbegin")) +config.substitutions.append(("%crtend", base_lib % "crtend")) + +config.substitutions.append(("%crt1", get_library_path("crt1.o"))) +config.substitutions.append(("%crti", get_library_path("crti.o"))) +config.substitutions.append(("%crtn", get_library_path("crtn.o"))) + +config.substitutions.append(("%libgcc", get_libgcc_file_name())) + +config.substitutions.append( + ("%libstdcxx", "-l" + config.sanitizer_cxx_lib.lstrip("lib")) +) + +# Default test suffixes. +config.suffixes = [".c", ".cpp"] + +if config.host_os not in ["Linux"]: + config.unsupported = True diff --git a/compiler-rt/test/crt/lit.site.cfg.py.in b/compiler-rt/test/crt/lit.site.cfg.py.in new file mode 100644 index 0000000000000..53eda0c45948b --- /dev/null +++ b/compiler-rt/test/crt/lit.site.cfg.py.in @@ -0,0 +1,14 @@ +@LIT_SITE_CFG_IN_HEADER@ + +# Tool-specific config options. +config.name_suffix = "@CRT_TEST_CONFIG_SUFFIX@" +config.crt_lit_source_dir = "@CRT_LIT_SOURCE_DIR@" +config.target_cflags = "@CRT_TEST_TARGET_CFLAGS@" +config.target_arch = "@CRT_TEST_TARGET_ARCH@" +config.sanitizer_cxx_lib = "@SANITIZER_TEST_CXX_LIBNAME@" + +# Load common config for all compiler-rt lit tests +lit_config.load_config(config, "@COMPILER_RT_BINARY_DIR@/test/lit.common.configured") + +# Load tool-specific config that would do the real work. +lit_config.load_config(config, "@CRT_LIT_SOURCE_DIR@/lit.cfg.py")