From bfbcb3d3fbb5bd816fbcedb1f8690d0d09191ec3 Mon Sep 17 00:00:00 2001 From: mstarzinger Date: Wed, 26 Aug 2015 03:25:19 -0700 Subject: [PATCH] [heap] User safer root set accessor when possible. R=mlippautz@chromium.org Review URL: https://codereview.chromium.org/1312763006 Cr-Commit-Position: refs/heads/master@{#30377} --- src/arm/macro-assembler-arm.cc | 2 +- src/heap/heap.cc | 2 +- src/heap/heap.h | 3 +++ src/ia32/macro-assembler-ia32.cc | 9 +++------ src/objects-debug.cc | 3 ++- src/snapshot/serialize.cc | 13 +++++++------ src/x87/macro-assembler-x87.cc | 9 +++------ 7 files changed, 20 insertions(+), 21 deletions(-) diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc index 5e071d5..5d0347c 100644 --- a/src/arm/macro-assembler-arm.cc +++ b/src/arm/macro-assembler-arm.cc @@ -425,7 +425,7 @@ void MacroAssembler::LoadRoot(Register destination, !predictable_code_size()) { // The CPU supports fast immediate values, and this root will never // change. We will load it as a relocatable immediate value. - Handle root(&isolate()->heap()->roots_array_start()[index]); + Handle root = isolate()->heap()->root_handle(index); mov(destination, Operand(root), LeaveCC, cond); return; } diff --git a/src/heap/heap.cc b/src/heap/heap.cc index b7e0b11..5d67854 100644 --- a/src/heap/heap.cc +++ b/src/heap/heap.cc @@ -3372,7 +3372,7 @@ bool Heap::RootCanBeWrittenAfterInitialization(Heap::RootListIndex root_index) { bool Heap::RootCanBeTreatedAsConstant(RootListIndex root_index) { return !RootCanBeWrittenAfterInitialization(root_index) && - !InNewSpace(roots_array_start()[root_index]); + !InNewSpace(root(root_index)); } diff --git a/src/heap/heap.h b/src/heap/heap.h index 68de80b..254b19f 100644 --- a/src/heap/heap.h +++ b/src/heap/heap.h @@ -1207,6 +1207,9 @@ class Heap { #undef SYMBOL_ACCESSOR Object* root(RootListIndex index) { return roots_[index]; } + Handle root_handle(RootListIndex index) { + return Handle(&roots_[index]); + } // Generated code can embed this address to get access to the roots. Object** roots_array_start() { return roots_; } diff --git a/src/ia32/macro-assembler-ia32.cc b/src/ia32/macro-assembler-ia32.cc index dd624b9..fb0cb33 100644 --- a/src/ia32/macro-assembler-ia32.cc +++ b/src/ia32/macro-assembler-ia32.cc @@ -66,8 +66,7 @@ void MacroAssembler::Store(Register src, const Operand& dst, Representation r) { void MacroAssembler::LoadRoot(Register destination, Heap::RootListIndex index) { if (isolate()->heap()->RootCanBeTreatedAsConstant(index)) { - Handle value(&isolate()->heap()->roots_array_start()[index]); - mov(destination, value); + mov(destination, isolate()->heap()->root_handle(index)); return; } ExternalReference roots_array_start = @@ -105,16 +104,14 @@ void MacroAssembler::CompareRoot(Register with, void MacroAssembler::CompareRoot(Register with, Heap::RootListIndex index) { DCHECK(isolate()->heap()->RootCanBeTreatedAsConstant(index)); - Handle value(&isolate()->heap()->roots_array_start()[index]); - cmp(with, value); + cmp(with, isolate()->heap()->root_handle(index)); } void MacroAssembler::CompareRoot(const Operand& with, Heap::RootListIndex index) { DCHECK(isolate()->heap()->RootCanBeTreatedAsConstant(index)); - Handle value(&isolate()->heap()->roots_array_start()[index]); - cmp(with, value); + cmp(with, isolate()->heap()->root_handle(index)); } diff --git a/src/objects-debug.cc b/src/objects-debug.cc index 93da2ed..961ad51 100644 --- a/src/objects-debug.cc +++ b/src/objects-debug.cc @@ -1236,7 +1236,8 @@ bool CanLeak(Object* obj, Heap* heap, bool skip_weak_cell) { if (obj->IsMap()) { Map* map = Map::cast(obj); for (int i = 0; i < Heap::kStrongRootListLength; i++) { - if (map == heap->roots_array_start()[i]) return false; + Heap::RootListIndex root_index = static_cast(i); + if (map == heap->root(root_index)) return false; } return true; } diff --git a/src/snapshot/serialize.cc b/src/snapshot/serialize.cc index 9097dba..b1bca7b 100644 --- a/src/snapshot/serialize.cc +++ b/src/snapshot/serialize.cc @@ -354,10 +354,9 @@ RootIndexMap::RootIndexMap(Isolate* isolate) { map_ = isolate->root_index_map(); if (map_ != NULL) return; map_ = new HashMap(HashMap::PointersMatch); - Object** root_array = isolate->heap()->roots_array_start(); for (uint32_t i = 0; i < Heap::kStrongRootListLength; i++) { Heap::RootListIndex root_index = static_cast(i); - Object* root = root_array[root_index]; + Object* root = isolate->heap()->root(root_index); // Omit root entries that can be written after initialization. They must // not be referenced through the root list in the snapshot. if (root->IsHeapObject() && @@ -954,8 +953,9 @@ bool Deserializer::ReadData(Object** current, Object** limit, int source_space, emit_write_barrier = (space_number == NEW_SPACE); \ new_object = GetBackReferencedObject(data & kSpaceMask); \ } else if (where == kRootArray) { \ - int root_id = source_.GetInt(); \ - new_object = isolate->heap()->roots_array_start()[root_id]; \ + int id = source_.GetInt(); \ + Heap::RootListIndex root_index = static_cast(id); \ + new_object = isolate->heap()->root(root_index); \ emit_write_barrier = isolate->heap()->InNewSpace(new_object); \ } else if (where == kPartialSnapshotCache) { \ int cache_index = source_.GetInt(); \ @@ -1229,8 +1229,9 @@ bool Deserializer::ReadData(Object** current, Object** limit, int source_space, SIXTEEN_CASES(kRootArrayConstants) SIXTEEN_CASES(kRootArrayConstants + 16) { - int root_id = data & kRootArrayConstantsMask; - Object* object = isolate->heap()->roots_array_start()[root_id]; + int id = data & kRootArrayConstantsMask; + Heap::RootListIndex root_index = static_cast(id); + Object* object = isolate->heap()->root(root_index); DCHECK(!isolate->heap()->InNewSpace(object)); UnalignedCopy(current++, &object); break; diff --git a/src/x87/macro-assembler-x87.cc b/src/x87/macro-assembler-x87.cc index afd983f..925a71e 100644 --- a/src/x87/macro-assembler-x87.cc +++ b/src/x87/macro-assembler-x87.cc @@ -66,8 +66,7 @@ void MacroAssembler::Store(Register src, const Operand& dst, Representation r) { void MacroAssembler::LoadRoot(Register destination, Heap::RootListIndex index) { if (isolate()->heap()->RootCanBeTreatedAsConstant(index)) { - Handle value(&isolate()->heap()->roots_array_start()[index]); - mov(destination, value); + mov(destination, isolate()->heap()->root_handle(index)); return; } ExternalReference roots_array_start = @@ -105,16 +104,14 @@ void MacroAssembler::CompareRoot(Register with, void MacroAssembler::CompareRoot(Register with, Heap::RootListIndex index) { DCHECK(isolate()->heap()->RootCanBeTreatedAsConstant(index)); - Handle value(&isolate()->heap()->roots_array_start()[index]); - cmp(with, value); + cmp(with, isolate()->heap()->root_handle(index)); } void MacroAssembler::CompareRoot(const Operand& with, Heap::RootListIndex index) { DCHECK(isolate()->heap()->RootCanBeTreatedAsConstant(index)); - Handle value(&isolate()->heap()->roots_array_start()[index]); - cmp(with, value); + cmp(with, isolate()->heap()->root_handle(index)); } -- 2.7.4