|  | // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | #ifndef RUNTIME_VM_STACK_FRAME_X64_H_ | 
|  | #define RUNTIME_VM_STACK_FRAME_X64_H_ | 
|  |  | 
|  | #if !defined(RUNTIME_VM_STACK_FRAME_H_) | 
|  | #error Do not include stack_frame_x64.h directly; use stack_frame.h instead. | 
|  | #endif | 
|  |  | 
|  | #include "vm/constants.h" | 
|  |  | 
|  | namespace dart { | 
|  |  | 
|  | /* X64 Dart Frame Layout | 
|  |  | 
|  | |                    | <- TOS | 
|  | Callee frame   | ...                | | 
|  | | saved PP           | | 
|  | | code object        | | 
|  | | saved RBP          |    (RBP of current frame) | 
|  | | saved PC           |    (PC of current frame) | 
|  | +--------------------+ | 
|  | Current frame  | ...               T| <- RSP of current frame | 
|  | | first local       T| | 
|  | | caller's PP       T| | 
|  | | code object       T|    (current frame's code object) | 
|  | | caller's RBP       | <- RBP of current frame | 
|  | | caller's ret addr  |    (PC of caller frame) | 
|  | +--------------------+ | 
|  | Caller frame   | last parameter     | <- RSP of caller frame | 
|  | |  ...               | | 
|  |  | 
|  | T against a slot indicates it needs to be traversed during GC. | 
|  | */ | 
|  |  | 
|  | static constexpr int kDartFrameFixedSize = 4;  // PC marker, RBP, PP, PC. | 
|  | static constexpr int kSavedPcSlotFromSp = -1; | 
|  |  | 
|  | static constexpr int kFirstObjectSlotFromFp = | 
|  | -1;  // Used by GC to traverse stack. | 
|  | static constexpr int kLastFixedObjectSlotFromFp = -2; | 
|  |  | 
|  | static constexpr int kFirstLocalSlotFromFp = -3; | 
|  | static constexpr int kSavedCallerPpSlotFromFp = -2; | 
|  | static constexpr int kPcMarkerSlotFromFp = -1; | 
|  | static constexpr int kSavedCallerFpSlotFromFp = 0; | 
|  | static constexpr int kSavedCallerPcSlotFromFp = 1; | 
|  |  | 
|  | static constexpr int kParamEndSlotFromFp = 1;  // One slot past last parameter. | 
|  | static constexpr int kCallerSpSlotFromFp = 2; | 
|  | static constexpr int kLastParamSlotFromEntrySp = 1;  // Skip return address. | 
|  |  | 
|  | // Entry and exit frame layout. | 
|  | #if defined(DART_TARGET_OS_WINDOWS) | 
|  | static constexpr int kExitLinkSlotFromEntryFp = -33; | 
|  | #else | 
|  | static constexpr int kExitLinkSlotFromEntryFp = -11; | 
|  | #endif  // defined(DART_TARGET_OS_WINDOWS) | 
|  |  | 
|  | // For FFI native -> Dart callbacks, the number of stack slots between arguments | 
|  | // passed on stack and arguments saved in callback prologue. 2 = return address | 
|  | // (1) + saved frame pointer (1). Also add slots for the shadow space, if | 
|  | // present. | 
|  | // | 
|  | // If NativeCallbackTrampolines::Enabled(), then | 
|  | // kNativeCallbackTrampolineStackDelta must be added as well. | 
|  | constexpr intptr_t kCallbackSlotsBeforeSavedArguments = | 
|  | 2 + CallingConventions::kShadowSpaceBytes / kWordSize; | 
|  |  | 
|  | // For FFI calls passing in TypedData, we save it on the stack before entering | 
|  | // a Dart frame. This denotes how to get to the backed up typed data. | 
|  | static constexpr int kFfiCallerTypedDataSlotFromFp = kCallerSpSlotFromFp; | 
|  |  | 
|  | }  // namespace dart | 
|  |  | 
|  | #endif  // RUNTIME_VM_STACK_FRAME_X64_H_ |