summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autoconf/configure.ac2
-rwxr-xr-xconfigure2
-rw-r--r--include/llvm/System/Atomic.h2
-rw-r--r--include/llvm/Type.h5
-rw-r--r--lib/System/Atomic.cpp28
5 files changed, 35 insertions, 4 deletions
diff --git a/autoconf/configure.ac b/autoconf/configure.ac
index 828e5585f6..4ba6b2b481 100644
--- a/autoconf/configure.ac
+++ b/autoconf/configure.ac
@@ -935,6 +935,8 @@ AC_LINK_IFELSE(
volatile unsigned long val = 1;
__sync_synchronize();
__sync_val_compare_and_swap(&val, 1, 0);
+ __sync_add_and_fetch(&val, 1);
+ __sync_sub_and_fetch(&val, 1);
return 0;
}
]]),
diff --git a/configure b/configure
index 7fdb067bf2..6920d6d90f 100755
--- a/configure
+++ b/configure
@@ -33760,6 +33760,8 @@ int main() {
volatile unsigned long val = 1;
__sync_synchronize();
__sync_val_compare_and_swap(&val, 1, 0);
+ __sync_add_and_fetch(&val, 1);
+ __sync_sub_and_fetch(&val, 1);
return 0;
}
diff --git a/include/llvm/System/Atomic.h b/include/llvm/System/Atomic.h
index cb9277cc35..f90a8f62e1 100644
--- a/include/llvm/System/Atomic.h
+++ b/include/llvm/System/Atomic.h
@@ -24,6 +24,8 @@ namespace llvm {
cas_flag CompareAndSwap(volatile cas_flag* ptr,
cas_flag new_value,
cas_flag old_value);
+ cas_flag AtomicPostIncrement(volatile cas_flag* ptr);
+ cas_flag AtomicPostDecrement(volatile cas_flag* ptr);
}
}
diff --git a/include/llvm/Type.h b/include/llvm/Type.h
index 9a48731ede..256944f600 100644
--- a/include/llvm/Type.h
+++ b/include/llvm/Type.h
@@ -353,10 +353,7 @@ public:
/// addAbstractTypeUser - Notify an abstract type that there is a new user of
/// it. This function is called primarily by the PATypeHandle class.
///
- void addAbstractTypeUser(AbstractTypeUser *U) const {
- assert(isAbstract() && "addAbstractTypeUser: Current type not abstract!");
- AbstractTypeUsers.push_back(U);
- }
+ void addAbstractTypeUser(AbstractTypeUser *U) const;
/// removeAbstractTypeUser - Notify an abstract type that a user of the class
/// no longer has a handle to the type. This function is called primarily by
diff --git a/lib/System/Atomic.cpp b/lib/System/Atomic.cpp
index 2827d88965..9d8ac925b8 100644
--- a/lib/System/Atomic.cpp
+++ b/lib/System/Atomic.cpp
@@ -51,3 +51,31 @@ sys::cas_flag sys::CompareAndSwap(volatile sys::cas_flag* ptr,
# error No compare-and-swap implementation for your platform!
#endif
}
+
+sys::cas_flag sys::AtomicPostIncrement(volatile sys::cas_flag* ptr) {
+#if LLVM_MULTITHREADED==0
+ ++(*ptr);
+ return *ptr;
+#elif defined(__GNUC__)
+ return __sync_add_and_fetch(ptr, 1);
+#elif defined(_MSC_VER)
+ return InterlockedCompareExchange(ptr, new_value, old_value);
+#else
+# error No atomic increment implementation for your platform!
+#endif
+}
+
+sys::cas_flag sys::AtomicPostDecrement(volatile sys::cas_flag* ptr) {
+#if LLVM_MULTITHREADED==0
+ --(*ptr);
+ return *ptr;
+#elif defined(__GNUC__)
+ return __sync_sub_and_fetch(ptr, 1);
+#elif defined(_MSC_VER)
+ return InterlockedIncrement(ptr);
+#else
+# error No atomic decrement implementation for your platform!
+#endif
+}
+
+