Revision: 11625
Author:   [email protected]
Date:     Tue May 22 08:30:08 2012
Log: Fix stack push order when reserving space for regexp registers on Windows.

[email protected]
BUG=
TEST=test-regexp/MacroAssemblerNativeLotsOfRegisters

Review URL: https://chromiumcodereview.appspot.com/10407095
http://code.google.com/p/v8/source/detail?r=11625

Modified:
 /branches/bleeding_edge/src/ia32/regexp-macro-assembler-ia32.cc
 /branches/bleeding_edge/src/x64/regexp-macro-assembler-x64.cc

=======================================
--- /branches/bleeding_edge/src/ia32/regexp-macro-assembler-ia32.cc Tue May 22 07:05:44 2012 +++ /branches/bleeding_edge/src/ia32/regexp-macro-assembler-ia32.cc Tue May 22 08:30:08 2012
@@ -790,6 +790,18 @@
   // position registers.
   __ mov(Operand(ebp, kInputStartMinusOne), eax);

+#ifdef WIN32
+  // Ensure that we write to each stack page, in order. Skipping a page
+  // on Windows can cause segmentation faults. Assuming page size is 4k.
+  const int kPageSize = 4096;
+  const int kRegistersPerPage = kPageSize / kPointerSize;
+  for (int i = num_saved_registers_ + kRegistersPerPage - 1;
+      i < num_registers_;
+      i += kRegistersPerPage) {
+    __ mov(register_location(i), eax);  // One write every page.
+  }
+#endif  // WIN32
+
   Label load_char_start_regexp, start_regexp;
   // Load newline if index is at start, previous character otherwise.
   __ cmp(Operand(ebp, kStartIndex), Immediate(0));
=======================================
--- /branches/bleeding_edge/src/x64/regexp-macro-assembler-x64.cc Tue May 22 07:05:44 2012 +++ /branches/bleeding_edge/src/x64/regexp-macro-assembler-x64.cc Tue May 22 08:30:08 2012
@@ -855,6 +855,18 @@
   // position registers.
   __ movq(Operand(rbp, kInputStartMinusOne), rax);

+#ifdef WIN32
+ // Ensure that we have written to each stack page, in order. Skipping a page
+  // on Windows can cause segmentation faults. Assuming page size is 4k.
+  const int kPageSize = 4096;
+  const int kRegistersPerPage = kPageSize / kPointerSize;
+  for (int i = num_saved_registers_ + kRegistersPerPage - 1;
+      i < num_registers_;
+      i += kRegistersPerPage) {
+    __ movq(register_location(i), rax);  // One write every page.
+  }
+#endif  // WIN32
+
   // Initialize code object pointer.
   __ Move(code_object_pointer(), masm_.CodeObject());

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

Reply via email to