[compiler-rt] d56729b - [AIX][compiler-rt] Build and install standalone libatomic
Kai Luo via llvm-commits
llvm-commits at lists.llvm.org
Sat May 15 22:04:14 PDT 2021
Author: Kai Luo
Date: 2021-05-16T05:04:08Z
New Revision: d56729b4a4393da9c65bdfe762b51f8b7b0ce0ca
URL: https://github.com/llvm/llvm-project/commit/d56729b4a4393da9c65bdfe762b51f8b7b0ce0ca
DIFF: https://github.com/llvm/llvm-project/commit/d56729b4a4393da9c65bdfe762b51f8b7b0ce0ca.diff
LOG: [AIX][compiler-rt] Build and install standalone libatomic
On AIX, we have to ship `libatomic.a` for compatibility. First, a new `clang_rt.atomic` is added. Second, use added cmake modules for AIX, we are able to build a compatible libatomic.a for AIX. The second step can't be perfectly implemented with cmake now since AIX's archive approach is kinda unique, i.e., archiving shared libraries into a static archive file.
Reviewed By: jsji
Differential Revision: https://reviews.llvm.org/D102155
Added:
compiler-rt/cmake/Modules/CompilerRTAIXUtils.cmake
compiler-rt/lib/builtins/ppc/atomic.exp
Modified:
compiler-rt/lib/builtins/CMakeLists.txt
Removed:
################################################################################
diff --git a/compiler-rt/cmake/Modules/CompilerRTAIXUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTAIXUtils.cmake
new file mode 100644
index 0000000000000..3f89682cc1105
--- /dev/null
+++ b/compiler-rt/cmake/Modules/CompilerRTAIXUtils.cmake
@@ -0,0 +1,53 @@
+include(CMakeParseArguments)
+include(CompilerRTUtils)
+
+function(get_aix_libatomic_default_link_flags link_flags export_list)
+ set(${link_flags}
+ "-Wl,-H512 -Wl,-D0 \
+ -Wl,-T512 -Wl,-bhalt:4 -Wl,-bernotok \
+ -Wl,-bnoentry -Wl,-bexport:${export_list} \
+ -Wl,-bmodtype:SRE -Wl,-lc" PARENT_SCOPE)
+endfunction()
+
+macro(archive_aix_libatomic name)
+ cmake_parse_arguments(LIB
+ ""
+ ""
+ "ARCHS;PARENT_TARGET"
+ ${ARGN})
+ set(shared_libraries_to_archive "")
+ foreach (arch ${LIB_ARCHS})
+ if(CAN_TARGET_${arch})
+ set(output_dir "${CMAKE_CURRENT_BINARY_DIR}/libatomic-${arch}.dir")
+ # FIXME: Target name should be kept consistent with definition
+ # in AddCompilerRT.cmake added by
+ # add_compiler_rt_runtime(<name> SHARED ...)
+ set(target ${name}-dynamic-${arch})
+ if(TARGET ${target})
+ file(MAKE_DIRECTORY ${output_dir})
+ add_custom_command(OUTPUT "${output_dir}/libatomic.so.1"
+ POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E
+ copy "$<TARGET_FILE:${target}>"
+ "${output_dir}/libatomic.so.1"
+ DEPENDS ${target})
+ list(APPEND shared_libraries_to_archive "${output_dir}/libatomic.so.1")
+ endif()
+ endif()
+ endforeach()
+ if(shared_libraries_to_archive)
+ set(output_dir "")
+ set(install_dir "")
+ get_compiler_rt_output_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} output_dir)
+ get_compiler_rt_install_dir(${COMPILER_RT_DEFAULT_TARGET_ARCH} install_dir)
+ add_custom_command(OUTPUT "${output_dir}/libatomic.a"
+ COMMAND ${CMAKE_AR} -X32_64 r "${output_dir}/libatomic.a"
+ ${shared_libraries_to_archive}
+ DEPENDS ${shared_libraries_to_archive})
+ install(FILES "${output_dir}/libatomic.a"
+ DESTINATION ${install_dir})
+ add_custom_target(aix-libatomic
+ DEPENDS "${output_dir}/libatomic.a")
+ endif()
+ add_dependencies(${LIB_PARENT_TARGET} aix-libatomic)
+endmacro()
diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt
index 9dfae8c5dbe38..17d751b37f4de 100644
--- a/compiler-rt/lib/builtins/CMakeLists.txt
+++ b/compiler-rt/lib/builtins/CMakeLists.txt
@@ -48,6 +48,10 @@ endif()
include(builtin-config-ix)
+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)
@@ -747,4 +751,42 @@ else ()
endforeach ()
endif ()
+option(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC
+ "Build standalone shared atomic library."
+ OFF)
+
+if(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC)
+ add_custom_target(builtins-standalone-atomic)
+ set(BUILTIN_DEPS "")
+ 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")
+ endif()
+ # The compiler needs builtins to link any other binaries, so let
+ # clang_rt.atomic be built after builtins.
+ set(BUILTIN_DEPS builtins)
+ endif()
+ foreach (arch ${BUILTIN_SUPPORTED_ARCH})
+ if(CAN_TARGET_${arch})
+ add_compiler_rt_runtime(clang_rt.atomic
+ SHARED
+ ARCHS ${arch}
+ SOURCES atomic.c
+ LINK_FLAGS ${COMPILER_RT_LIBATOMIC_LINK_FLAGS}
+ DEPS ${BUILTIN_DEPS}
+ PARENT_TARGET builtins-standalone-atomic)
+ endif()
+ endforeach()
+ # 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(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
+ archive_aix_libatomic(clang_rt.atomic
+ ARCHS ${BUILTIN_SUPPORTED_ARCH}
+ PARENT_TARGET builtins-standalone-atomic)
+ endif()
+ add_dependencies(compiler-rt builtins-standalone-atomic)
+endif()
+
add_dependencies(compiler-rt builtins)
diff --git a/compiler-rt/lib/builtins/ppc/atomic.exp b/compiler-rt/lib/builtins/ppc/atomic.exp
new file mode 100644
index 0000000000000..98f759de982f7
--- /dev/null
+++ b/compiler-rt/lib/builtins/ppc/atomic.exp
@@ -0,0 +1,41 @@
+__atomic_compare_exchange
+__atomic_compare_exchange_1
+__atomic_compare_exchange_2
+__atomic_compare_exchange_4
+__atomic_compare_exchange_8
+__atomic_exchange
+__atomic_exchange_1
+__atomic_exchange_2
+__atomic_exchange_4
+__atomic_exchange_8
+__atomic_fetch_add_1
+__atomic_fetch_add_2
+__atomic_fetch_add_4
+__atomic_fetch_add_8
+__atomic_fetch_and_1
+__atomic_fetch_and_2
+__atomic_fetch_and_4
+__atomic_fetch_and_8
+__atomic_fetch_or_1
+__atomic_fetch_or_2
+__atomic_fetch_or_4
+__atomic_fetch_or_8
+__atomic_fetch_sub_1
+__atomic_fetch_sub_2
+__atomic_fetch_sub_4
+__atomic_fetch_sub_8
+__atomic_fetch_xor_1
+__atomic_fetch_xor_2
+__atomic_fetch_xor_4
+__atomic_fetch_xor_8
+__atomic_is_lock_free
+__atomic_load
+__atomic_load_1
+__atomic_load_2
+__atomic_load_4
+__atomic_load_8
+__atomic_store
+__atomic_store_1
+__atomic_store_2
+__atomic_store_4
+__atomic_store_8
More information about the llvm-commits
mailing list