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" |
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
650 (function.deoptimization_counter() < | 650 (function.deoptimization_counter() < |
651 FLAG_max_deoptimization_counter_threshold)); | 651 FLAG_max_deoptimization_counter_threshold)); |
652 | 652 |
653 // 'Freeze' ICData in background compilation so that it does not | 653 // 'Freeze' ICData in background compilation so that it does not |
654 // change while compiling. | 654 // change while compiling. |
655 const bool clone_ic_data = Compiler::IsBackgroundCompilation(); | 655 const bool clone_ic_data = Compiler::IsBackgroundCompilation(); |
656 function.RestoreICDataMap(ic_data_array, clone_ic_data); | 656 function.RestoreICDataMap(ic_data_array, clone_ic_data); |
657 | 657 |
658 if (Compiler::IsBackgroundCompilation() && | 658 if (Compiler::IsBackgroundCompilation() && |
659 (function.ic_data_array() == Array::null())) { | 659 (function.ic_data_array() == Array::null())) { |
660 Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId); | 660 Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId, |
| 661 "RestoreICDataMap: ICData array cleared."); |
661 } | 662 } |
662 if (FLAG_print_ic_data_map) { | 663 if (FLAG_print_ic_data_map) { |
663 for (intptr_t i = 0; i < ic_data_array->length(); i++) { | 664 for (intptr_t i = 0; i < ic_data_array->length(); i++) { |
664 if ((*ic_data_array)[i] != NULL) { | 665 if ((*ic_data_array)[i] != NULL) { |
665 THR_Print("%" Pd " ", i); | 666 THR_Print("%" Pd " ", i); |
666 FlowGraphPrinter::PrintICData(*(*ic_data_array)[i]); | 667 FlowGraphPrinter::PrintICData(*(*ic_data_array)[i]); |
667 } | 668 } |
668 } | 669 } |
669 } | 670 } |
670 } | 671 } |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1060 // instruction object, since the creation of instruction object | 1061 // instruction object, since the creation of instruction object |
1061 // changes code page access permissions (makes them temporary not | 1062 // changes code page access permissions (makes them temporary not |
1062 // executable). | 1063 // executable). |
1063 { | 1064 { |
1064 SafepointOperationScope safepoint_scope(thread()); | 1065 SafepointOperationScope safepoint_scope(thread()); |
1065 // Do not Garbage collect during this stage and instead allow the | 1066 // Do not Garbage collect during this stage and instead allow the |
1066 // heap to grow. | 1067 // heap to grow. |
1067 NoHeapGrowthControlScope no_growth_control; | 1068 NoHeapGrowthControlScope no_growth_control; |
1068 if (!isolate()->background_compiler()->is_running()) { | 1069 if (!isolate()->background_compiler()->is_running()) { |
1069 // The background compiler is being stopped. | 1070 // The background compiler is being stopped. |
1070 Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId); | 1071 Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId, |
| 1072 "Background compilation is being stopped"); |
1071 } | 1073 } |
1072 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); | 1074 FinalizeCompilation(&assembler, &graph_compiler, flow_graph); |
1073 } | 1075 } |
1074 if (isolate()->heap()->NeedsGarbageCollection()) { | 1076 if (isolate()->heap()->NeedsGarbageCollection()) { |
1075 isolate()->heap()->CollectAllGarbage(); | 1077 isolate()->heap()->CollectAllGarbage(); |
1076 } | 1078 } |
1077 } | 1079 } |
1078 } | 1080 } |
1079 // Mark that this isolate now has compiled code. | 1081 // Mark that this isolate now has compiled code. |
1080 isolate()->set_has_compiled_code(true); | 1082 isolate()->set_has_compiled_code(true); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1188 | 1190 |
1189 | 1191 |
1190 CompileParsedFunctionHelper helper(parsed_function, optimized, osr_id); | 1192 CompileParsedFunctionHelper helper(parsed_function, optimized, osr_id); |
1191 | 1193 |
1192 if (Compiler::IsBackgroundCompilation()) { | 1194 if (Compiler::IsBackgroundCompilation()) { |
1193 if (isolate->IsTopLevelParsing() || | 1195 if (isolate->IsTopLevelParsing() || |
1194 (loading_invalidation_gen_at_start != | 1196 (loading_invalidation_gen_at_start != |
1195 isolate->loading_invalidation_gen())) { | 1197 isolate->loading_invalidation_gen())) { |
1196 // Loading occured while parsing. We need to abort here because state | 1198 // Loading occured while parsing. We need to abort here because state |
1197 // changed while compiling. | 1199 // changed while compiling. |
1198 Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId); | 1200 Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId, |
| 1201 "Invalidated state during parsing because of script loading"); |
1199 } | 1202 } |
1200 } | 1203 } |
1201 | 1204 |
1202 const bool success = helper.Compile(pipeline); | 1205 const bool success = helper.Compile(pipeline); |
1203 if (success) { | 1206 if (success) { |
1204 if (!optimized) { | 1207 if (!optimized) { |
1205 function.set_was_compiled(true); | 1208 function.set_was_compiled(true); |
1206 } | 1209 } |
1207 } else { | 1210 } else { |
1208 if (optimized) { | 1211 if (optimized) { |
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1572 Thread* const thread = Thread::Current(); | 1575 Thread* const thread = Thread::Current(); |
1573 const Object& result = PassiveObject::Handle(thread->sticky_error()); | 1576 const Object& result = PassiveObject::Handle(thread->sticky_error()); |
1574 thread->clear_sticky_error(); | 1577 thread->clear_sticky_error(); |
1575 return result.raw(); | 1578 return result.raw(); |
1576 } | 1579 } |
1577 UNREACHABLE(); | 1580 UNREACHABLE(); |
1578 return Object::null(); | 1581 return Object::null(); |
1579 } | 1582 } |
1580 | 1583 |
1581 | 1584 |
1582 void Compiler::AbortBackgroundCompilation(intptr_t deopt_id) { | 1585 void Compiler::AbortBackgroundCompilation(intptr_t deopt_id, const char* msg) { |
1583 if (FLAG_trace_compiler) { | 1586 if (FLAG_trace_compiler) { |
1584 THR_Print("ABORT background compilation\n"); | 1587 THR_Print("ABORT background compilation: %s\n", msg); |
| 1588 } |
| 1589 TimelineStream* stream = Timeline::GetCompilerStream(); |
| 1590 ASSERT(stream != NULL); |
| 1591 TimelineEvent* event = stream->StartEvent(); |
| 1592 if (event != NULL) { |
| 1593 event->Instant("AbortBackgroundCompilation"); |
| 1594 event->SetNumArguments(1); |
| 1595 event->CopyArgument(0, "reason", msg); |
| 1596 event->Complete(); |
1585 } | 1597 } |
1586 ASSERT(Compiler::IsBackgroundCompilation()); | 1598 ASSERT(Compiler::IsBackgroundCompilation()); |
1587 Thread::Current()->long_jump_base()->Jump( | 1599 Thread::Current()->long_jump_base()->Jump( |
1588 deopt_id, Object::background_compilation_error()); | 1600 deopt_id, Object::background_compilation_error()); |
1589 } | 1601 } |
1590 | 1602 |
1591 | 1603 |
1592 // C-heap allocated background compilation queue element. | 1604 // C-heap allocated background compilation queue element. |
1593 class QueueElement { | 1605 class QueueElement { |
1594 public: | 1606 public: |
(...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1960 return DartEntry::InvokeFunction(initializer, Object::empty_array()); | 1972 return DartEntry::InvokeFunction(initializer, Object::empty_array()); |
1961 } | 1973 } |
1962 | 1974 |
1963 | 1975 |
1964 RawObject* Compiler::ExecuteOnce(SequenceNode* fragment) { | 1976 RawObject* Compiler::ExecuteOnce(SequenceNode* fragment) { |
1965 UNREACHABLE(); | 1977 UNREACHABLE(); |
1966 return Object::null(); | 1978 return Object::null(); |
1967 } | 1979 } |
1968 | 1980 |
1969 | 1981 |
1970 void Compiler::AbortBackgroundCompilation(intptr_t deopt_id) { | 1982 void Compiler::AbortBackgroundCompilation(intptr_t deopt_id, const char* msg) { |
1971 UNREACHABLE(); | 1983 UNREACHABLE(); |
1972 } | 1984 } |
1973 | 1985 |
1974 | 1986 |
1975 void BackgroundCompiler::CompileOptimized(const Function& function) { | 1987 void BackgroundCompiler::CompileOptimized(const Function& function) { |
1976 UNREACHABLE(); | 1988 UNREACHABLE(); |
1977 } | 1989 } |
1978 | 1990 |
1979 | 1991 |
1980 void BackgroundCompiler::VisitPointers(ObjectPointerVisitor* visitor) { | 1992 void BackgroundCompiler::VisitPointers(ObjectPointerVisitor* visitor) { |
1981 UNREACHABLE(); | 1993 UNREACHABLE(); |
1982 } | 1994 } |
1983 | 1995 |
1984 | 1996 |
1985 void BackgroundCompiler::Stop(BackgroundCompiler* task) { | 1997 void BackgroundCompiler::Stop(BackgroundCompiler* task) { |
1986 UNREACHABLE(); | 1998 UNREACHABLE(); |
1987 } | 1999 } |
1988 | 2000 |
1989 | 2001 |
1990 void BackgroundCompiler::EnsureInit(Thread* thread) { | 2002 void BackgroundCompiler::EnsureInit(Thread* thread) { |
1991 UNREACHABLE(); | 2003 UNREACHABLE(); |
1992 } | 2004 } |
1993 | 2005 |
1994 #endif // DART_PRECOMPILED_RUNTIME | 2006 #endif // DART_PRECOMPILED_RUNTIME |
1995 | 2007 |
1996 } // namespace dart | 2008 } // namespace dart |
OLD | NEW |