Commit b3aabafd authored by Andrew Krieger's avatar Andrew Krieger Committed by Facebook Github Bot

Implement folly::launder for MSVC

Summary:
This implementation should suffice for MSVC. _ReadWriteBarrier()
generates no instructions but instructs the compiler not to reorder accesses
around it, and we have to rely on MSVC not currently having any other
optimizations for const members to worry about.

Reviewed By: yfeldblum

Differential Revision: D5723782

fbshipit-source-id: a68caa4673a5c410b326c1d2e3c0752bd945f4a6
parent 2a0318b4
...@@ -35,6 +35,11 @@ FOLLY_NODISCARD inline T* launder(T* in) noexcept { ...@@ -35,6 +35,11 @@ FOLLY_NODISCARD inline T* launder(T* in) noexcept {
// so the compiler has to assume that it has been changed inside the block. // so the compiler has to assume that it has been changed inside the block.
__asm__("" : "+r"(in)); __asm__("" : "+r"(in));
return in; return in;
#elif defined(_WIN32)
// MSVC does not currently have optimizations around const members of structs.
// _ReadWriteBarrier() will prevent compiler reordering memory accesses.
_ReadWriteBarrier();
return in;
#else #else
static_assert( static_assert(
false, "folly::launder is not implemented for this environment"); false, "folly::launder is not implemented for this environment");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment