blob: c45f015a231318300cbc4a9f44421f48f251b59c [file] [log] [blame]
Ben Murdoch3ef787d2012-04-12 10:51:47 +01001// Copyright 2012 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Steve Blocka7e24c12009-10-30 11:49:00 +00004
5#ifndef V8_FRAMES_INL_H_
6#define V8_FRAMES_INL_H_
7
Ben Murdochb8a8cc12014-11-26 15:28:44 +00008#include "src/frames.h"
9#include "src/isolate.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010#include "src/objects-inl.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011#include "src/v8memory.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000012
13#if V8_TARGET_ARCH_IA32
Ben Murdochb8a8cc12014-11-26 15:28:44 +000014#include "src/ia32/frames-ia32.h" // NOLINT
Steve Blocka7e24c12009-10-30 11:49:00 +000015#elif V8_TARGET_ARCH_X64
Ben Murdochb8a8cc12014-11-26 15:28:44 +000016#include "src/x64/frames-x64.h" // NOLINT
17#elif V8_TARGET_ARCH_ARM64
18#include "src/arm64/frames-arm64.h" // NOLINT
Steve Blocka7e24c12009-10-30 11:49:00 +000019#elif V8_TARGET_ARCH_ARM
Ben Murdochb8a8cc12014-11-26 15:28:44 +000020#include "src/arm/frames-arm.h" // NOLINT
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000021#elif V8_TARGET_ARCH_PPC
22#include "src/ppc/frames-ppc.h" // NOLINT
Andrei Popescu31002712010-02-23 13:46:05 +000023#elif V8_TARGET_ARCH_MIPS
Ben Murdochb8a8cc12014-11-26 15:28:44 +000024#include "src/mips/frames-mips.h" // NOLINT
25#elif V8_TARGET_ARCH_MIPS64
26#include "src/mips64/frames-mips64.h" // NOLINT
Ben Murdochda12d292016-06-02 14:46:10 +010027#elif V8_TARGET_ARCH_S390
28#include "src/s390/frames-s390.h" // NOLINT
Ben Murdochb8a8cc12014-11-26 15:28:44 +000029#elif V8_TARGET_ARCH_X87
30#include "src/x87/frames-x87.h" // NOLINT
Steve Blocka7e24c12009-10-30 11:49:00 +000031#else
32#error Unsupported target architecture.
33#endif
34
35namespace v8 {
36namespace internal {
37
38
39inline Address StackHandler::address() const {
40 return reinterpret_cast<Address>(const_cast<StackHandler*>(this));
41}
42
43
44inline StackHandler* StackHandler::next() const {
45 const int offset = StackHandlerConstants::kNextOffset;
46 return FromAddress(Memory::Address_at(address() + offset));
47}
48
49
Steve Blocka7e24c12009-10-30 11:49:00 +000050inline StackHandler* StackHandler::FromAddress(Address address) {
51 return reinterpret_cast<StackHandler*>(address);
52}
53
54
Ben Murdochb8a8cc12014-11-26 15:28:44 +000055inline StackFrame::StackFrame(StackFrameIteratorBase* iterator)
Ben Murdoch8b112d22011-06-08 16:22:53 +010056 : iterator_(iterator), isolate_(iterator_->isolate()) {
57}
58
59
Steve Blocka7e24c12009-10-30 11:49:00 +000060inline StackHandler* StackFrame::top_handler() const {
61 return iterator_->handler();
62}
63
64
Ben Murdoch3ef787d2012-04-12 10:51:47 +010065inline Code* StackFrame::LookupCode() const {
66 return GetContainingCode(isolate(), pc());
67}
68
69
Steve Block44f0eee2011-05-26 01:26:41 +010070inline Code* StackFrame::GetContainingCode(Isolate* isolate, Address pc) {
Ben Murdoch3ef787d2012-04-12 10:51:47 +010071 return isolate->inner_pointer_to_code_cache()->GetCacheEntry(pc)->code;
72}
73
74
Ben Murdochb8a8cc12014-11-26 15:28:44 +000075inline Address* StackFrame::ResolveReturnAddressLocation(Address* pc_address) {
76 if (return_address_location_resolver_ == NULL) {
77 return pc_address;
78 } else {
79 return reinterpret_cast<Address*>(
80 return_address_location_resolver_(
81 reinterpret_cast<uintptr_t>(pc_address)));
82 }
83}
84
85
86inline EntryFrame::EntryFrame(StackFrameIteratorBase* iterator)
Ben Murdoch3ef787d2012-04-12 10:51:47 +010087 : StackFrame(iterator) {
88}
89
90
Ben Murdochb8a8cc12014-11-26 15:28:44 +000091inline EntryConstructFrame::EntryConstructFrame(
92 StackFrameIteratorBase* iterator)
Ben Murdoch3ef787d2012-04-12 10:51:47 +010093 : EntryFrame(iterator) {
94}
95
96
Ben Murdochb8a8cc12014-11-26 15:28:44 +000097inline ExitFrame::ExitFrame(StackFrameIteratorBase* iterator)
Ben Murdoch3ef787d2012-04-12 10:51:47 +010098 : StackFrame(iterator) {
99}
100
101
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000102inline StandardFrame::StandardFrame(StackFrameIteratorBase* iterator)
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100103 : StackFrame(iterator) {
Steve Block44f0eee2011-05-26 01:26:41 +0100104}
105
106
Steve Blocka7e24c12009-10-30 11:49:00 +0000107inline Object* StandardFrame::GetExpression(int index) const {
108 return Memory::Object_at(GetExpressionAddress(index));
109}
110
111
112inline void StandardFrame::SetExpression(int index, Object* value) {
113 Memory::Object_at(GetExpressionAddress(index)) = value;
114}
115
116
117inline Object* StandardFrame::context() const {
118 const int offset = StandardFrameConstants::kContextOffset;
Ben Murdochda12d292016-06-02 14:46:10 +0100119 Object* maybe_result = Memory::Object_at(fp() + offset);
120 DCHECK(!maybe_result->IsSmi());
121 return maybe_result;
Steve Blocka7e24c12009-10-30 11:49:00 +0000122}
123
124
125inline Address StandardFrame::caller_fp() const {
126 return Memory::Address_at(fp() + StandardFrameConstants::kCallerFPOffset);
127}
128
129
130inline Address StandardFrame::caller_pc() const {
131 return Memory::Address_at(ComputePCAddress(fp()));
132}
133
134
135inline Address StandardFrame::ComputePCAddress(Address fp) {
136 return fp + StandardFrameConstants::kCallerPCOffset;
137}
138
139
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000140inline Address StandardFrame::ComputeConstantPoolAddress(Address fp) {
141 return fp + StandardFrameConstants::kConstantPoolOffset;
142}
143
144
Steve Blocka7e24c12009-10-30 11:49:00 +0000145inline bool StandardFrame::IsArgumentsAdaptorFrame(Address fp) {
Ben Murdochda12d292016-06-02 14:46:10 +0100146 Object* frame_type =
147 Memory::Object_at(fp + TypedFrameConstants::kFrameTypeOffset);
148 return frame_type == Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR);
Steve Blocka7e24c12009-10-30 11:49:00 +0000149}
150
151
152inline bool StandardFrame::IsConstructFrame(Address fp) {
Ben Murdochda12d292016-06-02 14:46:10 +0100153 Object* frame_type =
154 Memory::Object_at(fp + TypedFrameConstants::kFrameTypeOffset);
155 return frame_type == Smi::FromInt(StackFrame::CONSTRUCT);
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100156}
157
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000158inline JavaScriptFrame::JavaScriptFrame(StackFrameIteratorBase* iterator)
Ben Murdochda12d292016-06-02 14:46:10 +0100159 : StandardFrame(iterator) {}
Ben Murdoch592a9fc2012-03-05 11:04:45 +0000160
Ben Murdoch8b112d22011-06-08 16:22:53 +0100161Address JavaScriptFrame::GetParameterSlot(int index) const {
162 int param_count = ComputeParametersCount();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000163 DCHECK(-1 <= index && index < param_count);
Ben Murdoch8b112d22011-06-08 16:22:53 +0100164 int parameter_offset = (param_count - index - 1) * kPointerSize;
165 return caller_sp() + parameter_offset;
166}
167
168
169Object* JavaScriptFrame::GetParameter(int index) const {
170 return Memory::Object_at(GetParameterSlot(index));
171}
172
173
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000174inline Address JavaScriptFrame::GetOperandSlot(int index) const {
175 Address base = fp() + JavaScriptFrameConstants::kLocal0Offset;
176 DCHECK(IsAddressAligned(base, kPointerSize));
177 DCHECK_EQ(type(), JAVA_SCRIPT);
178 DCHECK_LT(index, ComputeOperandsCount());
179 DCHECK_LE(0, index);
180 // Operand stack grows down.
181 return base - index * kPointerSize;
182}
183
184
185inline Object* JavaScriptFrame::GetOperand(int index) const {
186 return Memory::Object_at(GetOperandSlot(index));
187}
188
189
190inline int JavaScriptFrame::ComputeOperandsCount() const {
191 Address base = fp() + JavaScriptFrameConstants::kLocal0Offset;
192 // Base points to low address of first operand and stack grows down, so add
193 // kPointerSize to get the actual stack size.
194 intptr_t stack_size_in_bytes = (base + kPointerSize) - sp();
195 DCHECK(IsAligned(stack_size_in_bytes, kPointerSize));
196 DCHECK(type() == JAVA_SCRIPT);
197 DCHECK(stack_size_in_bytes >= 0);
198 return static_cast<int>(stack_size_in_bytes >> kPointerSizeLog2);
199}
200
201
Steve Blocka7e24c12009-10-30 11:49:00 +0000202inline void JavaScriptFrame::set_receiver(Object* value) {
Ben Murdoch8b112d22011-06-08 16:22:53 +0100203 Memory::Object_at(GetParameterSlot(-1)) = value;
Steve Blocka7e24c12009-10-30 11:49:00 +0000204}
205
206
207inline bool JavaScriptFrame::has_adapted_arguments() const {
208 return IsArgumentsAdaptorFrame(caller_fp());
209}
210
211
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000212inline Object* JavaScriptFrame::function_slot_object() const {
213 const int offset = JavaScriptFrameConstants::kFunctionOffset;
214 return Memory::Object_at(fp() + offset);
215}
216
217
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000218inline StubFrame::StubFrame(StackFrameIteratorBase* iterator)
219 : StandardFrame(iterator) {
220}
221
222
223inline OptimizedFrame::OptimizedFrame(StackFrameIteratorBase* iterator)
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100224 : JavaScriptFrame(iterator) {
225}
226
227
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000228inline InterpretedFrame::InterpretedFrame(StackFrameIteratorBase* iterator)
229 : JavaScriptFrame(iterator) {}
230
231
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100232inline ArgumentsAdaptorFrame::ArgumentsAdaptorFrame(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000233 StackFrameIteratorBase* iterator) : JavaScriptFrame(iterator) {
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100234}
235
Ben Murdoch61f157c2016-09-16 13:49:30 +0100236inline BuiltinFrame::BuiltinFrame(StackFrameIteratorBase* iterator)
237 : JavaScriptFrame(iterator) {}
238
Ben Murdochda12d292016-06-02 14:46:10 +0100239inline WasmFrame::WasmFrame(StackFrameIteratorBase* iterator)
240 : StandardFrame(iterator) {}
241
242inline WasmToJsFrame::WasmToJsFrame(StackFrameIteratorBase* iterator)
243 : StubFrame(iterator) {}
244
245inline JsToWasmFrame::JsToWasmFrame(StackFrameIteratorBase* iterator)
246 : StubFrame(iterator) {}
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100247
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000248inline InternalFrame::InternalFrame(StackFrameIteratorBase* iterator)
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100249 : StandardFrame(iterator) {
250}
251
252
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000253inline StubFailureTrampolineFrame::StubFailureTrampolineFrame(
254 StackFrameIteratorBase* iterator) : StandardFrame(iterator) {
255}
256
257
258inline ConstructFrame::ConstructFrame(StackFrameIteratorBase* iterator)
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100259 : InternalFrame(iterator) {
260}
261
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000262inline JavaScriptFrameIterator::JavaScriptFrameIterator(
Ben Murdoch8b112d22011-06-08 16:22:53 +0100263 Isolate* isolate)
264 : iterator_(isolate) {
265 if (!done()) Advance();
266}
267
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000268inline JavaScriptFrameIterator::JavaScriptFrameIterator(
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100269 Isolate* isolate, ThreadLocalTop* top)
270 : iterator_(isolate, top) {
271 if (!done()) Advance();
272}
273
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000274inline JavaScriptFrame* JavaScriptFrameIterator::frame() const {
Steve Blocka7e24c12009-10-30 11:49:00 +0000275 // TODO(1233797): The frame hierarchy needs to change. It's
276 // problematic that we can't use the safe-cast operator to cast to
277 // the JavaScript frame type, because we may encounter arguments
278 // adaptor frames.
279 StackFrame* frame = iterator_.frame();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000280 DCHECK(frame->is_java_script() || frame->is_arguments_adaptor());
Steve Blocka7e24c12009-10-30 11:49:00 +0000281 return static_cast<JavaScriptFrame*>(frame);
282}
283
Ben Murdochc5610432016-08-08 18:44:38 +0100284inline StandardFrame* StackTraceFrameIterator::frame() const {
285 StackFrame* frame = iterator_.frame();
286 DCHECK(frame->is_java_script() || frame->is_arguments_adaptor() ||
287 frame->is_wasm());
288 return static_cast<StandardFrame*>(frame);
289}
290
291bool StackTraceFrameIterator::is_javascript() const {
292 return frame()->is_java_script();
293}
294
295bool StackTraceFrameIterator::is_wasm() const { return frame()->is_wasm(); }
296
297JavaScriptFrame* StackTraceFrameIterator::javascript_frame() const {
298 DCHECK(is_javascript());
299 return static_cast<JavaScriptFrame*>(frame());
300}
301
302WasmFrame* StackTraceFrameIterator::wasm_frame() const {
303 DCHECK(is_wasm());
304 return static_cast<WasmFrame*>(frame());
305}
Steve Blocka7e24c12009-10-30 11:49:00 +0000306
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000307inline StackFrame* SafeStackFrameIterator::frame() const {
308 DCHECK(!done());
309 DCHECK(frame_->is_java_script() || frame_->is_exit());
310 return frame_;
Steve Blocka7e24c12009-10-30 11:49:00 +0000311}
312
313
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000314} // namespace internal
315} // namespace v8
Steve Blocka7e24c12009-10-30 11:49:00 +0000316
317#endif // V8_FRAMES_INL_H_