OLD | NEW |
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/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
8 #include "src/compiler/linkage.h" | 8 #include "src/compiler/linkage.h" |
9 #include "src/compiler/pipeline.h" | 9 #include "src/compiler/pipeline.h" |
10 | 10 |
(...skipping 27 matching lines...) Expand all Loading... |
38 info_(info), | 38 info_(info), |
39 labels_(zone()->NewArray<Label>(code->InstructionBlockCount())), | 39 labels_(zone()->NewArray<Label>(code->InstructionBlockCount())), |
40 current_block_(RpoNumber::Invalid()), | 40 current_block_(RpoNumber::Invalid()), |
41 current_source_position_(SourcePosition::Unknown()), | 41 current_source_position_(SourcePosition::Unknown()), |
42 masm_(info->isolate(), NULL, 0), | 42 masm_(info->isolate(), NULL, 0), |
43 resolver_(this), | 43 resolver_(this), |
44 safepoints_(code->zone()), | 44 safepoints_(code->zone()), |
45 handlers_(code->zone()), | 45 handlers_(code->zone()), |
46 deoptimization_states_(code->zone()), | 46 deoptimization_states_(code->zone()), |
47 deoptimization_literals_(code->zone()), | 47 deoptimization_literals_(code->zone()), |
| 48 inlined_function_count_(0), |
48 translations_(code->zone()), | 49 translations_(code->zone()), |
49 last_lazy_deopt_pc_(0), | 50 last_lazy_deopt_pc_(0), |
50 jump_tables_(nullptr), | 51 jump_tables_(nullptr), |
51 ools_(nullptr), | 52 ools_(nullptr), |
52 osr_pc_offset_(-1), | 53 osr_pc_offset_(-1), |
53 needs_frame_(frame->GetSpillSlotCount() > 0 || code->ContainsCall()) { | 54 needs_frame_(frame->GetSpillSlotCount() > 0 || code->ContainsCall()) { |
54 for (int i = 0; i < code->InstructionBlockCount(); ++i) { | 55 for (int i = 0; i < code->InstructionBlockCount(); ++i) { |
55 new (&labels_[i]) Label; | 56 new (&labels_[i]) Label; |
56 } | 57 } |
57 } | 58 } |
58 | 59 |
59 | 60 |
60 Handle<Code> CodeGenerator::GenerateCode() { | 61 Handle<Code> CodeGenerator::GenerateCode() { |
61 CompilationInfo* info = this->info(); | 62 CompilationInfo* info = this->info(); |
62 | 63 |
63 // Emit a code line info recording start event. | 64 // Emit a code line info recording start event. |
64 PositionsRecorder* recorder = masm()->positions_recorder(); | 65 PositionsRecorder* recorder = masm()->positions_recorder(); |
65 LOG_CODE_EVENT(isolate(), CodeStartLinePosInfoRecordEvent(recorder)); | 66 LOG_CODE_EVENT(isolate(), CodeStartLinePosInfoRecordEvent(recorder)); |
66 | 67 |
67 // Place function entry hook if requested to do so. | 68 // Place function entry hook if requested to do so. |
68 if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) { | 69 if (linkage()->GetIncomingDescriptor()->IsJSFunctionCall()) { |
69 ProfileEntryHookStub::MaybeCallEntryHook(masm()); | 70 ProfileEntryHookStub::MaybeCallEntryHook(masm()); |
70 } | 71 } |
71 | 72 |
72 // Architecture-specific, linkage-specific prologue. | 73 // Architecture-specific, linkage-specific prologue. |
73 info->set_prologue_offset(masm()->pc_offset()); | 74 info->set_prologue_offset(masm()->pc_offset()); |
74 AssemblePrologue(); | 75 AssemblePrologue(); |
75 | 76 |
| 77 // Define deoptimization literals for all inlined functions. |
| 78 DCHECK_EQ(0u, deoptimization_literals_.size()); |
| 79 for (auto frame_state_descriptor : code()->frame_state_descriptors()) { |
| 80 Handle<SharedFunctionInfo> shared_info; |
| 81 if (frame_state_descriptor->shared_info().ToHandle(&shared_info) && |
| 82 !shared_info.is_identical_to(info->shared_info())) { |
| 83 DefineDeoptimizationLiteral(shared_info); |
| 84 } |
| 85 } |
| 86 inlined_function_count_ = deoptimization_literals_.size(); |
| 87 |
76 // Assemble all non-deferred blocks, followed by deferred ones. | 88 // Assemble all non-deferred blocks, followed by deferred ones. |
77 for (int deferred = 0; deferred < 2; ++deferred) { | 89 for (int deferred = 0; deferred < 2; ++deferred) { |
78 for (auto const block : code()->instruction_blocks()) { | 90 for (auto const block : code()->instruction_blocks()) { |
79 if (block->IsDeferred() == (deferred == 0)) { | 91 if (block->IsDeferred() == (deferred == 0)) { |
80 continue; | 92 continue; |
81 } | 93 } |
82 // Align loop headers on 16-byte boundaries. | 94 // Align loop headers on 16-byte boundaries. |
83 if (block->IsLoopHeader()) masm()->Align(16); | 95 if (block->IsLoopHeader()) masm()->Align(16); |
84 // Bind a label for a block. | 96 // Bind a label for a block. |
85 current_block_ = block->rpo_number(); | 97 current_block_ = block->rpo_number(); |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 CompilationInfo* info = this->info(); | 307 CompilationInfo* info = this->info(); |
296 int deopt_count = static_cast<int>(deoptimization_states_.size()); | 308 int deopt_count = static_cast<int>(deoptimization_states_.size()); |
297 if (deopt_count == 0 && !info->is_osr()) return; | 309 if (deopt_count == 0 && !info->is_osr()) return; |
298 Handle<DeoptimizationInputData> data = | 310 Handle<DeoptimizationInputData> data = |
299 DeoptimizationInputData::New(isolate(), deopt_count, TENURED); | 311 DeoptimizationInputData::New(isolate(), deopt_count, TENURED); |
300 | 312 |
301 Handle<ByteArray> translation_array = | 313 Handle<ByteArray> translation_array = |
302 translations_.CreateByteArray(isolate()->factory()); | 314 translations_.CreateByteArray(isolate()->factory()); |
303 | 315 |
304 data->SetTranslationByteArray(*translation_array); | 316 data->SetTranslationByteArray(*translation_array); |
305 data->SetInlinedFunctionCount(Smi::FromInt(0)); | 317 data->SetInlinedFunctionCount( |
| 318 Smi::FromInt(static_cast<int>(inlined_function_count_))); |
306 data->SetOptimizationId(Smi::FromInt(info->optimization_id())); | 319 data->SetOptimizationId(Smi::FromInt(info->optimization_id())); |
307 // TODO(jarin) The following code was copied over from Lithium, not sure | 320 // TODO(jarin) The following code was copied over from Lithium, not sure |
308 // whether the scope or the IsOptimizing condition are really needed. | 321 // whether the scope or the IsOptimizing condition are really needed. |
309 if (info->IsOptimizing()) { | 322 if (info->IsOptimizing()) { |
310 // Reference to shared function info does not change between phases. | 323 // Reference to shared function info does not change between phases. |
311 AllowDeferredHandleDereference allow_handle_dereference; | 324 AllowDeferredHandleDereference allow_handle_dereference; |
312 data->SetSharedFunctionInfo(*info->shared_info()); | 325 data->SetSharedFunctionInfo(*info->shared_info()); |
313 } else { | 326 } else { |
314 data->SetSharedFunctionInfo(Smi::FromInt(0)); | 327 data->SetSharedFunctionInfo(Smi::FromInt(0)); |
315 } | 328 } |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
664 : masm_(gen->masm()), next_(gen->ools_) { | 677 : masm_(gen->masm()), next_(gen->ools_) { |
665 gen->ools_ = this; | 678 gen->ools_ = this; |
666 } | 679 } |
667 | 680 |
668 | 681 |
669 OutOfLineCode::~OutOfLineCode() {} | 682 OutOfLineCode::~OutOfLineCode() {} |
670 | 683 |
671 } // namespace compiler | 684 } // namespace compiler |
672 } // namespace internal | 685 } // namespace internal |
673 } // namespace v8 | 686 } // namespace v8 |
OLD | NEW |