Revision: 3415
Author: [email protected]
Date: Thu Dec  3 23:43:40 2009
Log: Better handling of allocation alignment in generated code

Calculate the aligned size of strings when allocating from generated code  
using kObjectAlignmentMask

Add native code assert to make sure allocation from generated code keeps  
alignment.
Review URL: http://codereview.chromium.org/462025
http://code.google.com/p/v8/source/detail?r=3415

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

=======================================
--- /branches/bleeding_edge/src/ia32/codegen-ia32.cc    Thu Dec  3 02:24:16  
2009
+++ /branches/bleeding_edge/src/ia32/codegen-ia32.cc    Thu Dec  3 23:43:40  
2009
@@ -7091,7 +7091,7 @@
    switch (op_) {
      case Token::ADD: {
        // Test for string arguments before calling runtime.
-      Label not_strings, both_strings, not_string1, string1;
+      Label not_strings, not_string1, string1;
        Result answer;
        __ mov(eax, Operand(esp, 2 * kPointerSize));  // First argument.
        __ mov(edx, Operand(esp, 1 * kPointerSize));  // Second argument.
=======================================
--- /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc    Wed Dec  2  
23:56:21 2009
+++ /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc    Thu Dec  3  
23:43:40 2009
@@ -687,6 +687,11 @@

  void MacroAssembler::UpdateAllocationTopHelper(Register result_end,
                                                 Register scratch) {
+  if (FLAG_debug_code) {
+    test(result_end, Immediate(kObjectAlignmentMask));
+    Check(zero, "Unaligned allocation in new space");
+  }
+
    ExternalReference new_space_allocation_top =
        ExternalReference::new_space_allocation_top_address();

@@ -826,15 +831,18 @@
                                             Register scratch2,
                                             Register scratch3,
                                             Label* gc_required) {
-  // Calculate the number of words needed for the number of characters in  
the
-  // string
+  // Calculate the number of bytes needed for the characters in the string  
while
+  // observing object alignment.
+  ASSERT((SeqTwoByteString::kHeaderSize & kObjectAlignmentMask) == 0);
    mov(scratch1, length);
-  add(Operand(scratch1), Immediate(1));
-  shr(scratch1, 1);
+  ASSERT(kShortSize == 2);
+  shl(scratch1, 1);
+  add(Operand(scratch1), Immediate(kObjectAlignmentMask));
+  and_(Operand(scratch1), Immediate(~kObjectAlignmentMask));

    // Allocate two byte string in new space.
    AllocateInNewSpace(SeqTwoByteString::kHeaderSize,
-                     times_4,
+                     times_1,
                       scratch1,
                       result,
                       scratch2,
@@ -857,15 +865,17 @@
                                           Register scratch2,
                                           Register scratch3,
                                           Label* gc_required) {
-  // Calculate the number of words needed for the number of characters in  
the
-  // string
+  // Calculate the number of bytes needed for the characters in the string  
while
+  // observing object alignment.
+  ASSERT((SeqAsciiString::kHeaderSize & kObjectAlignmentMask) == 0);
    mov(scratch1, length);
-  add(Operand(scratch1), Immediate(3));
-  shr(scratch1, 2);
+  ASSERT(kCharSize == 1);
+  add(Operand(scratch1), Immediate(kObjectAlignmentMask));
+  and_(Operand(scratch1), Immediate(~kObjectAlignmentMask));

    // Allocate ascii string in new space.
    AllocateInNewSpace(SeqAsciiString::kHeaderSize,
-                     times_4,
+                     times_1,
                       scratch1,
                       result,
                       scratch2,
@@ -1383,11 +1393,15 @@
      RecordComment(msg);
    }
  #endif
+  // Disable stub call restrictions to always allow cals to abort.
+  set_allow_stub_calls(true);
+
    push(eax);
    push(Immediate(p0));
    push(Immediate(reinterpret_cast<intptr_t>(Smi::FromInt(p1 - p0))));
    CallRuntime(Runtime::kAbort, 2);
    // will not return here
+  int3();
  }


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

Reply via email to