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

Side by Side Diff: runtime/vm/stack_frame_dbc.h

Issue 2176413003: DBC: Fix reading locals out of a deopt frame. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: . Created 4 years, 4 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
« no previous file with comments | « runtime/vm/stack_frame.cc ('k') | no next file » | 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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 #ifndef VM_STACK_FRAME_DBC_H_ 5 #ifndef VM_STACK_FRAME_DBC_H_
6 #define VM_STACK_FRAME_DBC_H_ 6 #define VM_STACK_FRAME_DBC_H_
7 7
8 namespace dart { 8 namespace dart {
9 9
10 /* DBC Frame Layout 10 /* DBC Frame Layout
11 11
12 IMPORTANT: On DBC stack is growing upwards which is different from all other 12 IMPORTANT: On DBC stack is growing upwards which is different from all other
13 architectures. This enables effecient addressing for locals via unsigned index. 13 architectures. This enables efficient addressing for locals via unsigned index.
14 14
15 | | <- TOS 15 | | <- TOS
16 Callee frame | ... | 16 Callee frame | ... |
17 | saved FP | (FP of current frame) 17 | saved FP | (FP of current frame)
18 | saved PC | (PC of current frame) 18 | saved PC | (PC of current frame)
19 | code object | 19 | code object |
20 | function object | 20 | function object |
21 +--------------------+ 21 +--------------------+
22 Current frame | ... T| <- SP of current frame 22 Current frame | ... T| <- SP of current frame
23 | ... T| 23 | ... T|
(...skipping 25 matching lines...) Expand all
49 49
50 // Note: These constants don't match actual DBC behavior. This is done because 50 // Note: These constants don't match actual DBC behavior. This is done because
51 // setting kFirstLocalSlotFromFp to 0 breaks assumptions spread across the code. 51 // setting kFirstLocalSlotFromFp to 0 breaks assumptions spread across the code.
52 // Instead for the purposes of local variable allocation we pretend that DBC 52 // Instead for the purposes of local variable allocation we pretend that DBC
53 // behaves as other architectures (stack growing downwards) and later fix 53 // behaves as other architectures (stack growing downwards) and later fix
54 // these indices during code generation in the backend. 54 // these indices during code generation in the backend.
55 static const int kParamEndSlotFromFp = 4; // One slot past last parameter. 55 static const int kParamEndSlotFromFp = 4; // One slot past last parameter.
56 static const int kFirstLocalSlotFromFp = -1; 56 static const int kFirstLocalSlotFromFp = -1;
57 57
58 58
59 DART_FORCE_INLINE static uword LocalVarAddress(uword fp, intptr_t index) { 59 DART_FORCE_INLINE static intptr_t LocalVarIndex(intptr_t fp_offset,
60 ASSERT(index != 0); 60 intptr_t var_index) {
61 if (index > 0) { 61 ASSERT(var_index != 0);
62 return fp - index * kWordSize; 62 if (var_index > 0) {
63 return fp_offset - var_index;
63 } else { 64 } else {
64 return fp - (index + 1) * kWordSize; 65 return fp_offset - (var_index + 1);
65 } 66 }
66 } 67 }
67 68
69
68 DART_FORCE_INLINE static uword ParamAddress(uword fp, intptr_t reverse_index) { 70 DART_FORCE_INLINE static uword ParamAddress(uword fp, intptr_t reverse_index) {
69 return fp - (kDartFrameFixedSize + reverse_index) * kWordSize; 71 return fp - (kDartFrameFixedSize + reverse_index) * kWordSize;
70 } 72 }
71 73
72 DART_FORCE_INLINE static bool IsCalleeFrameOf(uword fp, uword other_fp) { 74 DART_FORCE_INLINE static bool IsCalleeFrameOf(uword fp, uword other_fp) {
73 return other_fp > fp; 75 return other_fp > fp;
74 } 76 }
75 77
76 static const int kExitLinkSlotFromEntryFp = 0; 78 static const int kExitLinkSlotFromEntryFp = 0;
77 79
78 // Value for stack limit that is used to cause an interrupt. 80 // Value for stack limit that is used to cause an interrupt.
79 // Note that on DBC stack is growing upwards so interrupt limit is 0 unlike 81 // Note that on DBC stack is growing upwards so interrupt limit is 0 unlike
80 // on all other architectures. 82 // on all other architectures.
81 static const uword kInterruptStackLimit = 0; 83 static const uword kInterruptStackLimit = 0;
82 84
83 } // namespace dart 85 } // namespace dart
84 86
85 #endif // VM_STACK_FRAME_DBC_H_ 87 #endif // VM_STACK_FRAME_DBC_H_
OLDNEW
« no previous file with comments | « runtime/vm/stack_frame.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698