CMake: generalize checking for target availability and add initial support for PowerPC native arch. With this patch, building LLVM on PowerPC native arch produces a working ASan runtime.
llvm-svn: 173044
This commit is contained in:
parent
d41ee2d2af
commit
b670018c9f
@ -50,15 +50,8 @@ else()
|
||||
set(TARGET_32_BIT_CFLAGS "-m32")
|
||||
endif()
|
||||
|
||||
# FIXME: Below we assume that the target build of LLVM/Clang is x86, which is
|
||||
# not at all valid. Much of this can be fixed just by switching to use
|
||||
# a just-built-clang binary for the compiles.
|
||||
|
||||
set(TARGET_x86_64_CFLAGS ${TARGET_64_BIT_CFLAGS})
|
||||
set(TARGET_i386_CFLAGS ${TARGET_32_BIT_CFLAGS})
|
||||
|
||||
set(COMPILER_RT_SUPPORTED_ARCH
|
||||
x86_64 i386)
|
||||
# List of architectures we can target.
|
||||
set(COMPILER_RT_SUPPORTED_ARCH)
|
||||
|
||||
function(get_target_flags_for_arch arch out_var)
|
||||
list(FIND COMPILER_RT_SUPPORTED_ARCH ${arch} ARCH_INDEX)
|
||||
@ -73,17 +66,31 @@ endfunction()
|
||||
# platform. We use the results of these tests to build only the various target
|
||||
# runtime libraries supported by our current compilers cross-compiling
|
||||
# abilities.
|
||||
set(SIMPLE_SOURCE64 ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/simple64.c)
|
||||
file(WRITE ${SIMPLE_SOURCE64} "#include <stdlib.h>\nint main() {}")
|
||||
try_compile(CAN_TARGET_x86_64 ${CMAKE_BINARY_DIR} ${SIMPLE_SOURCE64}
|
||||
COMPILE_DEFINITIONS "${TARGET_x86_64_CFLAGS}"
|
||||
CMAKE_FLAGS "-DCMAKE_EXE_LINKER_FLAGS:STRING=${TARGET_x86_64_CFLAGS}")
|
||||
set(SIMPLE_SOURCE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/simple.c)
|
||||
file(WRITE ${SIMPLE_SOURCE} "#include <stdlib.h>\nint main() {}")
|
||||
|
||||
set(SIMPLE_SOURCE32 ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/simple32.c)
|
||||
file(WRITE ${SIMPLE_SOURCE32} "#include <stdlib.h>\nint main() {}")
|
||||
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}")
|
||||
# test_target_arch(<arch> <target flags...>)
|
||||
# Sets the target flags for a given architecture and determines if this
|
||||
# architecture is supported by trying to build a simple file.
|
||||
macro(test_target_arch arch)
|
||||
set(TARGET_${arch}_CFLAGS ${ARGN})
|
||||
try_compile(CAN_TARGET_${arch} ${CMAKE_BINARY_DIR} ${SIMPLE_SOURCE}
|
||||
COMPILE_DEFINITIONS "${TARGET_${arch}_CFLAGS}"
|
||||
CMAKE_FLAGS "-DCMAKE_EXE_LINKER_FLAGS:STRING=${TARGET_${arch}_CFLAGS}")
|
||||
if(${CAN_TARGET_${arch}})
|
||||
list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
if("${LLVM_NATIVE_ARCH}" STREQUAL "X86")
|
||||
test_target_arch(x86_64 ${TARGET_64_BIT_CFLAGS})
|
||||
test_target_arch(i386 ${TARGET_32_BIT_CFLAGS})
|
||||
elseif("${LLVM_NATIVE_ARCH}" STREQUAL "PowerPC")
|
||||
# Explicitly set -m flag on powerpc, because on ppc64 defaults for gcc and
|
||||
# clang are different.
|
||||
test_target_arch(powerpc64 "-m64")
|
||||
test_target_arch(powerpc "-m32")
|
||||
endif()
|
||||
|
||||
# We only support running instrumented tests when we're not cross compiling
|
||||
# and target a unix-like system. On Android we define the rules for building
|
||||
@ -140,7 +147,7 @@ endif()
|
||||
# Architectures supported by Sanitizer runtimes. Specific sanitizers may
|
||||
# support only subset of these (e.g. TSan works on x86_64 only).
|
||||
filter_available_targets(SANITIZER_COMMON_SUPPORTED_ARCH
|
||||
x86_64 i386)
|
||||
x86_64 i386 powerpc64 powerpc)
|
||||
|
||||
# Install compiler-rt headers.
|
||||
install(DIRECTORY include/
|
||||
|
||||
@ -51,7 +51,7 @@ set(ASAN_DYLIB_DEFINITIONS
|
||||
|
||||
# Architectures supported by ASan.
|
||||
filter_available_targets(ASAN_SUPPORTED_ARCH
|
||||
x86_64 i386)
|
||||
x86_64 i386 powerpc64 powerpc)
|
||||
|
||||
set(ASAN_RUNTIME_LIBRARIES)
|
||||
if(APPLE)
|
||||
|
||||
@ -164,12 +164,9 @@ macro(add_asan_tests_for_arch arch)
|
||||
endmacro()
|
||||
|
||||
if(COMPILER_RT_CAN_EXECUTE_TESTS)
|
||||
if(CAN_TARGET_x86_64)
|
||||
add_asan_tests_for_arch(x86_64)
|
||||
endif()
|
||||
if(CAN_TARGET_i386)
|
||||
add_asan_tests_for_arch(i386)
|
||||
endif()
|
||||
foreach(arch ${ASAN_SUPPORTED_ARCH})
|
||||
add_asan_tests_for_arch(${arch})
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
if(ANDROID)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user