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

Side by Side Diff: runtime/vm/compiler.cc

Issue 2411823003: VM support for running Kernel binaries. (Closed)
Patch Set: Address comments Created 4 years, 2 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 | « runtime/vm/compiler.h ('k') | runtime/vm/dart_api_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/kernel.h"
20 #include "vm/kernel_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
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 UseKernelFrontEndFor(ParsedFunction* parsed_function) {
89 parsed_function->AllocateVariables(); 91 const Function& function = parsed_function->function();
92 return (function.kernel_function() != NULL) ||
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 (!UseKernelFrontEndFor(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 (UseKernelFrontEndFor(parsed_function)) {
112 kernel::TreeNode* node = static_cast<kernel::TreeNode*>(
113 parsed_function->function().kernel_function());
114 kernel::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
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
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 stack_zone(thread);
1708 ParsedFunction* parsed_function = 1729 Zone* zone = stack_zone.GetZone();
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.kernel_field() != NULL) {
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_kernel_function(field.kernel_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
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 UseKernelFrontEndFor(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
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
OLDNEW
« no previous file with comments | « runtime/vm/compiler.h ('k') | runtime/vm/dart_api_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698