OSDN Git Service

atomics.h
authorShih-wei Liao <sliao@google.com>
Sun, 9 May 2010 12:30:09 +0000 (05:30 -0700)
committerShih-wei Liao <sliao@google.com>
Sun, 9 May 2010 12:30:09 +0000 (05:30 -0700)
Change-Id: Iad1cf587770d21d2d7306fc661ee159901cc4d18

device/include/llvm/Config/config.h
host/include/llvm/Config/config.h
lib/System/Android.mk
lib/System/Atomic.cpp

index 3dbc737..709a702 100644 (file)
 
 /* 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
index 7aa5fc1..93be9ad 100644 (file)
 #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
index e80ad69..c0656c0 100644 (file)
@@ -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)
index 7ba8b77..a8835e3 100644 (file)
@@ -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)