Index: compiler-rt/trunk/cmake/Modules/CompilerRTDarwinUtils.cmake =================================================================== --- compiler-rt/trunk/cmake/Modules/CompilerRTDarwinUtils.cmake +++ compiler-rt/trunk/cmake/Modules/CompilerRTDarwinUtils.cmake @@ -99,3 +99,114 @@ 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} $) + 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() + Index: compiler-rt/trunk/cmake/config-ix.cmake =================================================================== --- compiler-rt/trunk/cmake/config-ix.cmake +++ compiler-rt/trunk/cmake/config-ix.cmake @@ -274,9 +274,9 @@ 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 @@ set(DARWIN_osx_LINKFLAGS ${DARWIN_COMMON_LINKFLAGS} -mmacosx-version-min=${SANITIZER_MIN_OSX_VERSION}) - - if(OSX_SDK_DIR) - list(APPEND DARWIN_osx_CFLAGS -isysroot ${OSX_SDK_DIR}) - list(APPEND DARWIN_osx_LINKFLAGS -isysroot ${OSX_SDK_DIR}) + set(DARWIN_osx_BUILTIN_MIN_VER 10.5) + set(DARWIN_osx_BUILTIN_MIN_VER_FLAG + -mmacosx-version-min=${DARWIN_osx_BUILTIN_MIN_VER}) + + 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 @@ 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 @@ 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) Index: compiler-rt/trunk/lib/builtins/CMakeLists.txt =================================================================== --- compiler-rt/trunk/lib/builtins/CMakeLists.txt +++ compiler-rt/trunk/lib/builtins/CMakeLists.txt @@ -315,45 +315,7 @@ 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}) Index: compiler-rt/trunk/lib/builtins/Darwin-excludes/README.TXT =================================================================== --- compiler-rt/trunk/lib/builtins/Darwin-excludes/README.TXT +++ compiler-rt/trunk/lib/builtins/Darwin-excludes/README.TXT @@ -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-.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. Index: compiler-rt/trunk/lib/builtins/Darwin-excludes/ios.txt =================================================================== --- compiler-rt/trunk/lib/builtins/Darwin-excludes/ios.txt +++ compiler-rt/trunk/lib/builtins/Darwin-excludes/ios.txt @@ -0,0 +1 @@ +apple_versioning Index: compiler-rt/trunk/lib/builtins/Darwin-excludes/ios6-armv7.txt =================================================================== --- compiler-rt/trunk/lib/builtins/Darwin-excludes/ios6-armv7.txt +++ compiler-rt/trunk/lib/builtins/Darwin-excludes/ios6-armv7.txt @@ -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 Index: compiler-rt/trunk/lib/builtins/Darwin-excludes/ios6-armv7s.txt =================================================================== --- compiler-rt/trunk/lib/builtins/Darwin-excludes/ios6-armv7s.txt +++ compiler-rt/trunk/lib/builtins/Darwin-excludes/ios6-armv7s.txt @@ -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 Index: compiler-rt/trunk/lib/builtins/Darwin-excludes/ios7-arm64.txt =================================================================== --- compiler-rt/trunk/lib/builtins/Darwin-excludes/ios7-arm64.txt +++ compiler-rt/trunk/lib/builtins/Darwin-excludes/ios7-arm64.txt @@ -0,0 +1,16 @@ +clzti2 +divti3 +fixdfti +fixsfti +fixunsdfti +floattidf +floattisf +floatuntidf +floatuntisf +gcc_personality_v0 +modti3 +powidf2 +powisf2 +udivmodti4 +udivti3 +umodti3