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

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

Issue 1414933006: Copy ICData descriptors when starting background compilation, so that they do not change while comp… (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Address comments Created 5 years, 1 month 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/compiler_test.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"
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); 177 const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
178 ASSERT(!function.HasCode()); 178 ASSERT(!function.HasCode());
179 const Error& error = 179 const Error& error =
180 Error::Handle(Compiler::CompileFunction(thread, function)); 180 Error::Handle(Compiler::CompileFunction(thread, function));
181 if (!error.IsNull()) { 181 if (!error.IsNull()) {
182 Exceptions::PropagateError(error); 182 Exceptions::PropagateError(error);
183 } 183 }
184 } 184 }
185 185
186 186
187 bool Compiler::IsBackgroundCompilation() {
188 // For now: compilation in non mutator thread is the background compoilation.
189 return !Thread::Current()->IsMutatorThread();
190 }
191
192
187 RawError* Compiler::Compile(const Library& library, const Script& script) { 193 RawError* Compiler::Compile(const Library& library, const Script& script) {
188 LongJumpScope jump; 194 LongJumpScope jump;
189 if (setjmp(*jump.Set()) == 0) { 195 if (setjmp(*jump.Set()) == 0) {
190 Thread* const thread = Thread::Current(); 196 Thread* const thread = Thread::Current();
191 StackZone zone(thread); 197 StackZone zone(thread);
192 if (FLAG_trace_compiler) { 198 if (FLAG_trace_compiler) {
193 const String& script_url = String::Handle(script.url()); 199 const String& script_url = String::Handle(script.url());
194 // TODO(iposva): Extract script kind. 200 // TODO(iposva): Extract script kind.
195 THR_Print("Compiling %s '%s'\n", "", script_url.ToCString()); 201 THR_Print("Compiling %s '%s'\n", "", script_url.ToCString());
196 } 202 }
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 // LongJump. 426 // LongJump.
421 { 427 {
422 CSTAT_TIMER_SCOPE(thread, graphbuilder_timer); 428 CSTAT_TIMER_SCOPE(thread, graphbuilder_timer);
423 ZoneGrowableArray<const ICData*>* ic_data_array = 429 ZoneGrowableArray<const ICData*>* ic_data_array =
424 new(zone) ZoneGrowableArray<const ICData*>(); 430 new(zone) ZoneGrowableArray<const ICData*>();
425 if (optimized) { 431 if (optimized) {
426 // Extract type feedback before the graph is built, as the graph 432 // Extract type feedback before the graph is built, as the graph
427 // builder uses it to attach it to nodes. 433 // builder uses it to attach it to nodes.
428 ASSERT(function.deoptimization_counter() < 434 ASSERT(function.deoptimization_counter() <
429 FLAG_deoptimization_counter_threshold); 435 FLAG_deoptimization_counter_threshold);
430 function.RestoreICDataMap(ic_data_array); 436
437 // 'Freeze' ICData in background compilation so that it does not
438 // change while compiling.
439 const bool clone_descriptors = Compiler::IsBackgroundCompilation();
440 function.RestoreICDataMap(ic_data_array, clone_descriptors);
441
431 if (FLAG_print_ic_data_map) { 442 if (FLAG_print_ic_data_map) {
432 for (intptr_t i = 0; i < ic_data_array->length(); i++) { 443 for (intptr_t i = 0; i < ic_data_array->length(); i++) {
433 if ((*ic_data_array)[i] != NULL) { 444 if ((*ic_data_array)[i] != NULL) {
434 THR_Print("%" Pd " ", i); 445 THR_Print("%" Pd " ", i);
435 FlowGraphPrinter::PrintICData(*(*ic_data_array)[i]); 446 FlowGraphPrinter::PrintICData(*(*ic_data_array)[i]);
436 } 447 }
437 } 448 }
438 } 449 }
439 } 450 }
440 451
(...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 function, 1541 function,
1531 Compiler::kNoOSRDeoptId, 1542 Compiler::kNoOSRDeoptId,
1532 &code)); 1543 &code));
1533 // TODO(srdjan): We do not expect errors while compiling optimized 1544 // TODO(srdjan): We do not expect errors while compiling optimized
1534 // code, any errors should have been caught when compiling 1545 // code, any errors should have been caught when compiling
1535 // unoptimized code. 1546 // unoptimized code.
1536 // If it still happens mark function as not optimizable. 1547 // If it still happens mark function as not optimizable.
1537 ASSERT(error.IsNull()); 1548 ASSERT(error.IsNull());
1538 temp_function = RemoveFunctionOrNull(); 1549 temp_function = RemoveFunctionOrNull();
1539 ASSERT(temp_function.raw() == function.raw()); 1550 ASSERT(temp_function.raw() == function.raw());
1540 // Reset to 0 so that it can be recompiled if needed.
1541 function.set_usage_counter(0);
1542 function = LastFunctionOrNull(); 1551 function = LastFunctionOrNull();
1552 ASSERT(!code.IsNull());
1543 AddCode(code); 1553 AddCode(code);
1544 } 1554 }
1545 } 1555 }
1546 Thread::ExitIsolateAsHelper(); 1556 Thread::ExitIsolateAsHelper();
1547 { 1557 {
1548 // Wait to be notified when the work queue is not empty. 1558 // Wait to be notified when the work queue is not empty.
1549 MonitorLocker ml(queue_monitor_); 1559 MonitorLocker ml(queue_monitor_);
1550 while ((function_queue_length() == 0) && running_) { 1560 while ((function_queue_length() == 0) && running_) {
1551 ml.Wait(); 1561 ml.Wait();
1552 } 1562 }
(...skipping 15 matching lines...) Expand all
1568 1578
1569 void BackgroundCompiler::InstallGeneratedCode() { 1579 void BackgroundCompiler::InstallGeneratedCode() {
1570 MonitorLocker ml(queue_monitor_); 1580 MonitorLocker ml(queue_monitor_);
1571 CompilationWorkQueue queue(CodesQueue()); 1581 CompilationWorkQueue queue(CodesQueue());
1572 Code& code = Code::Handle(); 1582 Code& code = Code::Handle();
1573 Object& owner = Object::Handle(); 1583 Object& owner = Object::Handle();
1574 for (intptr_t i = 0; i < queue.Length(); i++) { 1584 for (intptr_t i = 0; i < queue.Length(); i++) {
1575 code = queue.PopBackCode(); 1585 code = queue.PopBackCode();
1576 if (code.IsDisabled()) continue; 1586 if (code.IsDisabled()) continue;
1577 owner = code.owner(); 1587 owner = code.owner();
1578 ASSERT(owner.IsFunction()); 1588 const Function& function = Function::Cast(owner);
1579 Function::Cast(owner).InstallOptimizedCode(code, false /* not OSR */); 1589 function.InstallOptimizedCode(code, false /* not OSR */);
1590 if (function.usage_counter() < 0) {
1591 // Reset to 0 so that it can be recompiled if needed.
1592 function.set_usage_counter(0);
1593 }
1580 } 1594 }
1581 } 1595 }
1582 1596
1583 1597
1584 GrowableObjectArray* BackgroundCompiler::FunctionsQueue() const { 1598 GrowableObjectArray* BackgroundCompiler::FunctionsQueue() const {
1585 return 1599 return
1586 &GrowableObjectArray::ZoneHandle(isolate_->compilation_function_queue()); 1600 &GrowableObjectArray::ZoneHandle(isolate_->compilation_function_queue());
1587 } 1601 }
1588 1602
1589 1603
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1670 thread->zone(), GrowableObjectArray::New())); 1684 thread->zone(), GrowableObjectArray::New()));
1671 start_task = true; 1685 start_task = true;
1672 } 1686 }
1673 } 1687 }
1674 if (start_task) { 1688 if (start_task) {
1675 Dart::thread_pool()->Run(isolate->background_compiler()); 1689 Dart::thread_pool()->Run(isolate->background_compiler());
1676 } 1690 }
1677 } 1691 }
1678 1692
1679 } // namespace dart 1693 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/compiler.h ('k') | runtime/vm/compiler_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698