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

Side by Side Diff: src/compiler/pipeline.cc

Issue 2240523003: Revert of [turbofan] Split CodeGenerator::GenerateCode into AssembleCode and FinishCodeObject. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 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/compiler/code-generator.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/pipeline.h" 5 #include "src/compiler/pipeline.h"
6 6
7 #include <fstream> // NOLINT(readability/streams) 7 #include <fstream> // NOLINT(readability/streams)
8 #include <memory> 8 #include <memory>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 public: 82 public:
83 // For main entry point. 83 // For main entry point.
84 PipelineData(ZonePool* zone_pool, CompilationInfo* info, 84 PipelineData(ZonePool* zone_pool, CompilationInfo* info,
85 PipelineStatistics* pipeline_statistics) 85 PipelineStatistics* pipeline_statistics)
86 : isolate_(info->isolate()), 86 : isolate_(info->isolate()),
87 info_(info), 87 info_(info),
88 debug_name_(info_->GetDebugName()), 88 debug_name_(info_->GetDebugName()),
89 outer_zone_(info_->zone()), 89 outer_zone_(info_->zone()),
90 zone_pool_(zone_pool), 90 zone_pool_(zone_pool),
91 pipeline_statistics_(pipeline_statistics), 91 pipeline_statistics_(pipeline_statistics),
92 code_generator_(info->zone(), info),
93 graph_zone_scope_(zone_pool_), 92 graph_zone_scope_(zone_pool_),
94 graph_zone_(graph_zone_scope_.zone()), 93 graph_zone_(graph_zone_scope_.zone()),
95 instruction_zone_scope_(zone_pool_), 94 instruction_zone_scope_(zone_pool_),
96 instruction_zone_(instruction_zone_scope_.zone()), 95 instruction_zone_(instruction_zone_scope_.zone()),
97 sequence_(nullptr),
98 frame_(nullptr),
99 register_allocation_zone_scope_(zone_pool_), 96 register_allocation_zone_scope_(zone_pool_),
100 register_allocation_zone_(register_allocation_zone_scope_.zone()) { 97 register_allocation_zone_(register_allocation_zone_scope_.zone()) {
101 PhaseScope scope(pipeline_statistics, "init pipeline data"); 98 PhaseScope scope(pipeline_statistics, "init pipeline data");
102 graph_ = new (graph_zone_) Graph(graph_zone_); 99 graph_ = new (graph_zone_) Graph(graph_zone_);
103 source_positions_ = new (graph_zone_) SourcePositionTable(graph_); 100 source_positions_ = new (graph_zone_) SourcePositionTable(graph_);
104 simplified_ = new (graph_zone_) SimplifiedOperatorBuilder(graph_zone_); 101 simplified_ = new (graph_zone_) SimplifiedOperatorBuilder(graph_zone_);
105 machine_ = new (graph_zone_) MachineOperatorBuilder( 102 machine_ = new (graph_zone_) MachineOperatorBuilder(
106 graph_zone_, MachineType::PointerRepresentation(), 103 graph_zone_, MachineType::PointerRepresentation(),
107 InstructionSelector::SupportedMachineOperatorFlags(), 104 InstructionSelector::SupportedMachineOperatorFlags(),
108 InstructionSelector::AlignmentRequirements()); 105 InstructionSelector::AlignmentRequirements());
109 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_); 106 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_);
110 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_); 107 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_);
111 jsgraph_ = new (graph_zone_) 108 jsgraph_ = new (graph_zone_)
112 JSGraph(isolate_, graph_, common_, javascript_, simplified_, machine_); 109 JSGraph(isolate_, graph_, common_, javascript_, simplified_, machine_);
113 } 110 }
114 111
115 // For WASM compile entry point. 112 // For WASM compile entry point.
116 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph, 113 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph,
117 SourcePositionTable* source_positions) 114 SourcePositionTable* source_positions)
118 : isolate_(info->isolate()), 115 : isolate_(info->isolate()),
119 info_(info), 116 info_(info),
120 debug_name_(info_->GetDebugName()), 117 debug_name_(info_->GetDebugName()),
121 zone_pool_(zone_pool), 118 zone_pool_(zone_pool),
122 code_generator_(info->zone(), info),
123 graph_zone_scope_(zone_pool_), 119 graph_zone_scope_(zone_pool_),
124 graph_(graph), 120 graph_(graph),
125 source_positions_(source_positions), 121 source_positions_(source_positions),
126 instruction_zone_scope_(zone_pool_), 122 instruction_zone_scope_(zone_pool_),
127 instruction_zone_(instruction_zone_scope_.zone()), 123 instruction_zone_(instruction_zone_scope_.zone()),
128 sequence_(nullptr),
129 frame_(nullptr),
130 register_allocation_zone_scope_(zone_pool_), 124 register_allocation_zone_scope_(zone_pool_),
131 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} 125 register_allocation_zone_(register_allocation_zone_scope_.zone()) {}
132 126
133 // For machine graph testing entry point. 127 // For machine graph testing entry point.
134 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph, 128 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph,
135 Schedule* schedule) 129 Schedule* schedule)
136 : isolate_(info->isolate()), 130 : isolate_(info->isolate()),
137 info_(info), 131 info_(info),
138 debug_name_(info_->GetDebugName()), 132 debug_name_(info_->GetDebugName()),
139 zone_pool_(zone_pool), 133 zone_pool_(zone_pool),
140 code_generator_(info->zone(), info),
141 graph_zone_scope_(zone_pool_), 134 graph_zone_scope_(zone_pool_),
142 graph_(graph), 135 graph_(graph),
143 source_positions_(new (info->zone()) SourcePositionTable(graph_)), 136 source_positions_(new (info->zone()) SourcePositionTable(graph_)),
144 schedule_(schedule), 137 schedule_(schedule),
145 instruction_zone_scope_(zone_pool_), 138 instruction_zone_scope_(zone_pool_),
146 instruction_zone_(instruction_zone_scope_.zone()), 139 instruction_zone_(instruction_zone_scope_.zone()),
147 sequence_(nullptr),
148 frame_(nullptr),
149 register_allocation_zone_scope_(zone_pool_), 140 register_allocation_zone_scope_(zone_pool_),
150 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} 141 register_allocation_zone_(register_allocation_zone_scope_.zone()) {}
151 142
152 // For register allocation testing entry point. 143 // For register allocation testing entry point.
153 PipelineData(ZonePool* zone_pool, CompilationInfo* info, 144 PipelineData(ZonePool* zone_pool, CompilationInfo* info,
154 InstructionSequence* sequence) 145 InstructionSequence* sequence)
155 : isolate_(info->isolate()), 146 : isolate_(info->isolate()),
156 info_(info), 147 info_(info),
157 debug_name_(info_->GetDebugName()), 148 debug_name_(info_->GetDebugName()),
158 zone_pool_(zone_pool), 149 zone_pool_(zone_pool),
159 code_generator_(info->zone(), info),
160 graph_zone_scope_(zone_pool_), 150 graph_zone_scope_(zone_pool_),
161 instruction_zone_scope_(zone_pool_), 151 instruction_zone_scope_(zone_pool_),
162 instruction_zone_(sequence->zone()), 152 instruction_zone_(sequence->zone()),
163 sequence_(sequence), 153 sequence_(sequence),
164 frame_(nullptr),
165 register_allocation_zone_scope_(zone_pool_), 154 register_allocation_zone_scope_(zone_pool_),
166 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} 155 register_allocation_zone_(register_allocation_zone_scope_.zone()) {}
167 156
168 ~PipelineData() { 157 ~PipelineData() {
169 DeleteRegisterAllocationZone(); 158 DeleteRegisterAllocationZone();
170 DeleteInstructionZone(); 159 DeleteInstructionZone();
171 DeleteGraphZone(); 160 DeleteGraphZone();
172 } 161 }
173 162
174 Isolate* isolate() const { return isolate_; } 163 Isolate* isolate() const { return isolate_; }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 Schedule* schedule() const { return schedule_; } 204 Schedule* schedule() const { return schedule_; }
216 void set_schedule(Schedule* schedule) { 205 void set_schedule(Schedule* schedule) {
217 DCHECK(!schedule_); 206 DCHECK(!schedule_);
218 schedule_ = schedule; 207 schedule_ = schedule;
219 } 208 }
220 void reset_schedule() { schedule_ = nullptr; } 209 void reset_schedule() { schedule_ = nullptr; }
221 210
222 Zone* instruction_zone() const { return instruction_zone_; } 211 Zone* instruction_zone() const { return instruction_zone_; }
223 InstructionSequence* sequence() const { return sequence_; } 212 InstructionSequence* sequence() const { return sequence_; }
224 Frame* frame() const { return frame_; } 213 Frame* frame() const { return frame_; }
225 CodeGenerator* code_generator() { return &code_generator_; }
226 bool assemble_code_successful() {
227 return code_generator_.assemble_code_successful();
228 }
229 214
230 Zone* register_allocation_zone() const { return register_allocation_zone_; } 215 Zone* register_allocation_zone() const { return register_allocation_zone_; }
231 RegisterAllocationData* register_allocation_data() const { 216 RegisterAllocationData* register_allocation_data() const {
232 return register_allocation_data_; 217 return register_allocation_data_;
233 } 218 }
234 219
235 BasicBlockProfiler::Data* profiler_data() const { return profiler_data_; } 220 BasicBlockProfiler::Data* profiler_data() const { return profiler_data_; }
236 void set_profiler_data(BasicBlockProfiler::Data* profiler_data) { 221 void set_profiler_data(BasicBlockProfiler::Data* profiler_data) {
237 profiler_data_ = profiler_data; 222 profiler_data_ = profiler_data;
238 } 223 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 306
322 private: 307 private:
323 Isolate* const isolate_; 308 Isolate* const isolate_;
324 CompilationInfo* const info_; 309 CompilationInfo* const info_;
325 std::unique_ptr<char[]> debug_name_; 310 std::unique_ptr<char[]> debug_name_;
326 Zone* outer_zone_ = nullptr; 311 Zone* outer_zone_ = nullptr;
327 ZonePool* const zone_pool_; 312 ZonePool* const zone_pool_;
328 PipelineStatistics* pipeline_statistics_ = nullptr; 313 PipelineStatistics* pipeline_statistics_ = nullptr;
329 bool compilation_failed_ = false; 314 bool compilation_failed_ = false;
330 Handle<Code> code_ = Handle<Code>::null(); 315 Handle<Code> code_ = Handle<Code>::null();
331 CodeGenerator code_generator_;
332 316
333 // All objects in the following group of fields are allocated in graph_zone_. 317 // All objects in the following group of fields are allocated in graph_zone_.
334 // They are all set to nullptr when the graph_zone_ is destroyed. 318 // They are all set to nullptr when the graph_zone_ is destroyed.
335 ZonePool::Scope graph_zone_scope_; 319 ZonePool::Scope graph_zone_scope_;
336 Zone* graph_zone_ = nullptr; 320 Zone* graph_zone_ = nullptr;
337 Graph* graph_ = nullptr; 321 Graph* graph_ = nullptr;
338 SourcePositionTable* source_positions_ = nullptr; 322 SourcePositionTable* source_positions_ = nullptr;
339 LoopAssignmentAnalysis* loop_assignment_ = nullptr; 323 LoopAssignmentAnalysis* loop_assignment_ = nullptr;
340 TypeHintAnalysis* type_hint_analysis_ = nullptr; 324 TypeHintAnalysis* type_hint_analysis_ = nullptr;
341 SimplifiedOperatorBuilder* simplified_ = nullptr; 325 SimplifiedOperatorBuilder* simplified_ = nullptr;
342 MachineOperatorBuilder* machine_ = nullptr; 326 MachineOperatorBuilder* machine_ = nullptr;
343 CommonOperatorBuilder* common_ = nullptr; 327 CommonOperatorBuilder* common_ = nullptr;
344 JSOperatorBuilder* javascript_ = nullptr; 328 JSOperatorBuilder* javascript_ = nullptr;
345 JSGraph* jsgraph_ = nullptr; 329 JSGraph* jsgraph_ = nullptr;
346 Schedule* schedule_ = nullptr; 330 Schedule* schedule_ = nullptr;
347 331
348 // All objects in the following group of fields are allocated in 332 // All objects in the following group of fields are allocated in
349 // instruction_zone_. They are all set to nullptr when the instruction_zone_ 333 // instruction_zone_. They are all set to nullptr when the instruction_zone_
350 // is destroyed. 334 // is
335 // destroyed.
351 ZonePool::Scope instruction_zone_scope_; 336 ZonePool::Scope instruction_zone_scope_;
352 Zone* instruction_zone_; 337 Zone* instruction_zone_;
353 InstructionSequence* sequence_; 338 InstructionSequence* sequence_ = nullptr;
354 Frame* frame_; 339 Frame* frame_ = nullptr;
355 340
356 // All objects in the following group of fields are allocated in 341 // All objects in the following group of fields are allocated in
357 // register_allocation_zone_. They are all set to nullptr when the zone is 342 // register_allocation_zone_. They are all set to nullptr when the zone is
358 // destroyed. 343 // destroyed.
359 ZonePool::Scope register_allocation_zone_scope_; 344 ZonePool::Scope register_allocation_zone_scope_;
360 Zone* register_allocation_zone_; 345 Zone* register_allocation_zone_;
361 RegisterAllocationData* register_allocation_data_ = nullptr; 346 RegisterAllocationData* register_allocation_data_ = nullptr;
362 347
363 // Basic block profiling support. 348 // Basic block profiling support.
364 BasicBlockProfiler::Data* profiler_data_ = nullptr; 349 BasicBlockProfiler::Data* profiler_data_ = nullptr;
(...skipping 26 matching lines...) Expand all
391 template <typename Phase, typename Arg0, typename Arg1> 376 template <typename Phase, typename Arg0, typename Arg1>
392 void Run(Arg0 arg_0, Arg1 arg_1); 377 void Run(Arg0 arg_0, Arg1 arg_1);
393 378
394 // Run the graph creation and initial optimization passes. 379 // Run the graph creation and initial optimization passes.
395 bool CreateGraph(); 380 bool CreateGraph();
396 381
397 // Run the concurrent optimization passes. 382 // Run the concurrent optimization passes.
398 bool OptimizeGraph(Linkage* linkage); 383 bool OptimizeGraph(Linkage* linkage);
399 384
400 // Perform the actual code generation and return handle to a code object. 385 // Perform the actual code generation and return handle to a code object.
401 bool AssembleCode(Linkage* linkage); 386 Handle<Code> GenerateCode(Linkage* linkage);
402 Handle<Code> FinishCodeObject();
403 387
404 bool ScheduleAndSelectInstructions(Linkage* linkage); 388 bool ScheduleAndSelectInstructions(Linkage* linkage);
405 void RunPrintAndVerify(const char* phase, bool untyped = false); 389 void RunPrintAndVerify(const char* phase, bool untyped = false);
406 Handle<Code> ScheduleAndGenerateCode(CallDescriptor* call_descriptor); 390 Handle<Code> ScheduleAndGenerateCode(CallDescriptor* call_descriptor);
407 void AllocateRegisters(const RegisterConfiguration* config, 391 void AllocateRegisters(const RegisterConfiguration* config,
408 CallDescriptor* descriptor, bool run_verifier); 392 CallDescriptor* descriptor, bool run_verifier);
409 393
410 CompilationInfo* info() const; 394 CompilationInfo* info() const;
411 Isolate* isolate() const; 395 Isolate* isolate() const;
412 396
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 632
649 return SUCCEEDED; 633 return SUCCEEDED;
650 } 634 }
651 635
652 PipelineCompilationJob::Status PipelineCompilationJob::OptimizeGraphImpl() { 636 PipelineCompilationJob::Status PipelineCompilationJob::OptimizeGraphImpl() {
653 if (!pipeline_.OptimizeGraph(linkage_)) return FAILED; 637 if (!pipeline_.OptimizeGraph(linkage_)) return FAILED;
654 return SUCCEEDED; 638 return SUCCEEDED;
655 } 639 }
656 640
657 PipelineCompilationJob::Status PipelineCompilationJob::GenerateCodeImpl() { 641 PipelineCompilationJob::Status PipelineCompilationJob::GenerateCodeImpl() {
658 pipeline_.AssembleCode(linkage_); 642 Handle<Code> code = pipeline_.GenerateCode(linkage_);
659 Handle<Code> code = pipeline_.FinishCodeObject();
660 if (code.is_null()) { 643 if (code.is_null()) {
661 if (info()->bailout_reason() == kNoReason) { 644 if (info()->bailout_reason() == kNoReason) {
662 return AbortOptimization(kCodeGenerationFailed); 645 return AbortOptimization(kCodeGenerationFailed);
663 } 646 }
664 return FAILED; 647 return FAILED;
665 } 648 }
666 info()->dependencies()->Commit(code); 649 info()->dependencies()->Commit(code);
667 info()->SetCode(code); 650 info()->SetCode(code);
668 if (info()->is_deoptimization_enabled()) { 651 if (info()->is_deoptimization_enabled()) {
669 info()->context()->native_context()->AddOptimizedCode(*code); 652 info()->context()->native_context()->AddOptimizedCode(*code);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 } 692 }
710 693
711 pipeline_.RunPrintAndVerify("Machine", true); 694 pipeline_.RunPrintAndVerify("Machine", true);
712 695
713 if (!pipeline_.ScheduleAndSelectInstructions(&linkage_)) return FAILED; 696 if (!pipeline_.ScheduleAndSelectInstructions(&linkage_)) return FAILED;
714 return SUCCEEDED; 697 return SUCCEEDED;
715 } 698 }
716 699
717 PipelineWasmCompilationJob::Status 700 PipelineWasmCompilationJob::Status
718 PipelineWasmCompilationJob::GenerateCodeImpl() { 701 PipelineWasmCompilationJob::GenerateCodeImpl() {
719 pipeline_.AssembleCode(&linkage_); 702 pipeline_.GenerateCode(&linkage_);
720 pipeline_.FinishCodeObject();
721 return SUCCEEDED; 703 return SUCCEEDED;
722 } 704 }
723 705
724 template <typename Phase> 706 template <typename Phase>
725 void PipelineImpl::Run() { 707 void PipelineImpl::Run() {
726 PipelineRunScope scope(this->data_, Phase::phase_name()); 708 PipelineRunScope scope(this->data_, Phase::phase_name());
727 Phase phase; 709 Phase phase;
728 phase.Run(this->data_, scope.zone()); 710 phase.Run(this->data_, scope.zone());
729 } 711 }
730 712
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after
1408 1390
1409 void Run(PipelineData* data, Zone* temp_zone, bool frame_at_start) { 1391 void Run(PipelineData* data, Zone* temp_zone, bool frame_at_start) {
1410 ZoneVector<RpoNumber> result(temp_zone); 1392 ZoneVector<RpoNumber> result(temp_zone);
1411 if (JumpThreading::ComputeForwarding(temp_zone, result, data->sequence(), 1393 if (JumpThreading::ComputeForwarding(temp_zone, result, data->sequence(),
1412 frame_at_start)) { 1394 frame_at_start)) {
1413 JumpThreading::ApplyForwarding(result, data->sequence()); 1395 JumpThreading::ApplyForwarding(result, data->sequence());
1414 } 1396 }
1415 } 1397 }
1416 }; 1398 };
1417 1399
1418 struct AssembleCodePhase { 1400
1401 struct GenerateCodePhase {
1419 static const char* phase_name() { return "generate code"; } 1402 static const char* phase_name() { return "generate code"; }
1420 1403
1421 void Run(PipelineData* data, Zone* temp_zone, Linkage* linkage) { 1404 void Run(PipelineData* data, Zone* temp_zone, Linkage* linkage) {
1422 data->code_generator()->Initialize(data->frame(), linkage, 1405 CodeGenerator generator(data->frame(), linkage, data->sequence(),
1423 data->sequence()); 1406 data->info());
1424 data->code_generator()->AssembleCode(); 1407 data->set_code(generator.GenerateCode());
1425 } 1408 }
1426 }; 1409 };
1427 1410
1428 struct FinishCodeObjectPhase {
1429 static const char* phase_name() { return "generate code"; }
1430
1431 void Run(PipelineData* data, Zone* temp_zone) {
1432 data->set_code(data->code_generator()->FinishCodeObject());
1433 }
1434 };
1435 1411
1436 struct PrintGraphPhase { 1412 struct PrintGraphPhase {
1437 static const char* phase_name() { return nullptr; } 1413 static const char* phase_name() { return nullptr; }
1438 1414
1439 void Run(PipelineData* data, Zone* temp_zone, const char* phase) { 1415 void Run(PipelineData* data, Zone* temp_zone, const char* phase) {
1440 CompilationInfo* info = data->info(); 1416 CompilationInfo* info = data->info();
1441 Graph* graph = data->graph(); 1417 Graph* graph = data->graph();
1442 1418
1443 { // Print JSON. 1419 { // Print JSON.
1444 AllowHandleDereference allow_deref; 1420 AllowHandleDereference allow_deref;
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1677 ZonePool zone_pool(info->isolate()->allocator()); 1653 ZonePool zone_pool(info->isolate()->allocator());
1678 std::unique_ptr<PipelineStatistics> pipeline_statistics( 1654 std::unique_ptr<PipelineStatistics> pipeline_statistics(
1679 CreatePipelineStatistics(info, &zone_pool)); 1655 CreatePipelineStatistics(info, &zone_pool));
1680 PipelineData data(&zone_pool, info, pipeline_statistics.get()); 1656 PipelineData data(&zone_pool, info, pipeline_statistics.get());
1681 PipelineImpl pipeline(&data); 1657 PipelineImpl pipeline(&data);
1682 1658
1683 Linkage linkage(Linkage::ComputeIncoming(data.instruction_zone(), info)); 1659 Linkage linkage(Linkage::ComputeIncoming(data.instruction_zone(), info));
1684 1660
1685 if (!pipeline.CreateGraph()) return Handle<Code>::null(); 1661 if (!pipeline.CreateGraph()) return Handle<Code>::null();
1686 if (!pipeline.OptimizeGraph(&linkage)) return Handle<Code>::null(); 1662 if (!pipeline.OptimizeGraph(&linkage)) return Handle<Code>::null();
1687 pipeline.AssembleCode(&linkage); 1663 return pipeline.GenerateCode(&linkage);
1688 return pipeline.FinishCodeObject();
1689 } 1664 }
1690 1665
1691 // static 1666 // static
1692 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, 1667 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info,
1693 Graph* graph, 1668 Graph* graph,
1694 Schedule* schedule) { 1669 Schedule* schedule) {
1695 CallDescriptor* call_descriptor = 1670 CallDescriptor* call_descriptor =
1696 Linkage::ComputeIncoming(info->zone(), info); 1671 Linkage::ComputeIncoming(info->zone(), info);
1697 return GenerateCodeForTesting(info, call_descriptor, graph, schedule); 1672 return GenerateCodeForTesting(info, call_descriptor, graph, schedule);
1698 } 1673 }
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1806 // Optimimize jumps. 1781 // Optimimize jumps.
1807 if (FLAG_turbo_jt) { 1782 if (FLAG_turbo_jt) {
1808 Run<JumpThreadingPhase>(generate_frame_at_start); 1783 Run<JumpThreadingPhase>(generate_frame_at_start);
1809 } 1784 }
1810 1785
1811 data->EndPhaseKind(); 1786 data->EndPhaseKind();
1812 1787
1813 return true; 1788 return true;
1814 } 1789 }
1815 1790
1816 bool PipelineImpl::AssembleCode(Linkage* linkage) { 1791 Handle<Code> PipelineImpl::GenerateCode(Linkage* linkage) {
1817 PipelineData* data = this->data_; 1792 PipelineData* data = this->data_;
1818 1793
1819 data->BeginPhaseKind("assemble code"); 1794 data->BeginPhaseKind("code generation");
1820 1795
1821 // Assemble machine code. 1796 // Generate final machine code.
1822 Run<AssembleCodePhase>(linkage); 1797 Run<GenerateCodePhase>(linkage);
1823 return data->assemble_code_successful();
1824 }
1825
1826 Handle<Code> PipelineImpl::FinishCodeObject() {
1827 PipelineData* data = this->data_;
1828
1829 data->BeginPhaseKind("finish code generation");
1830
1831 // Generate final code object.
1832 Run<FinishCodeObjectPhase>();
1833 1798
1834 Handle<Code> code = data->code(); 1799 Handle<Code> code = data->code();
1835 if (data->profiler_data()) { 1800 if (data->profiler_data()) {
1836 #if ENABLE_DISASSEMBLER 1801 #if ENABLE_DISASSEMBLER
1837 std::ostringstream os; 1802 std::ostringstream os;
1838 code->Disassemble(nullptr, os); 1803 code->Disassemble(nullptr, os);
1839 data->profiler_data()->SetCode(&os); 1804 data->profiler_data()->SetCode(&os);
1840 #endif 1805 #endif
1841 } 1806 }
1842 1807
(...skipping 26 matching lines...) Expand all
1869 } 1834 }
1870 1835
1871 Handle<Code> PipelineImpl::ScheduleAndGenerateCode( 1836 Handle<Code> PipelineImpl::ScheduleAndGenerateCode(
1872 CallDescriptor* call_descriptor) { 1837 CallDescriptor* call_descriptor) {
1873 Linkage linkage(call_descriptor); 1838 Linkage linkage(call_descriptor);
1874 1839
1875 // Schedule the graph, perform instruction selection and register allocation. 1840 // Schedule the graph, perform instruction selection and register allocation.
1876 if (!ScheduleAndSelectInstructions(&linkage)) return Handle<Code>(); 1841 if (!ScheduleAndSelectInstructions(&linkage)) return Handle<Code>();
1877 1842
1878 // Generate the final machine code. 1843 // Generate the final machine code.
1879 AssembleCode(&linkage); 1844 return GenerateCode(&linkage);
1880 return FinishCodeObject();
1881 } 1845 }
1882 1846
1883 void PipelineImpl::AllocateRegisters(const RegisterConfiguration* config, 1847 void PipelineImpl::AllocateRegisters(const RegisterConfiguration* config,
1884 CallDescriptor* descriptor, 1848 CallDescriptor* descriptor,
1885 bool run_verifier) { 1849 bool run_verifier) {
1886 PipelineData* data = this->data_; 1850 PipelineData* data = this->data_;
1887 // Don't track usage for this zone in compiler stats. 1851 // Don't track usage for this zone in compiler stats.
1888 std::unique_ptr<Zone> verifier_zone; 1852 std::unique_ptr<Zone> verifier_zone;
1889 RegisterAllocatorVerifier* verifier = nullptr; 1853 RegisterAllocatorVerifier* verifier = nullptr;
1890 if (run_verifier) { 1854 if (run_verifier) {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1965 data->DeleteRegisterAllocationZone(); 1929 data->DeleteRegisterAllocationZone();
1966 } 1930 }
1967 1931
1968 CompilationInfo* PipelineImpl::info() const { return data_->info(); } 1932 CompilationInfo* PipelineImpl::info() const { return data_->info(); }
1969 1933
1970 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } 1934 Isolate* PipelineImpl::isolate() const { return info()->isolate(); }
1971 1935
1972 } // namespace compiler 1936 } // namespace compiler
1973 } // namespace internal 1937 } // namespace internal
1974 } // namespace v8 1938 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/code-generator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698