# These are the functions which clang needs when it is targeting a previous # version of the OS. The issue is that the backend may use functions which were # not present in the libgcc that shipped on the platform. In such cases, we link # with a version of the library which contains private_extern definitions of all # the extra functions which might be referenced. Description := Static runtime libraries for embedded clang/Darwin # A function that ensures we don't try to build for architectures that we # don't have working toolchains for. CheckArches = \ $(shell \ result=""; \ for arch in $(1); do \ if $(CC) -arch $$arch -c \ -integrated-as \ $(ProjSrcRoot)/make/platform/clang_macho_embedded_test_input.c \ -o /dev/null > /dev/null 2> /dev/null; then \ result="$$result$$arch "; \ else \ printf 1>&2 \ "warning: clang_macho_embedded.mk: dropping arch '$$arch' from lib '$(2)'\n"; \ fi; \ done; \ echo $$result) XCRun = \ $(shell \ result=`xcrun -find $(1) 2> /dev/null`; \ if [ "$$?" != "0" ]; then result=$(1); fi; \ echo $$result) ### CC := $(call XCRun,clang) AR := $(call XCRun,ar) RANLIB := $(call XCRun,ranlib) STRIP := $(call XCRun,strip) LIPO := $(call XCRun,lipo) DSYMUTIL := $(call XCRun,dsymutil) Configs := UniversalArchs := # Soft-float version of the runtime. No floating-point instructions will be used # and the ABI (out of necessity) passes floating values in normal registers: # non-VFP variant of the AAPCS. UniversalArchs.soft_static := $(call CheckArches,armv6m armv7m armv7em armv7,soft_static) Configs += $(if $(UniversalArchs.soft_static),soft_static) # Hard-float version of the runtime. On ARM VFP instructions and registers are # allowed, and floating point values get passed in them. VFP variant of the # AAPCS. UniversalArchs.hard_static := $(call CheckArches,armv7em armv7 i386 x86_64,hard_static) Configs += $(if $(UniversalArchs.hard_static),hard_static) UniversalArchs.soft_pic := $(call CheckArches,armv6m armv7m armv7em armv7,soft_pic) Configs += $(if $(UniversalArchs.soft_pic),soft_pic) UniversalArchs.hard_pic := $(call CheckArches,armv7em armv7 i386 x86_64,hard_pic) Configs += $(if $(UniversalArchs.hard_pic),hard_pic) CFLAGS := -Wall -Oz -fomit-frame-pointer -ffreestanding PIC_CFLAGS := -fPIC STATIC_CFLAGS := -static CFLAGS_SOFT := -mfloat-abi=soft CFLAGS_HARD := -mfloat-abi=hard CFLAGS_ARMV7 := -target thumbv7-apple-darwin-eabi CFLAGS_I386 := -march=pentium CFLAGS.soft_static := $(CFLAGS) $(STATIC_CFLAGS) $(CFLAGS_SOFT) CFLAGS.hard_static := $(CFLAGS) $(STATIC_CFLAGS) $(CFLAGS_HARD) CFLAGS.soft_pic := $(CFLAGS) $(PIC_CFLAGS) $(CFLAGS_SOFT) CFLAGS.hard_pic := $(CFLAGS) $(PIC_CFLAGS) $(CFLAGS_HARD) CFLAGS.soft_static.armv7 := $(CFLAGS.soft_static) $(CFLAGS_ARMV7) CFLAGS.hard_static.armv7 := $(CFLAGS.hard_static) $(CFLAGS_ARMV7) CFLAGS.soft_pic.armv7 := $(CFLAGS.soft_pic) $(CFLAGS_ARMV7) CFLAGS.hard_pic.armv7 := $(CFLAGS.hard_pic) $(CFLAGS_ARMV7) # x86 platforms ignore -mfloat-abi options and complain about doing so. Despite # this they're hard-float. CFLAGS.hard_static.i386 := $(CFLAGS) $(STATIC_CFLAGS) $(CFLAGS_I386) CFLAGS.hard_pic.i386 := $(CFLAGS) $(PIC_CFLAGS) $(CFLAGS_I386) CFLAGS.hard_static.x86_64 := $(CFLAGS) $(STATIC_CFLAGS) CFLAGS.hard_pic.x86_64 := $(CFLAGS) $(PIC_CFLAGS) # Functions not wanted: # + eprintf is obsolete anyway # + *vfp: designed for Thumb1 CPUs with VFPv2 COMMON_FUNCTIONS := \ absvdi2 \ absvsi2 \ addvdi3 \ addvsi3 \ ashldi3 \ ashrdi3 \ bswapdi2 \ bswapsi2 \ clzdi2 \ clzsi2 \ cmpdi2 \ ctzdi2 \ ctzsi2 \ divdc3 \ divdi3 \ divsc3 \ divmodsi4 \ udivmodsi4 \ do_global_dtors \ ffsdi2 \ fixdfdi \ fixsfdi \ fixunsdfdi \ fixunsdfsi \ fixunssfdi \ fixunssfsi \ floatdidf \ floatdisf \ floatundidf \ floatundisf \ gcc_bcmp \ lshrdi3 \ moddi3 \ muldc3 \ muldi3 \ mulsc3 \ mulvdi3 \ mulvsi3 \ negdi2 \ negvdi2 \ negvsi2 \ paritydi2 \ paritysi2 \ popcountdi2 \ popcountsi2 \ powidf2 \ powisf2 \ subvdi3 \ subvsi3 \ ucmpdi2 \ udiv_w_sdiv \ udivdi3 \ udivmoddi4 \ umoddi3 \ adddf3 \ addsf3 \ cmpdf2 \ cmpsf2 \ div0 \ divdf3 \ divsf3 \ divsi3 \ extendsfdf2 \ extendhfsf2 \ ffssi2 \ fixdfsi \ fixsfsi \ floatsidf \ floatsisf \ floatunsidf \ floatunsisf \ comparedf2 \ comparesf2 \ modsi3 \ muldf3 \ mulsf3 \ negdf2 \ negsf2 \ subdf3 \ subsf3 \ truncdfhf2 \ truncdfsf2 \ truncsfhf2 \ udivsi3 \ umodsi3 \ unorddf2 \ unordsf2 \ atomic_flag_clear \ atomic_flag_clear_explicit \ atomic_flag_test_and_set \ atomic_flag_test_and_set_explicit \ atomic_signal_fence \ atomic_thread_fence ARM_FUNCTIONS := \ aeabi_cdcmpeq \ aeabi_cdrcmple \ aeabi_cfcmpeq \ aeabi_cfrcmple \ aeabi_dcmpeq \ aeabi_dcmpge \ aeabi_dcmpgt \ aeabi_dcmple \ aeabi_dcmplt \ aeabi_drsub \ aeabi_fcmpeq \ aeabi_fcmpge \ aeabi_fcmpgt \ aeabi_fcmple \ aeabi_fcmplt \ aeabi_frsub \ aeabi_idivmod \ aeabi_uidivmod \ # ARM Assembly implementation which requires Thumb2 (i.e. won't work on v6M). THUMB2_FUNCTIONS := \ switch16 \ switch32 \ switch8 \ switchu8 \ sync_fetch_and_add_4 \ sync_fetch_and_sub_4 \ sync_fetch_and_and_4 \ sync_fetch_and_or_4 \ sync_fetch_and_xor_4 \ sync_fetch_and_nand_4 \ sync_fetch_and_max_4 \ sync_fetch_and_umax_4 \ sync_fetch_and_min_4 \ sync_fetch_and_umin_4 \ sync_fetch_and_add_8 \ sync_fetch_and_sub_8 \ sync_fetch_and_and_8 \ sync_fetch_and_or_8 \ sync_fetch_and_xor_8 \ sync_fetch_and_nand_8 \ sync_fetch_and_max_8 \ sync_fetch_and_umax_8 \ sync_fetch_and_min_8 \ sync_fetch_and_umin_8 I386_FUNCTIONS := \ i686.get_pc_thunk.eax \ i686.get_pc_thunk.ebp \ i686.get_pc_thunk.ebx \ i686.get_pc_thunk.ecx \ i686.get_pc_thunk.edi \ i686.get_pc_thunk.edx \ i686.get_pc_thunk.esi # FIXME: Currently, compiler-rt is missing implementations for a number of the # functions. Filter them out for now. MISSING_FUNCTIONS := \ cmpdf2 cmpsf2 div0 \ ffssi2 \ udiv_w_sdiv unorddf2 unordsf2 bswapdi2 \ bswapsi2 \ gcc_bcmp \ do_global_dtors \ i686.get_pc_thunk.eax i686.get_pc_thunk.ebp i686.get_pc_thunk.ebx \ i686.get_pc_thunk.ecx i686.get_pc_thunk.edi i686.get_pc_thunk.edx \ i686.get_pc_thunk.esi \ aeabi_cdcmpeq aeabi_cdrcmple aeabi_cfcmpeq aeabi_cfrcmple aeabi_dcmpeq \ aeabi_dcmpge aeabi_dcmpgt aeabi_dcmple aeabi_dcmplt aeabi_drsub \ aeabi_fcmpeq \ aeabi_fcmpge aeabi_fcmpgt aeabi_fcmple aeabi_fcmplt \ aeabi_frsub aeabi_idivmod aeabi_uidivmod FUNCTIONS_ARMV6M := $(COMMON_FUNCTIONS) $(ARM_FUNCTIONS) FUNCTIONS_ARM_ALL := $(COMMON_FUNCTIONS) $(ARM_FUNCTIONS) $(THUMB2_FUNCTIONS) FUNCTIONS_I386 := $(COMMON_FUNCTIONS) $(I386_FUNCTIONS) FUNCTIONS_X86_64 := $(COMMON_FUNCTIONS) FUNCTIONS_ARMV6M := \ $(filter-out $(MISSING_FUNCTIONS),$(FUNCTIONS_ARMV6M)) FUNCTIONS_ARM_ALL := \ $(filter-out $(MISSING_FUNCTIONS),$(FUNCTIONS_ARM_ALL)) FUNCTIONS_I386 := \ $(filter-out $(MISSING_FUNCTIONS),$(FUNCTIONS_I386)) FUNCTIONS_X86_64 := \ $(filter-out $(MISSING_FUNCTIONS),$(FUNCTIONS_X86_64)) FUNCTIONS.soft_static.armv6m := $(FUNCTIONS_ARMV6M) FUNCTIONS.soft_pic.armv6m := $(FUNCTIONS_ARMV6M) FUNCTIONS.soft_static.armv7m := $(FUNCTIONS_ARM_ALL) FUNCTIONS.soft_pic.armv7m := $(FUNCTIONS_ARM_ALL) FUNCTIONS.soft_static.armv7em := $(FUNCTIONS_ARM_ALL) FUNCTIONS.hard_static.armv7em := $(FUNCTIONS_ARM_ALL) FUNCTIONS.soft_pic.armv7em := $(FUNCTIONS_ARM_ALL) FUNCTIONS.hard_pic.armv7em := $(FUNCTIONS_ARM_ALL) FUNCTIONS.soft_static.armv7 := $(FUNCTIONS_ARM_ALL) FUNCTIONS.hard_static.armv7 := $(FUNCTIONS_ARM_ALL) FUNCTIONS.soft_pic.armv7 := $(FUNCTIONS_ARM_ALL) FUNCTIONS.hard_pic.armv7 := $(FUNCTIONS_ARM_ALL) FUNCTIONS.hard_static.i386 := $(FUNCTIONS_I386) FUNCTIONS.hard_pic.i386 := $(FUNCTIONS_I386) FUNCTIONS.hard_static.x86_64 := $(FUNCTIONS_X86_64) FUNCTIONS.hard_pic.x86_64 := $(FUNCTIONS_X86_64)