2021-09-07 14:24:16 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2021 Huawei Device Co., Ltd.
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
|
2022-01-22 08:07:03 +00:00
|
|
|
// in aot project, five Frames: Interpreter Frame、Runtime Frame、Optimized Entry Frame、Optimized Frame、
|
|
|
|
// Optimized Leave Frame.
|
|
|
|
// Optimized Entry Frame: when Interpreter/RuntimeFrame call aot code, generate this kind of frame.
|
|
|
|
// following c-abi, we'll add the following field: frameType(distinguish frame)、sp(record callite sp register
|
|
|
|
// for llvm stackmap)、prev(record previous frame position).
|
|
|
|
// Optimized Leave Frame: when aot code call Interpreter/RuntimeFrame, generate this kind of frame.
|
|
|
|
// gc related context (patchid、sp、fp) is saved to frame, prev field point to previous frame.
|
|
|
|
// Optimized Frame: when aot code call aot code, generate this kind of frame.
|
|
|
|
// following c-abi, we'll add the following field: frameType(distinguish frame)、sp(record callite sp register
|
|
|
|
// for llvm stackmap).
|
2021-10-10 02:44:14 +00:00
|
|
|
|
|
|
|
// Frame Layout
|
|
|
|
// Interpreter Frame(alias **iframe** ) Layout as follow:
|
|
|
|
// ```
|
2021-12-17 09:18:10 +00:00
|
|
|
// +----------------------------------+-------------------+
|
|
|
|
// | argv[n-1] | ^
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | ...... | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | thisArg [maybe not exist] | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | newTarget [maybe not exist] | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | callTarget [deleted] | |
|
|
|
|
// |----------------------------------| |
|
|
|
|
// | ...... | |
|
|
|
|
// |----------------------------------| |
|
|
|
|
// | Vregs [not exist in native] | |
|
|
|
|
// +----------------------------------+--------+ interpreter frame
|
|
|
|
// | base.frameType | ^ |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | base.prev(pre stack pointer) | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | numActualArgs [deleted] | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | env | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | acc | | |
|
2021-12-31 07:51:09 +00:00
|
|
|
// |----------------------------------|InterpretedFrame |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | profileTypeInfo | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | constantpool | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | method [changed to function] | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | sp(current stack point) | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | pc(bytecode addr) | v v
|
2021-10-10 02:44:14 +00:00
|
|
|
// +----------------------------------+--------+----------+
|
2022-01-22 08:07:03 +00:00
|
|
|
|
|
|
|
// Optimized Leave Frame(alias OptLeaveFrame) layout
|
|
|
|
// +--------------------------+
|
|
|
|
// | patchID | ^
|
|
|
|
// |- - - - - - - - - | |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | callsiteFp | Fixed
|
2022-01-22 08:07:03 +00:00
|
|
|
// |- - - - - - - - - | OptLeaveFrame
|
2022-01-24 07:36:24 +00:00
|
|
|
// | callsiteSp | |
|
2022-01-22 08:07:03 +00:00
|
|
|
// |- - - - - - - - - | |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | prevFp | |
|
2022-01-22 08:07:03 +00:00
|
|
|
// |- - - - - - - - - | |
|
|
|
|
// | frameType | v
|
|
|
|
// +--------------------------+
|
|
|
|
|
|
|
|
// Optimized Frame(alias OptimizedFrame) layout
|
|
|
|
// +--------------------------+
|
|
|
|
// | calleesave registers | ^
|
|
|
|
// |- - - - - - - - - | |
|
|
|
|
// | returnaddress | Fixed
|
|
|
|
// |- - - - - - - - - | OptimizedFrame
|
|
|
|
// | fp | |
|
|
|
|
// |- - - - - - - - - | |
|
|
|
|
// | frameType | |
|
|
|
|
// |- - - - - - - - - | |
|
|
|
|
// | sp | v
|
|
|
|
// +--------------------------+
|
|
|
|
|
|
|
|
// Optimized Entry Frame(alias OptimizedEntryFrame) layout
|
|
|
|
// +--------------------------+
|
|
|
|
// | calleesave registers | ^
|
|
|
|
// |- - - - - - - - - | |
|
|
|
|
// | returnaddress | Fixed
|
|
|
|
// |- - - - - - - - - | OptimizedEntryFrame
|
|
|
|
// | fp | |
|
|
|
|
// |- - - - - - - - - | |
|
|
|
|
// | frameType | |
|
|
|
|
// |- - - - - - - - - | |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | callsiteSp | v
|
2022-01-22 08:07:03 +00:00
|
|
|
// |- - - - - - - - - | |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | prevManagedFrameFp | |
|
2022-01-22 08:07:03 +00:00
|
|
|
// +--------------------------+
|
|
|
|
|
2021-10-10 02:44:14 +00:00
|
|
|
// ```
|
|
|
|
// address space grow from high address to low address.we add new field **FrameType** ,
|
|
|
|
// the field's value is INTERPRETER_FRAME(represent interpreter frame).
|
|
|
|
// **currentsp** is pointer to callTarget field address, sp field 's value is **currentsp** ,
|
|
|
|
// pre field pointer pre stack frame point. fill JSthread's sp field with iframe sp field
|
|
|
|
// by calling JSThread->SetCurrentSPFrame and save pre Frame address to iframe pre field.
|
|
|
|
|
|
|
|
// For Example:
|
|
|
|
// ```
|
2022-01-22 08:07:03 +00:00
|
|
|
// call call
|
|
|
|
// foo -----------------> bar ----------------------->baz ---------------------> rtfunc
|
|
|
|
// (interpret frame) (OptimizedEntryFrame) (OptimizedFrame) (OptLeaveFrame + Runtime Frame)
|
2021-10-10 02:44:14 +00:00
|
|
|
// ```
|
|
|
|
|
|
|
|
// Frame Layout as follow:
|
|
|
|
// ```
|
2021-12-17 09:18:10 +00:00
|
|
|
// +----------------------------------+-------------------+
|
|
|
|
// | argv[n-1] | ^
|
|
|
|
// |----------------------------------| |
|
|
|
|
// | ...... | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | thisArg [maybe not exist] | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | newTarget [maybe not exist] | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | ...... | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | Vregs | |
|
|
|
|
// +----------------------------------+--------+ foo's frame
|
|
|
|
// | base.frameType | ^ |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | base.prev(pre stack pointer) | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | env | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | acc | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-31 07:51:09 +00:00
|
|
|
// | profileTypeInfo |InterpretedFrame |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | constantpool | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | function | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | sp(current stack point) | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |----------------------------------| | |
|
2021-12-17 09:18:10 +00:00
|
|
|
// | pc(bytecode addr) | v v
|
2021-10-10 02:44:14 +00:00
|
|
|
// +----------------------------------+--------+----------+
|
|
|
|
// | ............. |
|
|
|
|
// +--------------------------+---------------------------+
|
2022-01-22 08:07:03 +00:00
|
|
|
// +--------------------------+---------------------------+
|
|
|
|
// | calleesave registers | ^ ^
|
|
|
|
// |- - - - - - - - - | | |
|
|
|
|
// | returnaddress | Fixed |
|
|
|
|
// |- - - - - - - - - | OptimizedEntryFrame |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | prevFp | | |
|
2022-01-22 08:07:03 +00:00
|
|
|
// |- - - - - - - - - | | |
|
|
|
|
// | frameType | | bar's frame
|
|
|
|
// |- - - - - - - - - | | |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | callsiteSp | v |
|
2022-01-22 08:07:03 +00:00
|
|
|
// |- - - - - - - - - | | |
|
2022-01-24 07:36:24 +00:00
|
|
|
// |prevManagedFrameFp | | V
|
2022-01-22 08:07:03 +00:00
|
|
|
// +--------------------------+---------------------------+
|
|
|
|
// | ............. |
|
|
|
|
// +--------------------------+---------------------------+
|
|
|
|
// +--------------------------+---------------------------+
|
|
|
|
// | calleesave registers | ^ ^
|
|
|
|
// |- - - - - - - - - | | |
|
|
|
|
// | returnaddress | Fixed |
|
|
|
|
// |- - - - - - - - - | OptimizedFrame |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | prevFp | | |
|
2022-01-22 08:07:03 +00:00
|
|
|
// |- - - - - - - - - | | baz's frame Header
|
|
|
|
// | frameType | | |
|
|
|
|
// |- - - - - - - - - | | |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | callsitesp | v V
|
2022-01-22 08:07:03 +00:00
|
|
|
// +--------------------------+---------------------------+
|
|
|
|
// | ............. |
|
|
|
|
// +--------------------------+---------------------------+
|
2021-12-31 07:51:09 +00:00
|
|
|
// | patchID | ^ ^
|
2021-10-10 02:44:14 +00:00
|
|
|
// |- - - - - - - - - | | |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | callsiteFp | Fixed |
|
2021-12-31 07:51:09 +00:00
|
|
|
// |- - - - - - - - - | OptLeaveFrame |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | callsitesp | | OptLeaveFrame
|
2021-10-10 02:44:14 +00:00
|
|
|
// |- - - - - - - - - | | |
|
2022-01-24 07:36:24 +00:00
|
|
|
// | prevFp | | |
|
2021-10-10 02:44:14 +00:00
|
|
|
// |- - - - - - - - - | | |
|
2021-12-31 07:51:09 +00:00
|
|
|
// | frameType | v |
|
|
|
|
// +--------------------------+---------------------------+
|
2021-10-10 02:44:14 +00:00
|
|
|
// | ............. |
|
|
|
|
// +--------------------------+---------------------------+
|
|
|
|
// | |
|
|
|
|
// | rtfunc's Frame |
|
|
|
|
// | |
|
|
|
|
// +------------------------------------------------------+
|
|
|
|
// ```
|
|
|
|
// Iterator:
|
2022-01-22 08:07:03 +00:00
|
|
|
// rtfunc get OptLeaveFrame by calling GetCurrentSPFrame.
|
|
|
|
// get baz's Frame by OptLeaveFrame.prev field.
|
|
|
|
// get bar's Frame by baz's frame fp field
|
|
|
|
// get foo's Frame by bar's Frame prev field
|
2021-10-10 02:44:14 +00:00
|
|
|
|
2021-09-07 14:24:16 +00:00
|
|
|
#ifndef ECMASCRIPT_FRAMES_H
|
|
|
|
#define ECMASCRIPT_FRAMES_H
|
|
|
|
|
2021-10-28 03:41:44 +00:00
|
|
|
#include "ecmascript/js_tagged_value.h"
|
|
|
|
|
2021-09-07 14:24:16 +00:00
|
|
|
namespace panda::ecmascript {
|
2021-10-09 10:49:19 +00:00
|
|
|
class JSThread;
|
2021-12-31 07:51:09 +00:00
|
|
|
enum class FrameType: uint64_t {
|
2021-09-07 14:24:16 +00:00
|
|
|
OPTIMIZED_FRAME = 0,
|
|
|
|
OPTIMIZED_ENTRY_FRAME = 1,
|
|
|
|
INTERPRETER_FRAME = 2,
|
2021-12-31 07:51:09 +00:00
|
|
|
OPTIMIZED_LEAVE_FRAME = 3,
|
2021-09-07 14:24:16 +00:00
|
|
|
};
|
|
|
|
|
2022-01-13 08:26:00 +00:00
|
|
|
class FrameConstants {
|
2021-09-07 14:24:16 +00:00
|
|
|
public:
|
2022-01-13 08:26:00 +00:00
|
|
|
#ifdef PANDA_TARGET_AMD64
|
|
|
|
static constexpr int SP_DWARF_REG_NUM = 7;
|
|
|
|
static constexpr int FP_DWARF_REG_NUM = 6;
|
2022-01-24 07:36:24 +00:00
|
|
|
static constexpr int CALLSITE_SP_TO_FP_DELTA = -2;
|
|
|
|
static constexpr int INTERPER_FRAME_FP_TO_FP_DELTA = -3;
|
2022-01-13 08:26:00 +00:00
|
|
|
#else
|
|
|
|
#ifdef PANDA_TARGET_ARM64
|
|
|
|
static constexpr int SP_DWARF_REG_NUM = 31; /* x31 */
|
|
|
|
static constexpr int FP_DWARF_REG_NUM = 29; /* x29 */
|
2022-01-24 07:36:24 +00:00
|
|
|
static constexpr int CALLSITE_SP_TO_FP_DELTA = -2;
|
|
|
|
static constexpr int INTERPER_FRAME_FP_TO_FP_DELTA = -3;
|
2022-01-13 08:26:00 +00:00
|
|
|
#else
|
|
|
|
#ifdef PANDA_TARGET_ARM32
|
|
|
|
static constexpr int SP_DWARF_REG_NUM = 13;
|
|
|
|
static constexpr int FP_DWARF_REG_NUM = 11;
|
2022-01-24 07:36:24 +00:00
|
|
|
static constexpr int CALLSITE_SP_TO_FP_DELTA = 0;
|
|
|
|
static constexpr int INTERPER_FRAME_FP_TO_FP_DELTA = 0;
|
2022-01-13 08:26:00 +00:00
|
|
|
#else
|
|
|
|
static constexpr int SP_DWARF_REG_NUM = 0;
|
|
|
|
static constexpr int FP_DWARF_REG_NUM = 0;
|
2022-01-24 07:36:24 +00:00
|
|
|
static constexpr int CALLSITE_SP_TO_FP_DELTA = 0;
|
|
|
|
static constexpr int INTERPER_FRAME_FP_TO_FP_DELTA = 0;
|
2022-01-13 08:26:00 +00:00
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
static constexpr int AARCH64_SLOT_SIZE = sizeof(uint64_t);
|
|
|
|
static constexpr int AMD64_SLOT_SIZE = sizeof(uint64_t);
|
|
|
|
static constexpr int ARM32_SLOT_SIZE = sizeof(uint32_t);
|
2021-09-07 14:24:16 +00:00
|
|
|
};
|
|
|
|
|
2022-01-13 08:26:00 +00:00
|
|
|
class OptimizedFrameBase {
|
2021-10-09 10:49:19 +00:00
|
|
|
public:
|
2022-01-13 08:26:00 +00:00
|
|
|
OptimizedFrameBase() = default;
|
|
|
|
~OptimizedFrameBase() = default;
|
2022-01-24 07:36:24 +00:00
|
|
|
static constexpr int64_t GetCallsiteSpToFpDelta()
|
2022-01-22 08:07:03 +00:00
|
|
|
{
|
2022-01-24 07:36:24 +00:00
|
|
|
return MEMBER_OFFSET(OptimizedFrameBase, callsiteSp) - MEMBER_OFFSET(OptimizedFrameBase, prevFp);
|
2022-01-22 08:07:03 +00:00
|
|
|
}
|
2022-01-24 07:36:24 +00:00
|
|
|
uintptr_t callsiteSp;
|
2022-01-13 08:26:00 +00:00
|
|
|
FrameType type;
|
2022-01-24 07:36:24 +00:00
|
|
|
JSTaggedType *prevFp; // fp register
|
2022-01-13 08:26:00 +00:00
|
|
|
static OptimizedFrameBase* GetFrameFromSp(JSTaggedType *sp)
|
|
|
|
{
|
|
|
|
return reinterpret_cast<OptimizedFrameBase *>(reinterpret_cast<uintptr_t>(sp)
|
2022-01-24 07:36:24 +00:00
|
|
|
- MEMBER_OFFSET(OptimizedFrameBase, prevFp));
|
2022-01-13 08:26:00 +00:00
|
|
|
}
|
2021-10-09 10:49:19 +00:00
|
|
|
};
|
|
|
|
|
2021-12-31 07:51:09 +00:00
|
|
|
class OptimizedEntryFrame {
|
2021-09-07 14:24:16 +00:00
|
|
|
public:
|
2021-12-31 07:51:09 +00:00
|
|
|
OptimizedEntryFrame() = default;
|
|
|
|
~OptimizedEntryFrame() = default;
|
2022-01-13 08:26:00 +00:00
|
|
|
JSTaggedType *prevInterpretedFrameFp;
|
|
|
|
OptimizedFrameBase base;
|
2022-01-24 07:36:24 +00:00
|
|
|
static constexpr int64_t GetCallsiteSpToFpDelta()
|
|
|
|
{
|
|
|
|
return MEMBER_OFFSET(OptimizedEntryFrame, base.callsiteSp) - MEMBER_OFFSET(OptimizedEntryFrame, base.prevFp);
|
|
|
|
}
|
|
|
|
// INTERPER_FRAME_FP_TO_FP_DELTA
|
|
|
|
static constexpr int64_t GetInterpreterFrameFpToFpDelta()
|
2022-01-22 08:07:03 +00:00
|
|
|
{
|
2022-01-24 09:34:20 +00:00
|
|
|
return MEMBER_OFFSET(OptimizedEntryFrame, prevInterpretedFrameFp) -
|
|
|
|
MEMBER_OFFSET(OptimizedEntryFrame, base.prevFp);
|
2022-01-22 08:07:03 +00:00
|
|
|
}
|
2021-12-31 08:32:32 +00:00
|
|
|
static OptimizedEntryFrame* GetFrameFromSp(JSTaggedType *sp)
|
2021-12-31 07:51:09 +00:00
|
|
|
{
|
|
|
|
return reinterpret_cast<OptimizedEntryFrame *>(reinterpret_cast<uintptr_t>(sp) -
|
2022-01-24 07:36:24 +00:00
|
|
|
MEMBER_OFFSET(OptimizedEntryFrame, base.prevFp));
|
2021-12-31 07:51:09 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2022-01-13 08:26:00 +00:00
|
|
|
class InterpretedFrameBase {
|
|
|
|
public:
|
|
|
|
InterpretedFrameBase() = default;
|
|
|
|
~InterpretedFrameBase() = default;
|
|
|
|
JSTaggedType *prev; // for llvm :c-fp ; for interrupt: thread-fp for gc
|
|
|
|
FrameType type;
|
|
|
|
};
|
|
|
|
|
2021-12-31 07:51:09 +00:00
|
|
|
// align with 8
|
|
|
|
// NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init)
|
|
|
|
struct InterpretedFrame {
|
|
|
|
const uint8_t *pc;
|
|
|
|
JSTaggedType *sp;
|
|
|
|
// aligned with 8 bits
|
|
|
|
alignas(sizeof(uint64_t)) JSTaggedValue constpool;
|
|
|
|
JSTaggedValue function;
|
|
|
|
JSTaggedValue profileTypeInfo;
|
|
|
|
JSTaggedValue acc;
|
|
|
|
JSTaggedValue env;
|
|
|
|
InterpretedFrameBase base;
|
2021-12-31 14:41:51 +00:00
|
|
|
static InterpretedFrame* GetFrameFromSp(JSTaggedType *sp)
|
2021-12-31 07:51:09 +00:00
|
|
|
{
|
|
|
|
return reinterpret_cast<InterpretedFrame *>(sp) - 1;
|
|
|
|
}
|
2022-01-13 08:26:00 +00:00
|
|
|
static constexpr uint32_t kSizeOn64Platform =
|
|
|
|
2 * sizeof(int64_t) + 5 * sizeof(JSTaggedValue) + 2 * sizeof(uint64_t);
|
|
|
|
static constexpr uint32_t kSizeOn32Platform =
|
|
|
|
2 * sizeof(int32_t) + 5 * sizeof(JSTaggedValue) + 2 * sizeof(uint64_t);
|
2021-12-31 07:51:09 +00:00
|
|
|
};
|
2022-01-13 08:26:00 +00:00
|
|
|
static_assert(sizeof(InterpretedFrame) % sizeof(uint64_t) == 0u);
|
|
|
|
|
2021-12-31 07:51:09 +00:00
|
|
|
struct OptLeaveFrame {
|
2022-01-13 08:26:00 +00:00
|
|
|
FrameType type;
|
2022-01-22 08:07:03 +00:00
|
|
|
JSTaggedType *prevFp; // set interpret frame cursp here
|
2022-01-24 07:36:24 +00:00
|
|
|
uintptr_t callsiteSp;
|
|
|
|
uintptr_t callsiteFp;
|
2021-12-31 07:51:09 +00:00
|
|
|
uint64_t patchId;
|
2021-12-31 08:32:32 +00:00
|
|
|
static OptLeaveFrame* GetFrameFromSp(JSTaggedType *sp)
|
2021-10-28 12:59:19 +00:00
|
|
|
{
|
2021-12-31 07:51:09 +00:00
|
|
|
return reinterpret_cast<OptLeaveFrame *>(reinterpret_cast<uintptr_t>(sp) -
|
2022-01-13 08:26:00 +00:00
|
|
|
MEMBER_OFFSET(OptLeaveFrame, prevFp));
|
2021-10-28 12:59:19 +00:00
|
|
|
}
|
2022-01-13 08:26:00 +00:00
|
|
|
static constexpr uint32_t kSizeOn64Platform = sizeof(FrameType) + 4 * sizeof(uint64_t);
|
|
|
|
static constexpr uint32_t kSizeOn32Platform = sizeof(FrameType) + 3 * sizeof(int32_t) + sizeof(uint64_t);
|
|
|
|
static constexpr uint32_t kPrevFpOffset = sizeof(FrameType);
|
2021-09-07 14:24:16 +00:00
|
|
|
};
|
|
|
|
|
2022-01-13 08:26:00 +00:00
|
|
|
#ifdef PANDA_TARGET_64
|
|
|
|
static_assert(InterpretedFrame::kSizeOn64Platform == sizeof(InterpretedFrame));
|
2022-01-24 09:34:20 +00:00
|
|
|
static_assert(OptimizedFrameBase::GetCallsiteSpToFpDelta() ==
|
|
|
|
FrameConstants::CALLSITE_SP_TO_FP_DELTA * sizeof(uintptr_t));
|
|
|
|
static_assert(OptimizedEntryFrame::GetCallsiteSpToFpDelta() ==
|
|
|
|
FrameConstants::CALLSITE_SP_TO_FP_DELTA * sizeof(uintptr_t));
|
|
|
|
static_assert(OptimizedEntryFrame::GetInterpreterFrameFpToFpDelta() ==
|
|
|
|
FrameConstants::INTERPER_FRAME_FP_TO_FP_DELTA * sizeof(uintptr_t));
|
2021-12-17 09:18:10 +00:00
|
|
|
#endif
|
2022-01-13 08:26:00 +00:00
|
|
|
#ifdef PANDA_TARGET_32
|
|
|
|
static_assert(InterpretedFrame::kSizeOn32Platform == sizeof(InterpretedFrame));
|
2021-12-17 09:18:10 +00:00
|
|
|
#endif
|
2021-09-07 14:24:16 +00:00
|
|
|
} // namespace panda::ecmascript
|
2021-10-28 03:41:44 +00:00
|
|
|
#endif // ECMASCRIPT_FRAMES_H
|