#include "llvm/ADT/Statistic.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Format.h"
+ #include "llvm/Support/MathExtras.h"
#include "llvm/Support/Timer.h"
+#include <ctype.h>
using namespace llvm;
static const char *DWARFGroupName = "DWARF Emission";
}
sys::cas_flag sys::AtomicIncrement(volatile sys::cas_flag* ptr) {
- #if LLVM_MULTITHREADED==0
+ #if LLVM_HAS_ATOMICS == 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)
}
sys::cas_flag sys::AtomicDecrement(volatile sys::cas_flag* ptr) {
- #if LLVM_MULTITHREADED==0
+ #if LLVM_HAS_ATOMICS == 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)
}
sys::cas_flag sys::AtomicAdd(volatile sys::cas_flag* ptr, sys::cas_flag val) {
- #if LLVM_MULTITHREADED==0
+ #if LLVM_HAS_ATOMICS == 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)