Skip to content

Reapply "[runtimes] Allow building against an installed LLVM tree" #114307

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1 change: 1 addition & 0 deletions compiler-rt/cmake/Modules/AddCompilerRT.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -790,6 +790,7 @@ function(configure_compiler_rt_lit_site_cfg input output)

string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} COMPILER_RT_RESOLVED_TEST_COMPILER ${COMPILER_RT_TEST_COMPILER})
string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} COMPILER_RT_RESOLVED_OUTPUT_DIR ${COMPILER_RT_OUTPUT_DIR})
string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} COMPILER_RT_RESOLVED_EXEC_OUTPUT_DIR ${COMPILER_RT_EXEC_OUTPUT_DIR})
string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} COMPILER_RT_RESOLVED_LIBRARY_OUTPUT_DIR ${output_dir})

configure_lit_site_cfg(${input} ${output})
Expand Down
9 changes: 9 additions & 0 deletions compiler-rt/test/hwasan/lit.cfg.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

import os

from lit.llvm import llvm_config
from lit.llvm.subst import ToolSubst, FindTool

# Setup config name.
config.name = "HWAddressSanitizer" + getattr(config, "name_suffix", "default")

Expand Down Expand Up @@ -74,6 +77,12 @@ def build_invocation(compile_flags):
("%env_hwasan_opts=", "env HWASAN_OPTIONS=" + default_hwasan_opts_str)
)

# Ensure that we can use hwasan_symbolize from the expected location
llvm_config.add_tool_substitutions(
[ToolSubst("hwasan_symbolize", unresolved="fatal")],
search_dirs=[config.compiler_rt_bindir],
)

# Default test suffixes.
config.suffixes = [".c", ".cpp"]

Expand Down
1 change: 1 addition & 0 deletions compiler-rt/test/lit.common.configured.in
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ set_default("python_executable", "@Python3_EXECUTABLE@")
set_default("compiler_rt_debug", @COMPILER_RT_DEBUG_PYBOOL@)
set_default("compiler_rt_intercept_libdispatch", @COMPILER_RT_INTERCEPT_LIBDISPATCH_PYBOOL@)
set_default("compiler_rt_output_dir", "@COMPILER_RT_RESOLVED_OUTPUT_DIR@")
set_default("compiler_rt_bindir", "@COMPILER_RT_RESOLVED_EXEC_OUTPUT_DIR@")
set_default("compiler_rt_libdir", "@COMPILER_RT_RESOLVED_LIBRARY_OUTPUT_DIR@")
set_default("emulator", "@COMPILER_RT_EMULATOR@")
set_default("asan_shadow_scale", "@COMPILER_RT_ASAN_SHADOW_SCALE@")
Expand Down
37 changes: 35 additions & 2 deletions runtimes/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
# This file handles building LLVM runtime sub-projects.
cmake_minimum_required(VERSION 3.20.0)

# This file can be used in two ways: the bootstrapping build calls it from
# llvm/runtimes/CMakeLists.txt where we reuse the build tree of the top-level
# build or it can be directly invoked in this directory. In the latter case we
# might be building against a LLVM install tree and might not have a valid build
# tree set up yet. We can detect whether we are using the bootstrapping build
# by checking for the HAVE_LLVM_LIT flag that is passed explicitly to
# llvm_ExternalProject_Add().
if (HAVE_LLVM_LIT)
message(STATUS "Performing bootstrapping runtimes build.")
else()
message(STATUS "Performing standalone runtimes build.")
endif()
# Add path for custom and the LLVM build's modules to the CMake module path.
set(LLVM_COMMON_CMAKE_UTILS "${CMAKE_CURRENT_SOURCE_DIR}/../cmake")
include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
Expand Down Expand Up @@ -236,6 +248,25 @@ foreach(entry ${runtimes})
endforeach()

if(LLVM_INCLUDE_TESTS)
# If built with the runtimes build (rooted at runtimes/CMakeLists.txt), we
# won't have llvm-lit. If built with the bootstrapping build (rooted at
# llvm/CMakeLists.txt), the top-level llvm CMake invocation already generated
# the llvm-lit script.
if (NOT HAVE_LLVM_LIT)
# Ensure that the appropriate variables for lit are set before adding any
# runtimes since their CMake tests configuration might depend on lit being
# present. This ensures that the testsuites use a local lit from the build
# dir rather than ${LLVM_INSTALL_DIR}/bin/llvm-lit (which may not exist if
# LLVM_BINARY_DIR points at an installed LLVM tree rather than a build tree).
set(LLVM_LIT_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin)
get_llvm_lit_path(_base_dir _file_name)
set(LLVM_EXTERNAL_LIT "${_base_dir}/${_file_name}" CACHE STRING "Command used to spawn lit" FORCE)
# Avoid warning about missing llvm-lit from runtimes CMake files. This is
# fine since we call configure_file() to create llvm-lit at the end of this
# file (after recursing into all runtimes' CMake logic), so it will exist.
set(LLVM_EXTERNAL_LIT_MISSING_WARNED_ONCE YES CACHE INTERNAL "")
endif()

set(LIT_ARGS_DEFAULT "-sv --show-xfail --show-unsupported")
if (MSVC OR XCODE)
set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
Expand Down Expand Up @@ -273,6 +304,8 @@ if(LLVM_INCLUDE_TESTS)
# If built by manually invoking cmake on this directory, we don't have
# llvm-lit. If invoked via llvm/runtimes, the toplevel llvm cmake
# invocation already generated the llvm-lit script.
# NOTE: this must be called after all testsuites have been added, since
# otherwise the generated llvm-lit does not have all required path mappings.
add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit
${CMAKE_CURRENT_BINARY_DIR}/llvm-lit)
endif()
Expand Down Expand Up @@ -306,10 +339,10 @@ if(SUB_COMPONENTS)
if(LLVM_RUNTIMES_TARGET)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/Components.cmake.in
${LLVM_BINARY_DIR}/runtimes/${LLVM_RUNTIMES_TARGET}/Components.cmake)
${CMAKE_CURRENT_BINARY_DIR}/runtimes/${LLVM_RUNTIMES_TARGET}/Components.cmake)
else()
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/Components.cmake.in
${LLVM_BINARY_DIR}/runtimes/Components.cmake)
${CMAKE_CURRENT_BINARY_DIR}/runtimes/Components.cmake)
endif()
endif()
Loading