Changes that didn't make it to PR#12982 (#13055)
authorCyd Haselton <chaselton@gmail.com>
Fri, 11 Aug 2017 20:14:36 +0000 (15:14 -0500)
committerJan Kotas <jkotas@microsoft.com>
Fri, 11 Aug 2017 20:14:36 +0000 (13:14 -0700)
* Changes that didn't make it to PR#12982

* Recommended changes to volatile.h

Added two templates to cast away volatility due to clang 3.8 changes

* Update runtime.Linux.Microsoft.NETCore.Runtime.CoreCLR.props

Fixed erroneous extra Platform conditional line

cross/android/arm64/toolchain.cmake
src/inc/volatile.h

index 60f8c78..2941589 100644 (file)
@@ -22,6 +22,10 @@ find_program(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump)
 add_compile_options(--sysroot=${CROSS_ROOTFS})
 add_compile_options(-fPIE)
 
+## Needed for Android or bionic specific conditionals
+add_compile_options(-D__ANDROID__)
+add_compile_options(-D__BIONIC__)
+
 set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -B ${CROSS_ROOTFS}/usr/lib/gcc/${TOOLCHAIN}")
 set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -L${CROSS_ROOTFS}/lib/${TOOLCHAIN}")
 set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} --sysroot=${CROSS_ROOTFS}")
index 5aa0e50..ecf9ffe 100644 (file)
 #define VOLATILE_MEMORY_BARRIER()
 #endif // __GNUC__
 
+template<typename T>
+struct RemoveVolatile
+{
+   typedef T type;
+};
+
+template<typename T>
+struct RemoveVolatile<volatile T>
+{
+   typedef T type;
+};
+
+
 //
 // VolatileLoad loads a T from a pointer to T.  It is guaranteed that this load will not be optimized
 // away by the compiler, and that any operation that occurs after this load, in program order, will
 // this is the case for most aligned scalar data types.  If you need atomic loads or stores, you need
 // to consult the compiler and CPU manuals to find which circumstances allow atomicity.
 //
+// Starting at version 3.8, clang errors out on initializing of type int * to volatile int *. To fix this, we add two templates to cast away volatility
+// Helper structures for casting away volatileness
+
+
 template<typename T>
 inline
 T VolatileLoad(T const * pt)
@@ -125,7 +142,7 @@ T VolatileLoad(T const * pt)
     static const unsigned lockFreeAtomicSizeMask = (1 << 1) | (1 << 2) | (1 << 4) | (1 << 8);
     if((1 << sizeof(T)) & lockFreeAtomicSizeMask)
     {
-        __atomic_load((T volatile const *)pt, &val, __ATOMIC_ACQUIRE);
+        __atomic_load((T const *)pt, const_cast<typename RemoveVolatile<T>::type *>(&val), __ATOMIC_ACQUIRE);
     }
     else
     {