| OLD | NEW |
| 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/adapters.h" | 10 #include "src/base/adapters.h" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 class PipelineData { | 76 class PipelineData { |
| 77 public: | 77 public: |
| 78 // For main entry point. | 78 // For main entry point. |
| 79 PipelineData(ZonePool* zone_pool, CompilationInfo* info, | 79 PipelineData(ZonePool* zone_pool, CompilationInfo* info, |
| 80 PipelineStatistics* pipeline_statistics) | 80 PipelineStatistics* pipeline_statistics) |
| 81 : isolate_(info->isolate()), | 81 : isolate_(info->isolate()), |
| 82 info_(info), | 82 info_(info), |
| 83 outer_zone_(info_->zone()), | 83 outer_zone_(info_->zone()), |
| 84 zone_pool_(zone_pool), | 84 zone_pool_(zone_pool), |
| 85 pipeline_statistics_(pipeline_statistics), | 85 pipeline_statistics_(pipeline_statistics), |
| 86 compilation_failed_(false), | |
| 87 code_(Handle<Code>::null()), | |
| 88 graph_zone_scope_(zone_pool_), | 86 graph_zone_scope_(zone_pool_), |
| 89 graph_zone_(graph_zone_scope_.zone()), | 87 graph_zone_(graph_zone_scope_.zone()), |
| 90 graph_(nullptr), | |
| 91 loop_assignment_(nullptr), | |
| 92 simplified_(nullptr), | |
| 93 machine_(nullptr), | |
| 94 common_(nullptr), | |
| 95 javascript_(nullptr), | |
| 96 jsgraph_(nullptr), | |
| 97 schedule_(nullptr), | |
| 98 instruction_zone_scope_(zone_pool_), | 88 instruction_zone_scope_(zone_pool_), |
| 99 instruction_zone_(instruction_zone_scope_.zone()), | 89 instruction_zone_(instruction_zone_scope_.zone()), |
| 100 sequence_(nullptr), | |
| 101 frame_(nullptr), | |
| 102 register_allocation_zone_scope_(zone_pool_), | 90 register_allocation_zone_scope_(zone_pool_), |
| 103 register_allocation_zone_(register_allocation_zone_scope_.zone()), | 91 register_allocation_zone_(register_allocation_zone_scope_.zone()) { |
| 104 register_allocation_data_(nullptr) { | |
| 105 PhaseScope scope(pipeline_statistics, "init pipeline data"); | 92 PhaseScope scope(pipeline_statistics, "init pipeline data"); |
| 106 graph_ = new (graph_zone_) Graph(graph_zone_); | 93 graph_ = new (graph_zone_) Graph(graph_zone_); |
| 107 source_positions_.Reset(new SourcePositionTable(graph_)); | 94 source_positions_ = new SourcePositionTable(graph_); |
| 95 source_positions_owned_ = true; |
| 108 simplified_ = new (graph_zone_) SimplifiedOperatorBuilder(graph_zone_); | 96 simplified_ = new (graph_zone_) SimplifiedOperatorBuilder(graph_zone_); |
| 109 machine_ = new (graph_zone_) MachineOperatorBuilder( | 97 machine_ = new (graph_zone_) MachineOperatorBuilder( |
| 110 graph_zone_, MachineType::PointerRepresentation(), | 98 graph_zone_, MachineType::PointerRepresentation(), |
| 111 InstructionSelector::SupportedMachineOperatorFlags()); | 99 InstructionSelector::SupportedMachineOperatorFlags()); |
| 112 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_); | 100 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_); |
| 113 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_); | 101 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_); |
| 114 jsgraph_ = new (graph_zone_) | 102 jsgraph_ = new (graph_zone_) |
| 115 JSGraph(isolate_, graph_, common_, javascript_, simplified_, machine_); | 103 JSGraph(isolate_, graph_, common_, javascript_, simplified_, machine_); |
| 116 } | 104 } |
| 117 | 105 |
| 106 // For WASM compile entry point. |
| 107 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph, |
| 108 SourcePositionTable* source_positions) |
| 109 : isolate_(info->isolate()), |
| 110 info_(info), |
| 111 zone_pool_(zone_pool), |
| 112 graph_zone_scope_(zone_pool_), |
| 113 graph_(graph), |
| 114 source_positions_(source_positions), |
| 115 instruction_zone_scope_(zone_pool_), |
| 116 instruction_zone_(instruction_zone_scope_.zone()), |
| 117 register_allocation_zone_scope_(zone_pool_), |
| 118 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} |
| 119 |
| 118 // For machine graph testing entry point. | 120 // For machine graph testing entry point. |
| 119 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph, | 121 PipelineData(ZonePool* zone_pool, CompilationInfo* info, Graph* graph, |
| 120 Schedule* schedule) | 122 Schedule* schedule) |
| 121 : isolate_(info->isolate()), | 123 : isolate_(info->isolate()), |
| 122 info_(info), | 124 info_(info), |
| 123 outer_zone_(nullptr), | |
| 124 zone_pool_(zone_pool), | 125 zone_pool_(zone_pool), |
| 125 pipeline_statistics_(nullptr), | |
| 126 compilation_failed_(false), | |
| 127 code_(Handle<Code>::null()), | |
| 128 graph_zone_scope_(zone_pool_), | 126 graph_zone_scope_(zone_pool_), |
| 129 graph_zone_(nullptr), | |
| 130 graph_(graph), | 127 graph_(graph), |
| 131 source_positions_(new SourcePositionTable(graph_)), | 128 source_positions_(new SourcePositionTable(graph_)), |
| 132 loop_assignment_(nullptr), | 129 source_positions_owned_(true), |
| 133 simplified_(nullptr), | |
| 134 machine_(nullptr), | |
| 135 common_(nullptr), | |
| 136 javascript_(nullptr), | |
| 137 jsgraph_(nullptr), | |
| 138 schedule_(schedule), | 130 schedule_(schedule), |
| 139 instruction_zone_scope_(zone_pool_), | 131 instruction_zone_scope_(zone_pool_), |
| 140 instruction_zone_(instruction_zone_scope_.zone()), | 132 instruction_zone_(instruction_zone_scope_.zone()), |
| 141 sequence_(nullptr), | |
| 142 frame_(nullptr), | |
| 143 register_allocation_zone_scope_(zone_pool_), | 133 register_allocation_zone_scope_(zone_pool_), |
| 144 register_allocation_zone_(register_allocation_zone_scope_.zone()), | 134 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} |
| 145 register_allocation_data_(nullptr) {} | |
| 146 | 135 |
| 147 // For register allocation testing entry point. | 136 // For register allocation testing entry point. |
| 148 PipelineData(ZonePool* zone_pool, CompilationInfo* info, | 137 PipelineData(ZonePool* zone_pool, CompilationInfo* info, |
| 149 InstructionSequence* sequence) | 138 InstructionSequence* sequence) |
| 150 : isolate_(info->isolate()), | 139 : isolate_(info->isolate()), |
| 151 info_(info), | 140 info_(info), |
| 152 outer_zone_(nullptr), | |
| 153 zone_pool_(zone_pool), | 141 zone_pool_(zone_pool), |
| 154 pipeline_statistics_(nullptr), | |
| 155 compilation_failed_(false), | |
| 156 code_(Handle<Code>::null()), | |
| 157 graph_zone_scope_(zone_pool_), | 142 graph_zone_scope_(zone_pool_), |
| 158 graph_zone_(nullptr), | |
| 159 graph_(nullptr), | |
| 160 loop_assignment_(nullptr), | |
| 161 simplified_(nullptr), | |
| 162 machine_(nullptr), | |
| 163 common_(nullptr), | |
| 164 javascript_(nullptr), | |
| 165 jsgraph_(nullptr), | |
| 166 schedule_(nullptr), | |
| 167 instruction_zone_scope_(zone_pool_), | 143 instruction_zone_scope_(zone_pool_), |
| 168 instruction_zone_(sequence->zone()), | 144 instruction_zone_(sequence->zone()), |
| 169 sequence_(sequence), | 145 sequence_(sequence), |
| 170 frame_(nullptr), | |
| 171 register_allocation_zone_scope_(zone_pool_), | 146 register_allocation_zone_scope_(zone_pool_), |
| 172 register_allocation_zone_(register_allocation_zone_scope_.zone()), | 147 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} |
| 173 register_allocation_data_(nullptr) {} | |
| 174 | 148 |
| 175 ~PipelineData() { | 149 ~PipelineData() { |
| 176 DeleteRegisterAllocationZone(); | 150 DeleteRegisterAllocationZone(); |
| 177 DeleteInstructionZone(); | 151 DeleteInstructionZone(); |
| 178 DeleteGraphZone(); | 152 DeleteGraphZone(); |
| 179 } | 153 } |
| 180 | 154 |
| 181 Isolate* isolate() const { return isolate_; } | 155 Isolate* isolate() const { return isolate_; } |
| 182 CompilationInfo* info() const { return info_; } | 156 CompilationInfo* info() const { return info_; } |
| 183 ZonePool* zone_pool() const { return zone_pool_; } | 157 ZonePool* zone_pool() const { return zone_pool_; } |
| 184 PipelineStatistics* pipeline_statistics() { return pipeline_statistics_; } | 158 PipelineStatistics* pipeline_statistics() { return pipeline_statistics_; } |
| 185 bool compilation_failed() const { return compilation_failed_; } | 159 bool compilation_failed() const { return compilation_failed_; } |
| 186 void set_compilation_failed() { compilation_failed_ = true; } | 160 void set_compilation_failed() { compilation_failed_ = true; } |
| 187 Handle<Code> code() { return code_; } | 161 Handle<Code> code() { return code_; } |
| 188 void set_code(Handle<Code> code) { | 162 void set_code(Handle<Code> code) { |
| 189 DCHECK(code_.is_null()); | 163 DCHECK(code_.is_null()); |
| 190 code_ = code; | 164 code_ = code; |
| 191 } | 165 } |
| 192 | 166 |
| 193 // RawMachineAssembler generally produces graphs which cannot be verified. | 167 // RawMachineAssembler generally produces graphs which cannot be verified. |
| 194 bool MayHaveUnverifiableGraph() const { return outer_zone_ == nullptr; } | 168 bool MayHaveUnverifiableGraph() const { return outer_zone_ == nullptr; } |
| 195 | 169 |
| 196 Zone* graph_zone() const { return graph_zone_; } | 170 Zone* graph_zone() const { return graph_zone_; } |
| 197 Graph* graph() const { return graph_; } | 171 Graph* graph() const { return graph_; } |
| 198 SourcePositionTable* source_positions() const { | 172 SourcePositionTable* source_positions() const { |
| 199 return source_positions_.get(); | 173 DCHECK_NOT_NULL(source_positions_); |
| 174 return source_positions_; |
| 200 } | 175 } |
| 201 MachineOperatorBuilder* machine() const { return machine_; } | 176 MachineOperatorBuilder* machine() const { return machine_; } |
| 202 CommonOperatorBuilder* common() const { return common_; } | 177 CommonOperatorBuilder* common() const { return common_; } |
| 203 JSOperatorBuilder* javascript() const { return javascript_; } | 178 JSOperatorBuilder* javascript() const { return javascript_; } |
| 204 JSGraph* jsgraph() const { return jsgraph_; } | 179 JSGraph* jsgraph() const { return jsgraph_; } |
| 205 MaybeHandle<Context> native_context() const { | 180 MaybeHandle<Context> native_context() const { |
| 206 if (info()->is_native_context_specializing()) { | 181 if (info()->is_native_context_specializing()) { |
| 207 return handle(info()->native_context(), isolate()); | 182 return handle(info()->native_context(), isolate()); |
| 208 } | 183 } |
| 209 return MaybeHandle<Context>(); | 184 return MaybeHandle<Context>(); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 232 InstructionSequence* sequence() const { return sequence_; } | 207 InstructionSequence* sequence() const { return sequence_; } |
| 233 Frame* frame() const { return frame_; } | 208 Frame* frame() const { return frame_; } |
| 234 | 209 |
| 235 Zone* register_allocation_zone() const { return register_allocation_zone_; } | 210 Zone* register_allocation_zone() const { return register_allocation_zone_; } |
| 236 RegisterAllocationData* register_allocation_data() const { | 211 RegisterAllocationData* register_allocation_data() const { |
| 237 return register_allocation_data_; | 212 return register_allocation_data_; |
| 238 } | 213 } |
| 239 | 214 |
| 240 void DeleteGraphZone() { | 215 void DeleteGraphZone() { |
| 241 // Destroy objects with destructors first. | 216 // Destroy objects with destructors first. |
| 242 source_positions_.Reset(nullptr); | 217 if (source_positions_owned_ && source_positions_) delete source_positions_; |
| 218 source_positions_ = nullptr; |
| 219 source_positions_owned_ = false; |
| 243 if (graph_zone_ == nullptr) return; | 220 if (graph_zone_ == nullptr) return; |
| 244 // Destroy zone and clear pointers. | 221 // Destroy zone and clear pointers. |
| 245 graph_zone_scope_.Destroy(); | 222 graph_zone_scope_.Destroy(); |
| 246 graph_zone_ = nullptr; | 223 graph_zone_ = nullptr; |
| 247 graph_ = nullptr; | 224 graph_ = nullptr; |
| 248 loop_assignment_ = nullptr; | 225 loop_assignment_ = nullptr; |
| 249 type_hint_analysis_ = nullptr; | 226 type_hint_analysis_ = nullptr; |
| 250 simplified_ = nullptr; | 227 simplified_ = nullptr; |
| 251 machine_ = nullptr; | 228 machine_ = nullptr; |
| 252 common_ = nullptr; | 229 common_ = nullptr; |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 const char* debug_name) { | 276 const char* debug_name) { |
| 300 DCHECK(register_allocation_data_ == nullptr); | 277 DCHECK(register_allocation_data_ == nullptr); |
| 301 register_allocation_data_ = new (register_allocation_zone()) | 278 register_allocation_data_ = new (register_allocation_zone()) |
| 302 RegisterAllocationData(config, register_allocation_zone(), frame(), | 279 RegisterAllocationData(config, register_allocation_zone(), frame(), |
| 303 sequence(), debug_name); | 280 sequence(), debug_name); |
| 304 } | 281 } |
| 305 | 282 |
| 306 private: | 283 private: |
| 307 Isolate* isolate_; | 284 Isolate* isolate_; |
| 308 CompilationInfo* info_; | 285 CompilationInfo* info_; |
| 309 Zone* outer_zone_; | 286 Zone* outer_zone_ = nullptr; |
| 310 ZonePool* const zone_pool_; | 287 ZonePool* const zone_pool_; |
| 311 PipelineStatistics* pipeline_statistics_; | 288 PipelineStatistics* pipeline_statistics_ = nullptr; |
| 312 bool compilation_failed_; | 289 bool compilation_failed_ = false; |
| 313 Handle<Code> code_; | 290 Handle<Code> code_; |
| 314 | 291 |
| 315 // All objects in the following group of fields are allocated in graph_zone_. | 292 // All objects in the following group of fields are allocated in graph_zone_. |
| 316 // They are all set to nullptr when the graph_zone_ is destroyed. | 293 // They are all set to nullptr when the graph_zone_ is destroyed. |
| 317 ZonePool::Scope graph_zone_scope_; | 294 ZonePool::Scope graph_zone_scope_; |
| 318 Zone* graph_zone_; | 295 Zone* graph_zone_ = nullptr; |
| 319 Graph* graph_; | 296 Graph* graph_ = nullptr; |
| 320 // TODO(dcarney): make this into a ZoneObject. | 297 // TODO(dcarney): make this into a ZoneObject. |
| 321 base::SmartPointer<SourcePositionTable> source_positions_; | 298 SourcePositionTable* source_positions_ = nullptr; |
| 322 LoopAssignmentAnalysis* loop_assignment_; | 299 // remember whether we allocated the SourcePositionTable ourselves. |
| 300 bool source_positions_owned_ = false; |
| 301 LoopAssignmentAnalysis* loop_assignment_ = nullptr; |
| 323 TypeHintAnalysis* type_hint_analysis_ = nullptr; | 302 TypeHintAnalysis* type_hint_analysis_ = nullptr; |
| 324 SimplifiedOperatorBuilder* simplified_; | 303 SimplifiedOperatorBuilder* simplified_ = nullptr; |
| 325 MachineOperatorBuilder* machine_; | 304 MachineOperatorBuilder* machine_ = nullptr; |
| 326 CommonOperatorBuilder* common_; | 305 CommonOperatorBuilder* common_ = nullptr; |
| 327 JSOperatorBuilder* javascript_; | 306 JSOperatorBuilder* javascript_ = nullptr; |
| 328 JSGraph* jsgraph_; | 307 JSGraph* jsgraph_ = nullptr; |
| 329 Schedule* schedule_; | 308 Schedule* schedule_ = nullptr; |
| 330 | 309 |
| 331 // All objects in the following group of fields are allocated in | 310 // All objects in the following group of fields are allocated in |
| 332 // instruction_zone_. They are all set to nullptr when the instruction_zone_ | 311 // instruction_zone_. They are all set to nullptr when the instruction_zone_ |
| 333 // is | 312 // is |
| 334 // destroyed. | 313 // destroyed. |
| 335 ZonePool::Scope instruction_zone_scope_; | 314 ZonePool::Scope instruction_zone_scope_; |
| 336 Zone* instruction_zone_; | 315 Zone* instruction_zone_; |
| 337 InstructionSequence* sequence_; | 316 InstructionSequence* sequence_ = nullptr; |
| 338 Frame* frame_; | 317 Frame* frame_ = nullptr; |
| 339 | 318 |
| 340 // All objects in the following group of fields are allocated in | 319 // All objects in the following group of fields are allocated in |
| 341 // register_allocation_zone_. They are all set to nullptr when the zone is | 320 // register_allocation_zone_. They are all set to nullptr when the zone is |
| 342 // destroyed. | 321 // destroyed. |
| 343 ZonePool::Scope register_allocation_zone_scope_; | 322 ZonePool::Scope register_allocation_zone_scope_; |
| 344 Zone* register_allocation_zone_; | 323 Zone* register_allocation_zone_; |
| 345 RegisterAllocationData* register_allocation_data_; | 324 RegisterAllocationData* register_allocation_data_ = nullptr; |
| 346 | 325 |
| 347 int CalculateFixedFrameSize(CallDescriptor* descriptor) { | 326 int CalculateFixedFrameSize(CallDescriptor* descriptor) { |
| 348 if (descriptor->IsJSFunctionCall()) { | 327 if (descriptor->IsJSFunctionCall()) { |
| 349 return StandardFrameConstants::kFixedSlotCount; | 328 return StandardFrameConstants::kFixedSlotCount; |
| 350 } | 329 } |
| 351 return descriptor->IsCFunctionCall() | 330 return descriptor->IsCFunctionCall() |
| 352 ? (CommonFrameConstants::kFixedSlotCountAboveFp + | 331 ? (CommonFrameConstants::kFixedSlotCountAboveFp + |
| 353 CommonFrameConstants::kCPSlotCount) | 332 CommonFrameConstants::kCPSlotCount) |
| 354 : TypedFrameConstants::kFixedSlotCount; | 333 : TypedFrameConstants::kFixedSlotCount; |
| 355 } | 334 } |
| (...skipping 951 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1307 | 1286 |
| 1308 data.source_positions()->RemoveDecorator(); | 1287 data.source_positions()->RemoveDecorator(); |
| 1309 | 1288 |
| 1310 // Kill the Typer and thereby uninstall the decorator (if any). | 1289 // Kill the Typer and thereby uninstall the decorator (if any). |
| 1311 typer.Reset(nullptr); | 1290 typer.Reset(nullptr); |
| 1312 | 1291 |
| 1313 return ScheduleAndGenerateCode( | 1292 return ScheduleAndGenerateCode( |
| 1314 Linkage::ComputeIncoming(data.instruction_zone(), info())); | 1293 Linkage::ComputeIncoming(data.instruction_zone(), info())); |
| 1315 } | 1294 } |
| 1316 | 1295 |
| 1296 Handle<Code> Pipeline::GenerateWASMCode(CompilationInfo* info, |
| 1297 CallDescriptor* call_descriptor, |
| 1298 Graph* graph, |
| 1299 SourcePositionTable* source_positions) { |
| 1300 // Construct a pipeline for scheduling and code generation. |
| 1301 ZonePool zone_pool(info->isolate()->allocator()); |
| 1302 PipelineData data(&zone_pool, info, graph, source_positions); |
| 1303 base::SmartPointer<PipelineStatistics> pipeline_statistics; |
| 1304 if (FLAG_turbo_stats) { |
| 1305 pipeline_statistics.Reset(new PipelineStatistics(info, &zone_pool)); |
| 1306 pipeline_statistics->BeginPhaseKind("test codegen"); |
| 1307 } |
| 1308 |
| 1309 Pipeline pipeline(info); |
| 1310 pipeline.data_ = &data; |
| 1311 if (data.schedule() == nullptr) { |
| 1312 // TODO(rossberg): Should this really be untyped? |
| 1313 pipeline.RunPrintAndVerify("Machine", true); |
| 1314 } |
| 1315 |
| 1316 Handle<Code> code = pipeline.ScheduleAndGenerateCode(call_descriptor); |
| 1317 return code; |
| 1318 } |
| 1317 | 1319 |
| 1318 Handle<Code> Pipeline::GenerateCodeForCodeStub(Isolate* isolate, | 1320 Handle<Code> Pipeline::GenerateCodeForCodeStub(Isolate* isolate, |
| 1319 CallDescriptor* call_descriptor, | 1321 CallDescriptor* call_descriptor, |
| 1320 Graph* graph, Schedule* schedule, | 1322 Graph* graph, Schedule* schedule, |
| 1321 Code::Flags flags, | 1323 Code::Flags flags, |
| 1322 const char* debug_name) { | 1324 const char* debug_name) { |
| 1323 CompilationInfo info(debug_name, isolate, graph->zone(), flags); | 1325 CompilationInfo info(debug_name, isolate, graph->zone(), flags); |
| 1324 | 1326 |
| 1325 // Construct a pipeline for scheduling and code generation. | 1327 // Construct a pipeline for scheduling and code generation. |
| 1326 ZonePool zone_pool(isolate->allocator()); | 1328 ZonePool zone_pool(isolate->allocator()); |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1592 } | 1594 } |
| 1593 | 1595 |
| 1594 data->DeleteRegisterAllocationZone(); | 1596 data->DeleteRegisterAllocationZone(); |
| 1595 } | 1597 } |
| 1596 | 1598 |
| 1597 Isolate* Pipeline::isolate() const { return info()->isolate(); } | 1599 Isolate* Pipeline::isolate() const { return info()->isolate(); } |
| 1598 | 1600 |
| 1599 } // namespace compiler | 1601 } // namespace compiler |
| 1600 } // namespace internal | 1602 } // namespace internal |
| 1601 } // namespace v8 | 1603 } // namespace v8 |
| OLD | NEW |