diff options
-rw-r--r-- | device/include/llvm/Config/config.h | 1 | ||||
-rw-r--r-- | host/include/llvm/Config/config.h | 2 | ||||
-rw-r--r-- | lib/System/Android.mk | 2 | ||||
-rw-r--r-- | lib/System/Atomic.cpp | 16 |
4 files changed, 20 insertions, 1 deletions
diff --git a/device/include/llvm/Config/config.h b/device/include/llvm/Config/config.h index 3dbc737..709a702 100644 --- a/device/include/llvm/Config/config.h +++ b/device/include/llvm/Config/config.h @@ -476,6 +476,7 @@ /* Build multithreading support into LLVM */ /* #undef LLVM_MULTITHREADED */ +//#define LLVM_MULTITHREADED 1 /* LLVM architecture name for the native architecture, if available */ #define LLVM_NATIVE_ARCH ARMTarget diff --git a/host/include/llvm/Config/config.h b/host/include/llvm/Config/config.h index 7aa5fc1..93be9ad 100644 --- a/host/include/llvm/Config/config.h +++ b/host/include/llvm/Config/config.h @@ -472,7 +472,7 @@ #define LLVM_MANDIR "/usr/local/google/llvm/man" /* Build multithreading support into LLVM */ -#define LLVM_MULTITHREADED 0 +#define LLVM_MULTITHREADED 1 /* LLVM architecture name for the native architecture, if available */ #define LLVM_NATIVE_ARCH X86Target diff --git a/lib/System/Android.mk b/lib/System/Android.mk index e80ad69..c0656c0 100644 --- a/lib/System/Android.mk +++ b/lib/System/Android.mk @@ -41,6 +41,8 @@ REQUIRES_RTTI := 1 LOCAL_SRC_FILES := $(system_SRC_FILES) +LOCAL_CFLAGS += -I bionic/libc/include + LOCAL_MODULE:= libLLVMSystem include $(LLVM_DEVICE_BUILD_MK) diff --git a/lib/System/Atomic.cpp b/lib/System/Atomic.cpp index 7ba8b77..a8835e3 100644 --- a/lib/System/Atomic.cpp +++ b/lib/System/Atomic.cpp @@ -13,6 +13,9 @@ #include "llvm/System/Atomic.h" #include "llvm/Config/config.h" +#if defined(ANDROID_TARGET_BUILD) +# include "sys/atomics.h" +#endif using namespace llvm; @@ -43,6 +46,8 @@ sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr, if (result == old_value) *ptr = new_value; return result; +#elif defined(ANDROID_TARGET_BUILD) + return __atomic_cmpxchg(old_value, new_value, (volatile int*)ptr); #elif defined(__GNUC__) return __sync_val_compare_and_swap(ptr, old_value, new_value); #elif defined(_MSC_VER) @@ -56,6 +61,8 @@ sys::cas_flag sys::AtomicIncrement(volatile sys::cas_flag* ptr) { #if LLVM_MULTITHREADED==0 ++(*ptr); return *ptr; +#elif defined(ANDROID_TARGET_BUILD) + return __atomic_inc((volatile int*)ptr); #elif defined(__GNUC__) return __sync_add_and_fetch(ptr, 1); #elif defined(_MSC_VER) @@ -69,6 +76,8 @@ sys::cas_flag sys::AtomicDecrement(volatile sys::cas_flag* ptr) { #if LLVM_MULTITHREADED==0 --(*ptr); return *ptr; +#elif defined(ANDROID_TARGET_BUILD) + return __atomic_dec((volatile int*)ptr); #elif defined(__GNUC__) return __sync_sub_and_fetch(ptr, 1); #elif defined(_MSC_VER) @@ -82,6 +91,13 @@ sys::cas_flag sys::AtomicAdd(volatile sys::cas_flag* ptr, sys::cas_flag val) { #if LLVM_MULTITHREADED==0 *ptr += val; return *ptr; +#elif defined(ANDROID_TARGET_BUILD) + sys::cas_flag original, result; + do { + original = *ptr; + result = original + val; + } while (__atomic_cmpxchg(original, result, (volatile int*)ptr) != original); + return result; #elif defined(__GNUC__) return __sync_add_and_fetch(ptr, val); #elif defined(_MSC_VER) |