From b44546be11c235c108a97c798fd6602c7cdaa400 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Sat, 1 Aug 2015 19:00:31 -0400 Subject: [PATCH] Revert "Hid inline assembly behind a macro". The MEMORY_BARRIER code is OK, and the use of inline assembly code is OK to tame the optimizer is OK; but its confusing because the interactions are not readily apparent. --- misc.h | 11 ----------- smartptr.h | 8 +++++--- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/misc.h b/misc.h index f2b44e50..f0df03c2 100644 --- a/misc.h +++ b/misc.h @@ -61,17 +61,6 @@ # pragma GCC diagnostic ignored "-Wunused-parameter" #endif -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -# pragma intrinsic(_ReadWriteBarrier) -# define MEMORY_BARRIER() _ReadWriteBarrier() -#elif defined(_INTEL_COMPILER) -# define MEMORY_BARRIER() __memory_barrier() -#elif defined(__GNUC__) || defined(__clang__) -# define MEMORY_BARRIER() __asm__ __volatile__ ("" ::: "memory") -#else -# define MEMORY_BARRIER() -#endif - NAMESPACE_BEGIN(CryptoPP) // ************** compile-time assertion *************** diff --git a/smartptr.h b/smartptr.h index db5441fe..057f5213 100644 --- a/smartptr.h +++ b/smartptr.h @@ -3,7 +3,6 @@ #include "config.h" #include "stdcpp.h" -#include "misc.h" #include "trap.h" NAMESPACE_BEGIN(CryptoPP) @@ -52,8 +51,11 @@ template simple_ptr::~simple_ptr() delete m_p; m_p = NULL; - // https://github.com/weidai11/cryptopp/issues/6 - MEMORY_BARRIER(); +#ifdef __GNUC__ + // From Andrew Haley (GCC Dev), to tame the optimizer so the assignment is always performed. + // See "Disable optimizations in one function" on the GCC mailing list. + asm volatile ("" : : : "memory"); +#endif } template class member_ptr