Hi echristo,
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.
http://llvm-reviews.chandlerc.com/D1954
Files:
lib/Headers/Intrin.h
test/Headers/ms-intrin.cpp
Index: lib/Headers/Intrin.h
===================================================================
--- lib/Headers/Intrin.h
+++ lib/Headers/Intrin.h
@@ -243,7 +243,9 @@
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 _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 @@
}
#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__))
Index: test/Headers/ms-intrin.cpp
===================================================================
--- test/Headers/ms-intrin.cpp
+++ test/Headers/ms-intrin.cpp
@@ -1,6 +1,6 @@
// RUN: %clang_cc1 -triple i386-pc-win32 -target-cpu pentium4 \
// RUN: -fms-extensions -fms-compatibility -fmsc-version=1700 \
-// RUN: -ffreestanding -fsyntax-only %s
+// RUN: -ffreestanding -verify %s
// Intrin.h needs size_t, but -ffreestanding prevents us from getting it from
// stddef.h. Work around it with this typedef.
@@ -11,3 +11,14 @@
// Use some C++ to make sure we closed the extern "C" brackets.
template <typename T>
void foo(T V) {}
+
+void bar() {
+ _ReadWriteBarrier(); // expected-warning {{is deprecated: use other
intrinsics or C++11 atomics instead}}
+ _ReadBarrier(); // expected-warning {{is deprecated: use other
intrinsics or C++11 atomics instead}}
+ _WriteBarrier(); // expected-warning {{is deprecated: use other
intrinsics or C++11 atomics instead}}
+ // FIXME: It'd be handy if we didn't have to hardcode the line number in
+ // intrin.h.
+ // [email protected]:754 {{declared here}}
+ // [email protected]:759 {{declared here}}
+ // [email protected]:764 {{declared here}}
+}
Index: lib/Headers/Intrin.h
===================================================================
--- lib/Headers/Intrin.h
+++ lib/Headers/Intrin.h
@@ -243,7 +243,9 @@
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 _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 @@
}
#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__))
Index: test/Headers/ms-intrin.cpp
===================================================================
--- test/Headers/ms-intrin.cpp
+++ test/Headers/ms-intrin.cpp
@@ -1,6 +1,6 @@
// RUN: %clang_cc1 -triple i386-pc-win32 -target-cpu pentium4 \
// RUN: -fms-extensions -fms-compatibility -fmsc-version=1700 \
-// RUN: -ffreestanding -fsyntax-only %s
+// RUN: -ffreestanding -verify %s
// Intrin.h needs size_t, but -ffreestanding prevents us from getting it from
// stddef.h. Work around it with this typedef.
@@ -11,3 +11,14 @@
// Use some C++ to make sure we closed the extern "C" brackets.
template <typename T>
void foo(T V) {}
+
+void bar() {
+ _ReadWriteBarrier(); // expected-warning {{is deprecated: use other intrinsics or C++11 atomics instead}}
+ _ReadBarrier(); // expected-warning {{is deprecated: use other intrinsics or C++11 atomics instead}}
+ _WriteBarrier(); // expected-warning {{is deprecated: use other intrinsics or C++11 atomics instead}}
+ // FIXME: It'd be handy if we didn't have to hardcode the line number in
+ // intrin.h.
+ // [email protected]:754 {{declared here}}
+ // [email protected]:759 {{declared here}}
+ // [email protected]:764 {{declared here}}
+}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits