diff options
Diffstat (limited to 'deps/v8/src/lithium.cc')
-rw-r--r-- | deps/v8/src/lithium.cc | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/deps/v8/src/lithium.cc b/deps/v8/src/lithium.cc index d57a2dd4ac..c15e9dbee2 100644 --- a/deps/v8/src/lithium.cc +++ b/deps/v8/src/lithium.cc @@ -18,6 +18,9 @@ #elif V8_TARGET_ARCH_ARM #include "src/arm/lithium-arm.h" // NOLINT #include "src/arm/lithium-codegen-arm.h" // NOLINT +#elif V8_TARGET_ARCH_PPC +#include "src/ppc/lithium-ppc.h" // NOLINT +#include "src/ppc/lithium-codegen-ppc.h" // NOLINT #elif V8_TARGET_ARCH_MIPS #include "src/mips/lithium-mips.h" // NOLINT #include "src/mips/lithium-codegen-mips.h" // NOLINT @@ -410,7 +413,58 @@ Representation LChunk::LookupLiteralRepresentation( } +static void AddWeakObjectToCodeDependency(Isolate* isolate, + Handle<HeapObject> object, + Handle<Code> code) { + Handle<WeakCell> cell = Code::WeakCellFor(code); + Heap* heap = isolate->heap(); + Handle<DependentCode> dep(heap->LookupWeakObjectToCodeDependency(object)); + dep = DependentCode::InsertWeakCode(dep, DependentCode::kWeakCodeGroup, cell); + heap->AddWeakObjectToCodeDependency(object, dep); +} + + +void LChunk::RegisterWeakObjectsInOptimizedCode(Handle<Code> code) const { + DCHECK(code->is_optimized_code()); + ZoneList<Handle<Map> > maps(1, zone()); + ZoneList<Handle<HeapObject> > objects(1, zone()); + int mode_mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) | + RelocInfo::ModeMask(RelocInfo::CELL); + for (RelocIterator it(*code, mode_mask); !it.done(); it.next()) { + RelocInfo::Mode mode = it.rinfo()->rmode(); + if (mode == RelocInfo::CELL && + code->IsWeakObjectInOptimizedCode(it.rinfo()->target_cell())) { + objects.Add(Handle<HeapObject>(it.rinfo()->target_cell()), zone()); + } else if (mode == RelocInfo::EMBEDDED_OBJECT && + code->IsWeakObjectInOptimizedCode(it.rinfo()->target_object())) { + if (it.rinfo()->target_object()->IsMap()) { + Handle<Map> map(Map::cast(it.rinfo()->target_object())); + maps.Add(map, zone()); + } else { + Handle<HeapObject> object( + HeapObject::cast(it.rinfo()->target_object())); + objects.Add(object, zone()); + } + } + } + for (int i = 0; i < maps.length(); i++) { + Map::AddDependentCode(maps.at(i), DependentCode::kWeakCodeGroup, code); + } + for (int i = 0; i < objects.length(); i++) { + AddWeakObjectToCodeDependency(isolate(), objects.at(i), code); + } + if (FLAG_enable_ool_constant_pool) { + code->constant_pool()->set_weak_object_state( + ConstantPoolArray::WEAK_OBJECTS_IN_OPTIMIZED_CODE); + } + code->set_can_have_weak_objects(true); +} + + void LChunk::CommitDependencies(Handle<Code> code) const { + if (!code->is_optimized_code()) return; + HandleScope scope(isolate()); + for (MapSet::const_iterator it = deprecation_dependencies_.begin(), iend = deprecation_dependencies_.end(); it != iend; ++it) { Handle<Map> map = *it; @@ -428,6 +482,7 @@ void LChunk::CommitDependencies(Handle<Code> code) const { } info_->CommitDependencies(code); + RegisterWeakObjectsInOptimizedCode(code); } |