Index: runtime/vm/assembler_ia32.cc |
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc |
index 6f798e0e0530ccf634745ce6eb9ed9619e31709d..f9e4c1ee3e03927756bba4bdf284b2953df871ad 100644 |
--- a/runtime/vm/assembler_ia32.cc |
+++ b/runtime/vm/assembler_ia32.cc |
@@ -14,7 +14,6 @@ |
#include "vm/runtime_entry.h" |
#include "vm/stack_frame.h" |
#include "vm/stub_code.h" |
-#include "vm/verified_memory.h" |
namespace dart { |
@@ -1998,9 +1997,6 @@ void Assembler::hlt() { |
void Assembler::j(Condition condition, Label* label, bool near) { |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
- if (VerifiedMemory::enabled()) { |
- near = Assembler::kFarJump; |
- } |
if (label->IsBound()) { |
static const int kShortSize = 2; |
static const int kLongSize = 6; |
@@ -2043,9 +2039,6 @@ void Assembler::jmp(Register reg) { |
void Assembler::jmp(Label* label, bool near) { |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
- if (VerifiedMemory::enabled()) { |
- near = Assembler::kFarJump; |
- } |
if (label->IsBound()) { |
static const int kShortSize = 2; |
static const int kLongSize = 5; |
@@ -2266,105 +2259,13 @@ void Assembler::StoreIntoObjectFilter(Register object, |
} |
-void Assembler::VerifyHeapWord(const Address& address, |
- FieldContent old_content) { |
-#if defined(DEBUG) |
- switch (old_content) { |
- case kEmptyOrSmiOrNull: |
- VerifyUninitialized(address); |
- break; |
- case kHeapObjectOrSmi: |
- VerifyObjectOrSmi(address); |
- break; |
- case kOnlySmi: |
- VerifySmi(address); |
- break; |
- } |
-#endif // DEBUG |
- if (VerifiedMemory::enabled()) { |
- Register addr_reg = EDX; |
- Register value = EBX; |
- // Preserve registers. |
- pushl(addr_reg); |
- pushl(value); |
- leal(addr_reg, address); |
- // ASSERT(*address == *(address + offset)) |
- movl(value, Address(addr_reg, 0)); |
- cmpl(value, Address(addr_reg, VerifiedMemory::offset())); |
- Label ok; |
- j(EQUAL, &ok, Assembler::kNearJump); |
- Stop("Write barrier verification failed"); |
- Bind(&ok); |
- popl(value); |
- popl(addr_reg); |
- } |
-} |
- |
- |
-void Assembler::VerifiedWrite(const Address& dest, |
- Register value, |
- FieldContent old_content) { |
- VerifyHeapWord(dest, old_content); |
- movl(dest, value); |
- if (VerifiedMemory::enabled()) { |
- Register temp = (value == EDX) ? ECX : EDX; |
- pushl(temp); |
- leal(temp, dest); |
- movl(Address(temp, VerifiedMemory::offset()), value); |
- popl(temp); |
- } |
-} |
- |
- |
-#if defined(DEBUG) |
-void Assembler::VerifyObjectOrSmi(const Address& dest) { |
- Label ok; |
- testb(dest, Immediate(kHeapObjectTag)); |
- j(ZERO, &ok, Assembler::kNearJump); |
- // Non-smi case: Verify object pointer is word-aligned when untagged. |
- COMPILE_ASSERT(kHeapObjectTag == 1); |
- testb(dest, Immediate((kWordSize - 1) - kHeapObjectTag)); |
- j(ZERO, &ok, Assembler::kNearJump); |
- Stop("Expected heap object or Smi"); |
- Bind(&ok); |
-} |
- |
- |
-void Assembler::VerifyUninitialized(const Address& dest) { |
- Label ok; |
- testb(dest, Immediate(kHeapObjectTag)); |
- j(ZERO, &ok, Assembler::kNearJump); |
- // Non-smi case: Check for the special zap word or null. |
-#if defined(DEBUG) |
- cmpl(dest, Immediate(Heap::kZap32Bits)); |
- j(EQUAL, &ok, Assembler::kNearJump); |
-#else |
-#error Only supported in DEBUG mode |
-#endif |
- cmpl(dest, Immediate(reinterpret_cast<uint32_t>(Object::null()))); |
- j(EQUAL, &ok, Assembler::kNearJump); |
- Stop("Expected zapped, Smi or null"); |
- Bind(&ok); |
-} |
- |
- |
-void Assembler::VerifySmi(const Address& dest, const char* stop_msg) { |
- Label done; |
- testb(dest, Immediate(kHeapObjectTag)); |
- j(ZERO, &done, Assembler::kNearJump); |
- Stop(stop_msg); |
- Bind(&done); |
-} |
-#endif // defined(DEBUG) |
- |
- |
// Destroys the value register. |
void Assembler::StoreIntoObject(Register object, |
const Address& dest, |
Register value, |
bool can_value_be_smi) { |
ASSERT(object != value); |
- VerifiedWrite(dest, value, kHeapObjectOrSmi); |
+ movl(dest, value); |
Label done; |
if (can_value_be_smi) { |
StoreIntoObjectFilter(object, value, &done); |
@@ -2388,9 +2289,8 @@ void Assembler::StoreIntoObject(Register object, |
void Assembler::StoreIntoObjectNoBarrier(Register object, |
const Address& dest, |
- Register value, |
- FieldContent old_content) { |
- VerifiedWrite(dest, value, old_content); |
+ Register value) { |
+ movl(dest, value); |
#if defined(DEBUG) |
Label done; |
pushl(value); |
@@ -2418,30 +2318,14 @@ void Assembler::UnverifiedStoreOldObject(const Address& dest, |
void Assembler::StoreIntoObjectNoBarrier(Register object, |
const Address& dest, |
- const Object& value, |
- FieldContent old_content) { |
+ const Object& value) { |
ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal()); |
ASSERT(!value.IsField() || Field::Cast(value).IsOriginal()); |
- VerifyHeapWord(dest, old_content); |
if (value.IsSmi() || value.InVMHeap()) { |
Immediate imm_value(reinterpret_cast<int32_t>(value.raw())); |
movl(dest, imm_value); |
- if (VerifiedMemory::enabled()) { |
- Register temp = ECX; |
- pushl(temp); |
- leal(temp, dest); |
- movl(Address(temp, VerifiedMemory::offset()), imm_value); |
- popl(temp); |
- } |
} else { |
UnverifiedStoreOldObject(dest, value); |
- if (VerifiedMemory::enabled()) { |
- Register temp = EDX; |
- pushl(temp); |
- leal(temp, dest); |
- UnverifiedStoreOldObject(Address(temp, VerifiedMemory::offset()), value); |
- popl(temp); |
- } |
} |
// No store buffer update. |
} |
@@ -2455,37 +2339,21 @@ void Assembler::StoreIntoSmiField(const Address& dest, Register value) { |
Stop("New value must be Smi."); |
Bind(&done); |
#endif // defined(DEBUG) |
- VerifiedWrite(dest, value, kOnlySmi); |
+ movl(dest, value); |
} |
void Assembler::ZeroInitSmiField(const Address& dest) { |
- VerifyHeapWord(dest, kEmptyOrSmiOrNull); |
Immediate zero(Smi::RawValue(0)); |
movl(dest, zero); |
- if (VerifiedMemory::enabled()) { |
- Register temp = ECX; |
- pushl(temp); |
- leal(temp, dest); |
- movl(Address(temp, VerifiedMemory::offset()), zero); |
- popl(temp); |
- } |
} |
void Assembler::IncrementSmiField(const Address& dest, int32_t increment) { |
// Note: FlowGraphCompiler::EdgeCounterIncrementSizeInBytes depends on |
// the length of this instruction sequence. |
- VerifyHeapWord(dest, kOnlySmi); |
Immediate inc_imm(Smi::RawValue(increment)); |
addl(dest, inc_imm); |
- if (VerifiedMemory::enabled()) { |
- Register temp = ECX; |
- pushl(temp); |
- leal(temp, dest); |
- addl(Address(temp, VerifiedMemory::offset()), inc_imm); |
- popl(temp); |
- } |
} |