Index: runtime/vm/assembler_x64.cc |
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc |
index fcab5eafb922677ce26acc847fd68ac7d4211bf3..bbfee1f7578f2ed00a5a2a1348fc18e6536ca644 100644 |
--- a/runtime/vm/assembler_x64.cc |
+++ b/runtime/vm/assembler_x64.cc |
@@ -17,6 +17,7 @@ |
namespace dart { |
+DECLARE_FLAG(bool, allow_absolute_addresses); |
DEFINE_FLAG(bool, print_stop_message, true, "Print stop message."); |
DECLARE_FLAG(bool, inline_alloc); |
@@ -2818,6 +2819,7 @@ void Assembler::LoadObjectHelper(Register dst, |
LoadWordFromPoolOffset(dst, offset - kHeapObjectTag); |
} else { |
ASSERT(object.IsSmi() || object.InVMHeap()); |
+ ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); |
LoadImmediate(dst, Immediate(reinterpret_cast<int64_t>(object.raw()))); |
} |
} |
@@ -2852,6 +2854,7 @@ void Assembler::StoreObject(const Address& dst, const Object& object) { |
LoadObject(TMP, object); |
movq(dst, TMP); |
} else { |
+ ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); |
MoveImmediate(dst, Immediate(reinterpret_cast<int64_t>(object.raw()))); |
} |
} |
@@ -2864,6 +2867,7 @@ void Assembler::PushObject(const Object& object) { |
LoadObject(TMP, object); |
pushq(TMP); |
} else { |
+ ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); |
PushImmediate(Immediate(reinterpret_cast<int64_t>(object.raw()))); |
} |
} |
@@ -2877,6 +2881,7 @@ void Assembler::CompareObject(Register reg, const Object& object) { |
ObjectPool::element_offset(object_pool_wrapper_.FindObject(object)); |
cmpq(reg, Address(PP, offset-kHeapObjectTag)); |
} else { |
+ ASSERT(object.IsSmi() || FLAG_allow_absolute_addresses); |
CompareImmediate( |
reg, Immediate(reinterpret_cast<int64_t>(object.raw()))); |
} |
@@ -3026,7 +3031,9 @@ void Assembler::VerifyUninitialized(const Address& dest) { |
#else |
#error Only supported in DEBUG mode |
#endif |
- cmpq(dest, Immediate(reinterpret_cast<uint64_t>(Object::null()))); |
+ // Is TMP available here or do we need a memory-memory comparison? |
+ LoadObject(TMP, Object::null_object()); |
Florian Schneider
2015/09/11 13:42:40
TMP should be only used inside the Assembler, so I
|
+ cmpq(dest, TMP); |
j(EQUAL, &ok, Assembler::kNearJump); |
static const bool kFixedLengthEncoding = true; |
Stop("Expected zapped, Smi or null", kFixedLengthEncoding); |
@@ -3444,6 +3451,7 @@ void Assembler::MaybeTraceAllocation(intptr_t cid, |
intptr_t state_offset = ClassTable::StateOffsetFor(cid); |
Register temp_reg = TMP; |
if (inline_isolate) { |
+ ASSERT(FLAG_allow_absolute_addresses); |
ClassTable* class_table = Isolate::Current()->class_table(); |
ClassHeapStats** table_ptr = class_table->TableAddressFor(cid); |
if (cid < kNumPredefinedCids) { |
@@ -3474,6 +3482,7 @@ void Assembler::UpdateAllocationStats(intptr_t cid, |
ClassTable::CounterOffsetFor(cid, space == Heap::kNew); |
Register temp_reg = TMP; |
if (inline_isolate) { |
+ ASSERT(FLAG_allow_absolute_addresses); |
ClassTable* class_table = Isolate::Current()->class_table(); |
ClassHeapStats** table_ptr = class_table->TableAddressFor(cid); |
if (cid < kNumPredefinedCids) { |