127 int _offset_fp; // relative frame pointer for use in stack-chunk frames
128 };
129 // The interpreter and adapters will extend the frame of the caller.
130 // Since oopMaps are based on the sp of the caller before extension
131 // we need to know that value. However in order to compute the address
132 // of the return address we need the real "raw" sp. By convention we
133 // use sp() to mean "raw" sp and unextended_sp() to mean the caller's
134 // original sp.
135
136 union {
137 intptr_t* _unextended_sp;
138 int _offset_unextended_sp; // for use in stack-chunk frames
139 };
140
141 void adjust_unextended_sp() NOT_DEBUG_RETURN;
142
143 intptr_t* ptr_at_addr(int offset) const {
144 return (intptr_t*) addr_at(offset);
145 }
146
147 #ifdef ASSERT
148 // Used in frame::sender_for_{interpreter,compiled}_frame
149 static void verify_deopt_original_pc(nmethod* nm, intptr_t* unextended_sp);
150 #endif
151
152 public:
153 // Constructors
154
155 frame(intptr_t* sp, intptr_t* fp, address pc);
156
157 frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc);
158
159 frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb);
160 // used for heap frame construction by continuations
161 frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb, const ImmutableOopMap* oop_map, bool relative);
162
163 frame(intptr_t* sp, intptr_t* fp);
164
165 void init(intptr_t* sp, intptr_t* fp, address pc);
166 void setup(address pc);
|
127 int _offset_fp; // relative frame pointer for use in stack-chunk frames
128 };
129 // The interpreter and adapters will extend the frame of the caller.
130 // Since oopMaps are based on the sp of the caller before extension
131 // we need to know that value. However in order to compute the address
132 // of the return address we need the real "raw" sp. By convention we
133 // use sp() to mean "raw" sp and unextended_sp() to mean the caller's
134 // original sp.
135
136 union {
137 intptr_t* _unextended_sp;
138 int _offset_unextended_sp; // for use in stack-chunk frames
139 };
140
141 void adjust_unextended_sp() NOT_DEBUG_RETURN;
142
143 intptr_t* ptr_at_addr(int offset) const {
144 return (intptr_t*) addr_at(offset);
145 }
146
147 public:
148 // Support for scalarized inline type calling convention
149 intptr_t* repair_sender_sp(intptr_t* sender_sp, intptr_t** saved_fp_addr) const;
150 static intptr_t* repair_sender_sp(nmethod* nm, intptr_t* sp, intptr_t** saved_fp_addr);
151 bool was_augmented_on_entry(int& real_size) const;
152
153 private:
154 #ifdef ASSERT
155 // Used in frame::sender_for_{interpreter,compiled}_frame
156 static void verify_deopt_original_pc(nmethod* nm, intptr_t* unextended_sp);
157 #endif
158
159 public:
160 // Constructors
161
162 frame(intptr_t* sp, intptr_t* fp, address pc);
163
164 frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc);
165
166 frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb);
167 // used for heap frame construction by continuations
168 frame(intptr_t* sp, intptr_t* unextended_sp, intptr_t* fp, address pc, CodeBlob* cb, const ImmutableOopMap* oop_map, bool relative);
169
170 frame(intptr_t* sp, intptr_t* fp);
171
172 void init(intptr_t* sp, intptr_t* fp, address pc);
173 void setup(address pc);
|