OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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/precompiler.h" | 5 #include "vm/precompiler.h" |
6 | 6 |
7 #include "vm/compiler.h" | 7 #include "vm/compiler.h" |
8 #include "vm/isolate.h" | 8 #include "vm/isolate.h" |
9 #include "vm/log.h" | 9 #include "vm/log.h" |
10 #include "vm/longjump.h" | 10 #include "vm/longjump.h" |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 libraries_(GrowableObjectArray::Handle(Z, I->object_store()->libraries())), | 55 libraries_(GrowableObjectArray::Handle(Z, I->object_store()->libraries())), |
56 pending_functions_(GrowableObjectArray::Handle(Z, | 56 pending_functions_(GrowableObjectArray::Handle(Z, |
57 GrowableObjectArray::New())), | 57 GrowableObjectArray::New())), |
58 collected_closures_(GrowableObjectArray::Handle(Z, I->collected_closures())), | 58 collected_closures_(GrowableObjectArray::Handle(Z, I->collected_closures())), |
59 sent_selectors_(Z), | 59 sent_selectors_(Z), |
60 error_(Error::Handle(Z)) { | 60 error_(Error::Handle(Z)) { |
61 } | 61 } |
62 | 62 |
63 | 63 |
64 void Precompiler::DoCompileAll() { | 64 void Precompiler::DoCompileAll() { |
65 LogBlock lb(thread_); | 65 LogBlock lb; |
66 | 66 |
67 // Drop all existing code so we can use the presence of code as an indicator | 67 // Drop all existing code so we can use the presence of code as an indicator |
68 // that we have already looked for the function's callees. | 68 // that we have already looked for the function's callees. |
69 ClearAllCode(); | 69 ClearAllCode(); |
70 | 70 |
71 // Start with the allocations and invocations that happen from C++. | 71 // Start with the allocations and invocations that happen from C++. |
72 AddRoots(); | 72 AddRoots(); |
73 | 73 |
74 // TODO(rmacnak): Eagerly add field-invocation functions to all signature | 74 // TODO(rmacnak): Eagerly add field-invocation functions to all signature |
75 // classes so closure calls don't go through the runtime. | 75 // classes so closure calls don't go through the runtime. |
76 | 76 |
77 // Compile newly found targets and add their callees until we reach a fixed | 77 // Compile newly found targets and add their callees until we reach a fixed |
78 // point. | 78 // point. |
79 Iterate(); | 79 Iterate(); |
80 | 80 |
81 CleanUp(); | 81 CleanUp(); |
82 | 82 |
83 if (FLAG_trace_precompiler) { | 83 if (FLAG_trace_precompiler) { |
84 ISL_Print("Precompiled %" Pd " functions, %" Pd " dynamic types," | 84 THR_Print("Precompiled %" Pd " functions, %" Pd " dynamic types," |
85 " %" Pd " dynamic selectors.\n Dropped %" Pd " functions.\n", | 85 " %" Pd " dynamic selectors.\n Dropped %" Pd " functions.\n", |
86 function_count_, | 86 function_count_, |
87 class_count_, | 87 class_count_, |
88 selector_count_, | 88 selector_count_, |
89 dropped_function_count_); | 89 dropped_function_count_); |
90 } | 90 } |
91 | 91 |
92 I->set_compilation_allowed(false); | 92 I->set_compilation_allowed(false); |
93 } | 93 } |
94 | 94 |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 String& class_name = String::Handle(Z); | 269 String& class_name = String::Handle(Z); |
270 String& function_name = String::Handle(Z); | 270 String& function_name = String::Handle(Z); |
271 for (intptr_t i = 0; kExternallyCalled[i].library_ != NULL; i++) { | 271 for (intptr_t i = 0; kExternallyCalled[i].library_ != NULL; i++) { |
272 library_name = Symbols::New(kExternallyCalled[i].library_); | 272 library_name = Symbols::New(kExternallyCalled[i].library_); |
273 class_name = Symbols::New(kExternallyCalled[i].class_); | 273 class_name = Symbols::New(kExternallyCalled[i].class_); |
274 function_name = Symbols::New(kExternallyCalled[i].function_); | 274 function_name = Symbols::New(kExternallyCalled[i].function_); |
275 | 275 |
276 lib = Library::LookupLibrary(library_name); | 276 lib = Library::LookupLibrary(library_name); |
277 if (lib.IsNull()) { | 277 if (lib.IsNull()) { |
278 if (FLAG_trace_precompiler) { | 278 if (FLAG_trace_precompiler) { |
279 ISL_Print("WARNING: Missing %s\n", kExternallyCalled[i].library_); | 279 THR_Print("WARNING: Missing %s\n", kExternallyCalled[i].library_); |
280 } | 280 } |
281 continue; | 281 continue; |
282 } | 282 } |
283 | 283 |
284 if (class_name.raw() == Symbols::TopLevel().raw()) { | 284 if (class_name.raw() == Symbols::TopLevel().raw()) { |
285 func = lib.LookupFunctionAllowPrivate(function_name); | 285 func = lib.LookupFunctionAllowPrivate(function_name); |
286 } else { | 286 } else { |
287 cls = lib.LookupClassAllowPrivate(class_name); | 287 cls = lib.LookupClassAllowPrivate(class_name); |
288 if (cls.IsNull()) { | 288 if (cls.IsNull()) { |
289 if (FLAG_trace_precompiler) { | 289 if (FLAG_trace_precompiler) { |
290 ISL_Print("WARNING: Missing %s %s\n", | 290 THR_Print("WARNING: Missing %s %s\n", |
291 kExternallyCalled[i].library_, | 291 kExternallyCalled[i].library_, |
292 kExternallyCalled[i].class_); | 292 kExternallyCalled[i].class_); |
293 } | 293 } |
294 continue; | 294 continue; |
295 } | 295 } |
296 | 296 |
297 ASSERT(!cls.IsNull()); | 297 ASSERT(!cls.IsNull()); |
298 func = cls.LookupFunctionAllowPrivate(function_name); | 298 func = cls.LookupFunctionAllowPrivate(function_name); |
299 } | 299 } |
300 | 300 |
301 if (func.IsNull()) { | 301 if (func.IsNull()) { |
302 if (FLAG_trace_precompiler) { | 302 if (FLAG_trace_precompiler) { |
303 ISL_Print("WARNING: Missing %s %s %s\n", | 303 THR_Print("WARNING: Missing %s %s %s\n", |
304 kExternallyCalled[i].library_, | 304 kExternallyCalled[i].library_, |
305 kExternallyCalled[i].class_, | 305 kExternallyCalled[i].class_, |
306 kExternallyCalled[i].function_); | 306 kExternallyCalled[i].function_); |
307 } | 307 } |
308 continue; | 308 continue; |
309 } | 309 } |
310 | 310 |
311 AddFunction(func); | 311 AddFunction(func); |
312 } | 312 } |
313 } | 313 } |
(...skipping 29 matching lines...) Expand all Loading... |
343 | 343 |
344 // TODO(rmacnak): DropEmptyClasses(); | 344 // TODO(rmacnak): DropEmptyClasses(); |
345 } | 345 } |
346 | 346 |
347 | 347 |
348 void Precompiler::ProcessFunction(const Function& function) { | 348 void Precompiler::ProcessFunction(const Function& function) { |
349 if (!function.HasCode()) { | 349 if (!function.HasCode()) { |
350 function_count_++; | 350 function_count_++; |
351 | 351 |
352 if (FLAG_trace_precompiler) { | 352 if (FLAG_trace_precompiler) { |
353 ISL_Print("Precompiling %" Pd " %s (%" Pd ", %s)\n", | 353 THR_Print("Precompiling %" Pd " %s (%" Pd ", %s)\n", |
354 function_count_, | 354 function_count_, |
355 function.ToLibNamePrefixedQualifiedCString(), | 355 function.ToLibNamePrefixedQualifiedCString(), |
356 function.token_pos(), | 356 function.token_pos(), |
357 Function::KindToCString(function.kind())); | 357 Function::KindToCString(function.kind())); |
358 } | 358 } |
359 | 359 |
360 ASSERT(!function.is_abstract()); | 360 ASSERT(!function.is_abstract()); |
361 ASSERT(!function.IsRedirectingFactory()); | 361 ASSERT(!function.IsRedirectingFactory()); |
362 | 362 |
363 error_ = Compiler::CompileFunction(thread_, function); | 363 error_ = Compiler::CompileFunction(thread_, function); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 // Potential const object. Uninitialized field will harmlessly do a | 435 // Potential const object. Uninitialized field will harmlessly do a |
436 // redundant add of the Null class. | 436 // redundant add of the Null class. |
437 const Object& value = Object::Handle(Z, field.StaticValue()); | 437 const Object& value = Object::Handle(Z, field.StaticValue()); |
438 const Class& cls = Class::Handle(Z, value.clazz()); | 438 const Class& cls = Class::Handle(Z, value.clazz()); |
439 AddClass(cls); | 439 AddClass(cls); |
440 | 440 |
441 if (field.has_initializer()) { | 441 if (field.has_initializer()) { |
442 if (field.PrecompiledInitializer() != Function::null()) return; | 442 if (field.PrecompiledInitializer() != Function::null()) return; |
443 | 443 |
444 if (FLAG_trace_precompiler) { | 444 if (FLAG_trace_precompiler) { |
445 ISL_Print("Precompiling initializer for %s\n", field.ToCString()); | 445 THR_Print("Precompiling initializer for %s\n", field.ToCString()); |
446 } | 446 } |
447 Compiler::CompileStaticInitializer(field); | 447 Compiler::CompileStaticInitializer(field); |
448 | 448 |
449 const Function& function = | 449 const Function& function = |
450 Function::Handle(Z, field.PrecompiledInitializer()); | 450 Function::Handle(Z, field.PrecompiledInitializer()); |
451 AddCalleesOf(function); | 451 AddCalleesOf(function); |
452 } | 452 } |
453 } | 453 } |
454 } | 454 } |
455 | 455 |
(...skipping 11 matching lines...) Expand all Loading... |
467 } | 467 } |
468 | 468 |
469 | 469 |
470 void Precompiler::AddSelector(const String& selector) { | 470 void Precompiler::AddSelector(const String& selector) { |
471 if (!IsSent(selector)) { | 471 if (!IsSent(selector)) { |
472 sent_selectors_.Add(selector); | 472 sent_selectors_.Add(selector); |
473 selector_count_++; | 473 selector_count_++; |
474 changed_ = true; | 474 changed_ = true; |
475 | 475 |
476 if (FLAG_trace_precompiler) { | 476 if (FLAG_trace_precompiler) { |
477 ISL_Print("Enqueueing selector %" Pd " %s\n", | 477 THR_Print("Enqueueing selector %" Pd " %s\n", |
478 selector_count_, | 478 selector_count_, |
479 selector.ToCString()); | 479 selector.ToCString()); |
480 } | 480 } |
481 | 481 |
482 if (!Field::IsGetterName(selector) && | 482 if (!Field::IsGetterName(selector) && |
483 !Field::IsSetterName(selector)) { | 483 !Field::IsSetterName(selector)) { |
484 // Regular method may be call-through-getter. | 484 // Regular method may be call-through-getter. |
485 const String& getter = String::Handle(Field::GetterSymbol(selector)); | 485 const String& getter = String::Handle(Field::GetterSymbol(selector)); |
486 AddSelector(getter); | 486 AddSelector(getter); |
487 } | 487 } |
488 } | 488 } |
489 } | 489 } |
490 | 490 |
491 | 491 |
492 void Precompiler::AddClass(const Class& cls) { | 492 void Precompiler::AddClass(const Class& cls) { |
493 if (cls.is_allocated()) return; | 493 if (cls.is_allocated()) return; |
494 | 494 |
495 class_count_++; | 495 class_count_++; |
496 cls.set_is_allocated(); | 496 cls.set_is_allocated(); |
497 changed_ = true; | 497 changed_ = true; |
498 | 498 |
499 if (FLAG_trace_precompiler) { | 499 if (FLAG_trace_precompiler) { |
500 ISL_Print("Allocation %" Pd " %s\n", class_count_, cls.ToCString()); | 500 THR_Print("Allocation %" Pd " %s\n", class_count_, cls.ToCString()); |
501 } | 501 } |
502 | 502 |
503 const Class& superclass = Class::Handle(cls.SuperClass()); | 503 const Class& superclass = Class::Handle(cls.SuperClass()); |
504 if (!superclass.IsNull()) { | 504 if (!superclass.IsNull()) { |
505 AddClass(superclass); | 505 AddClass(superclass); |
506 } | 506 } |
507 } | 507 } |
508 | 508 |
509 | 509 |
510 void Precompiler::CheckForNewDynamicFunctions() { | 510 void Precompiler::CheckForNewDynamicFunctions() { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
607 | 607 |
608 functions = cls.functions(); | 608 functions = cls.functions(); |
609 retained_functions = GrowableObjectArray::New(); | 609 retained_functions = GrowableObjectArray::New(); |
610 for (intptr_t j = 0; j < functions.Length(); j++) { | 610 for (intptr_t j = 0; j < functions.Length(); j++) { |
611 function ^= functions.At(j); | 611 function ^= functions.At(j); |
612 if (function.HasCode()) { | 612 if (function.HasCode()) { |
613 retained_functions.Add(function); | 613 retained_functions.Add(function); |
614 } else { | 614 } else { |
615 dropped_function_count_++; | 615 dropped_function_count_++; |
616 if (FLAG_trace_precompiler) { | 616 if (FLAG_trace_precompiler) { |
617 ISL_Print("Precompilation dropping %s\n", | 617 THR_Print("Precompilation dropping %s\n", |
618 function.ToLibNamePrefixedQualifiedCString()); | 618 function.ToLibNamePrefixedQualifiedCString()); |
619 } | 619 } |
620 } | 620 } |
621 } | 621 } |
622 | 622 |
623 functions = Array::New(retained_functions.Length(), Heap::kOld); | 623 functions = Array::New(retained_functions.Length(), Heap::kOld); |
624 for (intptr_t j = 0; j < retained_functions.Length(); j++) { | 624 for (intptr_t j = 0; j < retained_functions.Length(); j++) { |
625 function ^= retained_functions.At(j); | 625 function ^= retained_functions.At(j); |
626 functions.SetAt(j, function); | 626 functions.SetAt(j, function); |
627 } | 627 } |
628 cls.SetFunctions(functions); | 628 cls.SetFunctions(functions); |
629 | 629 |
630 closures = cls.closures(); | 630 closures = cls.closures(); |
631 if (!closures.IsNull()) { | 631 if (!closures.IsNull()) { |
632 for (intptr_t j = 0; j < closures.Length(); j++) { | 632 for (intptr_t j = 0; j < closures.Length(); j++) { |
633 function ^= closures.At(j); | 633 function ^= closures.At(j); |
634 ASSERT(function.HasCode()); | 634 ASSERT(function.HasCode()); |
635 } | 635 } |
636 } | 636 } |
637 } | 637 } |
638 } | 638 } |
639 } | 639 } |
640 | 640 |
641 } // namespace dart | 641 } // namespace dart |
OLD | NEW |