forked from OSchip/llvm-project
[CMake] [Darwin] Bug 21562 - Add a CMake equivalent for make/platform/clang_darwin.mk in compiler_rt
Summary: Building the builtins on Darwin platforms is a bit complicated. This is a first-pass implementation of the functionality from clang_darwin.mk into CMake. When building the builtins on Darwin we have layers of blacklists that we apply based on platform, architecture, and minimum supported OS version. Reviewers: bogner, filcab, bob.wilson, samsonov Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D13059 llvm-svn: 248383
This commit is contained in:
parent
6173f848b9
commit
0d427986f5
|
@ -99,3 +99,114 @@ function(darwin_filter_host_archs input output)
|
|||
endif()
|
||||
set(${output} ${tmp_var} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
set(DARWIN_EXCLUDE_DIR ${CMAKE_SOURCE_DIR}/lib/builtins/Darwin-excludes)
|
||||
|
||||
# Read and process the exclude file into a list of symbols
|
||||
function(darwin_read_exclude_file output_var file)
|
||||
if(EXISTS ${DARWIN_EXCLUDE_DIR}/${file}.txt)
|
||||
file(READ ${DARWIN_EXCLUDE_DIR}/${file}.txt ${file}_EXCLUDES)
|
||||
string(REPLACE "\n" ";" ${file}_EXCLUDES ${${file}_EXCLUDES})
|
||||
set(${output_var} ${${file}_EXCLUDES} PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# this function takes an OS, architecture and minimum version and provides a
|
||||
# list of builtin functions to exclude
|
||||
function(darwin_find_excluded_builtins_list os arch min_version)
|
||||
darwin_read_exclude_file(${os}_BUILTINS ${os})
|
||||
darwin_read_exclude_file(${os}_${arch}_BASE_BUILTINS ${os}-${arch})
|
||||
|
||||
file(GLOB builtin_lists ${DARWIN_EXCLUDE_DIR}/${os}*-${arch}.txt)
|
||||
foreach(builtin_list ${builtin_lists})
|
||||
string(REGEX MATCH "${os}([0-9\\.]*)-${arch}.txt" VERSION_MATCHED "${builtin_list}")
|
||||
if (VERSION_MATCHED AND NOT CMAKE_MATCH_1 VERSION_LESS min_version)
|
||||
if(NOT smallest_version)
|
||||
set(smallest_version ${CMAKE_MATCH_1})
|
||||
elseif(CMAKE_MATCH_1 VERSION_LESS smallest_version)
|
||||
set(smallest_version ${CMAKE_MATCH_1})
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
if(smallest_version)
|
||||
darwin_read_exclude_file(${arch}_${os}_BUILTINS ${os}${smallest_version}-${arch})
|
||||
endif()
|
||||
|
||||
set(${arch}_${os}_EXCLUDED_BUILTINS
|
||||
${${arch}_${os}_BUILTINS}
|
||||
${${os}_${arch}_BASE_BUILTINS}
|
||||
${${os}_BUILTINS} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# adds a single builtin library for a single OS & ARCH
|
||||
function(darwin_add_builtin_library name)
|
||||
cmake_parse_arguments(LIB
|
||||
""
|
||||
"PARENT_TARGET;OS;ARCH"
|
||||
"SOURCES;CFLAGS"
|
||||
${ARGN})
|
||||
set(libname "${name}_${LIB_ARCH}_${LIB_OS}")
|
||||
add_library(${libname} STATIC ${LIB_SOURCES})
|
||||
set_target_compile_flags(${libname}
|
||||
-isysroot ${DARWIN_${LIB_OS}_SYSROOT}
|
||||
${DARWIN_${LIB_OS}_BUILTIN_MIN_VER_FLAG}
|
||||
${LIB_CFLAGS})
|
||||
set_target_properties(${libname} PROPERTIES
|
||||
OUTPUT_NAME ${libname}${COMPILER_RT_OS_SUFFIX})
|
||||
set_target_properties(${libname} PROPERTIES
|
||||
OSX_ARCHITECTURES ${LIB_ARCH})
|
||||
|
||||
if(LIB_PARENT_TARGET)
|
||||
add_dependencies(${LIB_PARENT_TARGET} ${libname})
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Generates builtin libraries for all operating systems specified in ARGN. Each
|
||||
# OS library is constructed by lipo-ing together single-architecture libraries.
|
||||
macro(darwin_add_builtin_libraries)
|
||||
foreach (os ${ARGN})
|
||||
list_union(DARWIN_BUILTIN_ARCHS DARWIN_${os}_ARCHS BUILTIN_SUPPORTED_ARCH)
|
||||
set(${os}_builtin_libs)
|
||||
set(${os}_builtin_lipo_flags)
|
||||
foreach (arch ${DARWIN_BUILTIN_ARCHS})
|
||||
darwin_find_excluded_builtins_list(${os} ${arch} ${DARWIN_${os}_BUILTIN_MIN_VER})
|
||||
# Filter out generic versions of routines that are re-implemented in
|
||||
# architecture specific manner. This prevents multiple definitions of the
|
||||
# same symbols, making the symbol selection non-deterministic.
|
||||
foreach (_file ${${arch}_SOURCES})
|
||||
get_filename_component(_name_we ${_file} NAME_WE)
|
||||
list(FIND ${arch}_${os}_EXCLUDED_BUILTINS ${_name_we} _found)
|
||||
if(_found GREATER -1)
|
||||
list(REMOVE_ITEM ${arch}_SOURCES ${_file})
|
||||
elseif(${_file} MATCHES ${arch}/*)
|
||||
get_filename_component(_name ${_file} NAME)
|
||||
string(REPLACE ".S" ".c" _cname "${_name}")
|
||||
list(REMOVE_ITEM ${arch}_SOURCES ${_cname})
|
||||
endif ()
|
||||
endforeach ()
|
||||
|
||||
darwin_add_builtin_library(clang_rt.builtins
|
||||
OS ${os}
|
||||
ARCH ${arch}
|
||||
SOURCES ${${arch}_SOURCES}
|
||||
CFLAGS "-std=c99" -arch ${arch}
|
||||
PARENT_TARGET builtins)
|
||||
list(APPEND ${os}_builtin_libs clang_rt.builtins_${arch}_${os})
|
||||
list(APPEND ${os}_builtin_lipo_flags -arch ${arch} $<TARGET_FILE:clang_rt.builtins_${arch}_${os}>)
|
||||
endforeach()
|
||||
|
||||
if(${os}_builtin_libs)
|
||||
add_custom_command(OUTPUT ${COMPILER_RT_LIBRARY_OUTPUT_DIR}/libclang_rt.${os}.a
|
||||
COMMAND lipo -output
|
||||
${COMPILER_RT_LIBRARY_OUTPUT_DIR}/libclang_rt.${os}.a
|
||||
-create ${${os}_builtin_lipo_flags}
|
||||
DEPENDS ${${os}_builtin_libs}
|
||||
)
|
||||
add_custom_target(clang_rt.${os}
|
||||
DEPENDS ${COMPILER_RT_LIBRARY_OUTPUT_DIR}/libclang_rt.${os}.a)
|
||||
add_dependencies(builtins clang_rt.${os})
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
|
|
|
@ -274,9 +274,9 @@ if(APPLE)
|
|||
|
||||
option(COMPILER_RT_ENABLE_IOS "Enable building for iOS - Experimental" Off)
|
||||
|
||||
find_darwin_sdk_dir(OSX_SDK_DIR macosx)
|
||||
find_darwin_sdk_dir(IOSSIM_SDK_DIR iphonesimulator)
|
||||
find_darwin_sdk_dir(IOS_SDK_DIR iphoneos)
|
||||
find_darwin_sdk_dir(DARWIN_osx_SYSROOT macosx)
|
||||
find_darwin_sdk_dir(DARWIN_iossim_SYSROOT iphonesimulator)
|
||||
find_darwin_sdk_dir(DARWIN_ios_SYSROOT iphoneos)
|
||||
|
||||
# Note: In order to target x86_64h on OS X the minimum deployment target must
|
||||
# be 10.8 or higher.
|
||||
|
@ -312,10 +312,13 @@ if(APPLE)
|
|||
set(DARWIN_osx_LINKFLAGS
|
||||
${DARWIN_COMMON_LINKFLAGS}
|
||||
-mmacosx-version-min=${SANITIZER_MIN_OSX_VERSION})
|
||||
set(DARWIN_osx_BUILTIN_MIN_VER 10.5)
|
||||
set(DARWIN_osx_BUILTIN_MIN_VER_FLAG
|
||||
-mmacosx-version-min=${DARWIN_osx_BUILTIN_MIN_VER})
|
||||
|
||||
if(OSX_SDK_DIR)
|
||||
list(APPEND DARWIN_osx_CFLAGS -isysroot ${OSX_SDK_DIR})
|
||||
list(APPEND DARWIN_osx_LINKFLAGS -isysroot ${OSX_SDK_DIR})
|
||||
if(DARWIN_osx_SYSROOT)
|
||||
list(APPEND DARWIN_osx_CFLAGS -isysroot ${DARWIN_osx_SYSROOT})
|
||||
list(APPEND DARWIN_osx_LINKFLAGS -isysroot ${DARWIN_osx_SYSROOT})
|
||||
endif()
|
||||
|
||||
# Figure out which arches to use for each OS
|
||||
|
@ -332,15 +335,18 @@ if(APPLE)
|
|||
set(CAN_TARGET_${arch} 1)
|
||||
endforeach()
|
||||
|
||||
if(IOSSIM_SDK_DIR)
|
||||
if(DARWIN_iossim_SYSROOT)
|
||||
set(DARWIN_iossim_CFLAGS
|
||||
${DARWIN_COMMON_CFLAGS}
|
||||
-mios-simulator-version-min=7.0
|
||||
-isysroot ${IOSSIM_SDK_DIR})
|
||||
-isysroot ${DARWIN_iossim_SYSROOT})
|
||||
set(DARWIN_iossim_LINKFLAGS
|
||||
${DARWIN_COMMON_LINKFLAGS}
|
||||
-mios-simulator-version-min=7.0
|
||||
-isysroot ${IOSSIM_SDK_DIR})
|
||||
-isysroot ${DARWIN_iossim_SYSROOT})
|
||||
set(DARWIN_iossim_BUILTIN_MIN_VER 6.0)
|
||||
set(DARWIN_iossim_BUILTIN_MIN_VER_FLAG
|
||||
-mios-simulator-version-min=${DARWIN_iossim_BUILTIN_MIN_VER})
|
||||
|
||||
list(APPEND SANITIZER_COMMON_SUPPORTED_OS iossim)
|
||||
list(APPEND BUILTIN_SUPPORTED_OS iossim)
|
||||
|
@ -354,15 +360,18 @@ if(APPLE)
|
|||
endforeach()
|
||||
endif()
|
||||
|
||||
if(IOS_SDK_DIR AND COMPILER_RT_ENABLE_IOS)
|
||||
if(DARWIN_ios_SYSROOT AND COMPILER_RT_ENABLE_IOS)
|
||||
set(DARWIN_ios_CFLAGS
|
||||
${DARWIN_COMMON_CFLAGS}
|
||||
-miphoneos-version-min=7.0
|
||||
-isysroot ${IOS_SDK_DIR})
|
||||
-isysroot ${DARWIN_ios_SYSROOT})
|
||||
set(DARWIN_ios_LINKFLAGS
|
||||
${DARWIN_COMMON_LINKFLAGS}
|
||||
-miphoneos-version-min=7.0
|
||||
-isysroot ${IOS_SDK_DIR})
|
||||
-isysroot ${DARWIN_ios_SYSROOT})
|
||||
set(DARWIN_ios_BUILTIN_MIN_VER 6.0)
|
||||
set(DARWIN_ios_BUILTIN_MIN_VER_FLAG
|
||||
-miphoneos-version-min=${DARWIN_ios_BUILTIN_MIN_VER})
|
||||
|
||||
list(APPEND SANITIZER_COMMON_SUPPORTED_OS ios)
|
||||
list(APPEND BUILTIN_SUPPORTED_OS ios)
|
||||
|
|
|
@ -315,45 +315,7 @@ set(arm64_SOURCES ${aarch64_SOURCES})
|
|||
add_custom_target(builtins)
|
||||
|
||||
if (APPLE)
|
||||
foreach (os ${BUILTIN_SUPPORTED_OS})
|
||||
list_union(DARWIN_BUILTIN_ARCHS DARWIN_${os}_ARCHS BUILTIN_SUPPORTED_ARCH)
|
||||
set(${os}_builtin_libs)
|
||||
set(${os}_builtin_lipo_flags)
|
||||
foreach (arch ${DARWIN_BUILTIN_ARCHS})
|
||||
# Filter out generic versions of routines that are re-implemented in
|
||||
# architecture specific manner. This prevents multiple definitions of the
|
||||
# same symbols, making the symbol selection non-deterministic.
|
||||
foreach (_file ${${arch}_SOURCES})
|
||||
if (${_file} MATCHES ${arch}/*)
|
||||
get_filename_component(_name ${_file} NAME)
|
||||
string(REPLACE ".S" ".c" _cname "${_name}")
|
||||
list(REMOVE_ITEM ${arch}_SOURCES ${_cname})
|
||||
endif ()
|
||||
endforeach ()
|
||||
|
||||
add_compiler_rt_runtime(clang_rt.builtins_${arch} STATIC
|
||||
OS ${os}
|
||||
ARCHS ${arch}
|
||||
SOURCES ${${arch}_SOURCES}
|
||||
CFLAGS "-std=c99" ${DARWIN_${os}_CFLAGS} -arch ${arch}
|
||||
PARENT_TARGET builtins)
|
||||
list(APPEND ${os}_builtin_libs clang_rt.builtins_${arch}_${os})
|
||||
list(APPEND ${os}_builtin_lipo_flags -arch ${arch}
|
||||
${COMPILER_RT_LIBRARY_OUTPUT_DIR}/libclang_rt.builtins_${arch}_${os}.a)
|
||||
endforeach()
|
||||
|
||||
if(${os}_builtin_libs)
|
||||
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/libclang_rt.builtins_${os}.a
|
||||
COMMAND lipo -output
|
||||
${COMPILER_RT_LIBRARY_OUTPUT_DIR}/libclang_rt.builtins_${os}.a
|
||||
-create ${${os}_builtin_lipo_flags}
|
||||
DEPENDS ${${os}_builtin_libs}
|
||||
)
|
||||
add_custom_target(clang_rt.builtins_${os}
|
||||
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libclang_rt.builtins_${os}.a)
|
||||
add_dependencies(builtins clang_rt.builtins_${os})
|
||||
endif()
|
||||
endforeach()
|
||||
darwin_add_builtin_libraries(${BUILTIN_SUPPORTED_OS})
|
||||
elseif (NOT WIN32 OR MINGW)
|
||||
foreach (arch ${BUILTIN_SUPPORTED_ARCH})
|
||||
if (CAN_TARGET_${arch})
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
This folder contains list of symbols that should be excluded from the builtin
|
||||
libraries for Darwin. There are two reasons symbols are excluded:
|
||||
|
||||
(1) They aren't supported on Darwin
|
||||
(2) They are contained within the OS on the minimum supported target
|
||||
|
||||
The builtin libraries must contain all symbols not provided by the lowest
|
||||
supported target OS. Meaning if minimum deployment target is iOS 6, all builtins
|
||||
not included in the ios6-<arch>.txt files need to be included. The one catch is
|
||||
that this is per-architecture. Since iOS 6 doesn't support arm64, when supporting
|
||||
iOS 6, the minimum deployment target for arm64 binaries is iOS 7.
|
|
@ -0,0 +1 @@
|
|||
apple_versioning
|
|
@ -0,0 +1,120 @@
|
|||
absvdi2
|
||||
absvsi2
|
||||
adddf3
|
||||
adddf3vfp
|
||||
addsf3
|
||||
addsf3vfp
|
||||
addvdi3
|
||||
addvsi3
|
||||
ashldi3
|
||||
ashrdi3
|
||||
bswapdi2
|
||||
bswapsi2
|
||||
clzdi2
|
||||
clzsi2
|
||||
cmpdi2
|
||||
ctzdi2
|
||||
ctzsi2
|
||||
divdc3
|
||||
divdf3
|
||||
divdf3vfp
|
||||
divdi3
|
||||
divmodsi4
|
||||
divsc3
|
||||
divsf3
|
||||
divsf3vfp
|
||||
divsi3
|
||||
eqdf2
|
||||
eqdf2vfp
|
||||
eqsf2
|
||||
eqsf2vfp
|
||||
extendsfdf2
|
||||
extendsfdf2vfp
|
||||
ffsdi2
|
||||
fixdfdi
|
||||
fixdfsi
|
||||
fixdfsivfp
|
||||
fixsfdi
|
||||
fixsfsi
|
||||
fixsfsivfp
|
||||
fixunsdfdi
|
||||
fixunsdfsi
|
||||
fixunsdfsivfp
|
||||
fixunssfdi
|
||||
fixunssfsi
|
||||
fixunssfsivfp
|
||||
floatdidf
|
||||
floatdisf
|
||||
floatsidf
|
||||
floatsidfvfp
|
||||
floatsisf
|
||||
floatsisfvfp
|
||||
floatundidf
|
||||
floatundisf
|
||||
floatunsidf
|
||||
floatunsisf
|
||||
floatunssidfvfp
|
||||
floatunssisfvfp
|
||||
gcc_personality_sj0
|
||||
gedf2
|
||||
gedf2vfp
|
||||
gesf2
|
||||
gesf2vfp
|
||||
gtdf2
|
||||
gtdf2vfp
|
||||
gtsf2
|
||||
gtsf2vfp
|
||||
ledf2
|
||||
ledf2vfp
|
||||
lesf2
|
||||
lesf2vfp
|
||||
lshrdi3
|
||||
ltdf2
|
||||
ltdf2vfp
|
||||
ltsf2
|
||||
ltsf2vfp
|
||||
moddi3
|
||||
modsi3
|
||||
muldc3
|
||||
muldf3
|
||||
muldf3vfp
|
||||
muldi3
|
||||
mulodi4
|
||||
mulosi4
|
||||
mulsc3
|
||||
mulsf3
|
||||
mulsf3vfp
|
||||
mulvdi3
|
||||
mulvsi3
|
||||
nedf2
|
||||
nedf2vfp
|
||||
negdi2
|
||||
negvdi2
|
||||
negvsi2
|
||||
nesf2
|
||||
nesf2vfp
|
||||
paritydi2
|
||||
paritysi2
|
||||
popcountdi2
|
||||
popcountsi2
|
||||
powidf2
|
||||
powisf2
|
||||
subdf3
|
||||
subdf3vfp
|
||||
subsf3
|
||||
subsf3vfp
|
||||
subvdi3
|
||||
subvsi3
|
||||
truncdfsf2
|
||||
truncdfsf2vfp
|
||||
ucmpdi2
|
||||
udivdi3
|
||||
udivmoddi4
|
||||
udivmodsi4
|
||||
udivsi3
|
||||
umoddi3
|
||||
umodsi3
|
||||
unorddf2
|
||||
unorddf2vfp
|
||||
unordsf2
|
||||
unordsf2vfp
|
|
@ -0,0 +1,120 @@
|
|||
absvdi2
|
||||
absvsi2
|
||||
adddf3
|
||||
adddf3vfp
|
||||
addsf3
|
||||
addsf3vfp
|
||||
addvdi3
|
||||
addvsi3
|
||||
ashldi3
|
||||
ashrdi3
|
||||
bswapdi2
|
||||
bswapsi2
|
||||
clzdi2
|
||||
clzsi2
|
||||
cmpdi2
|
||||
ctzdi2
|
||||
ctzsi2
|
||||
divdc3
|
||||
divdf3
|
||||
divdf3vfp
|
||||
divdi3
|
||||
divmodsi4
|
||||
divsc3
|
||||
divsf3
|
||||
divsf3vfp
|
||||
divsi3
|
||||
eqdf2
|
||||
eqdf2vfp
|
||||
eqsf2
|
||||
eqsf2vfp
|
||||
extendsfdf2
|
||||
extendsfdf2vfp
|
||||
ffsdi2
|
||||
fixdfdi
|
||||
fixdfsi
|
||||
fixdfsivfp
|
||||
fixsfdi
|
||||
fixsfsi
|
||||
fixsfsivfp
|
||||
fixunsdfdi
|
||||
fixunsdfsi
|
||||
fixunsdfsivfp
|
||||
fixunssfdi
|
||||
fixunssfsi
|
||||
fixunssfsivfp
|
||||
floatdidf
|
||||
floatdisf
|
||||
floatsidf
|
||||
floatsidfvfp
|
||||
floatsisf
|
||||
floatsisfvfp
|
||||
floatundidf
|
||||
floatundisf
|
||||
floatunsidf
|
||||
floatunsisf
|
||||
floatunssidfvfp
|
||||
floatunssisfvfp
|
||||
gcc_personality_sj0
|
||||
gedf2
|
||||
gedf2vfp
|
||||
gesf2
|
||||
gesf2vfp
|
||||
gtdf2
|
||||
gtdf2vfp
|
||||
gtsf2
|
||||
gtsf2vfp
|
||||
ledf2
|
||||
ledf2vfp
|
||||
lesf2
|
||||
lesf2vfp
|
||||
lshrdi3
|
||||
ltdf2
|
||||
ltdf2vfp
|
||||
ltsf2
|
||||
ltsf2vfp
|
||||
moddi3
|
||||
modsi3
|
||||
muldc3
|
||||
muldf3
|
||||
muldf3vfp
|
||||
muldi3
|
||||
mulodi4
|
||||
mulosi4
|
||||
mulsc3
|
||||
mulsf3
|
||||
mulsf3vfp
|
||||
mulvdi3
|
||||
mulvsi3
|
||||
nedf2
|
||||
nedf2vfp
|
||||
negdi2
|
||||
negvdi2
|
||||
negvsi2
|
||||
nesf2
|
||||
nesf2vfp
|
||||
paritydi2
|
||||
paritysi2
|
||||
popcountdi2
|
||||
popcountsi2
|
||||
powidf2
|
||||
powisf2
|
||||
subdf3
|
||||
subdf3vfp
|
||||
subsf3
|
||||
subsf3vfp
|
||||
subvdi3
|
||||
subvsi3
|
||||
truncdfsf2
|
||||
truncdfsf2vfp
|
||||
ucmpdi2
|
||||
udivdi3
|
||||
udivmoddi4
|
||||
udivmodsi4
|
||||
udivsi3
|
||||
umoddi3
|
||||
umodsi3
|
||||
unorddf2
|
||||
unorddf2vfp
|
||||
unordsf2
|
||||
unordsf2vfp
|
|
@ -0,0 +1,16 @@
|
|||
clzti2
|
||||
divti3
|
||||
fixdfti
|
||||
fixsfti
|
||||
fixunsdfti
|
||||
floattidf
|
||||
floattisf
|
||||
floatuntidf
|
||||
floatuntisf
|
||||
gcc_personality_v0
|
||||
modti3
|
||||
powidf2
|
||||
powisf2
|
||||
udivmodti4
|
||||
udivti3
|
||||
umodti3
|
Loading…
Reference in New Issue