Reviewers: fschneider,

Description:
Fix strict-aliasing violation in compilation of r7437.


BUG=
TEST=


Please review this at http://codereview.chromium.org/6765027/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/ia32/codegen-ia32.cc
  M src/platform-posix.cc
  M src/platform-win32.cc
  M src/x64/codegen-x64.cc


Index: src/ia32/codegen-ia32.cc
diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc
index 2d17a72df920be30df83ec01e54d41295fb61d3a..d82ca963f60d727e6864f8e693d6efc4810191f2 100644
--- a/src/ia32/codegen-ia32.cc
+++ b/src/ia32/codegen-ia32.cc
@@ -10377,7 +10377,6 @@ OS::MemCopyFunction CreateMemCopyFunction() {
   if (chunk == NULL) return &MemCopyWrapper;
   memcpy(chunk->GetStartAddress(), desc.buffer, desc.instr_size);
   CPU::FlushICache(chunk->GetStartAddress(), desc.instr_size);
-  MemoryBarrier();
   return FUNCTION_CAST<OS::MemCopyFunction>(chunk->GetStartAddress());
 }

Index: src/platform-posix.cc
diff --git a/src/platform-posix.cc b/src/platform-posix.cc
index 8365352d64aff63329d5cd94b828ee452b957129..9cf8b57e178304096b42fa70f3d1fddd19db9569 100644
--- a/src/platform-posix.cc
+++ b/src/platform-posix.cc
@@ -217,8 +217,9 @@ void OS::MemCopy(void* dest, const void* src, size_t size) {
     ScopedLock lock(memcopy_function_mutex);
     Isolate::EnsureDefaultIsolate();
     if (memcopy_function == NULL) {
-      Release_Store(reinterpret_cast<AtomicWord*>(&memcopy_function),
-                    reinterpret_cast<AtomicWord>(CreateMemCopyFunction()));
+      OS::MemCopyFunction temp = CreateMemCopyFunction();
+      MemoryBarrier();
+      memcopy_function = temp;
     }
   }
   (*memcopy_function)(dest, src, size);
Index: src/platform-win32.cc
diff --git a/src/platform-win32.cc b/src/platform-win32.cc
index 0901fcaf7684471c3f22b23e69d1bb10780ea99a..e23ebe5c387452bc7167b72eaf0acf357521411c 100644
--- a/src/platform-win32.cc
+++ b/src/platform-win32.cc
@@ -188,7 +188,9 @@ void OS::MemCopy(void* dest, const void* src, size_t size) {
     ScopedLock lock(memcopy_function_mutex);
     Isolate::EnsureDefaultIsolate();
     if (memcopy_function == NULL) {
-      memcopy_function = CreateMemCopyFunction();
+      OS::MemCopyFunction temp = CreateMemCopyFunction();
+      MemoryBarrier();
+      memcopy_function = temp;
     }
   }
   (*memcopy_function)(dest, src, size);
@@ -210,8 +212,9 @@ double modulo(double x, double y) {
     ScopedLock lock(modulo_function_mutex);
     Isolate::EnsureDefaultIsolate();
     if (modulo_function == NULL) {
-      Release_Store(reinterpret_cast<AtomicWord*>(&modulo_function),
-                    reinterpret_cast<AtomicWord>(CreateModuloFunction()));
+      ModuloFunction temp = CreateModuloFunction();
+      MemoryBarrier();
+      modulo_function = temp;
     }
   }
   return (*modulo_function)(x, y);
Index: src/x64/codegen-x64.cc
diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc
index c8f1c04a6d7532d705eaa8b4df1b8df6808b0a32..642e11f44173dae8238e11128fd23ca9ce0bbe80 100644
--- a/src/x64/codegen-x64.cc
+++ b/src/x64/codegen-x64.cc
@@ -8824,9 +8824,6 @@ ModuloFunction CreateModuloFunction() {

   CodeDesc desc;
   masm.GetCode(&desc);
-  // Make sure that the compiled code is visible to all threads before
-  // returning the pointer to it.
-  MemoryBarrier();
   // Call the function from C++ through this pointer.
   return FUNCTION_CAST<ModuloFunction>(buffer);
 }


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to