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

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

Issue 254723003: Remember all deopt reasons in ic_data, not just the last one. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 8 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 | Annotate | Revision Log
« no previous file with comments | « runtime/vm/code_generator.h ('k') | runtime/vm/code_patcher_arm64_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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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/code_generator.h" 5 #include "vm/code_generator.h"
6 6
7 #include "vm/assembler.h" 7 #include "vm/assembler.h"
8 #include "vm/ast.h" 8 #include "vm/ast.h"
9 #include "vm/bigint_operations.h" 9 #include "vm/bigint_operations.h"
10 #include "vm/code_patcher.h" 10 #include "vm/code_patcher.h"
(...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after
740 String& function_name = String::Handle(ic_data.target_name()); 740 String& function_name = String::Handle(ic_data.target_name());
741 ASSERT(function_name.IsSymbol()); 741 ASSERT(function_name.IsSymbol());
742 Function& target_function = Function::Handle( 742 Function& target_function = Function::Handle(
743 Resolver::ResolveDynamic(receiver, function_name, arguments_descriptor)); 743 Resolver::ResolveDynamic(receiver, function_name, arguments_descriptor));
744 if (target_function.IsNull()) { 744 if (target_function.IsNull()) {
745 if (FLAG_trace_ic) { 745 if (FLAG_trace_ic) {
746 OS::PrintErr("InlineCacheMissHandler NULL function for %s receiver: %s\n", 746 OS::PrintErr("InlineCacheMissHandler NULL function for %s receiver: %s\n",
747 String::Handle(ic_data.target_name()).ToCString(), 747 String::Handle(ic_data.target_name()).ToCString(),
748 receiver.ToCString()); 748 receiver.ToCString());
749 } 749 }
750 ic_data.set_is_closure_call(true); 750 ic_data.SetIsClosureCall();
751 target_function = InlineCacheMissHelper(receiver, ic_data); 751 target_function = InlineCacheMissHelper(receiver, ic_data);
752 } 752 }
753 ASSERT(!target_function.IsNull()); 753 ASSERT(!target_function.IsNull());
754 if (args.length() == 1) { 754 if (args.length() == 1) {
755 ic_data.AddReceiverCheck(args[0]->GetClassId(), target_function); 755 ic_data.AddReceiverCheck(args[0]->GetClassId(), target_function);
756 } else { 756 } else {
757 GrowableArray<intptr_t> class_ids(args.length()); 757 GrowableArray<intptr_t> class_ids(args.length());
758 ASSERT(ic_data.num_args_tested() == args.length()); 758 ASSERT(ic_data.NumArgsTested() == args.length());
759 for (intptr_t i = 0; i < args.length(); i++) { 759 for (intptr_t i = 0; i < args.length(); i++) {
760 class_ids.Add(args[i]->GetClassId()); 760 class_ids.Add(args[i]->GetClassId());
761 } 761 }
762 ic_data.AddCheck(class_ids, target_function); 762 ic_data.AddCheck(class_ids, target_function);
763 } 763 }
764 if (FLAG_trace_ic_miss_in_optimized || FLAG_trace_ic) { 764 if (FLAG_trace_ic_miss_in_optimized || FLAG_trace_ic) {
765 DartFrameIterator iterator; 765 DartFrameIterator iterator;
766 StackFrame* caller_frame = iterator.NextFrame(); 766 StackFrame* caller_frame = iterator.NextFrame();
767 ASSERT(caller_frame != NULL); 767 ASSERT(caller_frame != NULL);
768 if (FLAG_trace_ic_miss_in_optimized) { 768 if (FLAG_trace_ic_miss_in_optimized) {
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
901 OS::PrintErr("Megamorphic IC miss, class=%s, function=%s\n", 901 OS::PrintErr("Megamorphic IC miss, class=%s, function=%s\n",
902 cls.ToCString(), name.ToCString()); 902 cls.ToCString(), name.ToCString());
903 } 903 }
904 904
905 ArgumentsDescriptor args_desc(descriptor); 905 ArgumentsDescriptor args_desc(descriptor);
906 Function& target_function = Function::Handle( 906 Function& target_function = Function::Handle(
907 Resolver::ResolveDynamicForReceiverClass(cls, 907 Resolver::ResolveDynamicForReceiverClass(cls,
908 name, 908 name,
909 args_desc)); 909 args_desc));
910 if (target_function.IsNull()) { 910 if (target_function.IsNull()) {
911 ic_data.set_is_closure_call(true); 911 ic_data.SetIsClosureCall();
912 target_function = InlineCacheMissHelper(receiver, ic_data); 912 target_function = InlineCacheMissHelper(receiver, ic_data);
913 } 913 }
914 914
915 ASSERT(!target_function.IsNull()); 915 ASSERT(!target_function.IsNull());
916 // Insert function found into cache and return it. 916 // Insert function found into cache and return it.
917 cache.EnsureCapacity(); 917 cache.EnsureCapacity();
918 const Smi& class_id = Smi::Handle(Smi::New(cls.id())); 918 const Smi& class_id = Smi::Handle(Smi::New(cls.id()));
919 cache.Insert(class_id, target_function); 919 cache.Insert(class_id, target_function);
920 arguments.SetReturn(target_function); 920 arguments.SetReturn(target_function);
921 } 921 }
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 const Function& function = Function::CheckedHandle(arguments.ArgAt(1)); 1180 const Function& function = Function::CheckedHandle(arguments.ArgAt(1));
1181 DartFrameIterator iterator; 1181 DartFrameIterator iterator;
1182 StackFrame* frame = iterator.NextFrame(); 1182 StackFrame* frame = iterator.NextFrame();
1183 ASSERT(frame != NULL); 1183 ASSERT(frame != NULL);
1184 OS::PrintErr("IC call @%#" Px ": ICData: %p cnt:%" Pd " nchecks: %" Pd 1184 OS::PrintErr("IC call @%#" Px ": ICData: %p cnt:%" Pd " nchecks: %" Pd
1185 " %s %s\n", 1185 " %s %s\n",
1186 frame->pc(), 1186 frame->pc(),
1187 ic_data.raw(), 1187 ic_data.raw(),
1188 function.usage_counter(), 1188 function.usage_counter(),
1189 ic_data.NumberOfChecks(), 1189 ic_data.NumberOfChecks(),
1190 ic_data.is_closure_call() ? "closure" : "", 1190 ic_data.IsClosureCall() ? "closure" : "",
1191 function.ToFullyQualifiedCString()); 1191 function.ToFullyQualifiedCString());
1192 } 1192 }
1193 1193
1194 1194
1195 // This is called from function that needs to be optimized. 1195 // This is called from function that needs to be optimized.
1196 // The requesting function can be already optimized (reoptimization). 1196 // The requesting function can be already optimized (reoptimization).
1197 // Returns the Code object where to continue execution. 1197 // Returns the Code object where to continue execution.
1198 DEFINE_RUNTIME_ENTRY(OptimizeInvokedFunction, 1) { 1198 DEFINE_RUNTIME_ENTRY(OptimizeInvokedFunction, 1) {
1199 const Function& function = Function::CheckedHandle(arguments.ArgAt(0)); 1199 const Function& function = Function::CheckedHandle(arguments.ArgAt(0));
1200 ASSERT(!function.IsNull()); 1200 ASSERT(!function.IsNull());
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1262 if (FLAG_trace_patching) { 1262 if (FLAG_trace_patching) {
1263 OS::PrintErr("FixCallersTarget: patching from %#" Px " to '%s' %#" Px "\n", 1263 OS::PrintErr("FixCallersTarget: patching from %#" Px " to '%s' %#" Px "\n",
1264 frame->pc(), 1264 frame->pc(),
1265 target_function.ToFullyQualifiedCString(), 1265 target_function.ToFullyQualifiedCString(),
1266 current_target_code.EntryPoint()); 1266 current_target_code.EntryPoint());
1267 } 1267 }
1268 arguments.SetReturn(current_target_code); 1268 arguments.SetReturn(current_target_code);
1269 } 1269 }
1270 1270
1271 1271
1272 const char* DeoptReasonToText(intptr_t deopt_id) { 1272 const char* DeoptReasonToCString(ICData::ICData::DeoptReasonId deopt_reason) {
1273 switch (deopt_id) { 1273 switch (deopt_reason) {
1274 #define DEOPT_REASON_ID_TO_TEXT(name) case kDeopt##name: return #name; 1274 #define DEOPT_REASON_TO_TEXT(name) case ICData::kDeopt##name: return #name;
1275 DEOPT_REASONS(DEOPT_REASON_ID_TO_TEXT) 1275 DEOPT_REASONS(DEOPT_REASON_TO_TEXT)
1276 #undef DEOPT_REASON_ID_TO_TEXT 1276 #undef DEOPT_REASON_TO_TEXT
1277 default: 1277 default:
1278 UNREACHABLE(); 1278 UNREACHABLE();
1279 return ""; 1279 return "";
1280 } 1280 }
1281 } 1281 }
1282 1282
1283 1283
1284 void DeoptimizeAt(const Code& optimized_code, uword pc) { 1284 void DeoptimizeAt(const Code& optimized_code, uword pc) {
1285 ASSERT(optimized_code.is_optimized()); 1285 ASSERT(optimized_code.is_optimized());
1286 intptr_t deopt_reason = kDeoptUnknown; 1286 ICData::DeoptReasonId deopt_reason = ICData::kDeoptUnknown;
1287 const DeoptInfo& deopt_info = 1287 const DeoptInfo& deopt_info =
1288 DeoptInfo::Handle(optimized_code.GetDeoptInfoAtPc(pc, &deopt_reason)); 1288 DeoptInfo::Handle(optimized_code.GetDeoptInfoAtPc(pc, &deopt_reason));
1289 ASSERT(!deopt_info.IsNull()); 1289 ASSERT(!deopt_info.IsNull());
1290 const Function& function = Function::Handle(optimized_code.function()); 1290 const Function& function = Function::Handle(optimized_code.function());
1291 const Code& unoptimized_code = Code::Handle(function.unoptimized_code()); 1291 const Code& unoptimized_code = Code::Handle(function.unoptimized_code());
1292 ASSERT(!unoptimized_code.IsNull()); 1292 ASSERT(!unoptimized_code.IsNull());
1293 // The switch to unoptimized code may have already occurred. 1293 // The switch to unoptimized code may have already occurred.
1294 if (function.HasOptimizedCode()) { 1294 if (function.HasOptimizedCode()) {
1295 function.SwitchToUnoptimizedCode(); 1295 function.SwitchToUnoptimizedCode();
1296 } 1296 }
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
1497 // of the given value. 1497 // of the given value.
1498 // Arg0: Field object; 1498 // Arg0: Field object;
1499 // Arg1: Value that is being stored. 1499 // Arg1: Value that is being stored.
1500 DEFINE_RUNTIME_ENTRY(UpdateFieldCid, 2) { 1500 DEFINE_RUNTIME_ENTRY(UpdateFieldCid, 2) {
1501 const Field& field = Field::CheckedHandle(arguments.ArgAt(0)); 1501 const Field& field = Field::CheckedHandle(arguments.ArgAt(0));
1502 const Object& value = Object::Handle(arguments.ArgAt(1)); 1502 const Object& value = Object::Handle(arguments.ArgAt(1));
1503 field.UpdateGuardedCidAndLength(value); 1503 field.UpdateGuardedCidAndLength(value);
1504 } 1504 }
1505 1505
1506 } // namespace dart 1506 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/code_generator.h ('k') | runtime/vm/code_patcher_arm64_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698