| 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/platform/elapsed-timer.h" | 10 #include "src/base/platform/elapsed-timer.h" |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 }; | 252 }; |
| 253 | 253 |
| 254 | 254 |
| 255 static void TraceSchedule(Schedule* schedule) { | 255 static void TraceSchedule(Schedule* schedule) { |
| 256 if (!FLAG_trace_turbo) return; | 256 if (!FLAG_trace_turbo) return; |
| 257 OFStream os(stdout); | 257 OFStream os(stdout); |
| 258 os << "-- Schedule --------------------------------------\n" << *schedule; | 258 os << "-- Schedule --------------------------------------\n" << *schedule; |
| 259 } | 259 } |
| 260 | 260 |
| 261 | 261 |
| 262 static SmartArrayPointer<char> GetDebugName(CompilationInfo* info) { |
| 263 SmartArrayPointer<char> name; |
| 264 if (info->IsStub()) { |
| 265 if (info->code_stub() != NULL) { |
| 266 CodeStub::Major major_key = info->code_stub()->MajorKey(); |
| 267 const char* major_name = CodeStub::MajorName(major_key, false); |
| 268 size_t len = strlen(major_name); |
| 269 name.Reset(new char[len]); |
| 270 memcpy(name.get(), major_name, len); |
| 271 } |
| 272 } else { |
| 273 AllowHandleDereference allow_deref; |
| 274 name = info->function()->debug_name()->ToCString(); |
| 275 } |
| 276 return name; |
| 277 } |
| 278 |
| 279 |
| 262 Handle<Code> Pipeline::GenerateCode() { | 280 Handle<Code> Pipeline::GenerateCode() { |
| 263 // This list must be kept in sync with DONT_TURBOFAN_NODE in ast.cc. | 281 // This list must be kept in sync with DONT_TURBOFAN_NODE in ast.cc. |
| 264 if (info()->function()->dont_optimize_reason() == kTryCatchStatement || | 282 if (info()->function()->dont_optimize_reason() == kTryCatchStatement || |
| 265 info()->function()->dont_optimize_reason() == kTryFinallyStatement || | 283 info()->function()->dont_optimize_reason() == kTryFinallyStatement || |
| 266 // TODO(turbofan): Make ES6 for-of work and remove this bailout. | 284 // TODO(turbofan): Make ES6 for-of work and remove this bailout. |
| 267 info()->function()->dont_optimize_reason() == kForOfStatement || | 285 info()->function()->dont_optimize_reason() == kForOfStatement || |
| 268 // TODO(turbofan): Make super work and remove this bailout. | 286 // TODO(turbofan): Make super work and remove this bailout. |
| 269 info()->function()->dont_optimize_reason() == kSuperReference || | 287 info()->function()->dont_optimize_reason() == kSuperReference || |
| 270 // TODO(turbofan): Make class literals work and remove this bailout. | 288 // TODO(turbofan): Make class literals work and remove this bailout. |
| 271 info()->function()->dont_optimize_reason() == kClassLiteral || | 289 info()->function()->dont_optimize_reason() == kClassLiteral || |
| 272 // TODO(turbofan): Make OSR work and remove this bailout. | 290 // TODO(turbofan): Make OSR work and remove this bailout. |
| 273 info()->is_osr()) { | 291 info()->is_osr()) { |
| 274 return Handle<Code>::null(); | 292 return Handle<Code>::null(); |
| 275 } | 293 } |
| 276 | 294 |
| 277 ZonePool zone_pool(isolate()); | 295 ZonePool zone_pool(isolate()); |
| 278 | 296 |
| 279 SmartPointer<PipelineStatistics> pipeline_statistics; | 297 SmartPointer<PipelineStatistics> pipeline_statistics; |
| 280 if (FLAG_turbo_stats) { | 298 if (FLAG_turbo_stats) { |
| 281 pipeline_statistics.Reset(new PipelineStatistics(info(), &zone_pool)); | 299 pipeline_statistics.Reset(new PipelineStatistics(info(), &zone_pool)); |
| 282 pipeline_statistics->BeginPhaseKind("graph creation"); | 300 pipeline_statistics->BeginPhaseKind("graph creation"); |
| 283 } | 301 } |
| 284 | 302 |
| 285 if (FLAG_trace_turbo) { | 303 if (FLAG_trace_turbo) { |
| 286 OFStream os(stdout); | 304 OFStream os(stdout); |
| 287 os << "---------------------------------------------------\n" | 305 os << "---------------------------------------------------\n" |
| 288 << "Begin compiling method " | 306 << "Begin compiling method " << GetDebugName(info()).get() |
| 289 << info()->function()->debug_name()->ToCString().get() | |
| 290 << " using Turbofan" << std::endl; | 307 << " using Turbofan" << std::endl; |
| 291 TurboCfgFile tcf(isolate()); | 308 TurboCfgFile tcf(isolate()); |
| 292 tcf << AsC1VCompilation(info()); | 309 tcf << AsC1VCompilation(info()); |
| 293 } | 310 } |
| 294 | 311 |
| 295 // Initialize the graph and builders. | 312 // Initialize the graph and builders. |
| 296 PipelineData data(info(), &zone_pool, pipeline_statistics.get()); | 313 PipelineData data(info(), &zone_pool, pipeline_statistics.get()); |
| 297 | 314 |
| 298 data.source_positions()->AddDecorator(); | 315 data.source_positions()->AddDecorator(); |
| 299 | 316 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 code = GenerateCode(&linkage, &data); | 473 code = GenerateCode(&linkage, &data); |
| 457 info()->SetCode(code); | 474 info()->SetCode(code); |
| 458 } | 475 } |
| 459 | 476 |
| 460 // Print optimized code. | 477 // Print optimized code. |
| 461 v8::internal::CodeGenerator::PrintCode(code, info()); | 478 v8::internal::CodeGenerator::PrintCode(code, info()); |
| 462 | 479 |
| 463 if (FLAG_trace_turbo) { | 480 if (FLAG_trace_turbo) { |
| 464 OFStream os(stdout); | 481 OFStream os(stdout); |
| 465 os << "--------------------------------------------------\n" | 482 os << "--------------------------------------------------\n" |
| 466 << "Finished compiling method " | 483 << "Finished compiling method " << GetDebugName(info()).get() |
| 467 << info()->function()->debug_name()->ToCString().get() | |
| 468 << " using Turbofan" << std::endl; | 484 << " using Turbofan" << std::endl; |
| 469 } | 485 } |
| 470 | 486 |
| 471 return code; | 487 return code; |
| 472 } | 488 } |
| 473 | 489 |
| 474 | 490 |
| 475 void Pipeline::ComputeSchedule(PipelineData* data) { | 491 void Pipeline::ComputeSchedule(PipelineData* data) { |
| 476 PhaseScope phase_scope(data->pipeline_statistics(), "scheduling"); | 492 PhaseScope phase_scope(data->pipeline_statistics(), "scheduling"); |
| 477 Schedule* schedule = | 493 Schedule* schedule = |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 549 | 565 |
| 550 // Allocate registers. | 566 // Allocate registers. |
| 551 Frame frame; | 567 Frame frame; |
| 552 { | 568 { |
| 553 int node_count = sequence.VirtualRegisterCount(); | 569 int node_count = sequence.VirtualRegisterCount(); |
| 554 if (node_count > UnallocatedOperand::kMaxVirtualRegisters) { | 570 if (node_count > UnallocatedOperand::kMaxVirtualRegisters) { |
| 555 info()->AbortOptimization(kNotEnoughVirtualRegistersForValues); | 571 info()->AbortOptimization(kNotEnoughVirtualRegistersForValues); |
| 556 return Handle<Code>::null(); | 572 return Handle<Code>::null(); |
| 557 } | 573 } |
| 558 ZonePool::Scope zone_scope(data->zone_pool()); | 574 ZonePool::Scope zone_scope(data->zone_pool()); |
| 559 RegisterAllocator allocator(zone_scope.zone(), &frame, info(), &sequence); | 575 |
| 576 SmartArrayPointer<char> debug_name; |
| 577 #ifdef DEBUG |
| 578 debug_name = GetDebugName(info()); |
| 579 #endif |
| 580 |
| 581 RegisterAllocator allocator(zone_scope.zone(), &frame, &sequence, |
| 582 debug_name.get()); |
| 560 if (!allocator.Allocate(data->pipeline_statistics())) { | 583 if (!allocator.Allocate(data->pipeline_statistics())) { |
| 561 info()->AbortOptimization(kNotEnoughVirtualRegistersRegalloc); | 584 info()->AbortOptimization(kNotEnoughVirtualRegistersRegalloc); |
| 562 return Handle<Code>::null(); | 585 return Handle<Code>::null(); |
| 563 } | 586 } |
| 564 if (FLAG_trace_turbo) { | 587 if (FLAG_trace_turbo) { |
| 565 TurboCfgFile tcf(isolate()); | 588 TurboCfgFile tcf(isolate()); |
| 566 tcf << AsC1VAllocator("CodeGen", &allocator); | 589 tcf << AsC1VAllocator("CodeGen", &allocator); |
| 567 } | 590 } |
| 568 } | 591 } |
| 569 | 592 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 600 } | 623 } |
| 601 | 624 |
| 602 | 625 |
| 603 void Pipeline::TearDown() { | 626 void Pipeline::TearDown() { |
| 604 InstructionOperand::TearDownCaches(); | 627 InstructionOperand::TearDownCaches(); |
| 605 } | 628 } |
| 606 | 629 |
| 607 } // namespace compiler | 630 } // namespace compiler |
| 608 } // namespace internal | 631 } // namespace internal |
| 609 } // namespace v8 | 632 } // namespace v8 |
| OLD | NEW |