| Index: runtime/vm/precompiler.cc
|
| diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
|
| index 6f57ab8ecd5bdc3f91f67b31c139a17ec9463de0..5c504582ad160bc9a5eb2a055fed061e7c46b561 100644
|
| --- a/runtime/vm/precompiler.cc
|
| +++ b/runtime/vm/precompiler.cc
|
| @@ -53,7 +53,10 @@ namespace dart {
|
|
|
| DEFINE_FLAG(bool, print_unique_targets, false, "Print unique dynaic targets");
|
| DEFINE_FLAG(bool, trace_precompiler, false, "Trace precompiler.");
|
| -DEFINE_FLAG(int, max_speculative_inlining_attempts, 1,
|
| +DEFINE_FLAG(
|
| + int,
|
| + max_speculative_inlining_attempts,
|
| + 1,
|
| "Max number of attempts with speculative inlining (precompilation only)");
|
| DEFINE_FLAG(int, precompiler_rounds, 1, "Number of precompiler iterations");
|
|
|
| @@ -80,16 +83,13 @@ class DartPrecompilationPipeline : public DartCompilationPipeline {
|
| public:
|
| explicit DartPrecompilationPipeline(Zone* zone,
|
| FieldTypeMap* field_map = NULL)
|
| - : zone_(zone),
|
| - result_type_(CompileType::None()),
|
| - field_map_(field_map) { }
|
| + : zone_(zone), result_type_(CompileType::None()), field_map_(field_map) {}
|
|
|
| virtual void FinalizeCompilation(FlowGraph* flow_graph) {
|
| - if ((field_map_ != NULL )&&
|
| + if ((field_map_ != NULL) &&
|
| flow_graph->function().IsGenerativeConstructor()) {
|
| for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
|
| - !block_it.Done();
|
| - block_it.Advance()) {
|
| + !block_it.Done(); block_it.Advance()) {
|
| ForwardInstructionIterator it(block_it.Current());
|
| for (; !it.Done(); it.Advance()) {
|
| StoreInstanceFieldInstr* store = it.Current()->AsStoreInstanceField();
|
| @@ -106,18 +106,18 @@ class DartPrecompilationPipeline : public DartCompilationPipeline {
|
| &Field::Handle(zone_, store->field().raw()), // Re-wrap.
|
| store->value()->Type()->ToCid()));
|
| if (FLAG_trace_precompiler && FLAG_support_il_printer) {
|
| - THR_Print(" initial type = %s\n",
|
| - store->value()->Type()->ToCString());
|
| + THR_Print(" initial type = %s\n",
|
| + store->value()->Type()->ToCString());
|
| }
|
| continue;
|
| }
|
| CompileType type = CompileType::FromCid(entry->cid_);
|
| if (FLAG_trace_precompiler && FLAG_support_il_printer) {
|
| - THR_Print(" old type = %s\n", type.ToCString());
|
| + THR_Print(" old type = %s\n", type.ToCString());
|
| }
|
| type.Union(store->value()->Type());
|
| if (FLAG_trace_precompiler && FLAG_support_il_printer) {
|
| - THR_Print(" new type = %s\n", type.ToCString());
|
| + THR_Print(" new type = %s\n", type.ToCString());
|
| }
|
| entry->cid_ = type.ToCid();
|
| }
|
| @@ -128,8 +128,7 @@ class DartPrecompilationPipeline : public DartCompilationPipeline {
|
|
|
| CompileType result_type = CompileType::None();
|
| for (BlockIterator block_it = flow_graph->reverse_postorder_iterator();
|
| - !block_it.Done();
|
| - block_it.Advance()) {
|
| + !block_it.Done(); block_it.Advance()) {
|
| ForwardInstructionIterator it(block_it.Current());
|
| for (; !it.Done(); it.Advance()) {
|
| ReturnInstr* return_instr = it.Current()->AsReturn();
|
| @@ -158,8 +157,7 @@ class PrecompileParsedFunctionHelper : public ValueObject {
|
| : precompiler_(precompiler),
|
| parsed_function_(parsed_function),
|
| optimized_(optimized),
|
| - thread_(Thread::Current()) {
|
| - }
|
| + thread_(Thread::Current()) {}
|
|
|
| bool Compile(CompilationPipeline* pipeline);
|
|
|
| @@ -216,7 +214,8 @@ bool TypeRangeCache::InstanceOfHasClassRange(const AbstractType& type,
|
| const TypeArguments& type_arguments =
|
| TypeArguments::Handle(zone, type.arguments());
|
| if (!type_arguments.IsNull() &&
|
| - !type_arguments.IsRaw(0, type_arguments.Length())) return false;
|
| + !type_arguments.IsRaw(0, type_arguments.Length()))
|
| + return false;
|
|
|
|
|
| intptr_t type_cid = type.type_class_id();
|
| @@ -290,36 +289,35 @@ bool TypeRangeCache::InstanceOfHasClassRange(const AbstractType& type,
|
| }
|
|
|
|
|
| -Precompiler::Precompiler(Thread* thread, bool reset_fields) :
|
| - thread_(thread),
|
| - zone_(NULL),
|
| - isolate_(thread->isolate()),
|
| - reset_fields_(reset_fields),
|
| - changed_(false),
|
| - function_count_(0),
|
| - class_count_(0),
|
| - selector_count_(0),
|
| - dropped_function_count_(0),
|
| - dropped_field_count_(0),
|
| - dropped_class_count_(0),
|
| - dropped_typearg_count_(0),
|
| - dropped_type_count_(0),
|
| - dropped_library_count_(0),
|
| - libraries_(GrowableObjectArray::Handle(I->object_store()->libraries())),
|
| - pending_functions_(
|
| - GrowableObjectArray::Handle(GrowableObjectArray::New())),
|
| - sent_selectors_(),
|
| - enqueued_functions_(),
|
| - fields_to_retain_(),
|
| - functions_to_retain_(),
|
| - classes_to_retain_(),
|
| - typeargs_to_retain_(),
|
| - types_to_retain_(),
|
| - consts_to_retain_(),
|
| - field_type_map_(),
|
| - error_(Error::Handle()),
|
| - get_runtime_type_is_unique_(false) {
|
| -}
|
| +Precompiler::Precompiler(Thread* thread, bool reset_fields)
|
| + : thread_(thread),
|
| + zone_(NULL),
|
| + isolate_(thread->isolate()),
|
| + reset_fields_(reset_fields),
|
| + changed_(false),
|
| + function_count_(0),
|
| + class_count_(0),
|
| + selector_count_(0),
|
| + dropped_function_count_(0),
|
| + dropped_field_count_(0),
|
| + dropped_class_count_(0),
|
| + dropped_typearg_count_(0),
|
| + dropped_type_count_(0),
|
| + dropped_library_count_(0),
|
| + libraries_(GrowableObjectArray::Handle(I->object_store()->libraries())),
|
| + pending_functions_(
|
| + GrowableObjectArray::Handle(GrowableObjectArray::New())),
|
| + sent_selectors_(),
|
| + enqueued_functions_(),
|
| + fields_to_retain_(),
|
| + functions_to_retain_(),
|
| + classes_to_retain_(),
|
| + typeargs_to_retain_(),
|
| + types_to_retain_(),
|
| + consts_to_retain_(),
|
| + field_type_map_(),
|
| + error_(Error::Handle()),
|
| + get_runtime_type_is_unique_(false) {}
|
|
|
|
|
| void Precompiler::DoCompileAll(
|
| @@ -330,7 +328,8 @@ void Precompiler::DoCompileAll(
|
| StackZone stack_zone(T);
|
| zone_ = stack_zone.GetZone();
|
|
|
| - { HANDLESCOPE(T);
|
| + {
|
| + HANDLESCOPE(T);
|
| // Make sure class hierarchy is stable before compilation so that CHA
|
| // can be used. Also ensures lookup of entry points won't miss functions
|
| // because their class hasn't been finalized yet.
|
| @@ -454,15 +453,14 @@ void Precompiler::PrecompileStaticInitializers() {
|
| class StaticInitializerVisitor : public ClassVisitor {
|
| public:
|
| explicit StaticInitializerVisitor(Zone* zone)
|
| - : fields_(Array::Handle(zone)),
|
| - field_(Field::Handle(zone)),
|
| - function_(Function::Handle(zone)) { }
|
| + : fields_(Array::Handle(zone)),
|
| + field_(Field::Handle(zone)),
|
| + function_(Function::Handle(zone)) {}
|
| void Visit(const Class& cls) {
|
| fields_ = cls.fields();
|
| for (intptr_t j = 0; j < fields_.Length(); j++) {
|
| field_ ^= fields_.At(j);
|
| - if (field_.is_static() &&
|
| - field_.is_final() &&
|
| + if (field_.is_static() && field_.is_final() &&
|
| field_.has_initializer()) {
|
| if (FLAG_trace_precompiler) {
|
| THR_Print("Precompiling initializer for %s\n", field_.ToCString());
|
| @@ -488,8 +486,7 @@ void Precompiler::PrecompileConstructors() {
|
| class ConstructorVisitor : public FunctionVisitor {
|
| public:
|
| explicit ConstructorVisitor(Precompiler* precompiler, Zone* zone)
|
| - : precompiler_(precompiler), zone_(zone) {
|
| - }
|
| + : precompiler_(precompiler), zone_(zone) {}
|
| void Visit(const Function& function) {
|
| if (!function.IsGenerativeConstructor()) return;
|
| if (function.HasCode()) {
|
| @@ -500,10 +497,7 @@ void Precompiler::PrecompileConstructors() {
|
| if (FLAG_trace_precompiler) {
|
| THR_Print("Precompiling constructor %s\n", function.ToCString());
|
| }
|
| - CompileFunction(precompiler_,
|
| - Thread::Current(),
|
| - zone_,
|
| - function,
|
| + CompileFunction(precompiler_, Thread::Current(), zone_, function,
|
| precompiler_->field_type_map());
|
| }
|
|
|
| @@ -517,14 +511,14 @@ void Precompiler::PrecompileConstructors() {
|
| VisitFunctions(&visitor);
|
|
|
| FieldTypeMap::Iterator it(field_type_map_.GetIterator());
|
| - for (FieldTypePair* current = it.Next();
|
| - current != NULL;
|
| + for (FieldTypePair* current = it.Next(); current != NULL;
|
| current = it.Next()) {
|
| const intptr_t cid = current->cid_;
|
| current->field_->set_guarded_cid(cid);
|
| current->field_->set_is_nullable(cid == kNullCid || cid == kDynamicCid);
|
| if (FLAG_trace_precompiler) {
|
| - THR_Print("Field %s <- Type %s\n", current->field_->ToCString(),
|
| + THR_Print(
|
| + "Field %s <- Type %s\n", current->field_->ToCString(),
|
| Class::Handle(T->isolate()->class_table()->At(cid)).ToCString());
|
| }
|
| }
|
| @@ -542,9 +536,7 @@ void Precompiler::ClearAllCode() {
|
| VisitFunctions(&function_visitor);
|
|
|
| class ClearCodeClassVisitor : public ClassVisitor {
|
| - void Visit(const Class& cls) {
|
| - cls.DisableAllocationStub();
|
| - }
|
| + void Visit(const Class& cls) { cls.DisableAllocationStub(); }
|
| };
|
| ClearCodeClassVisitor class_visitor;
|
| VisitClasses(&class_visitor);
|
| @@ -566,10 +558,8 @@ void Precompiler::AddRoots(Dart_QualifiedFunctionName embedder_entry_points[]) {
|
| if (!isolate()->class_table()->HasValidClassAt(cid)) {
|
| continue;
|
| }
|
| - if ((cid == kDynamicCid) ||
|
| - (cid == kVoidCid) ||
|
| - (cid == kFreeListElement) ||
|
| - (cid == kForwardingCorpse)) {
|
| + if ((cid == kDynamicCid) || (cid == kVoidCid) ||
|
| + (cid == kFreeListElement) || (cid == kForwardingCorpse)) {
|
| continue;
|
| }
|
| cls = isolate()->class_table()->At(cid);
|
| @@ -578,49 +568,48 @@ void Precompiler::AddRoots(Dart_QualifiedFunctionName embedder_entry_points[]) {
|
|
|
| Dart_QualifiedFunctionName vm_entry_points[] = {
|
| // Functions
|
| - { "dart:async", "::", "_setScheduleImmediateClosure" },
|
| - { "dart:core", "::", "_completeDeferredLoads" },
|
| - { "dart:core", "AbstractClassInstantiationError",
|
| - "AbstractClassInstantiationError._create" },
|
| - { "dart:core", "ArgumentError", "ArgumentError." },
|
| - { "dart:core", "CyclicInitializationError",
|
| - "CyclicInitializationError." },
|
| - { "dart:core", "FallThroughError", "FallThroughError._create" },
|
| - { "dart:core", "FormatException", "FormatException." },
|
| - { "dart:core", "NoSuchMethodError", "NoSuchMethodError._withType" },
|
| - { "dart:core", "NullThrownError", "NullThrownError." },
|
| - { "dart:core", "OutOfMemoryError", "OutOfMemoryError." },
|
| - { "dart:core", "RangeError", "RangeError." },
|
| - { "dart:core", "RangeError", "RangeError.range" },
|
| - { "dart:core", "StackOverflowError", "StackOverflowError." },
|
| - { "dart:core", "UnsupportedError", "UnsupportedError." },
|
| - { "dart:core", "_AssertionError", "_AssertionError._create" },
|
| - { "dart:core", "_CastError", "_CastError._create" },
|
| - { "dart:core", "_InternalError", "_InternalError." },
|
| - { "dart:core", "_InvocationMirror", "_allocateInvocationMirror" },
|
| - { "dart:core", "_TypeError", "_TypeError._create" },
|
| - { "dart:isolate", "IsolateSpawnException", "IsolateSpawnException." },
|
| - { "dart:isolate", "::", "_getIsolateScheduleImmediateClosure" },
|
| - { "dart:isolate", "::", "_setupHooks" },
|
| - { "dart:isolate", "::", "_startMainIsolate" },
|
| - { "dart:isolate", "::", "_startIsolate" },
|
| - { "dart:isolate", "_RawReceivePortImpl", "_handleMessage" },
|
| - { "dart:isolate", "_RawReceivePortImpl", "_lookupHandler" },
|
| - { "dart:isolate", "_SendPortImpl", "send" },
|
| - { "dart:typed_data", "ByteData", "ByteData." },
|
| - { "dart:typed_data", "ByteData", "ByteData._view" },
|
| - { "dart:typed_data", "ByteBuffer", "ByteBuffer._New" },
|
| - { "dart:_vmservice", "::", "_registerIsolate" },
|
| - { "dart:_vmservice", "::", "boot" },
|
| + {"dart:async", "::", "_setScheduleImmediateClosure"},
|
| + {"dart:core", "::", "_completeDeferredLoads"},
|
| + {"dart:core", "AbstractClassInstantiationError",
|
| + "AbstractClassInstantiationError._create"},
|
| + {"dart:core", "ArgumentError", "ArgumentError."},
|
| + {"dart:core", "CyclicInitializationError", "CyclicInitializationError."},
|
| + {"dart:core", "FallThroughError", "FallThroughError._create"},
|
| + {"dart:core", "FormatException", "FormatException."},
|
| + {"dart:core", "NoSuchMethodError", "NoSuchMethodError._withType"},
|
| + {"dart:core", "NullThrownError", "NullThrownError."},
|
| + {"dart:core", "OutOfMemoryError", "OutOfMemoryError."},
|
| + {"dart:core", "RangeError", "RangeError."},
|
| + {"dart:core", "RangeError", "RangeError.range"},
|
| + {"dart:core", "StackOverflowError", "StackOverflowError."},
|
| + {"dart:core", "UnsupportedError", "UnsupportedError."},
|
| + {"dart:core", "_AssertionError", "_AssertionError._create"},
|
| + {"dart:core", "_CastError", "_CastError._create"},
|
| + {"dart:core", "_InternalError", "_InternalError."},
|
| + {"dart:core", "_InvocationMirror", "_allocateInvocationMirror"},
|
| + {"dart:core", "_TypeError", "_TypeError._create"},
|
| + {"dart:isolate", "IsolateSpawnException", "IsolateSpawnException."},
|
| + {"dart:isolate", "::", "_getIsolateScheduleImmediateClosure"},
|
| + {"dart:isolate", "::", "_setupHooks"},
|
| + {"dart:isolate", "::", "_startMainIsolate"},
|
| + {"dart:isolate", "::", "_startIsolate"},
|
| + {"dart:isolate", "_RawReceivePortImpl", "_handleMessage"},
|
| + {"dart:isolate", "_RawReceivePortImpl", "_lookupHandler"},
|
| + {"dart:isolate", "_SendPortImpl", "send"},
|
| + {"dart:typed_data", "ByteData", "ByteData."},
|
| + {"dart:typed_data", "ByteData", "ByteData._view"},
|
| + {"dart:typed_data", "ByteBuffer", "ByteBuffer._New"},
|
| + {"dart:_vmservice", "::", "_registerIsolate"},
|
| + {"dart:_vmservice", "::", "boot"},
|
| #if !defined(PRODUCT)
|
| - { "dart:developer", "Metrics", "_printMetrics" },
|
| - { "dart:developer", "::", "_runExtension" },
|
| - { "dart:isolate", "::", "_runPendingImmediateCallback" },
|
| + {"dart:developer", "Metrics", "_printMetrics"},
|
| + {"dart:developer", "::", "_runExtension"},
|
| + {"dart:isolate", "::", "_runPendingImmediateCallback"},
|
| #endif // !PRODUCT
|
| // Fields
|
| - { "dart:core", "Error", "_stackTrace" },
|
| - { "dart:math", "_Random", "_state" },
|
| - { NULL, NULL, NULL } // Must be terminated with NULL entries.
|
| + {"dart:core", "Error", "_stackTrace"},
|
| + {"dart:math", "_Random", "_state"},
|
| + {NULL, NULL, NULL} // Must be terminated with NULL entries.
|
| };
|
|
|
| AddEntryPoints(vm_entry_points);
|
| @@ -644,8 +633,9 @@ void Precompiler::AddEntryPoints(Dart_QualifiedFunctionName entry_points[]) {
|
|
|
| lib = Library::LookupLibrary(T, library_uri);
|
| if (lib.IsNull()) {
|
| - String& msg = String::Handle(Z, String::NewFormatted(
|
| - "Cannot find entry point %s\n", entry_points[i].library_uri));
|
| + String& msg =
|
| + String::Handle(Z, String::NewFormatted("Cannot find entry point %s\n",
|
| + entry_points[i].library_uri));
|
| Jump(Error::Handle(Z, ApiError::New(msg)));
|
| UNREACHABLE();
|
| }
|
| @@ -662,10 +652,10 @@ void Precompiler::AddEntryPoints(Dart_QualifiedFunctionName entry_points[]) {
|
| }
|
| cls = lib.LookupLocalClass(class_name);
|
| if (cls.IsNull()) {
|
| - String& msg = String::Handle(Z, String::NewFormatted(
|
| - "Cannot find entry point %s %s\n",
|
| - entry_points[i].library_uri,
|
| - entry_points[i].class_name));
|
| + String& msg = String::Handle(
|
| + Z, String::NewFormatted("Cannot find entry point %s %s\n",
|
| + entry_points[i].library_uri,
|
| + entry_points[i].class_name));
|
| Jump(Error::Handle(Z, ApiError::New(msg)));
|
| UNREACHABLE();
|
| }
|
| @@ -676,11 +666,11 @@ void Precompiler::AddEntryPoints(Dart_QualifiedFunctionName entry_points[]) {
|
| }
|
|
|
| if (func.IsNull() && field.IsNull()) {
|
| - String& msg = String::Handle(Z, String::NewFormatted(
|
| - "Cannot find entry point %s %s %s\n",
|
| - entry_points[i].library_uri,
|
| - entry_points[i].class_name,
|
| - entry_points[i].function_name));
|
| + String& msg = String::Handle(
|
| + Z, String::NewFormatted("Cannot find entry point %s %s %s\n",
|
| + entry_points[i].library_uri,
|
| + entry_points[i].class_name,
|
| + entry_points[i].function_name));
|
| Jump(Error::Handle(Z, ApiError::New(msg)));
|
| UNREACHABLE();
|
| }
|
| @@ -759,8 +749,7 @@ void Precompiler::CollectCallbackFields() {
|
| if (FLAG_trace_precompiler) {
|
| THR_Print("Found callback field %s\n", field_name.ToCString());
|
| }
|
| - args_desc =
|
| - ArgumentsDescriptor::New(function.num_fixed_parameters());
|
| + args_desc = ArgumentsDescriptor::New(function.num_fixed_parameters());
|
| cids.Clear();
|
| if (T->cha()->ConcreteSubclasses(cls, &cids)) {
|
| for (intptr_t j = 0; j < cids.length(); ++j) {
|
| @@ -768,9 +757,7 @@ void Precompiler::CollectCallbackFields() {
|
| if (subcls.is_allocated()) {
|
| // Add dispatcher to cls.
|
| dispatcher = subcls.GetInvocationDispatcher(
|
| - field_name,
|
| - args_desc,
|
| - RawFunction::kInvokeFieldDispatcher,
|
| + field_name, args_desc, RawFunction::kInvokeFieldDispatcher,
|
| /* create_if_absent = */ true);
|
| if (FLAG_trace_precompiler) {
|
| THR_Print("Added invoke-field-dispatcher for %s to %s\n",
|
| @@ -791,8 +778,7 @@ void Precompiler::ProcessFunction(const Function& function) {
|
| function_count_++;
|
|
|
| if (FLAG_trace_precompiler) {
|
| - THR_Print("Precompiling %" Pd " %s (%s, %s)\n",
|
| - function_count_,
|
| + THR_Print("Precompiling %" Pd " %s (%s, %s)\n", function_count_,
|
| function.ToLibNamePrefixedQualifiedCString(),
|
| function.token_pos().ToCString(),
|
| Function::KindToCString(function.kind()));
|
| @@ -1057,10 +1043,10 @@ void Precompiler::AddConstObject(const Instance& instance) {
|
|
|
| class ConstObjectVisitor : public ObjectPointerVisitor {
|
| public:
|
| - ConstObjectVisitor(Precompiler* precompiler, Isolate* isolate) :
|
| - ObjectPointerVisitor(isolate),
|
| - precompiler_(precompiler),
|
| - subinstance_(Object::Handle()) {}
|
| + ConstObjectVisitor(Precompiler* precompiler, Isolate* isolate)
|
| + : ObjectPointerVisitor(isolate),
|
| + precompiler_(precompiler),
|
| + subinstance_(Object::Handle()) {}
|
|
|
| virtual void VisitPointers(RawObject** first, RawObject** last) {
|
| for (RawObject** current = first; current <= last; current++) {
|
| @@ -1087,11 +1073,10 @@ void Precompiler::AddClosureCall(const ICData& call_site) {
|
| Array::Handle(Z, call_site.arguments_descriptor());
|
| const Class& cache_class =
|
| Class::Handle(Z, I->object_store()->closure_class());
|
| - const Function& dispatcher = Function::Handle(Z,
|
| - cache_class.GetInvocationDispatcher(Symbols::Call(),
|
| - arguments_descriptor,
|
| - RawFunction::kInvokeFieldDispatcher,
|
| - true /* create_if_absent */));
|
| + const Function& dispatcher = Function::Handle(
|
| + Z, cache_class.GetInvocationDispatcher(
|
| + Symbols::Call(), arguments_descriptor,
|
| + RawFunction::kInvokeFieldDispatcher, true /* create_if_absent */));
|
| AddFunction(dispatcher);
|
| }
|
|
|
| @@ -1118,8 +1103,8 @@ void Precompiler::AddField(const Field& field) {
|
| THR_Print("Precompiling initializer for %s\n", field.ToCString());
|
| }
|
| ASSERT(Dart::snapshot_kind() != Snapshot::kAppNoJIT);
|
| - const Function& initializer = Function::Handle(Z,
|
| - CompileStaticInitializer(field, /* compute_type = */ true));
|
| + const Function& initializer = Function::Handle(
|
| + Z, CompileStaticInitializer(field, /* compute_type = */ true));
|
| ASSERT(!initializer.IsNull());
|
| field.SetPrecompiledInitializer(initializer);
|
| AddCalleesOf(initializer);
|
| @@ -1187,8 +1172,7 @@ RawObject* Precompiler::EvaluateStaticInitializer(const Field& field) {
|
| } else {
|
| Thread* const thread = Thread::Current();
|
| StackZone zone(thread);
|
| - const Error& error =
|
| - Error::Handle(thread->zone(), thread->sticky_error());
|
| + const Error& error = Error::Handle(thread->zone(), thread->sticky_error());
|
| thread->clear_sticky_error();
|
| return error.raw();
|
| }
|
| @@ -1214,7 +1198,7 @@ RawObject* Precompiler::ExecuteOnce(SequenceNode* fragment) {
|
| const Function& func = Function::ZoneHandle(Function::New(
|
| String::Handle(Symbols::New(thread, kEvalConst)),
|
| RawFunction::kRegularFunction,
|
| - true, // static function
|
| + true, // static function
|
| false, // not const function
|
| false, // not abstract
|
| false, // not external
|
| @@ -1235,8 +1219,7 @@ RawObject* Precompiler::ExecuteOnce(SequenceNode* fragment) {
|
| ParsedFunction* parsed_function = new ParsedFunction(thread, func);
|
| parsed_function->SetNodeSequence(fragment);
|
| fragment->scope()->AddVariable(parsed_function->EnsureExpressionTemp());
|
| - fragment->scope()->AddVariable(
|
| - parsed_function->current_context_var());
|
| + fragment->scope()->AddVariable(parsed_function->current_context_var());
|
| parsed_function->AllocateVariables();
|
|
|
| // Non-optimized code generator.
|
| @@ -1245,16 +1228,15 @@ RawObject* Precompiler::ExecuteOnce(SequenceNode* fragment) {
|
| parsed_function,
|
| /* optimized = */ false);
|
| helper.Compile(&pipeline);
|
| - Code::Handle(func.unoptimized_code()).set_var_descriptors(
|
| - Object::empty_var_descriptors());
|
| + Code::Handle(func.unoptimized_code())
|
| + .set_var_descriptors(Object::empty_var_descriptors());
|
|
|
| const Object& result = PassiveObject::Handle(
|
| DartEntry::InvokeFunction(func, Object::empty_array()));
|
| return result.raw();
|
| } else {
|
| Thread* const thread = Thread::Current();
|
| - const Object& result =
|
| - PassiveObject::Handle(thread->sticky_error());
|
| + const Object& result = PassiveObject::Handle(thread->sticky_error());
|
| thread->clear_sticky_error();
|
| return result.raw();
|
| }
|
| @@ -1289,8 +1271,7 @@ void Precompiler::AddSelector(const String& selector) {
|
| changed_ = true;
|
|
|
| if (FLAG_trace_precompiler) {
|
| - THR_Print("Enqueueing selector %" Pd " %s\n",
|
| - selector_count_,
|
| + THR_Print("Enqueueing selector %" Pd " %s\n", selector_count_,
|
| selector.ToCString());
|
| }
|
| }
|
| @@ -1362,8 +1343,8 @@ void Precompiler::CheckForNewDynamicFunctions() {
|
| // Function is get:foo and somewhere foo is called.
|
| AddFunction(function);
|
| }
|
| - selector3 = Symbols::LookupFromConcat(thread(),
|
| - Symbols::ClosurizePrefix(), selector2);
|
| + selector3 = Symbols::LookupFromConcat(
|
| + thread(), Symbols::ClosurizePrefix(), selector2);
|
| if (IsSent(selector3)) {
|
| // Hash-closurization.
|
| // Function is get:foo and somewhere get:#foo is called.
|
| @@ -1377,8 +1358,8 @@ void Precompiler::CheckForNewDynamicFunctions() {
|
| AddFunction(function2);
|
| }
|
| } else if (Field::IsSetterName(selector)) {
|
| - selector2 = Symbols::LookupFromConcat(thread(),
|
| - Symbols::ClosurizePrefix(), selector);
|
| + selector2 = Symbols::LookupFromConcat(
|
| + thread(), Symbols::ClosurizePrefix(), selector);
|
| if (IsSent(selector2)) {
|
| // Hash-closurization.
|
| // Function is set:foo and somewhere get:#set:foo is called.
|
| @@ -1403,8 +1384,8 @@ void Precompiler::CheckForNewDynamicFunctions() {
|
| function2 = function.GetMethodExtractor(selector2);
|
| AddFunction(function2);
|
| }
|
| - selector2 = Symbols::LookupFromConcat(thread(),
|
| - Symbols::ClosurizePrefix(), selector);
|
| + selector2 = Symbols::LookupFromConcat(
|
| + thread(), Symbols::ClosurizePrefix(), selector);
|
| if (IsSent(selector2)) {
|
| // Hash-closurization.
|
| // Function is foo and somewhere get:#foo is called.
|
| @@ -1429,14 +1410,10 @@ class NameFunctionsTraits {
|
|
|
| static bool IsMatch(const Object& a, const Object& b) {
|
| return a.IsString() && b.IsString() &&
|
| - String::Cast(a).Equals(String::Cast(b));
|
| - }
|
| - static uword Hash(const Object& obj) {
|
| - return String::Cast(obj).Hash();
|
| - }
|
| - static RawObject* NewKey(const String& str) {
|
| - return str.raw();
|
| + String::Cast(a).Equals(String::Cast(b));
|
| }
|
| + static uword Hash(const Object& obj) { return String::Cast(obj).Hash(); }
|
| + static RawObject* NewKey(const String& str) { return str.raw(); }
|
| };
|
|
|
| typedef UnorderedHashMap<NameFunctionsTraits> Table;
|
| @@ -1530,7 +1507,7 @@ void Precompiler::CollectDynamicFunctionNames() {
|
| THR_Print("* %s\n", function.ToQualifiedCString());
|
| }
|
| THR_Print("%" Pd " of %" Pd " dynamic selectors are unique\n",
|
| - functions_set.NumOccupied(), table.NumOccupied());
|
| + functions_set.NumOccupied(), table.NumOccupied());
|
| }
|
|
|
| isolate()->object_store()->set_unique_dynamic_targets(
|
| @@ -1736,8 +1713,7 @@ void Precompiler::DropFields() {
|
| }
|
| dropped_field_count_++;
|
| if (FLAG_trace_precompiler) {
|
| - THR_Print("Dropping field %s\n",
|
| - field.ToCString());
|
| + THR_Print("Dropping field %s\n", field.ToCString());
|
| }
|
| }
|
| }
|
| @@ -1816,8 +1792,8 @@ void Precompiler::DropTypeArguments() {
|
| // Now construct a new type arguments table and save in the object store.
|
| const intptr_t dict_size =
|
| Utils::RoundUpToPowerOfTwo(retained_typeargs.Length() * 4 / 3);
|
| - typeargs_array = HashTables::New<CanonicalTypeArgumentsSet>(dict_size,
|
| - Heap::kOld);
|
| + typeargs_array =
|
| + HashTables::New<CanonicalTypeArgumentsSet>(dict_size, Heap::kOld);
|
| CanonicalTypeArgumentsSet typeargs_table(Z, typeargs_array.raw());
|
| bool present;
|
| for (intptr_t i = 0; i < retained_typeargs.Length(); i++) {
|
| @@ -1969,8 +1945,7 @@ void Precompiler::DropClasses() {
|
| class_table->StatsWithUpdatedSize(cid)->post_gc.old_count;
|
| if (instances != 0) {
|
| FATAL2("Want to drop class %s, but it has %" Pd " instances\n",
|
| - cls.ToCString(),
|
| - instances);
|
| + cls.ToCString(), instances);
|
| }
|
| #endif
|
|
|
| @@ -1994,8 +1969,8 @@ void Precompiler::DropClasses() {
|
| void Precompiler::DropLibraries() {
|
| const GrowableObjectArray& retained_libraries =
|
| GrowableObjectArray::Handle(Z, GrowableObjectArray::New());
|
| - const Library& root_lib = Library::Handle(Z,
|
| - I->object_store()->root_library());
|
| + const Library& root_lib =
|
| + Library::Handle(Z, I->object_store()->root_library());
|
| Library& lib = Library::Handle(Z);
|
|
|
| for (intptr_t i = 0; i < libraries_.Length(); i++) {
|
| @@ -2047,13 +2022,12 @@ void Precompiler::DropLibraries() {
|
| void Precompiler::BindStaticCalls() {
|
| class BindStaticCallsVisitor : public FunctionVisitor {
|
| public:
|
| - explicit BindStaticCallsVisitor(Zone* zone) :
|
| - code_(Code::Handle(zone)),
|
| - table_(Array::Handle(zone)),
|
| - pc_offset_(Smi::Handle(zone)),
|
| - target_(Function::Handle(zone)),
|
| - target_code_(Code::Handle(zone)) {
|
| - }
|
| + explicit BindStaticCallsVisitor(Zone* zone)
|
| + : code_(Code::Handle(zone)),
|
| + table_(Array::Handle(zone)),
|
| + pc_offset_(Smi::Handle(zone)),
|
| + target_(Function::Handle(zone)),
|
| + target_code_(Code::Handle(zone)) {}
|
|
|
| void Visit(const Function& function) {
|
| if (!function.HasCode()) {
|
| @@ -2062,8 +2036,7 @@ void Precompiler::BindStaticCalls() {
|
| code_ = function.CurrentCode();
|
| table_ = code_.static_calls_target_table();
|
|
|
| - for (intptr_t i = 0;
|
| - i < table_.Length();
|
| + for (intptr_t i = 0; i < table_.Length();
|
| i += Code::kSCallTableEntryLength) {
|
| pc_offset_ ^= table_.At(i + Code::kSCallTableOffsetEntry);
|
| target_ ^= table_.At(i + Code::kSCallTableFunctionEntry);
|
| @@ -2114,18 +2087,17 @@ void Precompiler::SwitchICCalls() {
|
|
|
| class SwitchICCallsVisitor : public FunctionVisitor {
|
| public:
|
| - explicit SwitchICCallsVisitor(Zone* zone) :
|
| - zone_(zone),
|
| - code_(Code::Handle(zone)),
|
| - pool_(ObjectPool::Handle(zone)),
|
| - entry_(Object::Handle(zone)),
|
| - ic_(ICData::Handle(zone)),
|
| - target_name_(String::Handle(zone)),
|
| - args_descriptor_(Array::Handle(zone)),
|
| - unlinked_(UnlinkedCall::Handle(zone)),
|
| - target_code_(Code::Handle(zone)),
|
| - canonical_unlinked_calls_() {
|
| - }
|
| + explicit SwitchICCallsVisitor(Zone* zone)
|
| + : zone_(zone),
|
| + code_(Code::Handle(zone)),
|
| + pool_(ObjectPool::Handle(zone)),
|
| + entry_(Object::Handle(zone)),
|
| + ic_(ICData::Handle(zone)),
|
| + target_name_(String::Handle(zone)),
|
| + args_descriptor_(Array::Handle(zone)),
|
| + unlinked_(UnlinkedCall::Handle(zone)),
|
| + target_code_(Code::Handle(zone)),
|
| + canonical_unlinked_calls_() {}
|
|
|
| void Visit(const Function& function) {
|
| if (!function.HasCode()) {
|
| @@ -2191,18 +2163,18 @@ void Precompiler::SwitchICCalls() {
|
|
|
|
|
| void Precompiler::ShareMegamorphicBuckets() {
|
| - const GrowableObjectArray& table = GrowableObjectArray::Handle(Z,
|
| - I->object_store()->megamorphic_cache_table());
|
| + const GrowableObjectArray& table = GrowableObjectArray::Handle(
|
| + Z, I->object_store()->megamorphic_cache_table());
|
| if (table.IsNull()) return;
|
| MegamorphicCache& cache = MegamorphicCache::Handle(Z);
|
|
|
| const intptr_t capacity = 1;
|
| - const Array& buckets = Array::Handle(Z,
|
| - Array::New(MegamorphicCache::kEntryLength * capacity, Heap::kOld));
|
| + const Array& buckets = Array::Handle(
|
| + Z, Array::New(MegamorphicCache::kEntryLength * capacity, Heap::kOld));
|
| const Function& handler =
|
| Function::Handle(Z, MegamorphicCacheTable::miss_handler(I));
|
| - MegamorphicCache::SetEntry(buckets, 0,
|
| - MegamorphicCache::smi_illegal_cid(), handler);
|
| + MegamorphicCache::SetEntry(buckets, 0, MegamorphicCache::smi_illegal_cid(),
|
| + handler);
|
|
|
| for (intptr_t i = 0; i < table.Length(); i++) {
|
| cache ^= table.At(i);
|
| @@ -2216,13 +2188,12 @@ void Precompiler::ShareMegamorphicBuckets() {
|
| void Precompiler::DedupStackmaps() {
|
| class DedupStackmapsVisitor : public FunctionVisitor {
|
| public:
|
| - explicit DedupStackmapsVisitor(Zone* zone) :
|
| - zone_(zone),
|
| - canonical_stackmaps_(),
|
| - code_(Code::Handle(zone)),
|
| - stackmaps_(Array::Handle(zone)),
|
| - stackmap_(Stackmap::Handle(zone)) {
|
| - }
|
| + explicit DedupStackmapsVisitor(Zone* zone)
|
| + : zone_(zone),
|
| + canonical_stackmaps_(),
|
| + code_(Code::Handle(zone)),
|
| + stackmaps_(Array::Handle(zone)),
|
| + stackmap_(Stackmap::Handle(zone)) {}
|
|
|
| void Visit(const Function& function) {
|
| if (!function.HasCode()) {
|
| @@ -2266,12 +2237,11 @@ void Precompiler::DedupStackmaps() {
|
| void Precompiler::DedupLists() {
|
| class DedupListsVisitor : public FunctionVisitor {
|
| public:
|
| - explicit DedupListsVisitor(Zone* zone) :
|
| - zone_(zone),
|
| - canonical_lists_(),
|
| - code_(Code::Handle(zone)),
|
| - list_(Array::Handle(zone)) {
|
| - }
|
| + explicit DedupListsVisitor(Zone* zone)
|
| + : zone_(zone),
|
| + canonical_lists_(),
|
| + code_(Code::Handle(zone)),
|
| + list_(Array::Handle(zone)) {}
|
|
|
| void Visit(const Function& function) {
|
| code_ = function.CurrentCode();
|
| @@ -2285,10 +2255,8 @@ void Precompiler::DedupLists() {
|
|
|
| list_ = function.parameter_types();
|
| if (!list_.IsNull()) {
|
| - if (!function.IsSignatureFunction() &&
|
| - !function.IsClosureFunction() &&
|
| - (function.name() != Symbols::Call().raw()) &&
|
| - !list_.InVMHeap()) {
|
| + if (!function.IsSignatureFunction() && !function.IsClosureFunction() &&
|
| + (function.name() != Symbols::Call().raw()) && !list_.InVMHeap()) {
|
| // Parameter types not needed for function type tests.
|
| for (intptr_t i = 0; i < list_.Length(); i++) {
|
| list_.SetAt(i, Object::dynamic_type());
|
| @@ -2300,8 +2268,7 @@ void Precompiler::DedupLists() {
|
|
|
| list_ = function.parameter_names();
|
| if (!list_.IsNull()) {
|
| - if (!function.HasOptionalNamedParameters() &&
|
| - !list_.InVMHeap()) {
|
| + if (!function.HasOptionalNamedParameters() && !list_.InVMHeap()) {
|
| // Parameter names not needed for resolution.
|
| for (intptr_t i = 0; i < list_.Length(); i++) {
|
| list_.SetAt(i, Symbols::OptimizedOut());
|
| @@ -2337,12 +2304,11 @@ void Precompiler::DedupLists() {
|
| void Precompiler::DedupInstructions() {
|
| class DedupInstructionsVisitor : public FunctionVisitor {
|
| public:
|
| - explicit DedupInstructionsVisitor(Zone* zone) :
|
| - zone_(zone),
|
| - canonical_instructions_set_(),
|
| - code_(Code::Handle(zone)),
|
| - instructions_(Instructions::Handle(zone)) {
|
| - }
|
| + explicit DedupInstructionsVisitor(Zone* zone)
|
| + : zone_(zone),
|
| + canonical_instructions_set_(),
|
| + code_(Code::Handle(zone)),
|
| + instructions_(Instructions::Handle(zone)) {}
|
|
|
| void Visit(const Function& function) {
|
| if (!function.HasCode()) {
|
| @@ -2463,9 +2429,11 @@ void Precompiler::FinalizeAllClasses() {
|
| lib ^= libraries_.At(i);
|
| if (!lib.Loaded()) {
|
| String& uri = String::Handle(Z, lib.url());
|
| - String& msg = String::Handle(Z, String::NewFormatted(
|
| - "Library '%s' is not loaded. "
|
| - "Did you forget to call Dart_FinalizeLoading?", uri.ToCString()));
|
| + String& msg = String::Handle(
|
| + Z,
|
| + String::NewFormatted("Library '%s' is not loaded. "
|
| + "Did you forget to call Dart_FinalizeLoading?",
|
| + uri.ToCString()));
|
| Jump(Error::Handle(Z, ApiError::New(msg)));
|
| }
|
|
|
| @@ -2523,8 +2491,8 @@ void Precompiler::SortClasses() {
|
| if (old_to_new_cid[cid] == -1) {
|
| old_to_new_cid[cid] = next_new_cid++;
|
| if (FLAG_trace_precompiler) {
|
| - THR_Print("%" Pd ": %s, was %" Pd "\n",
|
| - old_to_new_cid[cid], cls.ToCString(), cid);
|
| + THR_Print("%" Pd ": %s, was %" Pd "\n", old_to_new_cid[cid],
|
| + cls.ToCString(), cid);
|
| }
|
| }
|
| subclasses = cls.direct_subclasses();
|
| @@ -2543,8 +2511,8 @@ void Precompiler::SortClasses() {
|
| old_to_new_cid[cid] = next_new_cid++;
|
| if (FLAG_trace_precompiler && table->HasValidClassAt(cid)) {
|
| cls = table->At(cid);
|
| - THR_Print("%" Pd ": %s, was %" Pd "\n",
|
| - old_to_new_cid[cid], cls.ToCString(), cid);
|
| + THR_Print("%" Pd ": %s, was %" Pd "\n", old_to_new_cid[cid],
|
| + cls.ToCString(), cid);
|
| }
|
| }
|
| }
|
| @@ -2558,7 +2526,7 @@ void Precompiler::SortClasses() {
|
| class CidRewriteVisitor : public ObjectVisitor {
|
| public:
|
| explicit CidRewriteVisitor(intptr_t* old_to_new_cids)
|
| - : old_to_new_cids_(old_to_new_cids) { }
|
| + : old_to_new_cids_(old_to_new_cids) {}
|
|
|
| intptr_t Map(intptr_t cid) {
|
| ASSERT(cid != -1);
|
| @@ -2670,8 +2638,8 @@ void PrecompileParsedFunctionHelper::FinalizeCompilation(
|
| deopt_info_array.Length() * sizeof(uword));
|
| // Allocates instruction object. Since this occurs only at safepoint,
|
| // there can be no concurrent access to the instruction page.
|
| - const Code& code = Code::Handle(
|
| - Code::FinalizeCode(function, assembler, optimized()));
|
| + const Code& code =
|
| + Code::Handle(Code::FinalizeCode(function, assembler, optimized()));
|
| code.set_is_optimized(optimized());
|
| code.set_owner(function);
|
| if (!function.IsOptimizable()) {
|
| @@ -2681,8 +2649,7 @@ void PrecompileParsedFunctionHelper::FinalizeCompilation(
|
| }
|
|
|
| const Array& intervals = graph_compiler->inlined_code_intervals();
|
| - INC_STAT(thread(), total_code_size,
|
| - intervals.Length() * sizeof(uword));
|
| + INC_STAT(thread(), total_code_size, intervals.Length() * sizeof(uword));
|
| code.SetInlinedIntervals(intervals);
|
|
|
| const Array& inlined_id_array =
|
| @@ -2767,16 +2734,13 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
| {
|
| CSTAT_TIMER_SCOPE(thread(), graphbuilder_timer);
|
| ZoneGrowableArray<const ICData*>* ic_data_array =
|
| - new(zone) ZoneGrowableArray<const ICData*>();
|
| + new (zone) ZoneGrowableArray<const ICData*>();
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds(thread(), compiler_timeline,
|
| "BuildFlowGraph");
|
| #endif // !PRODUCT
|
| - flow_graph = pipeline->BuildFlowGraph(zone,
|
| - parsed_function(),
|
| - *ic_data_array,
|
| - Compiler::kNoOSRDeoptId);
|
| + flow_graph = pipeline->BuildFlowGraph(
|
| + zone, parsed_function(), *ic_data_array, Compiler::kNoOSRDeoptId);
|
| }
|
|
|
| const bool print_flow_graph =
|
| @@ -2790,9 +2754,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| if (optimized()) {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds(thread(),
|
| - compiler_timeline,
|
| - "ComputeSSA");
|
| + TimelineDurationScope tds(thread(), compiler_timeline, "ComputeSSA");
|
| #endif // !PRODUCT
|
| CSTAT_TIMER_SCOPE(thread(), ssa_timer);
|
| // Transform to SSA (virtual register 0 and no inlining arguments).
|
| @@ -2815,8 +2777,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
| // potentially affect optimizations.
|
| if (optimized()) {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds(thread(), compiler_timeline,
|
| "OptimizationPasses");
|
| #endif // !PRODUCT
|
| inline_id_to_function.Add(&function);
|
| @@ -2830,10 +2791,8 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
| caller_inline_id.Add(-1);
|
| CSTAT_TIMER_SCOPE(thread(), graphoptimizer_timer);
|
|
|
| - AotOptimizer optimizer(precompiler_,
|
| - flow_graph,
|
| - use_speculative_inlining,
|
| - &inlining_black_list);
|
| + AotOptimizer optimizer(precompiler_, flow_graph,
|
| + use_speculative_inlining, &inlining_black_list);
|
| optimizer.PopulateWithICData();
|
|
|
| optimizer.ApplyClassIds();
|
| @@ -2855,9 +2814,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
| // Inlining (mutates the flow graph)
|
| if (FLAG_use_inlining) {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| - "Inlining");
|
| + TimelineDurationScope tds2(thread(), compiler_timeline, "Inlining");
|
| #endif // !PRODUCT
|
| CSTAT_TIMER_SCOPE(thread(), graphinliner_timer);
|
| // Propagate types to create more inlining opportunities.
|
| @@ -2868,13 +2825,10 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
| optimizer.ApplyClassIds();
|
| DEBUG_ASSERT(flow_graph->VerifyUseLists());
|
|
|
| - FlowGraphInliner inliner(flow_graph,
|
| - &inline_id_to_function,
|
| - &inline_id_to_token_pos,
|
| - &caller_inline_id,
|
| + FlowGraphInliner inliner(flow_graph, &inline_id_to_function,
|
| + &inline_id_to_token_pos, &caller_inline_id,
|
| use_speculative_inlining,
|
| - &inlining_black_list,
|
| - precompiler_);
|
| + &inlining_black_list, precompiler_);
|
| inliner.Inline();
|
| // Use lists are maintained and validated by the inliner.
|
| DEBUG_ASSERT(flow_graph->VerifyUseLists());
|
| @@ -2886,8 +2840,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "ApplyClassIds");
|
| #endif // !PRODUCT
|
| // Use propagated class-ids to optimize further.
|
| @@ -2910,8 +2863,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "BranchSimplifier");
|
| #endif // !PRODUCT
|
| BranchSimplifier::Simplify(flow_graph);
|
| @@ -2923,8 +2875,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| if (FLAG_constant_propagation) {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "ConstantPropagation");
|
| #endif // !PRODUCT
|
| ConstantPropagator::Optimize(flow_graph);
|
| @@ -2954,8 +2905,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "SelectRepresentations");
|
| #endif // !PRODUCT
|
| // Where beneficial convert Smi operations into Int32 operations.
|
| @@ -2971,8 +2921,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "CommonSubexpressionElinination");
|
| #endif // !PRODUCT
|
| if (FLAG_common_subexpression_elimination ||
|
| @@ -3013,8 +2962,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "DeadStoreElimination");
|
| #endif // !PRODUCT
|
| DeadStoreElimination::Optimize(flow_graph);
|
| @@ -3022,8 +2970,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| if (FLAG_range_analysis) {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "RangeAnalysis");
|
| #endif // !PRODUCT
|
| // Propagate types after store-load-forwarding. Some phis may have
|
| @@ -3041,8 +2988,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| if (FLAG_constant_propagation) {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "ConstantPropagator::OptimizeBranches");
|
| #endif // !PRODUCT
|
| // Constant propagation can use information from range analysis to
|
| @@ -3059,8 +3005,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "TryCatchAnalyzer::Optimize");
|
| #endif // !PRODUCT
|
| // Optimize try-blocks.
|
| @@ -3074,8 +3019,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "EliminateDeadPhis");
|
| #endif // !PRODUCT
|
| DeadCodeElimination::EliminateDeadPhis(flow_graph);
|
| @@ -3090,10 +3034,9 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
| // the deoptimization path.
|
| AllocationSinking* sinking = NULL;
|
| if (FLAG_allocation_sinking &&
|
| - (flow_graph->graph_entry()->SuccessorCount() == 1)) {
|
| + (flow_graph->graph_entry()->SuccessorCount() == 1)) {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "AllocationSinking::Optimize");
|
| #endif // !PRODUCT
|
| // TODO(fschneider): Support allocation sinking with try-catch.
|
| @@ -3110,8 +3053,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "SelectRepresentations");
|
| #endif // !PRODUCT
|
| // Ensure that all phis inserted by optimization passes have
|
| @@ -3132,8 +3074,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
| if (sinking != NULL) {
|
| #ifndef PRODUCT
|
| TimelineDurationScope tds2(
|
| - thread(),
|
| - compiler_timeline,
|
| + thread(), compiler_timeline,
|
| "AllocationSinking::DetachMaterializations");
|
| #endif // !PRODUCT
|
| // Remove all MaterializeObject instructions inserted by allocation
|
| @@ -3152,8 +3093,7 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds2(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds2(thread(), compiler_timeline,
|
| "AllocateRegisters");
|
| #endif // !PRODUCT
|
| // Perform register allocation on the SSA graph.
|
| @@ -3168,25 +3108,20 @@ bool PrecompileParsedFunctionHelper::Compile(CompilationPipeline* pipeline) {
|
|
|
| ASSERT(inline_id_to_function.length() == caller_inline_id.length());
|
| Assembler assembler(use_far_branches);
|
| - FlowGraphCompiler graph_compiler(&assembler, flow_graph,
|
| - *parsed_function(), optimized(),
|
| - inline_id_to_function,
|
| - inline_id_to_token_pos,
|
| - caller_inline_id);
|
| + FlowGraphCompiler graph_compiler(
|
| + &assembler, flow_graph, *parsed_function(), optimized(),
|
| + inline_id_to_function, inline_id_to_token_pos, caller_inline_id);
|
| {
|
| CSTAT_TIMER_SCOPE(thread(), graphcompiler_timer);
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds(thread(),
|
| - compiler_timeline,
|
| - "CompileGraph");
|
| + TimelineDurationScope tds(thread(), compiler_timeline, "CompileGraph");
|
| #endif // !PRODUCT
|
| graph_compiler.CompileGraph();
|
| pipeline->FinalizeCompilation(flow_graph);
|
| }
|
| {
|
| #ifndef PRODUCT
|
| - TimelineDurationScope tds(thread(),
|
| - compiler_timeline,
|
| + TimelineDurationScope tds(thread(), compiler_timeline,
|
| "FinalizeCompilation");
|
| #endif // !PRODUCT
|
| ASSERT(thread()->IsMutatorThread());
|
| @@ -3267,20 +3202,17 @@ static RawError* PrecompileFunctionHelper(Precompiler* precompiler,
|
| StackZone stack_zone(thread);
|
| Zone* const zone = stack_zone.GetZone();
|
| const bool trace_compiler =
|
| - FLAG_trace_compiler ||
|
| - (FLAG_trace_optimizing_compiler && optimized);
|
| + FLAG_trace_compiler || (FLAG_trace_optimizing_compiler && optimized);
|
| Timer per_compile_timer(trace_compiler, "Compilation time");
|
| per_compile_timer.Start();
|
|
|
| - ParsedFunction* parsed_function = new(zone) ParsedFunction(
|
| - thread, Function::ZoneHandle(zone, function.raw()));
|
| + ParsedFunction* parsed_function = new (zone)
|
| + ParsedFunction(thread, Function::ZoneHandle(zone, function.raw()));
|
| if (trace_compiler) {
|
| - THR_Print(
|
| - "Precompiling %sfunction: '%s' @ token %" Pd ", size %" Pd "\n",
|
| - (optimized ? "optimized " : ""),
|
| - function.ToFullyQualifiedCString(),
|
| - function.token_pos().Pos(),
|
| - (function.end_token_pos().Pos() - function.token_pos().Pos()));
|
| + THR_Print("Precompiling %sfunction: '%s' @ token %" Pd ", size %" Pd "\n",
|
| + (optimized ? "optimized " : ""),
|
| + function.ToFullyQualifiedCString(), function.token_pos().Pos(),
|
| + (function.end_token_pos().Pos() - function.token_pos().Pos()));
|
| }
|
| INC_STAT(thread, num_functions_compiled, 1);
|
| if (optimized) {
|
| @@ -3291,13 +3223,12 @@ static RawError* PrecompileFunctionHelper(Precompiler* precompiler,
|
| const int64_t num_tokens_before = STAT_VALUE(thread, num_tokens_consumed);
|
| pipeline->ParseFunction(parsed_function);
|
| const int64_t num_tokens_after = STAT_VALUE(thread, num_tokens_consumed);
|
| - INC_STAT(thread,
|
| - num_func_tokens_compiled,
|
| + INC_STAT(thread, num_func_tokens_compiled,
|
| num_tokens_after - num_tokens_before);
|
| }
|
|
|
| - PrecompileParsedFunctionHelper helper(
|
| - precompiler, parsed_function, optimized);
|
| + PrecompileParsedFunctionHelper helper(precompiler, parsed_function,
|
| + optimized);
|
| const bool success = helper.Compile(pipeline);
|
| if (!success) {
|
| // Encountered error.
|
| @@ -3322,8 +3253,7 @@ static RawError* PrecompileFunctionHelper(Precompiler* precompiler,
|
|
|
| if (FLAG_disassemble && FlowGraphPrinter::ShouldPrint(function)) {
|
| Disassembler::DisassembleCode(function, optimized);
|
| - } else if (FLAG_disassemble_optimized &&
|
| - optimized &&
|
| + } else if (FLAG_disassemble_optimized && optimized &&
|
| FlowGraphPrinter::ShouldPrint(function)) {
|
| Disassembler::DisassembleCode(function, true);
|
| }
|
|
|