From: Christopher Dykes Date: Thu, 26 Jan 2017 18:44:00 +0000 (-0800) Subject: Add __builtin___clear_cache to the portability headers X-Git-Tag: v2017.03.06.00~78 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=cc0ca971057edb5e4c8f78946b0c5508395ecc48;p=folly.git Add __builtin___clear_cache to the portability headers Summary: HHVM uses this heavily in it's ARM JIT, so provide an implementation. With GCC & Clang this function is a no-op on x86_64 where the requirement doesn't exist, so do the same in the portability header. This doesn't include the Windows portability header on x64 specifically because it is a very heavy header and this is currently very lightweight. Reviewed By: yfeldblum Differential Revision: D4451032 fbshipit-source-id: 0af57448577635f9cd690ea9b09ce46a244191e1 --- diff --git a/folly/Portability.h b/folly/Portability.h index 7a48f533..17c064ba 100644 --- a/folly/Portability.h +++ b/folly/Portability.h @@ -109,6 +109,12 @@ constexpr bool kHasUnalignedAccess = false; # define FOLLY_PPC64 0 #endif +namespace folly { +constexpr bool kIsArchAmd64 = FOLLY_X64 == 1; +constexpr bool kIsArchAArch64 = FOLLY_A64 == 1; +constexpr bool kIsArchPPC64 = FOLLY_PPC64 == 1; +} + // packing is very ugly in msvc #ifdef _MSC_VER # define FOLLY_PACK_ATTR /**/ diff --git a/folly/portability/Builtins.cpp b/folly/portability/Builtins.cpp new file mode 100755 index 00000000..80f634eb --- /dev/null +++ b/folly/portability/Builtins.cpp @@ -0,0 +1,31 @@ +/* + * Copyright 2017 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#if _WIN32 +#include + +namespace folly { +namespace portability { +namespace detail { +void call_flush_instruction_cache_self_pid(void* begin, size_t size) { + FlushInstructionCache(GetCurrentProcess(), begin, size); +} +} +} +} +#endif diff --git a/folly/portability/Builtins.h b/folly/portability/Builtins.h index acc4ed9a..98bbb097 100755 --- a/folly/portability/Builtins.h +++ b/folly/portability/Builtins.h @@ -18,8 +18,28 @@ #ifdef _WIN32 #include -#include #include +#include +#include + +namespace folly { +namespace portability { +namespace detail { +void call_flush_instruction_cache_self_pid(void* begin, size_t size); +} +} +} + +FOLLY_ALWAYS_INLINE void __builtin___clear_cache(char* begin, char* end) { + if (folly::kIsArchAmd64) { + // x86_64 doesn't require the instruction cache to be flushed after + // modification. + } else { + // Default to flushing it for everything else, such as ARM. + folly::portability::detail::call_flush_instruction_cache_self_pid( + static_cast(begin), static_cast(end - begin)); + } +} FOLLY_ALWAYS_INLINE int __builtin_clz(unsigned int x) { unsigned long index;