diff --git a/compiler-rt/cmake/Modules/CompilerRTAIXUtils.cmake b/compiler-rt/cmake/Modules/CompilerRTAIXUtils.cmake new file mode 100644 --- /dev/null +++ b/compiler-rt/cmake/Modules/CompilerRTAIXUtils.cmake @@ -0,0 +1,113 @@ +include(CMakeParseArguments) + +set(AIX_LIBATOMIC_EXPORTED_ROUTINES + __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 +) + +function(add_aix_atomic_dynlib bitmode out_dir export_list) + cmake_parse_arguments(LIB + "" + "" + "DEPENDS;SOURCES;LINK_FLAGS" + ${ARGN}) + add_library(atomic_${bitmode} SHARED ${LIB_SOURCES}) + if(LIB_DEPENDS) + add_dependencies(atomic_${bitmode} ${LIB_DEPENDS}) + endif() + set_target_properties(atomic_${bitmode} + PROPERTIES + SOVERSION 1 + POSITION_INDEPENDENT_CODE OFF + COMPILE_FLAGS -m${bitmode} -I -qmakedep=gcc + LINK_FLAGS "-Wl,-b${bitmode} -Wl,-H512 -Wl,-D0 \ + -Wl,-T512 -Wl,-bhalt:4 -Wl,-bernotok \ + -Wl,-bnoentry -Wl,-bexport:${export_list} \ + -Wl,-bmodtype:SRE -Wl,-lc") + # Copy it to ${out_dir}/libatomic.so.1 for compatibility. + add_custom_command(TARGET atomic_${bitmode} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy "$" + "${out_dir}/libatomic.so.1") +endfunction() + +function(add_aix_libatomic) + cmake_parse_arguments(LIB + "" + "" + "PARENT_TARGET;SOURCES" + ${ARGN}) + # Write exported routines to export list file prior the build. + set(LIBATOMIC_EXPORT_LIST ${CMAKE_CURRENT_BINARY_DIR}/export_list.atomic) + STRING(REGEX REPLACE ";" "\n" LIBATOMIC_EXPORTED_ROUTINES_TEXT + "${AIX_LIBATOMIC_EXPORTED_ROUTINES}") + file(GENERATE + OUTPUT ${LIBATOMIC_EXPORT_LIST} + CONTENT ${LIBATOMIC_EXPORTED_ROUTINES_TEXT}) + # Build 32/64 bit shared libraries. + set(AIX_LIBATOMIC_32_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/libatomic_32.dir") + file(MAKE_DIRECTORY "${AIX_LIBATOMIC_32_OUT_DIR}") + set(AIX_LIBATOMIC_64_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/libatomic_64.dir") + file(MAKE_DIRECTORY "${AIX_LIBATOMIC_64_OUT_DIR}") + add_aix_atomic_dynlib(32 ${AIX_LIBATOMIC_32_OUT_DIR} ${LIBATOMIC_EXPORT_LIST} + SOURCES ${LIB_SOURCES}) + add_aix_atomic_dynlib(64 ${AIX_LIBATOMIC_64_OUT_DIR} ${LIBATOMIC_EXPORT_LIST} + SOURCES ${LIB_SOURCES}) + # Archive built shared libraries to libatomic.a. + set(AIX_LIBATOMIC_ARCHIVE ${CMAKE_CURRENT_BINARY_DIR}/libatomic.a) + add_custom_command(OUTPUT ${AIX_LIBATOMIC_ARCHIVE} + COMMAND ${CMAKE_AR} -r -X32_64 + -o ${AIX_LIBATOMIC_ARCHIVE} + ${AIX_LIBATOMIC_32_OUT_DIR}/libatomic.so.1 + ${AIX_LIBATOMIC_64_OUT_DIR}/libatomic.so.1 + DEPENDS atomic_32 atomic_64) + add_custom_target(aix-libatomic DEPENDS ${AIX_LIBATOMIC_ARCHIVE}) + # Set install step. + if (AIX_LIBATOMIC_INSTALL_DIR) + install(FILES ${AIX_LIBATOMIC_ARCHIVE} + DESTINATION ${AIX_LIBATOMIC_INSTALL_DIR}) + endif() + if(LIB_PARENT_TARGET) + add_dependencies(${LIB_PARENT_TARGET} aix-libatomic) + endif() +endfunction() diff --git a/compiler-rt/lib/builtins/CMakeLists.txt b/compiler-rt/lib/builtins/CMakeLists.txt --- a/compiler-rt/lib/builtins/CMakeLists.txt +++ b/compiler-rt/lib/builtins/CMakeLists.txt @@ -747,4 +747,12 @@ endforeach () endif () +# On AIX, we have to ship a libatomic.a for compatibility. +if (${CMAKE_SYSTEM_NAME} MATCHES "AIX") + include(CompilerRTAIXUtils) + add_aix_libatomic( + PARENT_TARGET builtins + SOURCES atomic.c) +endif() + add_dependencies(compiler-rt builtins)