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

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

Issue 12457034: Ensure that all goto instructions have deoptimization target. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Delete UNREACHABLE Created 7 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/object.h ('k') | runtime/vm/object_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/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/bigint_operations.h" 10 #include "vm/bigint_operations.h"
(...skipping 6899 matching lines...) Expand 10 before | Expand all | Expand 10 after
6910 NoGCScope no_gc; 6910 NoGCScope no_gc;
6911 result ^= raw; 6911 result ^= raw;
6912 result.SetLength(num_descriptors); 6912 result.SetLength(num_descriptors);
6913 } 6913 }
6914 return result.raw(); 6914 return result.raw();
6915 } 6915 }
6916 6916
6917 6917
6918 const char* PcDescriptors::KindAsStr(intptr_t index) const { 6918 const char* PcDescriptors::KindAsStr(intptr_t index) const {
6919 switch (DescriptorKind(index)) { 6919 switch (DescriptorKind(index)) {
6920 case PcDescriptors::kDeoptBefore: return "deopt-before "; 6920 case PcDescriptors::kDeopt: return "deopt ";
6921 case PcDescriptors::kDeoptAfter: return "deopt-after ";
6922 case PcDescriptors::kEntryPatch: return "entry-patch "; 6921 case PcDescriptors::kEntryPatch: return "entry-patch ";
6923 case PcDescriptors::kPatchCode: return "patch "; 6922 case PcDescriptors::kPatchCode: return "patch ";
6924 case PcDescriptors::kLazyDeoptJump: return "lazy-deopt "; 6923 case PcDescriptors::kLazyDeoptJump: return "lazy-deopt ";
6925 case PcDescriptors::kIcCall: return "ic-call "; 6924 case PcDescriptors::kIcCall: return "ic-call ";
6926 case PcDescriptors::kFuncCall: return "fn-call "; 6925 case PcDescriptors::kFuncCall: return "fn-call ";
6927 case PcDescriptors::kReturn: return "return "; 6926 case PcDescriptors::kReturn: return "return ";
6928 case PcDescriptors::kOther: return "other "; 6927 case PcDescriptors::kOther: return "other ";
6929 } 6928 }
6930 UNREACHABLE(); 6929 UNREACHABLE();
6931 return ""; 6930 return "";
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
6992 OS::Print("Not checking pc decriptors, length %"Pd"\n", Length()); 6991 OS::Print("Not checking pc decriptors, length %"Pd"\n", Length());
6993 } 6992 }
6994 return; 6993 return;
6995 } 6994 }
6996 // Only check ids for unoptimized code that is optimizable. 6995 // Only check ids for unoptimized code that is optimizable.
6997 if (!function.is_optimizable()) return; 6996 if (!function.is_optimizable()) return;
6998 for (intptr_t i = 0; i < Length(); i++) { 6997 for (intptr_t i = 0; i < Length(); i++) {
6999 PcDescriptors::Kind kind = DescriptorKind(i); 6998 PcDescriptors::Kind kind = DescriptorKind(i);
7000 // 'deopt_id' is set for kDeopt and kIcCall and must be unique for one kind. 6999 // 'deopt_id' is set for kDeopt and kIcCall and must be unique for one kind.
7001 intptr_t deopt_id = Isolate::kNoDeoptId; 7000 intptr_t deopt_id = Isolate::kNoDeoptId;
7002 if ((DescriptorKind(i) == PcDescriptors::kDeoptBefore) || 7001 if ((DescriptorKind(i) != PcDescriptors::kDeopt) ||
7003 (DescriptorKind(i) == PcDescriptors::kIcCall)) { 7002 (DescriptorKind(i) != PcDescriptors::kIcCall)) {
7004 deopt_id = DeoptId(i); 7003 continue;
7005 } 7004 }
7005
7006 deopt_id = DeoptId(i);
7007 if (Isolate::IsDeoptAfter(deopt_id)) {
7008 // TODO(vegorov): some instructions contain multiple calls and have
7009 // multiple "after" targets recorded. Right now it is benign but might
7010 // lead to issues in the future. Fix that and enable verification.
7011 continue;
7012 }
7013
7006 for (intptr_t k = i + 1; k < Length(); k++) { 7014 for (intptr_t k = i + 1; k < Length(); k++) {
7007 if (kind == DescriptorKind(k)) { 7015 if (kind == DescriptorKind(k)) {
7008 if (deopt_id != Isolate::kNoDeoptId) { 7016 if (deopt_id != Isolate::kNoDeoptId) {
7009 ASSERT(DeoptId(k) != deopt_id); 7017 ASSERT(DeoptId(k) != deopt_id);
7010 } 7018 }
7011 } 7019 }
7012 } 7020 }
7013 } 7021 }
7014 #endif // DEBUG 7022 #endif // DEBUG
7015 } 7023 }
(...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after
7737 (descriptors.DescriptorKind(i) == kind)) { 7745 (descriptors.DescriptorKind(i) == kind)) {
7738 uword pc = descriptors.PC(i); 7746 uword pc = descriptors.PC(i);
7739 ASSERT(ContainsInstructionAt(pc)); 7747 ASSERT(ContainsInstructionAt(pc));
7740 return pc; 7748 return pc;
7741 } 7749 }
7742 } 7750 }
7743 return 0; 7751 return 0;
7744 } 7752 }
7745 7753
7746 7754
7747 uword Code::GetDeoptBeforePcAtDeoptId(intptr_t deopt_id) const {
7748 ASSERT(!is_optimized());
7749 return GetPcForDeoptId(deopt_id, PcDescriptors::kDeoptBefore);
7750 }
7751
7752
7753 uword Code::GetDeoptAfterPcAtDeoptId(intptr_t deopt_id) const {
7754 ASSERT(!is_optimized());
7755 return GetPcForDeoptId(deopt_id, PcDescriptors::kDeoptAfter);
7756 }
7757
7758
7759 const char* Code::ToCString() const { 7755 const char* Code::ToCString() const {
7760 const char* kFormat = "Code entry:%p"; 7756 const char* kFormat = "Code entry:%p";
7761 intptr_t len = OS::SNPrint(NULL, 0, kFormat, EntryPoint()) + 1; 7757 intptr_t len = OS::SNPrint(NULL, 0, kFormat, EntryPoint()) + 1;
7762 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 7758 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
7763 OS::SNPrint(chars, len, kFormat, EntryPoint()); 7759 OS::SNPrint(chars, len, kFormat, EntryPoint());
7764 return chars; 7760 return chars;
7765 } 7761 }
7766 7762
7767 7763
7768 uword Code::GetPatchCodePc() const { 7764 uword Code::GetPatchCodePc() const {
(...skipping 5280 matching lines...) Expand 10 before | Expand all | Expand 10 after
13049 } 13045 }
13050 return result.raw(); 13046 return result.raw();
13051 } 13047 }
13052 13048
13053 13049
13054 const char* WeakProperty::ToCString() const { 13050 const char* WeakProperty::ToCString() const {
13055 return "_WeakProperty"; 13051 return "_WeakProperty";
13056 } 13052 }
13057 13053
13058 } // namespace dart 13054 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/object_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698