From 96c902c529c10e6ae428b14c29f810953c43e1fb Mon Sep 17 00:00:00 2001 From: Valerii Hiora Date: Sat, 14 Jun 2014 17:52:16 +0300 Subject: [PATCH 1/2] Fixed _clearcache implementation Failed to compile for Android - there was a mess with register variables --- lib/builtins/clear_cache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/builtins/clear_cache.c b/lib/builtins/clear_cache.c index d8fa0aa333..a5cfac070f 100644 --- a/lib/builtins/clear_cache.c +++ b/lib/builtins/clear_cache.c @@ -49,12 +49,12 @@ __clear_cache(void* start, void* end) sysarch(ARM_SYNC_ICACHE, &arg); #elif defined(ANDROID) - const register int start_reg __asm("r0") = (int) (intptr_t) start; + register int start_reg __asm("r0") = (int) (intptr_t) start; const register int end_reg __asm("r1") = (int) (intptr_t) end; const register int flags __asm("r2") = 0; const register int syscall_nr __asm("r7") = __ARM_NR_cacheflush; __asm __volatile("svc 0x0" : "=r"(start_reg) - : "r"(syscall_nr), "r"(start_reg), "r"(end_reg), "r"(flags) : "r0"); + : "r"(syscall_nr), "r"(start_reg), "r"(end_reg), "r"(flags)); if (start_reg != 0) { compilerrt_abort(); } From 7b97b8468f0614072cf3299fa8c51e85f609316f Mon Sep 17 00:00:00 2001 From: Valerii Hiora Date: Sat, 14 Jun 2014 17:55:05 +0300 Subject: [PATCH 2/2] Turned off compilation of sync functions They were built by Apple engineers and use Thumb2 instructions which were unsupported for generic Android target. Those functions are conditionally compiled on macho-embedded targets but there was no any filtering for Android --- make/platform/triple.mk | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/make/platform/triple.mk b/make/platform/triple.mk index ce4bfe3b63..7ea152a363 100644 --- a/make/platform/triple.mk +++ b/make/platform/triple.mk @@ -23,5 +23,34 @@ endif # Filter out stuff that gcc cannot compile (these are only needed for clang-generated code anywasys). CommonFunctions_gcc := $(filter-out atomic enable_execute_stack,$(CommonFunctions)) -FUNCTIONS.builtins := $(CommonFunctions_gcc) $(value ArchFunctions.$(Arch)) +# Filter out stuff which is not available on specific target +# For example, sync_fetch_and_add_4 uses Thumb instructions, which are unavailable +# when building for arm-linux-androideabi +ifeq ($(TargetTriple),arm-linux-androideabi) + ArchDisabledFunctions := \ + 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 +endif + +ArchEnabledFunctions := $(filter-out $(ArchDisabledFunctions),$(value ArchFunctions.$(Arch))) + +FUNCTIONS.builtins := $(CommonFunctions_gcc) $(ArchEnabledFunctions)