From fe51abb4949ad9976168bf53edb52c20016b9a0d Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Fri, 10 Aug 2012 14:45:52 +0000 Subject: [ASan] CMake support for building ASan runtime as a universal binary on Mac git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@161665 91177308-0d34-0410-b5e6-96231b3b80d8 --- CMakeLists.txt | 12 +++++++ lib/CMakeLists.txt | 6 ++-- lib/asan/CMakeLists.txt | 67 +++++++++++++++++++++---------------- lib/asan/lit_tests/CMakeLists.txt | 2 +- lib/asan/tests/CMakeLists.txt | 13 +++---- lib/interception/CMakeLists.txt | 34 ++++++++++--------- lib/sanitizer_common/CMakeLists.txt | 36 +++++++++++--------- 7 files changed, 102 insertions(+), 68 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d8985c216..a7d9a8950 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,6 +48,18 @@ try_compile(CAN_TARGET_I386 ${CMAKE_BINARY_DIR} ${SIMPLE_SOURCE32} COMPILE_DEFINITIONS "${TARGET_I386_CFLAGS}" CMAKE_FLAGS "-DCMAKE_EXE_LINKER_FLAGS:STRING=${TARGET_I386_CFLAGS}") +function(filter_available_targets out_var) + set(archs) + foreach(arch ${ARGN}) + if(${arch} STREQUAL "x86_64" AND CAN_TARGET_X86_64) + list(APPEND archs ${arch}) + elseif (${arch} STREQUAL "i386" AND CAN_TARGET_I386) + list(APPEND archs ${arch}) + endif() + endforeach() + set(${out_var} ${archs} PARENT_SCOPE) +endfunction() + # Because compiler-rt spends a lot of time setting up custom compile flags, # define a handy helper function for it. The compile flags setting in CMake # has serious issues that make its syntax challenging at best. diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 670196553..c39bb0c05 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -15,8 +15,8 @@ elseif (UNIX) set(CLANG_RUNTIME_LIB_DIR ${LLVM_BINARY_DIR}/lib/clang/${CLANG_VERSION}/lib/linux) endif() -function(add_clang_runtime_static_library target_name) - set_target_properties(${target_name} PROPERTIES +function(add_clang_runtime_static_library target_names) + set_target_properties(${target_names} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${CLANG_RUNTIME_LIB_DIR}) endfunction() @@ -26,9 +26,9 @@ add_subdirectory(asan) add_subdirectory(interception) add_subdirectory(sanitizer_common) +# FIXME: Add support for tsan library. # FIXME: Add support for the profile library. - # The top-level lib directory contains a large amount of C code which provides # generic implementations of the core runtime library along with optimized # architecture-specific code in various subdirectories. diff --git a/lib/asan/CMakeLists.txt b/lib/asan/CMakeLists.txt index 111f80ea0..9d81ca5b5 100644 --- a/lib/asan/CMakeLists.txt +++ b/lib/asan/CMakeLists.txt @@ -46,38 +46,49 @@ set(ASAN_COMMON_DEFINITIONS ASAN_NEEDS_SEGV=1 ) -# FIXME: We need to build universal binaries on OS X instead of -# two arch-specific binaries. - -if(CAN_TARGET_X86_64) - add_library(clang_rt.asan-x86_64 STATIC +set(ASAN_RUNTIME_LIBRARIES) +if(APPLE) + # Build universal binary on APPLE. + add_library(clang_rt.asan_osx STATIC ${ASAN_SOURCES} - $ - $ - ) - set_target_compile_flags(clang_rt.asan-x86_64 - ${ASAN_CFLAGS} - ${TARGET_X86_64_CFLAGS} + $ + $ ) - set_property(TARGET clang_rt.asan-x86_64 APPEND PROPERTY COMPILE_DEFINITIONS - ${ASAN_COMMON_DEFINITIONS}) - add_clang_runtime_static_library(clang_rt.asan-x86_64) -endif() -if(CAN_TARGET_I386) - add_library(clang_rt.asan-i386 STATIC - ${ASAN_SOURCES} - $ - $ - ) - set_target_compile_flags(clang_rt.asan-i386 - ${ASAN_CFLAGS} - ${TARGET_I386_CFLAGS} - ) - set_property(TARGET clang_rt.asan-i386 APPEND PROPERTY COMPILE_DEFINITIONS - ${ASAN_COMMON_DEFINITIONS}) - add_clang_runtime_static_library(clang_rt.asan-i386) + set_target_compile_flags(clang_rt.asan_osx ${ASAN_CFLAGS}) + filter_available_targets(ASAN_TARGETS x86_64 i386) + set_target_properties(clang_rt.asan_osx PROPERTIES + OSX_ARCHITECTURES "${ASAN_TARGETS}") + list(APPEND ASAN_RUNTIME_LIBRARIES clang_rt.asan_osx) +else() + # Otherwise, build separate libraries for each target. + if(CAN_TARGET_X86_64) + add_library(clang_rt.asan-x86_64 STATIC + ${ASAN_SOURCES} + $ + $ + ) + set_target_compile_flags(clang_rt.asan-x86_64 + ${ASAN_CFLAGS} ${TARGET_X86_64_CFLAGS} + ) + list(APPEND ASAN_RUNTIME_LIBRARIES clang_rt.asan-x86_64) + endif() + if(CAN_TARGET_I386) + add_library(clang_rt.asan-i386 STATIC + ${ASAN_SOURCES} + $ + $ + ) + set_target_compile_flags(clang_rt.asan-i386 + ${ASAN_CFLAGS} ${TARGET_I386_CFLAGS} + ) + list(APPEND ASAN_RUNTIME_LIBRARIES clang_rt.asan-i386) + endif() endif() +set_property(TARGET ${ASAN_RUNTIME_LIBRARIES} APPEND PROPERTY + COMPILE_DEFINITIONS ${ASAN_COMMON_DEFINITIONS}) +add_clang_runtime_static_library(${ASAN_RUNTIME_LIBRARIES}) + if(LLVM_INCLUDE_TESTS) add_subdirectory(tests) endif() diff --git a/lib/asan/lit_tests/CMakeLists.txt b/lib/asan/lit_tests/CMakeLists.txt index c75407486..3f3bf44a0 100644 --- a/lib/asan/lit_tests/CMakeLists.txt +++ b/lib/asan/lit_tests/CMakeLists.txt @@ -16,7 +16,7 @@ if("${CMAKE_HOST_SYSTEM}" STREQUAL "${CMAKE_SYSTEM}") # and can be sure that clang would produce working binaries. set(ASAN_TEST_DEPS clang clang-headers FileCheck count not - clang-rt.asan-x86_64 clang-rt.asan-i386 + ${ASAN_RUNTIME_LIBRARIES} ) if(LLVM_INCLUDE_TESTS) list(APPEND ASAN_TEST_DEPS AsanUnitTests) diff --git a/lib/asan/tests/CMakeLists.txt b/lib/asan/tests/CMakeLists.txt index a17b811c4..07f540e8a 100644 --- a/lib/asan/tests/CMakeLists.txt +++ b/lib/asan/tests/CMakeLists.txt @@ -51,19 +51,20 @@ add_custom_target(AsanUnitTests) set_target_properties(AsanUnitTests PROPERTIES FOLDER "ASan unit tests") function(add_asan_test testname) add_unittest(AsanUnitTests ${testname} ${ARGN}) - if(LLVM_BUILD_32_BITS) - target_link_libraries(${testname} clang_rt.asan-i386) - else() - target_link_libraries(${testname} clang_rt.asan-x86_64) - endif() if (APPLE) # Darwin-specific linker flags. set_property(TARGET ${testname} APPEND PROPERTY LINK_FLAGS "-framework Foundation") + target_link_libraries(${testname} clang_rt.asan_osx) elseif (UNIX) # Linux-specific linker flags. set_property(TARGET ${testname} APPEND PROPERTY LINK_FLAGS "-lpthread -ldl -export-dynamic") + if(LLVM_BUILD_32_BITS) + target_link_libraries(${testname} clang_rt.asan-i386) + else() + target_link_libraries(${testname} clang_rt.asan-x86_64) + endif() endif() set(add_compile_flags "") get_property(compile_flags TARGET ${testname} PROPERTY COMPILE_FLAGS) @@ -99,7 +100,7 @@ if("${CMAKE_HOST_SYSTEM}" STREQUAL "${CMAKE_SYSTEM}" AND UNIX) -c -o "${output_obj}" ${CMAKE_CURRENT_SOURCE_DIR}/${source} MAIN_DEPENDENCY ${source} - DEPENDS clang clang_rt.asan-i386 clang_rt.asan-x86_64 ${ARGN} + DEPENDS clang ${ASAN_RUNTIME_LIBRARIES} ${ARGN} ) endfunction() diff --git a/lib/interception/CMakeLists.txt b/lib/interception/CMakeLists.txt index 3ebeb61f0..aacecf9b8 100644 --- a/lib/interception/CMakeLists.txt +++ b/lib/interception/CMakeLists.txt @@ -24,19 +24,23 @@ if(SUPPORTS_NO_VARIADIC_MACROS_FLAG) list(APPEND INTERCEPTION_CFLAGS -Wno-variadic-macros) endif() -set(INTERCEPTION_COMMON_DEFINITIONS) - -if(CAN_TARGET_X86_64) - add_library(RTInterception.x86_64 OBJECT ${INTERCEPTION_SOURCES}) - set_target_compile_flags(RTInterception.x86_64 - ${INTERCEPTION_CFLAGS} ${TARGET_X86_64_CFLAGS}) - set_property(TARGET RTInterception.x86_64 APPEND PROPERTY - COMPILE_DEFINITIONS ${INTERCEPTION_COMMON_DEFINITIONS}) -endif() -if(CAN_TARGET_I386) - add_library(RTInterception.i386 OBJECT ${INTERCEPTION_SOURCES}) - set_target_compile_flags(RTInterception.i386 - ${INTERCEPTION_CFLAGS} ${TARGET_I386_CFLAGS}) - set_property(TARGET RTInterception.i386 APPEND PROPERTY - COMPILE_DEFINITIONS ${INTERCEPTION_COMMON_DEFINITIONS}) +if(APPLE) + # Build universal binary on APPLE. + add_library(RTInterception.osx OBJECT ${INTERCEPTION_SOURCES}) + set_target_compile_flags(RTInterception.osx ${INTERCEPTION_CFLAGS}) + filter_available_targets(INTERCEPTION_TARGETS x86_64 i386) + set_target_properties(RTInterception.osx PROPERTIES + OSX_ARCHITECTURES "${INTERCEPTION_TARGETS}") +else() + # Otherwise, build separate libraries for each target. + if(CAN_TARGET_X86_64) + add_library(RTInterception.x86_64 OBJECT ${INTERCEPTION_SOURCES}) + set_target_compile_flags(RTInterception.x86_64 + ${INTERCEPTION_CFLAGS} ${TARGET_X86_64_CFLAGS}) + endif() + if(CAN_TARGET_I386) + add_library(RTInterception.i386 OBJECT ${INTERCEPTION_SOURCES}) + set_target_compile_flags(RTInterception.i386 + ${INTERCEPTION_CFLAGS} ${TARGET_I386_CFLAGS}) + endif() endif() diff --git a/lib/sanitizer_common/CMakeLists.txt b/lib/sanitizer_common/CMakeLists.txt index 7780f0b64..d3f3f24fb 100644 --- a/lib/sanitizer_common/CMakeLists.txt +++ b/lib/sanitizer_common/CMakeLists.txt @@ -23,19 +23,25 @@ set(SANITIZER_CFLAGS -fvisibility=hidden ) -set(SANITIZER_COMMON_DEFINITIONS) - -if(CAN_TARGET_X86_64) - add_library(RTSanitizerCommon.x86_64 OBJECT ${SANITIZER_SOURCES}) - set_target_compile_flags(RTSanitizerCommon.x86_64 - ${SANITIZER_CFLAGS} ${TARGET_X86_64_CFLAGS}) - set_property(TARGET RTSanitizerCommon.x86_64 APPEND PROPERTY - COMPILE_DEFINITIONS ${SANITIZER_COMMON_DEFINITIONS}) -endif() -if(CAN_TARGET_I386) - add_library(RTSanitizerCommon.i386 OBJECT ${SANITIZER_SOURCES}) - set_target_compile_flags(RTSanitizerCommon.i386 - ${SANITIZER_CFLAGS} ${TARGET_I386_CFLAGS}) - set_property(TARGET RTSanitizerCommon.i386 APPEND PROPERTY - COMPILE_DEFINITIONS ${SANITIZER_COMMON_DEFINITIONS}) +if(APPLE) + # Build universal binary on APPLE. + add_library(RTSanitizerCommon.osx OBJECT ${SANITIZER_SOURCES}) + set_target_compile_flags(RTSanitizerCommon.osx ${SANITIZER_CFLAGS}) + filter_available_targets(SANITIZER_TARGETS x86_64 i386) + set_target_properties(RTSanitizerCommon.osx PROPERTIES + OSX_ARCHITECTURES "${SANITIZER_TARGETS}") +else() + # Otherwise, build separate libraries for each target. + if(CAN_TARGET_X86_64) + add_library(RTSanitizerCommon.x86_64 OBJECT ${SANITIZER_SOURCES}) + set_target_compile_flags(RTSanitizerCommon.x86_64 + ${SANITIZER_CFLAGS} ${TARGET_X86_64_CFLAGS}) + endif() + if(CAN_TARGET_I386) + add_library(RTSanitizerCommon.i386 OBJECT ${SANITIZER_SOURCES}) + set_target_compile_flags(RTSanitizerCommon.i386 + ${SANITIZER_CFLAGS} ${TARGET_I386_CFLAGS}) + endif() endif() + +# FIXME: Add support for running sanitizer_common unit tests. -- cgit v1.2.3