| 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 <memory> | 8 #include <memory> | 
| 9 #include <sstream> | 9 #include <sstream> | 
| 10 | 10 | 
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 573  protected: | 573  protected: | 
| 574   Status CreateGraphImpl() final; | 574   Status CreateGraphImpl() final; | 
| 575   Status OptimizeGraphImpl() final; | 575   Status OptimizeGraphImpl() final; | 
| 576   Status GenerateCodeImpl() final; | 576   Status GenerateCodeImpl() final; | 
| 577 | 577 | 
| 578  private: | 578  private: | 
| 579   Zone zone_; | 579   Zone zone_; | 
| 580   ZonePool zone_pool_; | 580   ZonePool zone_pool_; | 
| 581   ParseInfo parse_info_; | 581   ParseInfo parse_info_; | 
| 582   CompilationInfo info_; | 582   CompilationInfo info_; | 
| 583   base::SmartPointer<PipelineStatistics> pipeline_statistics_; | 583   std::unique_ptr<PipelineStatistics> pipeline_statistics_; | 
| 584   PipelineData data_; | 584   PipelineData data_; | 
| 585   PipelineImpl pipeline_; | 585   PipelineImpl pipeline_; | 
| 586   Linkage* linkage_; | 586   Linkage* linkage_; | 
|  | 587 | 
|  | 588   DISALLOW_COPY_AND_ASSIGN(PipelineCompilationJob); | 
| 587 }; | 589 }; | 
| 588 | 590 | 
| 589 PipelineCompilationJob::Status PipelineCompilationJob::CreateGraphImpl() { | 591 PipelineCompilationJob::Status PipelineCompilationJob::CreateGraphImpl() { | 
| 590   if (info()->shared_info()->asm_function()) { | 592   if (info()->shared_info()->asm_function()) { | 
| 591     if (info()->osr_frame()) info()->MarkAsFrameSpecializing(); | 593     if (info()->osr_frame()) info()->MarkAsFrameSpecializing(); | 
| 592     info()->MarkAsFunctionContextSpecializing(); | 594     info()->MarkAsFunctionContextSpecializing(); | 
| 593   } else { | 595   } else { | 
| 594     if (!FLAG_always_opt) { | 596     if (!FLAG_always_opt) { | 
| 595       info()->MarkAsBailoutOnUninitialized(); | 597       info()->MarkAsBailoutOnUninitialized(); | 
| 596     } | 598     } | 
| (...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1557 Handle<Code> Pipeline::GenerateCodeForCodeStub(Isolate* isolate, | 1559 Handle<Code> Pipeline::GenerateCodeForCodeStub(Isolate* isolate, | 
| 1558                                                CallDescriptor* call_descriptor, | 1560                                                CallDescriptor* call_descriptor, | 
| 1559                                                Graph* graph, Schedule* schedule, | 1561                                                Graph* graph, Schedule* schedule, | 
| 1560                                                Code::Flags flags, | 1562                                                Code::Flags flags, | 
| 1561                                                const char* debug_name) { | 1563                                                const char* debug_name) { | 
| 1562   CompilationInfo info(CStrVector(debug_name), isolate, graph->zone(), flags); | 1564   CompilationInfo info(CStrVector(debug_name), isolate, graph->zone(), flags); | 
| 1563 | 1565 | 
| 1564   // Construct a pipeline for scheduling and code generation. | 1566   // Construct a pipeline for scheduling and code generation. | 
| 1565   ZonePool zone_pool(isolate->allocator()); | 1567   ZonePool zone_pool(isolate->allocator()); | 
| 1566   PipelineData data(&zone_pool, &info, graph, schedule); | 1568   PipelineData data(&zone_pool, &info, graph, schedule); | 
| 1567   base::SmartPointer<PipelineStatistics> pipeline_statistics; | 1569   std::unique_ptr<PipelineStatistics> pipeline_statistics; | 
| 1568   if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) { | 1570   if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) { | 
| 1569     pipeline_statistics.Reset(new PipelineStatistics(&info, &zone_pool)); | 1571     pipeline_statistics.reset(new PipelineStatistics(&info, &zone_pool)); | 
| 1570     pipeline_statistics->BeginPhaseKind("stub codegen"); | 1572     pipeline_statistics->BeginPhaseKind("stub codegen"); | 
| 1571   } | 1573   } | 
| 1572 | 1574 | 
| 1573   PipelineImpl pipeline(&data); | 1575   PipelineImpl pipeline(&data); | 
| 1574   DCHECK_NOT_NULL(data.schedule()); | 1576   DCHECK_NOT_NULL(data.schedule()); | 
| 1575 | 1577 | 
| 1576   if (FLAG_trace_turbo) { | 1578   if (FLAG_trace_turbo) { | 
| 1577     { | 1579     { | 
| 1578       TurboJsonFile json_of(&info, std::ios_base::trunc); | 1580       TurboJsonFile json_of(&info, std::ios_base::trunc); | 
| 1579       json_of << "{\"function\":\"" << info.GetDebugName().get() | 1581       json_of << "{\"function\":\"" << info.GetDebugName().get() | 
| 1580               << "\", \"source\":\"\",\n\"phases\":["; | 1582               << "\", \"source\":\"\",\n\"phases\":["; | 
| 1581     } | 1583     } | 
| 1582     pipeline.Run<PrintGraphPhase>("Machine"); | 1584     pipeline.Run<PrintGraphPhase>("Machine"); | 
| 1583   } | 1585   } | 
| 1584 | 1586 | 
| 1585   pipeline.Run<VerifyGraphPhase>(false, true); | 1587   pipeline.Run<VerifyGraphPhase>(false, true); | 
| 1586   return pipeline.ScheduleAndGenerateCode(call_descriptor); | 1588   return pipeline.ScheduleAndGenerateCode(call_descriptor); | 
| 1587 } | 1589 } | 
| 1588 | 1590 | 
| 1589 // static | 1591 // static | 
| 1590 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info) { | 1592 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info) { | 
| 1591   ZonePool zone_pool(info->isolate()->allocator()); | 1593   ZonePool zone_pool(info->isolate()->allocator()); | 
| 1592   base::SmartPointer<PipelineStatistics> pipeline_statistics( | 1594   std::unique_ptr<PipelineStatistics> pipeline_statistics( | 
| 1593       CreatePipelineStatistics(info, &zone_pool)); | 1595       CreatePipelineStatistics(info, &zone_pool)); | 
| 1594   PipelineData data(&zone_pool, info, pipeline_statistics.get()); | 1596   PipelineData data(&zone_pool, info, pipeline_statistics.get()); | 
| 1595   PipelineImpl pipeline(&data); | 1597   PipelineImpl pipeline(&data); | 
| 1596 | 1598 | 
| 1597   Linkage linkage(Linkage::ComputeIncoming(data.instruction_zone(), info)); | 1599   Linkage linkage(Linkage::ComputeIncoming(data.instruction_zone(), info)); | 
| 1598 | 1600 | 
| 1599   if (!pipeline.CreateGraph()) return Handle<Code>::null(); | 1601   if (!pipeline.CreateGraph()) return Handle<Code>::null(); | 
| 1600   if (!pipeline.OptimizeGraph(&linkage)) return Handle<Code>::null(); | 1602   if (!pipeline.OptimizeGraph(&linkage)) return Handle<Code>::null(); | 
| 1601   return pipeline.GenerateCode(&linkage); | 1603   return pipeline.GenerateCode(&linkage); | 
| 1602 } | 1604 } | 
| 1603 | 1605 | 
| 1604 // static | 1606 // static | 
| 1605 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, | 1607 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, | 
| 1606                                               Graph* graph, | 1608                                               Graph* graph, | 
| 1607                                               Schedule* schedule) { | 1609                                               Schedule* schedule) { | 
| 1608   CallDescriptor* call_descriptor = | 1610   CallDescriptor* call_descriptor = | 
| 1609       Linkage::ComputeIncoming(info->zone(), info); | 1611       Linkage::ComputeIncoming(info->zone(), info); | 
| 1610   return GenerateCodeForTesting(info, call_descriptor, graph, schedule); | 1612   return GenerateCodeForTesting(info, call_descriptor, graph, schedule); | 
| 1611 } | 1613 } | 
| 1612 | 1614 | 
| 1613 // static | 1615 // static | 
| 1614 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, | 1616 Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info, | 
| 1615                                               CallDescriptor* call_descriptor, | 1617                                               CallDescriptor* call_descriptor, | 
| 1616                                               Graph* graph, | 1618                                               Graph* graph, | 
| 1617                                               Schedule* schedule) { | 1619                                               Schedule* schedule) { | 
| 1618   // Construct a pipeline for scheduling and code generation. | 1620   // Construct a pipeline for scheduling and code generation. | 
| 1619   ZonePool zone_pool(info->isolate()->allocator()); | 1621   ZonePool zone_pool(info->isolate()->allocator()); | 
| 1620   PipelineData data(&zone_pool, info, graph, schedule); | 1622   PipelineData data(&zone_pool, info, graph, schedule); | 
| 1621   base::SmartPointer<PipelineStatistics> pipeline_statistics; | 1623   std::unique_ptr<PipelineStatistics> pipeline_statistics; | 
| 1622   if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) { | 1624   if (FLAG_turbo_stats || FLAG_turbo_stats_nvp) { | 
| 1623     pipeline_statistics.Reset(new PipelineStatistics(info, &zone_pool)); | 1625     pipeline_statistics.reset(new PipelineStatistics(info, &zone_pool)); | 
| 1624     pipeline_statistics->BeginPhaseKind("test codegen"); | 1626     pipeline_statistics->BeginPhaseKind("test codegen"); | 
| 1625   } | 1627   } | 
| 1626 | 1628 | 
| 1627   PipelineImpl pipeline(&data); | 1629   PipelineImpl pipeline(&data); | 
| 1628 | 1630 | 
| 1629   if (FLAG_trace_turbo) { | 1631   if (FLAG_trace_turbo) { | 
| 1630     TurboJsonFile json_of(info, std::ios_base::trunc); | 1632     TurboJsonFile json_of(info, std::ios_base::trunc); | 
| 1631     json_of << "{\"function\":\"" << info->GetDebugName().get() | 1633     json_of << "{\"function\":\"" << info->GetDebugName().get() | 
| 1632             << "\", \"source\":\"\",\n\"phases\":["; | 1634             << "\", \"source\":\"\",\n\"phases\":["; | 
| 1633   } | 1635   } | 
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1780 | 1782 | 
| 1781   // Generate the final machine code. | 1783   // Generate the final machine code. | 
| 1782   return GenerateCode(&linkage); | 1784   return GenerateCode(&linkage); | 
| 1783 } | 1785 } | 
| 1784 | 1786 | 
| 1785 void PipelineImpl::AllocateRegisters(const RegisterConfiguration* config, | 1787 void PipelineImpl::AllocateRegisters(const RegisterConfiguration* config, | 
| 1786                                      CallDescriptor* descriptor, | 1788                                      CallDescriptor* descriptor, | 
| 1787                                      bool run_verifier) { | 1789                                      bool run_verifier) { | 
| 1788   PipelineData* data = this->data_; | 1790   PipelineData* data = this->data_; | 
| 1789   // Don't track usage for this zone in compiler stats. | 1791   // Don't track usage for this zone in compiler stats. | 
| 1790   base::SmartPointer<Zone> verifier_zone; | 1792   std::unique_ptr<Zone> verifier_zone; | 
| 1791   RegisterAllocatorVerifier* verifier = nullptr; | 1793   RegisterAllocatorVerifier* verifier = nullptr; | 
| 1792   if (run_verifier) { | 1794   if (run_verifier) { | 
| 1793     verifier_zone.Reset(new Zone(isolate()->allocator())); | 1795     verifier_zone.reset(new Zone(isolate()->allocator())); | 
| 1794     verifier = new (verifier_zone.get()) RegisterAllocatorVerifier( | 1796     verifier = new (verifier_zone.get()) RegisterAllocatorVerifier( | 
| 1795         verifier_zone.get(), config, data->sequence()); | 1797         verifier_zone.get(), config, data->sequence()); | 
| 1796   } | 1798   } | 
| 1797 | 1799 | 
| 1798 #ifdef DEBUG | 1800 #ifdef DEBUG | 
| 1799   data_->sequence()->ValidateEdgeSplitForm(); | 1801   data_->sequence()->ValidateEdgeSplitForm(); | 
| 1800   data_->sequence()->ValidateDeferredBlockEntryPaths(); | 1802   data_->sequence()->ValidateDeferredBlockEntryPaths(); | 
| 1801   data_->sequence()->ValidateDeferredBlockExitPaths(); | 1803   data_->sequence()->ValidateDeferredBlockExitPaths(); | 
| 1802 #endif | 1804 #endif | 
| 1803 | 1805 | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1866   data->DeleteRegisterAllocationZone(); | 1868   data->DeleteRegisterAllocationZone(); | 
| 1867 } | 1869 } | 
| 1868 | 1870 | 
| 1869 CompilationInfo* PipelineImpl::info() const { return data_->info(); } | 1871 CompilationInfo* PipelineImpl::info() const { return data_->info(); } | 
| 1870 | 1872 | 
| 1871 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } | 1873 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } | 
| 1872 | 1874 | 
| 1873 }  // namespace compiler | 1875 }  // namespace compiler | 
| 1874 }  // namespace internal | 1876 }  // namespace internal | 
| 1875 }  // namespace v8 | 1877 }  // namespace v8 | 
| OLD | NEW | 
|---|