Index: runtime/vm/assembler_ia32.cc |
=================================================================== |
--- runtime/vm/assembler_ia32.cc (revision 33158) |
+++ runtime/vm/assembler_ia32.cc (working copy) |
@@ -2331,21 +2331,35 @@ |
} |
+static void ComputeCounterAddressesForCid(intptr_t cid, |
+ Heap::Space space, |
+ Address* count_address, |
+ Address* size_address) { |
+ ASSERT(cid < kNumPredefinedCids); |
+ Isolate* isolate = Isolate::Current(); |
+ ClassTable* class_table = isolate->class_table(); |
+ const uword class_heap_stats_table_address = |
+ class_table->PredefinedClassHeapStatsTableAddress(); |
+ const uword class_offset = cid * sizeof(ClassHeapStats); // NOLINT |
+ const uword count_field_offset = (space == Heap::kNew) ? |
+ ClassHeapStats::allocated_since_gc_new_space_offset() : |
+ ClassHeapStats::allocated_since_gc_old_space_offset(); |
+ const uword size_field_offset = (space == Heap::kNew) ? |
+ ClassHeapStats::allocated_size_since_gc_new_space_offset() : |
+ ClassHeapStats::allocated_size_since_gc_old_space_offset(); |
+ *count_address = Address::Absolute( |
+ class_heap_stats_table_address + class_offset + count_field_offset); |
+ *size_address = Address::Absolute( |
+ class_heap_stats_table_address + class_offset + size_field_offset); |
+} |
+ |
srdjan
2014/03/03 18:30:08
Two lines between functions.
|
void Assembler::UpdateAllocationStats(intptr_t cid, |
Register temp_reg, |
Heap::Space space) { |
ASSERT(cid > 0); |
- Isolate* isolate = Isolate::Current(); |
- ClassTable* class_table = isolate->class_table(); |
if (cid < kNumPredefinedCids) { |
- const uword class_heap_stats_table_address = |
- class_table->PredefinedClassHeapStatsTableAddress(); |
- const uword class_offset = cid * sizeof(ClassHeapStats); // NOLINT |
- const uword count_field_offset = (space == Heap::kNew) ? |
- ClassHeapStats::allocated_since_gc_new_space_offset() : |
- ClassHeapStats::allocated_since_gc_old_space_offset(); |
- const Address& count_address = Address::Absolute( |
- class_heap_stats_table_address + class_offset + count_field_offset); |
+ Address count_address(kNoRegister, 0), size_address(kNoRegister, 0); |
+ ComputeCounterAddressesForCid(cid, space, &count_address, &size_address); |
incl(count_address); |
} else { |
ASSERT(temp_reg != kNoRegister); |
@@ -2354,6 +2368,7 @@ |
ClassHeapStats::allocated_since_gc_new_space_offset() : |
ClassHeapStats::allocated_since_gc_old_space_offset(); |
// temp_reg gets address of class table pointer. |
+ ClassTable* class_table = Isolate::Current()->class_table(); |
movl(temp_reg, Address::Absolute(class_table->ClassStatsTableAddress())); |
// Increment allocation count. |
incl(Address(temp_reg, class_offset + count_field_offset)); |
@@ -2366,42 +2381,27 @@ |
Register temp_reg, |
Heap::Space space) { |
ASSERT(cid > 0); |
- Isolate* isolate = Isolate::Current(); |
- ClassTable* class_table = isolate->class_table(); |
- if (cid < kNumPredefinedCids) { |
- const uword class_heap_stats_table_address = |
- class_table->PredefinedClassHeapStatsTableAddress(); |
- const uword class_offset = cid * sizeof(ClassHeapStats); // NOLINT |
- const uword count_field_offset = (space == Heap::kNew) ? |
- ClassHeapStats::allocated_since_gc_new_space_offset() : |
- ClassHeapStats::allocated_since_gc_old_space_offset(); |
- const uword size_field_offset = (space == Heap::kNew) ? |
- ClassHeapStats::allocated_size_since_gc_new_space_offset() : |
- ClassHeapStats::allocated_size_since_gc_old_space_offset(); |
- const Address& count_address = Address::Absolute( |
- class_heap_stats_table_address + class_offset + count_field_offset); |
- const Address& size_address = Address::Absolute( |
- class_heap_stats_table_address + class_offset + size_field_offset); |
- incl(count_address); |
- addl(size_address, size_reg); |
- } else { |
- ASSERT(temp_reg != kNoRegister); |
- const uword class_offset = cid * sizeof(ClassHeapStats); // NOLINT |
- const uword count_field_offset = (space == Heap::kNew) ? |
- ClassHeapStats::allocated_since_gc_new_space_offset() : |
- ClassHeapStats::allocated_since_gc_old_space_offset(); |
- const uword size_field_offset = (space == Heap::kNew) ? |
- ClassHeapStats::allocated_size_since_gc_new_space_offset() : |
- ClassHeapStats::allocated_size_since_gc_old_space_offset(); |
- // temp_reg gets address of class table pointer. |
- movl(temp_reg, Address::Absolute(class_table->ClassStatsTableAddress())); |
- // Increment allocation count. |
- incl(Address(temp_reg, class_offset + count_field_offset)); |
- addl(Address(temp_reg, class_offset + size_field_offset), size_reg); |
- } |
+ ASSERT(cid < kNumPredefinedCids); |
+ Address count_address(kNoRegister, 0), size_address(kNoRegister, 0); |
+ ComputeCounterAddressesForCid(cid, space, &count_address, &size_address); |
+ incl(count_address); |
+ addl(size_address, size_reg); |
} |
+void Assembler::UpdateAllocationStatsWithSize(intptr_t cid, |
+ intptr_t size_in_bytes, |
+ Register temp_reg, |
+ Heap::Space space) { |
+ ASSERT(cid > 0); |
+ ASSERT(cid < kNumPredefinedCids); |
+ Address count_address(kNoRegister, 0), size_address(kNoRegister, 0); |
+ ComputeCounterAddressesForCid(cid, space, &count_address, &size_address); |
+ incl(count_address); |
+ addl(size_address, Immediate(size_in_bytes)); |
+} |
+ |
+ |
void Assembler::TryAllocate(const Class& cls, |
Label* failure, |
bool near_jump, |