Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1139)

Side by Side Diff: src/crankshaft/lithium.cc

Issue 1555743003: [turbofan] Port Crankshaft's weak objects mechanism to TurboFan. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/crankshaft/lithium.h ('k') | src/objects-inl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/crankshaft/lithium.h" 5 #include "src/crankshaft/lithium.h"
6 6
7 #include "src/ast/scopes.h" 7 #include "src/ast/scopes.h"
8 8
9 #if V8_TARGET_ARCH_IA32 9 #if V8_TARGET_ARCH_IA32
10 #include "src/crankshaft/ia32/lithium-ia32.h" // NOLINT 10 #include "src/crankshaft/ia32/lithium-ia32.h" // NOLINT
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 return HConstant::cast(graph_->LookupValue(operand->index())); 399 return HConstant::cast(graph_->LookupValue(operand->index()));
400 } 400 }
401 401
402 402
403 Representation LChunk::LookupLiteralRepresentation( 403 Representation LChunk::LookupLiteralRepresentation(
404 LConstantOperand* operand) const { 404 LConstantOperand* operand) const {
405 return graph_->LookupValue(operand->index())->representation(); 405 return graph_->LookupValue(operand->index())->representation();
406 } 406 }
407 407
408 408
409 static void AddWeakObjectToCodeDependency(Isolate* isolate,
410 Handle<HeapObject> object,
411 Handle<Code> code) {
412 Handle<WeakCell> cell = Code::WeakCellFor(code);
413 Heap* heap = isolate->heap();
414 Handle<DependentCode> dep(heap->LookupWeakObjectToCodeDependency(object));
415 dep = DependentCode::InsertWeakCode(dep, DependentCode::kWeakCodeGroup, cell);
416 heap->AddWeakObjectToCodeDependency(object, dep);
417 }
418
419
420 void LChunk::RegisterWeakObjectsInOptimizedCode(Handle<Code> code) const {
421 DCHECK(code->is_optimized_code());
422 ZoneList<Handle<Map> > maps(1, zone());
423 ZoneList<Handle<HeapObject> > objects(1, zone());
424 int mode_mask = RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
425 RelocInfo::ModeMask(RelocInfo::CELL);
426 for (RelocIterator it(*code, mode_mask); !it.done(); it.next()) {
427 RelocInfo::Mode mode = it.rinfo()->rmode();
428 if (mode == RelocInfo::CELL &&
429 code->IsWeakObjectInOptimizedCode(it.rinfo()->target_cell())) {
430 objects.Add(Handle<HeapObject>(it.rinfo()->target_cell()), zone());
431 } else if (mode == RelocInfo::EMBEDDED_OBJECT &&
432 code->IsWeakObjectInOptimizedCode(it.rinfo()->target_object())) {
433 if (it.rinfo()->target_object()->IsMap()) {
434 Handle<Map> map(Map::cast(it.rinfo()->target_object()));
435 maps.Add(map, zone());
436 } else {
437 Handle<HeapObject> object(
438 HeapObject::cast(it.rinfo()->target_object()));
439 objects.Add(object, zone());
440 }
441 }
442 }
443 for (int i = 0; i < maps.length(); i++) {
444 if (maps.at(i)->dependent_code()->IsEmpty(DependentCode::kWeakCodeGroup)) {
445 isolate()->heap()->AddRetainedMap(maps.at(i));
446 }
447 Map::AddDependentCode(maps.at(i), DependentCode::kWeakCodeGroup, code);
448 }
449 for (int i = 0; i < objects.length(); i++) {
450 AddWeakObjectToCodeDependency(isolate(), objects.at(i), code);
451 }
452 code->set_can_have_weak_objects(true);
453 }
454
455
456 void LChunk::CommitDependencies(Handle<Code> code) const { 409 void LChunk::CommitDependencies(Handle<Code> code) const {
457 if (!code->is_optimized_code()) return; 410 if (!code->is_optimized_code()) return;
458 HandleScope scope(isolate()); 411 HandleScope scope(isolate());
459 412
460 for (Handle<Map> map : deprecation_dependencies_) { 413 for (Handle<Map> map : deprecation_dependencies_) {
461 DCHECK(!map->is_deprecated()); 414 DCHECK(!map->is_deprecated());
462 DCHECK(map->CanBeDeprecated()); 415 DCHECK(map->CanBeDeprecated());
463 Map::AddDependentCode(map, DependentCode::kTransitionGroup, code); 416 Map::AddDependentCode(map, DependentCode::kTransitionGroup, code);
464 } 417 }
465 418
466 for (Handle<Map> map : stability_dependencies_) { 419 for (Handle<Map> map : stability_dependencies_) {
467 DCHECK(map->is_stable()); 420 DCHECK(map->is_stable());
468 DCHECK(map->CanTransition()); 421 DCHECK(map->CanTransition());
469 Map::AddDependentCode(map, DependentCode::kPrototypeCheckGroup, code); 422 Map::AddDependentCode(map, DependentCode::kPrototypeCheckGroup, code);
470 } 423 }
471 424
472 info_->dependencies()->Commit(code); 425 info_->dependencies()->Commit(code);
473 RegisterWeakObjectsInOptimizedCode(code);
474 } 426 }
475 427
476 428
477 LChunk* LChunk::NewChunk(HGraph* graph) { 429 LChunk* LChunk::NewChunk(HGraph* graph) {
478 DisallowHandleAllocation no_handles; 430 DisallowHandleAllocation no_handles;
479 DisallowHeapAllocation no_gc; 431 DisallowHeapAllocation no_gc;
480 graph->DisallowAddingNewValues(); 432 graph->DisallowAddingNewValues();
481 int values = graph->GetMaximumValueID(); 433 int values = graph->GetMaximumValueID();
482 CompilationInfo* info = graph->info(); 434 CompilationInfo* info = graph->info();
483 if (values > LUnallocated::kMaxVirtualRegisters) { 435 if (values > LUnallocated::kMaxVirtualRegisters) {
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 657
706 LPhase::~LPhase() { 658 LPhase::~LPhase() {
707 if (ShouldProduceTraceOutput()) { 659 if (ShouldProduceTraceOutput()) {
708 isolate()->GetHTracer()->TraceLithium(name(), chunk_); 660 isolate()->GetHTracer()->TraceLithium(name(), chunk_);
709 } 661 }
710 } 662 }
711 663
712 664
713 } // namespace internal 665 } // namespace internal
714 } // namespace v8 666 } // namespace v8
OLDNEW
« no previous file with comments | « src/crankshaft/lithium.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698