Index: third_party/tcmalloc/chromium/src/base/basictypes.h |
diff --git a/third_party/tcmalloc/chromium/src/base/basictypes.h b/third_party/tcmalloc/chromium/src/base/basictypes.h |
index 0f21fcae9e78ba178893619371006f18a62fe675..75b7b5ae777ae06b81ad63aa3912df8b58368aab 100644 |
--- a/third_party/tcmalloc/chromium/src/base/basictypes.h |
+++ b/third_party/tcmalloc/chromium/src/base/basictypes.h |
@@ -31,6 +31,7 @@ |
#define _BASICTYPES_H_ |
#include <config.h> |
+#include <string.h> // for memcpy() |
#ifdef HAVE_INTTYPES_H |
#include <inttypes.h> // gets us PRId64, etc |
#endif |
@@ -193,6 +194,28 @@ struct CompileAssert { |
(reinterpret_cast<char*>(&reinterpret_cast<strct*>(16)->field) - \ |
reinterpret_cast<char*>(16)) |
+// bit_cast<Dest,Source> implements the equivalent of |
+// "*reinterpret_cast<Dest*>(&source)". |
+// |
+// The reinterpret_cast method would produce undefined behavior |
+// according to ISO C++ specification section 3.10 -15 -. |
+// bit_cast<> calls memcpy() which is blessed by the standard, |
+// especially by the example in section 3.9. |
+// |
+// Fortunately memcpy() is very fast. In optimized mode, with a |
+// constant size, gcc 2.95.3, gcc 4.0.1, and msvc 7.1 produce inline |
+// code with the minimal amount of data movement. On a 32-bit system, |
+// memcpy(d,s,4) compiles to one load and one store, and memcpy(d,s,8) |
+// compiles to two loads and two stores. |
+ |
+template <class Dest, class Source> |
+inline Dest bit_cast(const Source& source) { |
+ COMPILE_ASSERT(sizeof(Dest) == sizeof(Source), bitcasting_unequal_sizes); |
+ Dest dest; |
+ memcpy(&dest, &source, sizeof(dest)); |
+ return dest; |
+} |
+ |
#ifdef HAVE___ATTRIBUTE__ |
# define ATTRIBUTE_WEAK __attribute__((weak)) |
# define ATTRIBUTE_NOINLINE __attribute__((noinline)) |
@@ -309,8 +332,7 @@ class AssignAttributeStartEnd { |
#endif // HAVE___ATTRIBUTE__ and __ELF__ or __MACH__ |
#if defined(HAVE___ATTRIBUTE__) && (defined(__i386__) || defined(__x86_64__)) |
-# define CACHELINE_SIZE 64 |
-# define CACHELINE_ALIGNED __attribute__((aligned(CACHELINE_SIZE))) |
+# define CACHELINE_ALIGNED __attribute__((aligned(64))) |
#else |
# define CACHELINE_ALIGNED |
#endif // defined(HAVE___ATTRIBUTE__) && (__i386__ || __x86_64__) |