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