summaryrefslogtreecommitdiff
path: root/lib/Headers
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2013-10-17 01:29:48 +0000
committerReid Kleckner <reid@kleckner.net>2013-10-17 01:29:48 +0000
commit0b327d323db4bbd93a4b91ed98ee9ab243290f4e (patch)
treea1ef5c95ba39e90a52317ce5984e223543086a26 /lib/Headers
parentb5b3f816d3c2543e11fb4f0b235041beafd81a1e (diff)
downloadclang-0b327d323db4bbd93a4b91ed98ee9ab243290f4e.tar.gz
Add implementations of the MSVC barrier intrinsics
Summary: These are deprecated in VS 2012 according to MSDN. They don't actually compile down to any code. They prevent the compiler from reordering memory accesses across the barrier, which is what a memory-clobbering volatile asm does. Reviewers: echristo CC: cfe-commits Differential Revision: http://llvm-reviews.chandlerc.com/D1954 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@192860 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Headers')
-rw-r--r--lib/Headers/Intrin.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/lib/Headers/Intrin.h b/lib/Headers/Intrin.h
index 5b00e3c8fe..437646471d 100644
--- a/lib/Headers/Intrin.h
+++ b/lib/Headers/Intrin.h
@@ -243,7 +243,9 @@ static __inline__
unsigned long __cdecl _lrotr(unsigned long, int);
static __inline__
unsigned int _lzcnt_u32(unsigned int);
+static __inline__
void _ReadBarrier(void);
+static __inline__
void _ReadWriteBarrier(void);
static __inline__
void *_ReturnAddress(void);
@@ -280,6 +282,7 @@ unsigned int _t1mskc_u32(unsigned int);
unsigned int _tzcnt_u32(unsigned int);
unsigned int _tzcnt_u32(unsigned int);
unsigned int _tzmsk_u32(unsigned int);
+static __inline__
void _WriteBarrier(void);
void _xabort(const unsigned int imm);
unsigned __int32 xbegin(void);
@@ -744,6 +747,24 @@ _InterlockedCompareExchange64(__int64 volatile *_Destination,
}
#endif
/*----------------------------------------------------------------------------*\
+|* Barriers
+\*----------------------------------------------------------------------------*/
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+__attribute__((deprecated("use other intrinsics or C++11 atomics instead")))
+_ReadWriteBarrier(void) {
+ __asm__ volatile ("" : : : "memory");
+}
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+__attribute__((deprecated("use other intrinsics or C++11 atomics instead")))
+_ReadBarrier(void) {
+ __asm__ volatile ("" : : : "memory");
+}
+static __inline__ void __attribute__((__always_inline__, __nodebug__))
+__attribute__((deprecated("use other intrinsics or C++11 atomics instead")))
+_WriteBarrier(void) {
+ __asm__ volatile ("" : : : "memory");
+}
+/*----------------------------------------------------------------------------*\
|* Misc
\*----------------------------------------------------------------------------*/
static __inline__ void * __attribute__((__always_inline__, __nodebug__))