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

Side by Side Diff: src/compiler/code-generator.cc

Issue 2451853002: Uniform and precise source positions for inlining (Closed)
Patch Set: fixed gcmole issue Created 4 years, 1 month 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
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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/compiler/code-generator.h" 5 #include "src/compiler/code-generator.h"
6 6
7 #include "src/address-map.h" 7 #include "src/address-map.h"
8 #include "src/base/adapters.h" 8 #include "src/base/adapters.h"
9 #include "src/compilation-info.h" 9 #include "src/compilation-info.h"
10 #include "src/compiler/code-generator-impl.h" 10 #include "src/compiler/code-generator-impl.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 81
82 // Place function entry hook if requested to do so. 82 // Place function entry hook if requested to do so.
83 if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) { 83 if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) {
84 ProfileEntryHookStub::MaybeCallEntryHook(masm()); 84 ProfileEntryHookStub::MaybeCallEntryHook(masm());
85 } 85 }
86 // Architecture-specific, linkage-specific prologue. 86 // Architecture-specific, linkage-specific prologue.
87 info->set_prologue_offset(masm()->pc_offset()); 87 info->set_prologue_offset(masm()->pc_offset());
88 88
89 // Define deoptimization literals for all inlined functions. 89 // Define deoptimization literals for all inlined functions.
90 DCHECK_EQ(0u, deoptimization_literals_.size()); 90 DCHECK_EQ(0u, deoptimization_literals_.size());
91 for (const CompilationInfo::InlinedFunctionHolder& inlined : 91 for (CompilationInfo::InlinedFunctionHolder& inlined :
92 info->inlined_functions()) { 92 info->inlined_functions()) {
93 if (!inlined.shared_info.is_identical_to(info->shared_info())) { 93 if (!inlined.shared_info.is_identical_to(info->shared_info())) {
94 inlined.RegisterInlinedFunctionId(deoptimization_literals_.size());
94 DefineDeoptimizationLiteral(inlined.shared_info); 95 DefineDeoptimizationLiteral(inlined.shared_info);
95 } 96 }
96 } 97 }
97 inlined_function_count_ = deoptimization_literals_.size(); 98 inlined_function_count_ = deoptimization_literals_.size();
98 99
99 // Define deoptimization literals for all unoptimized code objects of inlined 100 // Define deoptimization literals for all unoptimized code objects of inlined
100 // functions. This ensures unoptimized code is kept alive by optimized code. 101 // functions. This ensures unoptimized code is kept alive by optimized code.
101 for (const CompilationInfo::InlinedFunctionHolder& inlined : 102 for (const CompilationInfo::InlinedFunctionHolder& inlined :
102 info->inlined_functions()) { 103 info->inlined_functions()) {
103 if (!inlined.shared_info.is_identical_to(info->shared_info())) { 104 if (!inlined.shared_info.is_identical_to(info->shared_info())) {
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 } 463 }
463 case kFlags_none: { 464 case kFlags_none: {
464 break; 465 break;
465 } 466 }
466 } 467 }
467 return kSuccess; 468 return kSuccess;
468 } 469 }
469 470
470 471
471 void CodeGenerator::AssembleSourcePosition(Instruction* instr) { 472 void CodeGenerator::AssembleSourcePosition(Instruction* instr) {
472 SourcePosition source_position; 473 SourcePosition source_position = SourcePosition::Unknown();
473 if (!code()->GetSourcePosition(instr, &source_position)) return; 474 if (!code()->GetSourcePosition(instr, &source_position)) return;
474 if (source_position == current_source_position_) return; 475 if (source_position == current_source_position_) return;
475 current_source_position_ = source_position; 476 current_source_position_ = source_position;
476 if (source_position.IsUnknown()) return; 477 if (!source_position.IsKnown()) return;
477 int code_pos = source_position.raw(); 478 source_position_table_builder_.AddPosition(masm()->pc_offset(),
478 source_position_table_builder_.AddPosition(masm()->pc_offset(), code_pos, 479 source_position, false);
479 false);
480 if (FLAG_code_comments) { 480 if (FLAG_code_comments) {
481 CompilationInfo* info = this->info(); 481 CompilationInfo* info = this->info();
482 if (!info->parse_info()) return; 482 if (!info->parse_info()) return;
483 Vector<char> buffer = Vector<char>::New(256); 483 std::ostringstream buffer;
484 int ln = Script::GetLineNumber(info->script(), code_pos); 484 buffer << "-- " << source_position.InliningStack(info) << " --";
485 int cn = Script::GetColumnNumber(info->script(), code_pos); 485 masm()->RecordComment(StrDup(buffer.str().c_str()));
486 if (info->script()->name()->IsString()) {
487 Handle<String> file(String::cast(info->script()->name()));
488 base::OS::SNPrintF(buffer.start(), buffer.length(), "-- %s:%d:%d --",
489 file->ToCString().get(), ln, cn);
490 } else {
491 base::OS::SNPrintF(buffer.start(), buffer.length(),
492 "-- <unknown>:%d:%d --", ln, cn);
493 }
494 masm()->RecordComment(buffer.start());
495 } 486 }
496 } 487 }
497 488
498 bool CodeGenerator::GetSlotAboveSPBeforeTailCall(Instruction* instr, 489 bool CodeGenerator::GetSlotAboveSPBeforeTailCall(Instruction* instr,
499 int* slot) { 490 int* slot) {
500 if (instr->IsTailCall()) { 491 if (instr->IsTailCall()) {
501 InstructionOperandConverter g(this, instr); 492 InstructionOperandConverter g(this, instr);
502 *slot = g.InputInt32(instr->InputCount() - 1); 493 *slot = g.InputInt32(instr->InputCount() - 1);
503 return true; 494 return true;
504 } else { 495 } else {
505 return false; 496 return false;
506 } 497 }
507 } 498 }
508 499
509 void CodeGenerator::AssembleGaps(Instruction* instr) { 500 void CodeGenerator::AssembleGaps(Instruction* instr) {
510 for (int i = Instruction::FIRST_GAP_POSITION; 501 for (int i = Instruction::FIRST_GAP_POSITION;
511 i <= Instruction::LAST_GAP_POSITION; i++) { 502 i <= Instruction::LAST_GAP_POSITION; i++) {
512 Instruction::GapPosition inner_pos = 503 Instruction::GapPosition inner_pos =
513 static_cast<Instruction::GapPosition>(i); 504 static_cast<Instruction::GapPosition>(i);
514 ParallelMove* move = instr->GetParallelMove(inner_pos); 505 ParallelMove* move = instr->GetParallelMove(inner_pos);
515 if (move != nullptr) resolver()->Resolve(move); 506 if (move != nullptr) resolver()->Resolve(move);
516 } 507 }
517 } 508 }
518 509
510 namespace {
511
512 Handle<PodArray<InliningPosition>> CreateInliningPositions(
513 CompilationInfo* info) {
514 const CompilationInfo::InlinedFunctionList& inlined_functions =
515 info->inlined_functions();
516 if (inlined_functions.size() == 0) {
517 return Handle<PodArray<InliningPosition>>::cast(
518 info->isolate()->factory()->empty_byte_array());
519 }
520 Handle<PodArray<InliningPosition>> inl_positions =
521 PodArray<InliningPosition>::New(
522 info->isolate(), static_cast<int>(inlined_functions.size()), TENURED);
523 for (size_t i = 0; i < inlined_functions.size(); ++i) {
524 inl_positions->set(static_cast<int>(i), inlined_functions[i].position);
525 }
526 return inl_positions;
527 }
528
529 } // namespace
519 530
520 void CodeGenerator::PopulateDeoptimizationData(Handle<Code> code_object) { 531 void CodeGenerator::PopulateDeoptimizationData(Handle<Code> code_object) {
521 CompilationInfo* info = this->info(); 532 CompilationInfo* info = this->info();
522 int deopt_count = static_cast<int>(deoptimization_states_.size()); 533 int deopt_count = static_cast<int>(deoptimization_states_.size());
523 if (deopt_count == 0 && !info->is_osr()) return; 534 if (deopt_count == 0 && !info->is_osr()) return;
524 Handle<DeoptimizationInputData> data = 535 Handle<DeoptimizationInputData> data =
525 DeoptimizationInputData::New(isolate(), deopt_count, TENURED); 536 DeoptimizationInputData::New(isolate(), deopt_count, TENURED);
526 537
527 Handle<ByteArray> translation_array = 538 Handle<ByteArray> translation_array =
528 translations_.CreateByteArray(isolate()->factory()); 539 translations_.CreateByteArray(isolate()->factory());
(...skipping 12 matching lines...) Expand all
541 Handle<FixedArray> literals = isolate()->factory()->NewFixedArray( 552 Handle<FixedArray> literals = isolate()->factory()->NewFixedArray(
542 static_cast<int>(deoptimization_literals_.size()), TENURED); 553 static_cast<int>(deoptimization_literals_.size()), TENURED);
543 { 554 {
544 AllowDeferredHandleDereference copy_handles; 555 AllowDeferredHandleDereference copy_handles;
545 for (unsigned i = 0; i < deoptimization_literals_.size(); i++) { 556 for (unsigned i = 0; i < deoptimization_literals_.size(); i++) {
546 literals->set(i, *deoptimization_literals_[i]); 557 literals->set(i, *deoptimization_literals_[i]);
547 } 558 }
548 data->SetLiteralArray(*literals); 559 data->SetLiteralArray(*literals);
549 } 560 }
550 561
562 Handle<PodArray<InliningPosition>> inl_pos = CreateInliningPositions(info);
563 data->SetInliningPositions(*inl_pos);
564
551 if (info->is_osr()) { 565 if (info->is_osr()) {
552 DCHECK(osr_pc_offset_ >= 0); 566 DCHECK(osr_pc_offset_ >= 0);
553 data->SetOsrAstId(Smi::FromInt(info_->osr_ast_id().ToInt())); 567 data->SetOsrAstId(Smi::FromInt(info_->osr_ast_id().ToInt()));
554 data->SetOsrPcOffset(Smi::FromInt(osr_pc_offset_)); 568 data->SetOsrPcOffset(Smi::FromInt(osr_pc_offset_));
555 } else { 569 } else {
556 BailoutId osr_ast_id = BailoutId::None(); 570 BailoutId osr_ast_id = BailoutId::None();
557 data->SetOsrAstId(Smi::FromInt(osr_ast_id.ToInt())); 571 data->SetOsrAstId(Smi::FromInt(osr_ast_id.ToInt()));
558 data->SetOsrPcOffset(Smi::FromInt(-1)); 572 data->SetOsrPcOffset(Smi::FromInt(-1));
559 } 573 }
560 574
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 : frame_(gen->frame()), masm_(gen->masm()), next_(gen->ools_) { 949 : frame_(gen->frame()), masm_(gen->masm()), next_(gen->ools_) {
936 gen->ools_ = this; 950 gen->ools_ = this;
937 } 951 }
938 952
939 953
940 OutOfLineCode::~OutOfLineCode() {} 954 OutOfLineCode::~OutOfLineCode() {}
941 955
942 } // namespace compiler 956 } // namespace compiler
943 } // namespace internal 957 } // namespace internal
944 } // namespace v8 958 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698