From eabf5c89a9e44e710ff333ab21304627bd1e24c5 Mon Sep 17 00:00:00 2001 From: "sgjesse@chromium.org" Date: Fri, 4 Dec 2009 10:22:41 +0000 Subject: [PATCH] Add alignment check to object allocated in generated code for x64 and ARM Review URL: http://codereview.chromium.org/460068 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3418 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/macro-assembler-arm.cc | 23 +++++++++++++++-------- src/ia32/macro-assembler-ia32.cc | 2 +- src/x64/macro-assembler-x64.cc | 9 +++++++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index e56ac6e..aa6570c 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -794,15 +794,13 @@ void MacroAssembler::AllocateInNewSpace(int object_size, mov(scratch1, Operand(new_space_allocation_top)); if ((flags & RESULT_CONTAINS_TOP) == 0) { ldr(result, MemOperand(scratch1)); - } else { -#ifdef DEBUG + } else if (FLAG_debug_code) { // Assert that result actually contains top on entry. scratch2 is used // immediately below so this use of scratch2 does not cause difference with // respect to register content between debug and release mode. ldr(scratch2, MemOperand(scratch1)); cmp(result, scratch2); Check(eq, "Unexpected allocation top"); -#endif } // Calculate new top and bail out if new space is exhausted. Use result @@ -815,7 +813,11 @@ void MacroAssembler::AllocateInNewSpace(int object_size, cmp(result, Operand(scratch2)); b(hi, gc_required); - // Update allocation top. result temporarily holds the new top, + // Update allocation top. result temporarily holds the new top. + if (FLAG_debug_code) { + tst(result, Operand(kObjectAlignmentMask)); + Check(eq, "Unaligned allocation in new space"); + } str(result, MemOperand(scratch1)); // Tag and adjust back to start of new object. @@ -844,15 +846,13 @@ void MacroAssembler::AllocateInNewSpace(Register object_size, mov(scratch1, Operand(new_space_allocation_top)); if ((flags & RESULT_CONTAINS_TOP) == 0) { ldr(result, MemOperand(scratch1)); - } else { -#ifdef DEBUG + } else if (FLAG_debug_code) { // Assert that result actually contains top on entry. scratch2 is used // immediately below so this use of scratch2 does not cause difference with // respect to register content between debug and release mode. ldr(scratch2, MemOperand(scratch1)); cmp(result, scratch2); Check(eq, "Unexpected allocation top"); -#endif } // Calculate new top and bail out if new space is exhausted. Use result @@ -866,7 +866,11 @@ void MacroAssembler::AllocateInNewSpace(Register object_size, cmp(result, Operand(scratch2)); b(hi, gc_required); - // Update allocation top. result temporarily holds the new top, + // Update allocation top. result temporarily holds the new top. + if (FLAG_debug_code) { + tst(result, Operand(kObjectAlignmentMask)); + Check(eq, "Unaligned allocation in new space"); + } str(result, MemOperand(scratch1)); // Adjust back to start of new object. @@ -1162,6 +1166,9 @@ void MacroAssembler::Abort(const char* msg) { RecordComment(msg); } #endif + // Disable stub call restrictions to always allow calls to abort. + set_allow_stub_calls(true); + mov(r0, Operand(p0)); push(r0); mov(r0, Operand(Smi::FromInt(p1 - p0))); diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc index 1ffab32..b91caa8 100644 --- a/src/ia32/macro-assembler-ia32.cc +++ b/src/ia32/macro-assembler-ia32.cc @@ -1393,7 +1393,7 @@ void MacroAssembler::Abort(const char* msg) { RecordComment(msg); } #endif - // Disable stub call restrictions to always allow cals to abort. + // Disable stub call restrictions to always allow calls to abort. set_allow_stub_calls(true); push(eax); diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc index 16bb7b6..7115791 100644 --- a/src/x64/macro-assembler-x64.cc +++ b/src/x64/macro-assembler-x64.cc @@ -288,6 +288,9 @@ void MacroAssembler::Abort(const char* msg) { RecordComment(msg); } #endif + // Disable stub call restrictions to always allow calls to abort. + set_allow_stub_calls(true); + push(rax); movq(kScratchRegister, p0, RelocInfo::NONE); push(kScratchRegister); @@ -297,6 +300,7 @@ void MacroAssembler::Abort(const char* msg) { push(kScratchRegister); CallRuntime(Runtime::kAbort, 2); // will not return here + int3(); } @@ -2094,6 +2098,11 @@ void MacroAssembler::LoadAllocationTopHelper(Register result, void MacroAssembler::UpdateAllocationTopHelper(Register result_end, Register scratch) { + if (FLAG_debug_code) { + testq(result_end, Immediate(kObjectAlignmentMask)); + Check(zero, "Unaligned allocation in new space"); + } + ExternalReference new_space_allocation_top = ExternalReference::new_space_allocation_top_address(); -- 2.7.4