blob: 5ecbd4567e85086801ca3b2bc02984956a556de8 [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 Object* JavaScriptFrame::receiver() const {
Ben Murdoch8b112d22011-06-08 16:22:53 +0100203 return GetParameter(-1);
Steve Blocka7e24c12009-10-30 11:49:00 +0000204}
205
206
207inline void JavaScriptFrame::set_receiver(Object* value) {
Ben Murdoch8b112d22011-06-08 16:22:53 +0100208 Memory::Object_at(GetParameterSlot(-1)) = value;
Steve Blocka7e24c12009-10-30 11:49:00 +0000209}
210
211
212inline bool JavaScriptFrame::has_adapted_arguments() const {
213 return IsArgumentsAdaptorFrame(caller_fp());
214}
215
216
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000217inline JSFunction* JavaScriptFrame::function() const {
218 return JSFunction::cast(function_slot_object());
Steve Blocka7e24c12009-10-30 11:49:00 +0000219}
220
221
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000222inline Object* JavaScriptFrame::function_slot_object() const {
223 const int offset = JavaScriptFrameConstants::kFunctionOffset;
224 return Memory::Object_at(fp() + offset);
225}
226
227
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000228inline StubFrame::StubFrame(StackFrameIteratorBase* iterator)
229 : StandardFrame(iterator) {
230}
231
232
233inline OptimizedFrame::OptimizedFrame(StackFrameIteratorBase* iterator)
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100234 : JavaScriptFrame(iterator) {
235}
236
237
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000238inline InterpretedFrame::InterpretedFrame(StackFrameIteratorBase* iterator)
239 : JavaScriptFrame(iterator) {}
240
241
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100242inline ArgumentsAdaptorFrame::ArgumentsAdaptorFrame(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000243 StackFrameIteratorBase* iterator) : JavaScriptFrame(iterator) {
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100244}
245
Ben Murdochda12d292016-06-02 14:46:10 +0100246inline WasmFrame::WasmFrame(StackFrameIteratorBase* iterator)
247 : StandardFrame(iterator) {}
248
249inline WasmToJsFrame::WasmToJsFrame(StackFrameIteratorBase* iterator)
250 : StubFrame(iterator) {}
251
252inline JsToWasmFrame::JsToWasmFrame(StackFrameIteratorBase* iterator)
253 : StubFrame(iterator) {}
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100254
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000255inline InternalFrame::InternalFrame(StackFrameIteratorBase* iterator)
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100256 : StandardFrame(iterator) {
257}
258
259
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000260inline StubFailureTrampolineFrame::StubFailureTrampolineFrame(
261 StackFrameIteratorBase* iterator) : StandardFrame(iterator) {
262}
263
264
265inline ConstructFrame::ConstructFrame(StackFrameIteratorBase* iterator)
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100266 : InternalFrame(iterator) {
267}
268
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000269inline JavaScriptFrameIterator::JavaScriptFrameIterator(
Ben Murdoch8b112d22011-06-08 16:22:53 +0100270 Isolate* isolate)
271 : iterator_(isolate) {
272 if (!done()) Advance();
273}
274
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000275inline JavaScriptFrameIterator::JavaScriptFrameIterator(
Ben Murdoch3ef787d2012-04-12 10:51:47 +0100276 Isolate* isolate, ThreadLocalTop* top)
277 : iterator_(isolate, top) {
278 if (!done()) Advance();
279}
280
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000281inline JavaScriptFrame* JavaScriptFrameIterator::frame() const {
Steve Blocka7e24c12009-10-30 11:49:00 +0000282 // TODO(1233797): The frame hierarchy needs to change. It's
283 // problematic that we can't use the safe-cast operator to cast to
284 // the JavaScript frame type, because we may encounter arguments
285 // adaptor frames.
286 StackFrame* frame = iterator_.frame();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000287 DCHECK(frame->is_java_script() || frame->is_arguments_adaptor());
Steve Blocka7e24c12009-10-30 11:49:00 +0000288 return static_cast<JavaScriptFrame*>(frame);
289}
290
291
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000292inline StackFrame* SafeStackFrameIterator::frame() const {
293 DCHECK(!done());
294 DCHECK(frame_->is_java_script() || frame_->is_exit());
295 return frame_;
Steve Blocka7e24c12009-10-30 11:49:00 +0000296}
297
298
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299} // namespace internal
300} // namespace v8
Steve Blocka7e24c12009-10-30 11:49:00 +0000301
302#endif // V8_FRAMES_INL_H_