Skip to content

Commit

Permalink
[mlir] Avoid building some shared libraries when PIC is off
Browse files Browse the repository at this point in the history
When `LLVM_ENABLE_PIC = OFF`, shared libraries cannot be built against code
that's compiled without -fPIC. Example error message:
``
ld.lld: error: relocation R_X86_64_32 cannot be used against local symbol;
recompile with -fPIC
>>> defined in lib/libLLVMSupport.a(StringMap.cpp.o)
>>> referenced by StringMap.cpp
>>>               StringMap.cpp.o:(llvm::StringMapImpl::StringMapImpl(unsigned
>>>               int, unsigned int)) in archive lib/libLLVMSupport.a
``
Similar to [how libclang handles
this](https://github.com/llvm/llvm-project/blob/main/clang/tools/clang-shlib/CMakeLists.txt#L2-L4),
skip building these shared libraries when `LLVM_ENABLE_PIC = OFF`.

Differential Revision: https://reviews.llvm.org/D142941
  • Loading branch information
zhuhan0 committed Feb 13, 2023
1 parent bf7c421 commit 8e628f7
Show file tree
Hide file tree
Showing 2 changed files with 141 additions and 137 deletions.
276 changes: 140 additions & 136 deletions mlir/lib/ExecutionEngine/CMakeLists.txt
Expand Up @@ -119,162 +119,166 @@ add_mlir_library(MLIRJitRunner
MLIRSupport
)

add_mlir_library(mlir_float16_utils
SHARED
Float16bits.cpp

EXCLUDE_FROM_LIBMLIR
)
set_property(TARGET mlir_float16_utils PROPERTY CXX_STANDARD 17)
target_compile_definitions(mlir_float16_utils PRIVATE mlir_float16_utils_EXPORTS)

add_subdirectory(SparseTensor)

add_mlir_library(mlir_c_runner_utils
SHARED
CRunnerUtils.cpp
SparseTensorRuntime.cpp

EXCLUDE_FROM_LIBMLIR
# When -fPIC is not provided, shared libraries cannot be built if it links against
# non-PIC code.
if(LLVM_ENABLE_PIC)
add_mlir_library(mlir_float16_utils
SHARED
Float16bits.cpp

LINK_LIBS PUBLIC
mlir_float16_utils
MLIRSparseTensorEnums
MLIRSparseTensorRuntime
)
set_property(TARGET mlir_c_runner_utils PROPERTY CXX_STANDARD 17)
target_compile_definitions(mlir_c_runner_utils PRIVATE mlir_c_runner_utils_EXPORTS)
EXCLUDE_FROM_LIBMLIR
)
set_property(TARGET mlir_float16_utils PROPERTY CXX_STANDARD 17)
target_compile_definitions(mlir_float16_utils PRIVATE mlir_float16_utils_EXPORTS)

add_mlir_library(mlir_runner_utils
SHARED
RunnerUtils.cpp
add_subdirectory(SparseTensor)

EXCLUDE_FROM_LIBMLIR
)
target_compile_definitions(mlir_runner_utils PRIVATE mlir_runner_utils_EXPORTS)
add_mlir_library(mlir_c_runner_utils
SHARED
CRunnerUtils.cpp
SparseTensorRuntime.cpp

add_mlir_library(mlir_async_runtime
SHARED
AsyncRuntime.cpp
EXCLUDE_FROM_LIBMLIR

EXCLUDE_FROM_LIBMLIR
LINK_LIBS PUBLIC
mlir_float16_utils
MLIRSparseTensorEnums
MLIRSparseTensorRuntime
)
set_property(TARGET mlir_c_runner_utils PROPERTY CXX_STANDARD 17)
target_compile_definitions(mlir_c_runner_utils PRIVATE mlir_c_runner_utils_EXPORTS)

LINK_LIBS PUBLIC
${LLVM_PTHREAD_LIB}
)
set_property(TARGET mlir_async_runtime PROPERTY CXX_VISIBILITY_PRESET hidden)
target_compile_definitions(mlir_async_runtime PRIVATE mlir_async_runtime_EXPORTS)

if(MLIR_ENABLE_CUDA_RUNNER)
# Configure CUDA support. Using check_language first allows us to give a
# custom error message.
include(CheckLanguage)
check_language(CUDA)
if (CMAKE_CUDA_COMPILER)
enable_language(CUDA)
else()
message(SEND_ERROR
"Building the mlir cuda runner requires a working CUDA install")
endif()
add_mlir_library(mlir_runner_utils
SHARED
RunnerUtils.cpp

# We need the libcuda.so library.
find_library(CUDA_RUNTIME_LIBRARY cuda)
EXCLUDE_FROM_LIBMLIR
)
target_compile_definitions(mlir_runner_utils PRIVATE mlir_runner_utils_EXPORTS)

add_mlir_library(mlir_cuda_runtime
add_mlir_library(mlir_async_runtime
SHARED
CudaRuntimeWrappers.cpp
AsyncRuntime.cpp

EXCLUDE_FROM_LIBMLIR
)
set_property(TARGET mlir_cuda_runtime PROPERTY CXX_STANDARD 14)
target_include_directories(mlir_cuda_runtime
PRIVATE
${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}
)
target_link_libraries(mlir_cuda_runtime
PRIVATE
${CUDA_RUNTIME_LIBRARY}
)
endif()

if(MLIR_ENABLE_ROCM_RUNNER)
# Configure ROCm support.
if (NOT DEFINED ROCM_PATH)
if (NOT DEFINED ENV{ROCM_PATH})
set(ROCM_PATH "/opt/rocm" CACHE PATH "Path to which ROCm has been installed")
LINK_LIBS PUBLIC
${LLVM_PTHREAD_LIB}
)
set_property(TARGET mlir_async_runtime PROPERTY CXX_VISIBILITY_PRESET hidden)
target_compile_definitions(mlir_async_runtime PRIVATE mlir_async_runtime_EXPORTS)

if(MLIR_ENABLE_CUDA_RUNNER)
# Configure CUDA support. Using check_language first allows us to give a
# custom error message.
include(CheckLanguage)
check_language(CUDA)
if (CMAKE_CUDA_COMPILER)
enable_language(CUDA)
else()
set(ROCM_PATH $ENV{ROCM_PATH} CACHE PATH "Path to which ROCm has been installed")
message(SEND_ERROR
"Building the mlir cuda runner requires a working CUDA install")
endif()

# We need the libcuda.so library.
find_library(CUDA_RUNTIME_LIBRARY cuda)

add_mlir_library(mlir_cuda_runtime
SHARED
CudaRuntimeWrappers.cpp

EXCLUDE_FROM_LIBMLIR
)
set_property(TARGET mlir_cuda_runtime PROPERTY CXX_STANDARD 14)
target_include_directories(mlir_cuda_runtime
PRIVATE
${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES}
)
target_link_libraries(mlir_cuda_runtime
PRIVATE
${CUDA_RUNTIME_LIBRARY}
)
endif()
# A lot of the ROCm CMake files expect to find their own dependencies in
# CMAKE_PREFIX_PATH and don't respect PATHS or HINTS :( .
# Therefore, temporarily add the ROCm path to CMAKE_PREFIX_PATH so we can
# load HIP, then remove it
set(REAL_CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}")
list(APPEND CMAKE_PREFIX_PATH ${ROCM_PATH} "${ROCM_PATH}/hip")
find_package(hip REQUIRED)
set(CMAKE_PREFIX_PATH "${REAL_CMAKE_PREFIX_PATH}")

if (NOT DEFINED ROCM_TEST_CHIPSET)
execute_process(COMMAND "${ROCM_PATH}/bin/rocm_agent_enumerator"
OUTPUT_VARIABLE AGENTS_STRING
ERROR_VARIABLE AGENTS_STRING
RESULT_VARIABLE AGENT_ENUMERATOR_RESULT)

if (NOT AGENT_ENUMERATOR_RESULT EQUAL 0)
message(SEND_ERROR "Could not run rocm_agent_enumerator and ROCM_TEST_CHIPSET is not defined")
set(AGENTS_STRING "")

if(MLIR_ENABLE_ROCM_RUNNER)
# Configure ROCm support.
if (NOT DEFINED ROCM_PATH)
if (NOT DEFINED ENV{ROCM_PATH})
set(ROCM_PATH "/opt/rocm" CACHE PATH "Path to which ROCm has been installed")
else()
set(ROCM_PATH $ENV{ROCM_PATH} CACHE PATH "Path to which ROCm has been installed")
endif()
endif()
string(STRIP AGENTS_STRING ${AGENTS_STRING})
string(REPLACE "\n" ";" AGENTS_LIST ${AGENTS_STRING})
list(FILTER AGENTS_LIST EXCLUDE REGEX "gfx000")
if (AGENTS_LIST STREQUAL "")
message(SEND_ERROR "No non-CPU ROCm agents found on the system, and ROCM_TEST_CHIPSET is not defined")
else()
list(GET AGENTS_LIST 0 FIRST_AGENT)
set(ROCM_TEST_CHIPSET ${FIRST_AGENT} CACHE STRING "Chipset for which to compile ROCm integration tests")
message(STATUS "Compiling integration tests for ${ROCM_TEST_CHIPSET}")
# A lot of the ROCm CMake files expect to find their own dependencies in
# CMAKE_PREFIX_PATH and don't respect PATHS or HINTS :( .
# Therefore, temporarily add the ROCm path to CMAKE_PREFIX_PATH so we can
# load HIP, then remove it
set(REAL_CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}")
list(APPEND CMAKE_PREFIX_PATH ${ROCM_PATH} "${ROCM_PATH}/hip")
find_package(hip REQUIRED)
set(CMAKE_PREFIX_PATH "${REAL_CMAKE_PREFIX_PATH}")

if (NOT DEFINED ROCM_TEST_CHIPSET)
execute_process(COMMAND "${ROCM_PATH}/bin/rocm_agent_enumerator"
OUTPUT_VARIABLE AGENTS_STRING
ERROR_VARIABLE AGENTS_STRING
RESULT_VARIABLE AGENT_ENUMERATOR_RESULT)

if (NOT AGENT_ENUMERATOR_RESULT EQUAL 0)
message(SEND_ERROR "Could not run rocm_agent_enumerator and ROCM_TEST_CHIPSET is not defined")
set(AGENTS_STRING "")
endif()
string(STRIP AGENTS_STRING ${AGENTS_STRING})
string(REPLACE "\n" ";" AGENTS_LIST ${AGENTS_STRING})
list(FILTER AGENTS_LIST EXCLUDE REGEX "gfx000")
if (AGENTS_LIST STREQUAL "")
message(SEND_ERROR "No non-CPU ROCm agents found on the system, and ROCM_TEST_CHIPSET is not defined")
else()
list(GET AGENTS_LIST 0 FIRST_AGENT)
set(ROCM_TEST_CHIPSET ${FIRST_AGENT} CACHE STRING "Chipset for which to compile ROCm integration tests")
message(STATUS "Compiling integration tests for ${ROCM_TEST_CHIPSET}")
endif()
endif()
endif()

add_mlir_library(mlir_rocm_runtime
SHARED
RocmRuntimeWrappers.cpp
add_mlir_library(mlir_rocm_runtime
SHARED
RocmRuntimeWrappers.cpp

EXCLUDE_FROM_LIBMLIR
)
EXCLUDE_FROM_LIBMLIR
)

# Supress compiler warnings from HIP headers
check_cxx_compiler_flag(-Wno-c++98-compat-extra-semi
CXX_SUPPORTS_NO_CXX98_COMPAT_EXTRA_SEMI_FLAG)
if (CXX_SUPPORTS_CXX98_COMPAT_EXTRA_SEMI_FLAG)
target_compile_options(mlir_rocm_runtime PRIVATE
"-Wno-c++98-compat-extra-semi")
endif()
check_cxx_compiler_flag(-Wno-return-type-c-linkage
CXX_SUPPORTS_WNO_RETURN_TYPE_C_LINKAGE_FLAG)
if (CXX_SUPPORTS_WNO_RETURN_TYPE_C_LINKAGE_FLAG)
target_compile_options(mlir_rocm_runtime PRIVATE
"-Wno-return-type-c-linkage")
endif()
check_cxx_compiler_flag(-Wno-nested-anon-types
CXX_SUPPORTS_WNO_NESTED_ANON_TYPES_FLAG)
if (CXX_SUPPORTS_WNO_NESTED_ANON_TYPES_FLAG)
target_compile_options(mlir_rocm_runtime PRIVATE
"-Wno-nested-anon-types")
endif()
check_cxx_compiler_flag(-Wno-gnu-anonymous-struct
CXX_SUPPORTS_WNO_GNU_ANONYMOUS_STRUCT_FLAG)
if (CXX_SUPPORTS_WNO_GNU_ANONYMOUS_STRUCT_FLAG)
target_compile_options(mlir_rocm_runtime PRIVATE
"-Wno-gnu-anonymous-struct")
endif()
# Supress compiler warnings from HIP headers
check_cxx_compiler_flag(-Wno-c++98-compat-extra-semi
CXX_SUPPORTS_NO_CXX98_COMPAT_EXTRA_SEMI_FLAG)
if (CXX_SUPPORTS_CXX98_COMPAT_EXTRA_SEMI_FLAG)
target_compile_options(mlir_rocm_runtime PRIVATE
"-Wno-c++98-compat-extra-semi")
endif()
check_cxx_compiler_flag(-Wno-return-type-c-linkage
CXX_SUPPORTS_WNO_RETURN_TYPE_C_LINKAGE_FLAG)
if (CXX_SUPPORTS_WNO_RETURN_TYPE_C_LINKAGE_FLAG)
target_compile_options(mlir_rocm_runtime PRIVATE
"-Wno-return-type-c-linkage")
endif()
check_cxx_compiler_flag(-Wno-nested-anon-types
CXX_SUPPORTS_WNO_NESTED_ANON_TYPES_FLAG)
if (CXX_SUPPORTS_WNO_NESTED_ANON_TYPES_FLAG)
target_compile_options(mlir_rocm_runtime PRIVATE
"-Wno-nested-anon-types")
endif()
check_cxx_compiler_flag(-Wno-gnu-anonymous-struct
CXX_SUPPORTS_WNO_GNU_ANONYMOUS_STRUCT_FLAG)
if (CXX_SUPPORTS_WNO_GNU_ANONYMOUS_STRUCT_FLAG)
target_compile_options(mlir_rocm_runtime PRIVATE
"-Wno-gnu-anonymous-struct")
endif()

set_property(TARGET mlir_rocm_runtime
PROPERTY INSTALL_RPATH_USE_LINK_PATH ON)
set_property(TARGET mlir_rocm_runtime
PROPERTY INSTALL_RPATH_USE_LINK_PATH ON)

target_link_libraries(mlir_rocm_runtime
PUBLIC
hip::host hip::amdhip64
)
target_link_libraries(mlir_rocm_runtime
PUBLIC
hip::host hip::amdhip64
)
endif()
endif()
2 changes: 1 addition & 1 deletion mlir/test/CMakeLists.txt
Expand Up @@ -89,7 +89,7 @@ set(MLIR_TEST_DEPENDS
# The native target may not be enabled, in this case we won't
# run tests that involves executing on the host: do not build
# useless binaries.
if(TARGET ${LLVM_NATIVE_ARCH})
if(LLVM_ENABLE_PIC AND TARGET ${LLVM_NATIVE_ARCH})
list(APPEND MLIR_TEST_DEPENDS
mlir-cpu-runner
llc
Expand Down

0 comments on commit 8e628f7

Please sign in to comment.