OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/compiler.h" | 5 #include "vm/compiler.h" |
6 | 6 |
7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
8 | 8 |
9 #include "vm/ast_printer.h" | 9 #include "vm/ast_printer.h" |
10 #include "vm/block_scheduler.h" | 10 #include "vm/block_scheduler.h" |
11 #include "vm/branch_optimizer.h" | 11 #include "vm/branch_optimizer.h" |
12 #include "vm/cha.h" | 12 #include "vm/cha.h" |
13 #include "vm/code_generator.h" | 13 #include "vm/code_generator.h" |
14 #include "vm/code_patcher.h" | 14 #include "vm/code_patcher.h" |
15 #include "vm/constant_propagator.h" | 15 #include "vm/constant_propagator.h" |
16 #include "vm/dart_entry.h" | 16 #include "vm/dart_entry.h" |
17 #include "vm/debugger.h" | 17 #include "vm/debugger.h" |
18 #include "vm/deopt_instructions.h" | 18 #include "vm/deopt_instructions.h" |
19 #include "vm/dil.h" | |
20 #include "vm/dil_to_il.h" | |
19 #include "vm/disassembler.h" | 21 #include "vm/disassembler.h" |
20 #include "vm/exceptions.h" | 22 #include "vm/exceptions.h" |
21 #include "vm/flags.h" | 23 #include "vm/flags.h" |
22 #include "vm/flow_graph.h" | 24 #include "vm/flow_graph.h" |
23 #include "vm/flow_graph_allocator.h" | 25 #include "vm/flow_graph_allocator.h" |
24 #include "vm/flow_graph_builder.h" | 26 #include "vm/flow_graph_builder.h" |
25 #include "vm/flow_graph_compiler.h" | 27 #include "vm/flow_graph_compiler.h" |
26 #include "vm/flow_graph_inliner.h" | 28 #include "vm/flow_graph_inliner.h" |
27 #include "vm/flow_graph_range_analysis.h" | 29 #include "vm/flow_graph_range_analysis.h" |
28 #include "vm/flow_graph_type_propagator.h" | 30 #include "vm/flow_graph_type_propagator.h" |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
77 DEFINE_FLAG(bool, verify_compiler, false, | 79 DEFINE_FLAG(bool, verify_compiler, false, |
78 "Enable compiler verification assertions"); | 80 "Enable compiler verification assertions"); |
79 | 81 |
80 DECLARE_FLAG(bool, huge_method_cutoff_in_code_size); | 82 DECLARE_FLAG(bool, huge_method_cutoff_in_code_size); |
81 DECLARE_FLAG(bool, trace_failed_optimization_attempts); | 83 DECLARE_FLAG(bool, trace_failed_optimization_attempts); |
82 DECLARE_FLAG(bool, trace_irregexp); | 84 DECLARE_FLAG(bool, trace_irregexp); |
83 | 85 |
84 | 86 |
85 #ifndef DART_PRECOMPILED_RUNTIME | 87 #ifndef DART_PRECOMPILED_RUNTIME |
86 | 88 |
87 void DartCompilationPipeline::ParseFunction(ParsedFunction* parsed_function) { | 89 |
88 Parser::ParseFunction(parsed_function); | 90 bool UseDilFrontEndFor(ParsedFunction* parsed_function) { |
89 parsed_function->AllocateVariables(); | 91 const Function& function = parsed_function->function(); |
92 return (function.dil_function() != kNoDilNode) || | |
93 (function.kind() == RawFunction::kNoSuchMethodDispatcher) || | |
94 (function.kind() == RawFunction::kInvokeFieldDispatcher); | |
90 } | 95 } |
91 | 96 |
92 | 97 |
98 void DartCompilationPipeline::ParseFunction(ParsedFunction* parsed_function) { | |
99 if (!UseDilFrontEndFor(parsed_function)) { | |
100 Parser::ParseFunction(parsed_function); | |
101 parsed_function->AllocateVariables(); | |
102 } | |
103 } | |
104 | |
105 | |
93 FlowGraph* DartCompilationPipeline::BuildFlowGraph( | 106 FlowGraph* DartCompilationPipeline::BuildFlowGraph( |
94 Zone* zone, | 107 Zone* zone, |
95 ParsedFunction* parsed_function, | 108 ParsedFunction* parsed_function, |
96 const ZoneGrowableArray<const ICData*>& ic_data_array, | 109 const ZoneGrowableArray<const ICData*>& ic_data_array, |
97 intptr_t osr_id) { | 110 intptr_t osr_id) { |
98 // Build the flow graph. | 111 if (UseDilFrontEndFor(parsed_function)) { |
112 dil::TreeNode* node = reinterpret_cast<dil::TreeNode*>( | |
113 parsed_function->function().dil_function()); | |
114 dil::FlowGraphBuilder builder( | |
115 node, parsed_function, ic_data_array, NULL, osr_id); | |
116 FlowGraph* graph = builder.BuildGraph(); | |
117 ASSERT(graph != NULL); | |
118 return graph; | |
119 } | |
99 FlowGraphBuilder builder(*parsed_function, | 120 FlowGraphBuilder builder(*parsed_function, |
100 ic_data_array, | 121 ic_data_array, |
101 NULL, // NULL = not inlining. | 122 NULL, // NULL = not inlining. |
102 osr_id); | 123 osr_id); |
103 | 124 |
104 return builder.BuildGraph(); | 125 return builder.BuildGraph(); |
105 } | 126 } |
106 | 127 |
107 | 128 |
108 void DartCompilationPipeline::FinalizeCompilation(FlowGraph* flow_graph) { } | 129 void DartCompilationPipeline::FinalizeCompilation(FlowGraph* flow_graph) { } |
(...skipping 912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1021 } | 1042 } |
1022 | 1043 |
1023 if (flow_graph->Canonicalize()) { | 1044 if (flow_graph->Canonicalize()) { |
1024 flow_graph->Canonicalize(); | 1045 flow_graph->Canonicalize(); |
1025 } | 1046 } |
1026 | 1047 |
1027 // Attempt to sink allocations of temporary non-escaping objects to | 1048 // Attempt to sink allocations of temporary non-escaping objects to |
1028 // the deoptimization path. | 1049 // the deoptimization path. |
1029 AllocationSinking* sinking = NULL; | 1050 AllocationSinking* sinking = NULL; |
1030 if (FLAG_allocation_sinking && | 1051 if (FLAG_allocation_sinking && |
1031 (flow_graph->graph_entry()->SuccessorCount() == 1)) { | 1052 (flow_graph->graph_entry()->SuccessorCount() == 1)) { |
1032 NOT_IN_PRODUCT(TimelineDurationScope tds2( | 1053 NOT_IN_PRODUCT(TimelineDurationScope tds2( |
1033 thread(), compiler_timeline, "AllocationSinking::Optimize")); | 1054 thread(), compiler_timeline, "AllocationSinking::Optimize")); |
1034 // TODO(fschneider): Support allocation sinking with try-catch. | 1055 // TODO(fschneider): Support allocation sinking with try-catch. |
1035 sinking = new AllocationSinking(flow_graph); | 1056 sinking = new AllocationSinking(flow_graph); |
1036 sinking->Optimize(); | 1057 sinking->Optimize(); |
1037 } | 1058 } |
1038 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 1059 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
1039 | 1060 |
1040 DeadCodeElimination::EliminateDeadPhis(flow_graph); | 1061 DeadCodeElimination::EliminateDeadPhis(flow_graph); |
1041 DEBUG_ASSERT(flow_graph->VerifyUseLists()); | 1062 DEBUG_ASSERT(flow_graph->VerifyUseLists()); |
(...skipping 655 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1697 NOT_IN_PRODUCT( | 1718 NOT_IN_PRODUCT( |
1698 VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId); | 1719 VMTagScope tagScope(thread, VMTag::kCompileUnoptimizedTagId); |
1699 TimelineDurationScope tds(thread, Timeline::GetCompilerStream(), | 1720 TimelineDurationScope tds(thread, Timeline::GetCompilerStream(), |
1700 "CompileStaticInitializer"); | 1721 "CompileStaticInitializer"); |
1701 if (tds.enabled()) { | 1722 if (tds.enabled()) { |
1702 tds.SetNumArguments(1); | 1723 tds.SetNumArguments(1); |
1703 tds.CopyArgument(0, "field", field.ToCString()); | 1724 tds.CopyArgument(0, "field", field.ToCString()); |
1704 } | 1725 } |
1705 ) | 1726 ) |
1706 | 1727 |
1707 StackZone zone(thread); | 1728 StackZone _(thread); |
rmacnak
2016/10/13 00:56:39
StackZone stack_zone(thread);
Zone* zone = stack_z
Vyacheslav Egorov (Google)
2016/10/13 14:37:57
Done.
| |
1708 ParsedFunction* parsed_function = | 1729 Zone* zone = thread->zone(); |
1709 Parser::ParseStaticFieldInitializer(field); | 1730 ParsedFunction* parsed_function; |
1710 | 1731 |
1711 parsed_function->AllocateVariables(); | 1732 // Create a one-time-use function to evaluate the initializer and invoke |
1733 // it immediately. | |
1734 if (field.dil_field() != kNoDilNode) { | |
1735 // kImplicitStaticFinalGetter is used for both implicit static getters | |
1736 // and static initializers. The Kernel graph builder will tell the | |
1737 // difference by pattern matching on the name. | |
1738 const String& name = String::Handle(zone, | |
1739 Symbols::FromConcat(thread, | |
1740 Symbols::InitPrefix(), String::Handle(zone, field.name()))); | |
1741 const Script& script = Script::Handle(zone, field.Script()); | |
1742 Object& owner = Object::Handle(zone, field.Owner()); | |
1743 owner = PatchClass::New(Class::Cast(owner), script); | |
1744 const Function& function = Function::ZoneHandle(zone, | |
1745 Function::New(name, | |
1746 RawFunction::kImplicitStaticFinalGetter, | |
1747 true, // is_static | |
1748 false, // is_const | |
1749 false, // is_abstract | |
1750 false, // is_external | |
1751 false, // is_native | |
1752 owner, | |
1753 TokenPosition::kNoSource)); | |
1754 function.set_dil_function(field.dil_field()); | |
1755 function.set_result_type(AbstractType::Handle(zone, field.type())); | |
1756 function.set_is_reflectable(false); | |
1757 function.set_is_debuggable(false); | |
1758 function.set_is_inlinable(false); | |
1759 parsed_function = new(zone) ParsedFunction(thread, function); | |
1760 } else { | |
1761 parsed_function = Parser::ParseStaticFieldInitializer(field); | |
1762 parsed_function->AllocateVariables(); | |
1763 } | |
1764 | |
1712 // Non-optimized code generator. | 1765 // Non-optimized code generator. |
1713 DartCompilationPipeline pipeline; | 1766 DartCompilationPipeline pipeline; |
1714 CompileParsedFunctionHelper helper(parsed_function, false, kNoOSRDeoptId); | 1767 CompileParsedFunctionHelper helper(parsed_function, false, kNoOSRDeoptId); |
1715 helper.Compile(&pipeline); | 1768 helper.Compile(&pipeline); |
1716 initializer = parsed_function->function().raw(); | 1769 initializer = parsed_function->function().raw(); |
1717 Code::Handle(initializer.unoptimized_code()).set_var_descriptors( | 1770 Code::Handle(initializer.unoptimized_code()).set_var_descriptors( |
1718 Object::empty_var_descriptors()); | 1771 Object::empty_var_descriptors()); |
1719 } | 1772 } |
1720 // Invoke the function to evaluate the expression. | 1773 // Invoke the function to evaluate the expression. |
1721 return DartEntry::InvokeFunction(initializer, Object::empty_array()); | 1774 return DartEntry::InvokeFunction(initializer, Object::empty_array()); |
(...skipping 436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2158 } | 2211 } |
2159 if (start_task) { | 2212 if (start_task) { |
2160 Dart::thread_pool()->Run(isolate->background_compiler()); | 2213 Dart::thread_pool()->Run(isolate->background_compiler()); |
2161 } | 2214 } |
2162 } | 2215 } |
2163 | 2216 |
2164 | 2217 |
2165 #else // DART_PRECOMPILED_RUNTIME | 2218 #else // DART_PRECOMPILED_RUNTIME |
2166 | 2219 |
2167 | 2220 |
2221 bool UseDilFrontEndFor(ParsedFunction* parsed_function) { | |
2222 UNREACHABLE(); | |
2223 return false; | |
2224 } | |
2225 | |
2226 | |
2168 CompilationPipeline* CompilationPipeline::New(Zone* zone, | 2227 CompilationPipeline* CompilationPipeline::New(Zone* zone, |
2169 const Function& function) { | 2228 const Function& function) { |
2170 UNREACHABLE(); | 2229 UNREACHABLE(); |
2171 return NULL; | 2230 return NULL; |
2172 } | 2231 } |
2173 | 2232 |
2174 | 2233 |
2175 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) { | 2234 DEFINE_RUNTIME_ENTRY(CompileFunction, 1) { |
2176 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); | 2235 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); |
2177 FATAL3("Precompilation missed function %s (%" Pd ", %s)\n", | 2236 FATAL3("Precompilation missed function %s (%" Pd ", %s)\n", |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2307 | 2366 |
2308 | 2367 |
2309 bool BackgroundCompiler::IsDisabled() { | 2368 bool BackgroundCompiler::IsDisabled() { |
2310 UNREACHABLE(); | 2369 UNREACHABLE(); |
2311 return true; | 2370 return true; |
2312 } | 2371 } |
2313 | 2372 |
2314 #endif // DART_PRECOMPILED_RUNTIME | 2373 #endif // DART_PRECOMPILED_RUNTIME |
2315 | 2374 |
2316 } // namespace dart | 2375 } // namespace dart |
OLD | NEW |