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

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

Issue 2451853002: Uniform and precise source positions for inlining (Closed)
Patch Set: addressed comments 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 362 matching lines...) Expand 10 before | Expand all | Expand 10 after
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;
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)
vogelheim 2016/11/07 17:53:27 style nitpick: use if with braces, if it extends t
517 return Handle<PodArray<InliningPosition>>::cast(
518 info->isolate()->factory()->empty_byte_array());
519 Handle<PodArray<InliningPosition>> inl_positions =
520 PodArray<InliningPosition>::New(
521 info->isolate(), static_cast<int>(inlined_functions.size()), TENURED);
522 for (int i = 0; i < inlined_functions.size(); ++i) {
523 inl_positions->set(i, inlined_functions[i].position);
524 }
525 return inl_positions;
526 }
527
528 } // namespace
519 529
520 void CodeGenerator::PopulateDeoptimizationData(Handle<Code> code_object) { 530 void CodeGenerator::PopulateDeoptimizationData(Handle<Code> code_object) {
521 CompilationInfo* info = this->info(); 531 CompilationInfo* info = this->info();
522 int deopt_count = static_cast<int>(deoptimization_states_.size()); 532 int deopt_count = static_cast<int>(deoptimization_states_.size());
523 if (deopt_count == 0 && !info->is_osr()) return; 533 if (deopt_count == 0 && !info->is_osr()) return;
524 Handle<DeoptimizationInputData> data = 534 Handle<DeoptimizationInputData> data =
525 DeoptimizationInputData::New(isolate(), deopt_count, TENURED); 535 DeoptimizationInputData::New(isolate(), deopt_count, TENURED);
526 536
527 Handle<ByteArray> translation_array = 537 Handle<ByteArray> translation_array =
528 translations_.CreateByteArray(isolate()->factory()); 538 translations_.CreateByteArray(isolate()->factory());
(...skipping 12 matching lines...) Expand all
541 Handle<FixedArray> literals = isolate()->factory()->NewFixedArray( 551 Handle<FixedArray> literals = isolate()->factory()->NewFixedArray(
542 static_cast<int>(deoptimization_literals_.size()), TENURED); 552 static_cast<int>(deoptimization_literals_.size()), TENURED);
543 { 553 {
544 AllowDeferredHandleDereference copy_handles; 554 AllowDeferredHandleDereference copy_handles;
545 for (unsigned i = 0; i < deoptimization_literals_.size(); i++) { 555 for (unsigned i = 0; i < deoptimization_literals_.size(); i++) {
546 literals->set(i, *deoptimization_literals_[i]); 556 literals->set(i, *deoptimization_literals_[i]);
547 } 557 }
548 data->SetLiteralArray(*literals); 558 data->SetLiteralArray(*literals);
549 } 559 }
550 560
561 data->SetInliningPositions(*CreateInliningPositions(info));
562
551 if (info->is_osr()) { 563 if (info->is_osr()) {
552 DCHECK(osr_pc_offset_ >= 0); 564 DCHECK(osr_pc_offset_ >= 0);
553 data->SetOsrAstId(Smi::FromInt(info_->osr_ast_id().ToInt())); 565 data->SetOsrAstId(Smi::FromInt(info_->osr_ast_id().ToInt()));
554 data->SetOsrPcOffset(Smi::FromInt(osr_pc_offset_)); 566 data->SetOsrPcOffset(Smi::FromInt(osr_pc_offset_));
555 } else { 567 } else {
556 BailoutId osr_ast_id = BailoutId::None(); 568 BailoutId osr_ast_id = BailoutId::None();
557 data->SetOsrAstId(Smi::FromInt(osr_ast_id.ToInt())); 569 data->SetOsrAstId(Smi::FromInt(osr_ast_id.ToInt()));
558 data->SetOsrPcOffset(Smi::FromInt(-1)); 570 data->SetOsrPcOffset(Smi::FromInt(-1));
559 } 571 }
560 572
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
935 : frame_(gen->frame()), masm_(gen->masm()), next_(gen->ools_) { 947 : frame_(gen->frame()), masm_(gen->masm()), next_(gen->ools_) {
936 gen->ools_ = this; 948 gen->ools_ = this;
937 } 949 }
938 950
939 951
940 OutOfLineCode::~OutOfLineCode() {} 952 OutOfLineCode::~OutOfLineCode() {}
941 953
942 } // namespace compiler 954 } // namespace compiler
943 } // namespace internal 955 } // namespace internal
944 } // namespace v8 956 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698