123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- From f205cf35a9ad116b291b2b36a50800e4573e6ac6 Mon Sep 17 00:00:00 2001
- From: Khem Raj <raj.khem@gmail.com>
- Date: Sun, 19 Apr 2015 15:16:23 -0700
- Subject: [PATCH] compiler-rt: support a new embedded linux target
- Upstream-Status: Pending
- Signed-off-by: Khem Raj <raj.khem@gmail.com>
- ---
- .../make/platform/clang_linux_embedded.mk | 286 ++++++++++++++++++
- .../clang_linux_embedded_test_input.c | 0
- 2 files changed, 286 insertions(+)
- create mode 100644 compiler-rt/make/platform/clang_linux_embedded.mk
- create mode 100644 compiler-rt/make/platform/clang_linux_embedded_test_input.c
- diff --git a/compiler-rt/make/platform/clang_linux_embedded.mk b/compiler-rt/make/platform/clang_linux_embedded.mk
- new file mode 100644
- index 000000000000..d0a890075a1c
- --- /dev/null
- +++ b/compiler-rt/make/platform/clang_linux_embedded.mk
- @@ -0,0 +1,286 @@
- +# 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/Linux
- +
- +# 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_linux_embedded_test_input.c \
- + -o /dev/null > /dev/null 2> /dev/null; then \
- + result="$$result$$arch "; \
- + else \
- + printf 1>&2 \
- + "warning: clang_linux_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,arm 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 -Werror -Oz -fomit-frame-pointer -ffreestanding
- +
- +PIC_CFLAGS := -fPIC
- +STATIC_CFLAGS := -static
- +
- +CFLAGS_SOFT := -mfloat-abi=soft
- +CFLAGS_HARD := -mfloat-abi=hard
- +
- +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 \
- + ffssi2 \
- + fixdfsi \
- + fixsfsi \
- + floatsidf \
- + floatsisf \
- + floatunsidf \
- + floatunsisf \
- + comparedf2 \
- + comparesf2 \
- + modsi3 \
- + muldf3 \
- + mulsf3 \
- + negdf2 \
- + negsf2 \
- + subdf3 \
- + subsf3 \
- + truncdfsf2 \
- + udivsi3 \
- + umodsi3 \
- + unorddf2 \
- + unordsf2
- +
- +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)
- diff --git a/compiler-rt/make/platform/clang_linux_embedded_test_input.c b/compiler-rt/make/platform/clang_linux_embedded_test_input.c
- new file mode 100644
- index 000000000000..e69de29bb2d1
|