]> granicus.if.org Git - clang/commitdiff
Add implementations of the MSVC barrier intrinsics
authorReid Kleckner <reid@kleckner.net>
Thu, 17 Oct 2013 01:29:48 +0000 (01:29 +0000)
committerReid Kleckner <reid@kleckner.net>
Thu, 17 Oct 2013 01:29:48 +0000 (01:29 +0000)
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

lib/Headers/Intrin.h
test/Headers/ms-intrin.cpp

index 5b00e3c8fe497fc59bdc0eacce3e3c3b09e1b9df..437646471dabf9991892d92c32740a2aa3f860fd 100644 (file)
@@ -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__))
index 58ad5a2449cab98cb47e24251fdfaee9418dab57..1bf134e7eac6f66b32ac4c7e3ae866bc06198df2 100644 (file)
@@ -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}}
+}