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

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

Issue 913993004: Removed the funky 2-stage initialization of PipelineData. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Don't use brace-or-equal-initializers *sigh* Created 5 years, 10 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 | « no previous file | 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 <sstream> 8 #include <sstream>
9 9
10 #include "src/base/platform/elapsed-timer.h" 10 #include "src/base/platform/elapsed-timer.h"
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 #include "src/compiler/zone-pool.h" 47 #include "src/compiler/zone-pool.h"
48 #include "src/ostreams.h" 48 #include "src/ostreams.h"
49 #include "src/utils.h" 49 #include "src/utils.h"
50 50
51 namespace v8 { 51 namespace v8 {
52 namespace internal { 52 namespace internal {
53 namespace compiler { 53 namespace compiler {
54 54
55 class PipelineData { 55 class PipelineData {
56 public: 56 public:
57 explicit PipelineData(ZonePool* zone_pool, CompilationInfo* info) 57 // For main entry point.
58 PipelineData(ZonePool* zone_pool, CompilationInfo* info,
59 PipelineStatistics* pipeline_statistics)
58 : isolate_(info->isolate()), 60 : isolate_(info->isolate()),
59 info_(info), 61 info_(info),
60 outer_zone_(nullptr), 62 outer_zone_(info_->zone()),
61 zone_pool_(zone_pool), 63 zone_pool_(zone_pool),
62 pipeline_statistics_(nullptr), 64 pipeline_statistics_(pipeline_statistics),
63 compilation_failed_(false), 65 compilation_failed_(false),
64 code_(Handle<Code>::null()), 66 code_(Handle<Code>::null()),
65 graph_zone_scope_(zone_pool_), 67 graph_zone_scope_(zone_pool_),
66 graph_zone_(nullptr), 68 graph_zone_(graph_zone_scope_.zone()),
67 graph_(nullptr), 69 graph_(nullptr),
68 loop_assignment_(nullptr), 70 loop_assignment_(nullptr),
69 machine_(nullptr), 71 machine_(nullptr),
70 common_(nullptr), 72 common_(nullptr),
71 javascript_(nullptr), 73 javascript_(nullptr),
72 jsgraph_(nullptr), 74 jsgraph_(nullptr),
73 typer_(nullptr), 75 typer_(nullptr),
74 context_node_(nullptr), 76 context_node_(nullptr),
75 schedule_(nullptr), 77 schedule_(nullptr),
76 instruction_zone_scope_(zone_pool_), 78 instruction_zone_scope_(zone_pool_),
77 instruction_zone_(nullptr), 79 instruction_zone_(instruction_zone_scope_.zone()),
78 sequence_(nullptr), 80 sequence_(nullptr),
79 frame_(nullptr), 81 frame_(nullptr),
82 register_allocator_(nullptr) {
83 PhaseScope scope(pipeline_statistics, "init pipeline data");
84 graph_ = new (graph_zone_) Graph(graph_zone_);
85 source_positions_.Reset(new SourcePositionTable(graph_));
86 machine_ = new (graph_zone_) MachineOperatorBuilder(
87 graph_zone_, kMachPtr,
88 InstructionSelector::SupportedMachineOperatorFlags());
89 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_);
90 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_);
91 jsgraph_ = new (graph_zone_)
92 JSGraph(isolate_, graph_, common_, javascript_, machine_);
93 typer_.Reset(new Typer(isolate_, graph_, info_->context()));
94 }
95
96 // For machine graph testing entry point.
97 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph,
98 Schedule* schedule)
99 : isolate_(info->isolate()),
100 info_(info),
101 outer_zone_(nullptr),
102 zone_pool_(zone_pool),
103 pipeline_statistics_(nullptr),
104 compilation_failed_(false),
105 code_(Handle<Code>::null()),
106 graph_zone_scope_(zone_pool_),
107 graph_zone_(nullptr),
108 graph_(graph),
109 source_positions_(new SourcePositionTable(graph_)),
110 loop_assignment_(nullptr),
111 machine_(nullptr),
112 common_(nullptr),
113 javascript_(nullptr),
114 jsgraph_(nullptr),
115 typer_(nullptr),
116 context_node_(nullptr),
117 schedule_(schedule),
118 instruction_zone_scope_(zone_pool_),
119 instruction_zone_(instruction_zone_scope_.zone()),
120 sequence_(nullptr),
121 frame_(nullptr),
122 register_allocator_(nullptr) {}
123
124 // For register allocation testing entry point.
125 PipelineData(ZonePool* zone_pool, CompilationInfo* info,
126 InstructionSequence* sequence)
127 : isolate_(info->isolate()),
128 info_(info),
129 outer_zone_(nullptr),
130 zone_pool_(zone_pool),
131 pipeline_statistics_(nullptr),
132 compilation_failed_(false),
133 code_(Handle<Code>::null()),
134 graph_zone_scope_(zone_pool_),
135 graph_zone_(nullptr),
136 graph_(nullptr),
137 loop_assignment_(nullptr),
138 machine_(nullptr),
139 common_(nullptr),
140 javascript_(nullptr),
141 jsgraph_(nullptr),
142 typer_(nullptr),
143 context_node_(nullptr),
144 schedule_(nullptr),
145 instruction_zone_scope_(zone_pool_),
146 instruction_zone_(sequence->zone()),
147 sequence_(sequence),
148 frame_(nullptr),
80 register_allocator_(nullptr) {} 149 register_allocator_(nullptr) {}
81 150
82 ~PipelineData() { 151 ~PipelineData() {
83 DeleteInstructionZone(); 152 DeleteInstructionZone();
84 DeleteGraphZone(); 153 DeleteGraphZone();
85 } 154 }
86 155
87 // For main entry point.
88 void Initialize(PipelineStatistics* pipeline_statistics) {
89 PhaseScope scope(pipeline_statistics, "init pipeline data");
90 outer_zone_ = info()->zone();
91 pipeline_statistics_ = pipeline_statistics;
92 graph_zone_ = graph_zone_scope_.zone();
93 graph_ = new (graph_zone()) Graph(graph_zone());
94 source_positions_.Reset(new SourcePositionTable(graph()));
95 machine_ = new (graph_zone()) MachineOperatorBuilder(
96 graph_zone(), kMachPtr,
97 InstructionSelector::SupportedMachineOperatorFlags());
98 common_ = new (graph_zone()) CommonOperatorBuilder(graph_zone());
99 javascript_ = new (graph_zone()) JSOperatorBuilder(graph_zone());
100 jsgraph_ = new (graph_zone())
101 JSGraph(info()->isolate(), graph(), common(), javascript(), machine());
102 typer_.Reset(new Typer(info()->isolate(), graph(), info()->context()));
103 instruction_zone_ = instruction_zone_scope_.zone();
104 }
105
106 // For machine graph testing entry point.
107 void InitializeTorTesting(Graph* graph, Schedule* schedule) {
108 graph_ = graph;
109 source_positions_.Reset(new SourcePositionTable(graph));
110 schedule_ = schedule;
111 instruction_zone_ = instruction_zone_scope_.zone();
112 }
113
114 // For register allocation testing entry point.
115 void InitializeTorTesting(InstructionSequence* sequence) {
116 instruction_zone_ = sequence->zone();
117 sequence_ = sequence;
118 }
119
120 Isolate* isolate() const { return isolate_; } 156 Isolate* isolate() const { return isolate_; }
121 CompilationInfo* info() const { return info_; } 157 CompilationInfo* info() const { return info_; }
122 ZonePool* zone_pool() const { return zone_pool_; } 158 ZonePool* zone_pool() const { return zone_pool_; }
123 PipelineStatistics* pipeline_statistics() { return pipeline_statistics_; } 159 PipelineStatistics* pipeline_statistics() { return pipeline_statistics_; }
124 bool compilation_failed() const { return compilation_failed_; } 160 bool compilation_failed() const { return compilation_failed_; }
125 void set_compilation_failed() { compilation_failed_ = true; } 161 void set_compilation_failed() { compilation_failed_ = true; }
126 Handle<Code> code() { return code_; } 162 Handle<Code> code() { return code_; }
127 void set_code(Handle<Code> code) { 163 void set_code(Handle<Code> code) {
128 DCHECK(code_.is_null()); 164 DCHECK(code_.is_null());
129 code_ = code; 165 code_ = code;
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after
842 len); 878 len);
843 for (const auto& c : source) { 879 for (const auto& c : source) {
844 json_of << AsEscapedUC16ForJSON(c); 880 json_of << AsEscapedUC16ForJSON(c);
845 } 881 }
846 } 882 }
847 json_of << "\",\n\"phases\":["; 883 json_of << "\",\n\"phases\":[";
848 fclose(json_file); 884 fclose(json_file);
849 } 885 }
850 } 886 }
851 887
852 PipelineData data(&zone_pool, info()); 888 PipelineData data(&zone_pool, info(), pipeline_statistics.get());
853 this->data_ = &data; 889 this->data_ = &data;
854 data.Initialize(pipeline_statistics.get());
855 890
856 BeginPhaseKind("graph creation"); 891 BeginPhaseKind("graph creation");
857 892
858 if (FLAG_trace_turbo) { 893 if (FLAG_trace_turbo) {
859 OFStream os(stdout); 894 OFStream os(stdout);
860 os << "---------------------------------------------------\n" 895 os << "---------------------------------------------------\n"
861 << "Begin compiling method " << GetDebugName(info()).get() 896 << "Begin compiling method " << GetDebugName(info()).get()
862 << " using Turbofan" << std::endl; 897 << " using Turbofan" << std::endl;
863 TurboCfgFile tcf(isolate()); 898 TurboCfgFile tcf(isolate());
864 tcf << AsC1VCompilation(info()); 899 tcf << AsC1VCompilation(info());
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 return GenerateCodeForTesting(&info, call_descriptor, graph, schedule); 1006 return GenerateCodeForTesting(&info, call_descriptor, graph, schedule);
972 } 1007 }
973 1008
974 1009
975 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, 1010 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info,
976 CallDescriptor* call_descriptor, 1011 CallDescriptor* call_descriptor,
977 Graph* graph, 1012 Graph* graph,
978 Schedule* schedule) { 1013 Schedule* schedule) {
979 // Construct a pipeline for scheduling and code generation. 1014 // Construct a pipeline for scheduling and code generation.
980 ZonePool zone_pool; 1015 ZonePool zone_pool;
1016 PipelineData data(&zone_pool, info, graph, schedule);
981 Pipeline pipeline(info); 1017 Pipeline pipeline(info);
982 PipelineData data(&zone_pool, info);
983 pipeline.data_ = &data; 1018 pipeline.data_ = &data;
984 data.InitializeTorTesting(graph, schedule);
985 if (data.schedule() == nullptr) { 1019 if (data.schedule() == nullptr) {
986 // TODO(rossberg): Should this really be untyped? 1020 // TODO(rossberg): Should this really be untyped?
987 pipeline.RunPrintAndVerify("Machine", true); 1021 pipeline.RunPrintAndVerify("Machine", true);
988 } 1022 }
989 1023
990 return pipeline.ScheduleAndGenerateCode(call_descriptor); 1024 return pipeline.ScheduleAndGenerateCode(call_descriptor);
991 } 1025 }
992 1026
993 1027
994 bool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config, 1028 bool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config,
995 InstructionSequence* sequence, 1029 InstructionSequence* sequence,
996 bool run_verifier) { 1030 bool run_verifier) {
997 FakeStubForTesting stub(sequence->isolate()); 1031 FakeStubForTesting stub(sequence->isolate());
998 CompilationInfo info(&stub, sequence->isolate(), sequence->zone()); 1032 CompilationInfo info(&stub, sequence->isolate(), sequence->zone());
999 ZonePool zone_pool; 1033 ZonePool zone_pool;
1000 PipelineData data(&zone_pool, &info); 1034 PipelineData data(&zone_pool, &info, sequence);
1001 data.InitializeTorTesting(sequence);
1002 Pipeline pipeline(&info); 1035 Pipeline pipeline(&info);
1003 pipeline.data_ = &data; 1036 pipeline.data_ = &data;
1004 pipeline.AllocateRegisters(config, run_verifier); 1037 pipeline.AllocateRegisters(config, run_verifier);
1005 return !data.compilation_failed(); 1038 return !data.compilation_failed();
1006 } 1039 }
1007 1040
1008 1041
1009 Handle<Code> Pipeline::ScheduleAndGenerateCode( 1042 Handle<Code> Pipeline::ScheduleAndGenerateCode(
1010 CallDescriptor* call_descriptor) { 1043 CallDescriptor* call_descriptor) {
1011 PipelineData* data = this->data_; 1044 PipelineData* data = this->data_;
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1159 1192
1160 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) { 1193 if (FLAG_trace_turbo && !data->MayHaveUnverifiableGraph()) {
1161 TurboCfgFile tcf(data->isolate()); 1194 TurboCfgFile tcf(data->isolate());
1162 tcf << AsC1VAllocator("CodeGen", data->register_allocator()); 1195 tcf << AsC1VAllocator("CodeGen", data->register_allocator());
1163 } 1196 }
1164 } 1197 }
1165 1198
1166 } // namespace compiler 1199 } // namespace compiler
1167 } // namespace internal 1200 } // namespace internal
1168 } // namespace v8 1201 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698