summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Headers/Intrin.h21
-rw-r--r--clang/test/Headers/ms-intrin.cpp13
2 files changed, 33 insertions, 1 deletions
diff --git a/clang/lib/Headers/Intrin.h b/clang/lib/Headers/Intrin.h
index 5b00e3c8fe4..437646471da 100644
--- a/clang/lib/Headers/Intrin.h
+++ b/clang/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__))
diff --git a/clang/test/Headers/ms-intrin.cpp b/clang/test/Headers/ms-intrin.cpp
index 58ad5a2449c..1bf134e7eac 100644
--- a/clang/test/Headers/ms-intrin.cpp
+++ b/clang/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 @@ typedef __SIZE_TYPE__ size_t;
// 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.
+ // expected-note@Intrin.h:754 {{declared here}}
+ // expected-note@Intrin.h:759 {{declared here}}
+ // expected-note@Intrin.h:764 {{declared here}}
+}
OpenPOWER on IntegriCloud