7a51f8c843
port 9dcd0857d6
(r34571)
original commit message:
Before this CL, various code stubs used different techniques
for marking their frames to enable stack-crawling and other
access to data in the frame. All of them were based on a abuse
of the "standard" frame representation, e.g. storing the a
context pointer immediately below the frame's fp, and a
function pointer after that. Although functional, this approach
tends to make stubs and builtins do an awkward, unnecessary
dance to appear like standard frames, even if they have
nothing to do with JavaScript execution.
This CL attempts to improve this by:
* Ensuring that there are only two fundamentally different
types of frames, a "standard" frame and a "typed" frame.
Standard frames, as before, contain both a context and
function pointer. Typed frames contain only a minimum
of a smi marker in the position immediately below the fp
where the context is in standard frames.
* Only interpreted, full codegen, and optimized Crankshaft and
TurboFan JavaScript frames use the "standard" format. All
other frames use the type frame format with an explicit
marker.
* Typed frames can contain one or more values below the
type marker. There is new magic macro machinery in
frames.h that simplifies defining the offsets of these fields
in typed frames.
* A new flag in the CallDescriptor enables specifying whether
a frame is a standard frame or a typed frame. Secondary
register location spilling is now only enabled for standard
frames.
* A zillion places in the code have been updated to deal with
the fact that most code stubs and internal frames use the
typed frame format. This includes changes in the
deoptimizer, debugger, and liveedit.
* StandardFrameConstants::kMarkerOffset is deprecated,
(CommonFrameConstants::kContextOrFrameTypeOffset
and StandardFrameConstants::kFrameOffset are now used
in its stead).
BUG=
Review URL: https://codereview.chromium.org/1774353002
Cr-Commit-Position: refs/heads/master@{#34648}
79 lines
2.3 KiB
C++
79 lines
2.3 KiB
C++
// Copyright 2012 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef V8_X87_FRAMES_X87_H_
|
|
#define V8_X87_FRAMES_X87_H_
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
|
|
|
|
// Register lists
|
|
// Note that the bit values must match those used in actual instruction encoding
|
|
const int kNumRegs = 8;
|
|
|
|
|
|
// Caller-saved registers
|
|
const RegList kJSCallerSaved =
|
|
1 << 0 | // eax
|
|
1 << 1 | // ecx
|
|
1 << 2 | // edx
|
|
1 << 3 | // ebx - used as a caller-saved register in JavaScript code
|
|
1 << 7; // edi - callee function
|
|
|
|
const int kNumJSCallerSaved = 5;
|
|
|
|
|
|
// Number of registers for which space is reserved in safepoints.
|
|
const int kNumSafepointRegisters = 8;
|
|
|
|
// ----------------------------------------------------
|
|
|
|
|
|
class EntryFrameConstants : public AllStatic {
|
|
public:
|
|
static const int kCallerFPOffset = -6 * kPointerSize;
|
|
|
|
static const int kNewTargetArgOffset = +2 * kPointerSize;
|
|
static const int kFunctionArgOffset = +3 * kPointerSize;
|
|
static const int kReceiverArgOffset = +4 * kPointerSize;
|
|
static const int kArgcOffset = +5 * kPointerSize;
|
|
static const int kArgvOffset = +6 * kPointerSize;
|
|
};
|
|
|
|
class ExitFrameConstants : public TypedFrameConstants {
|
|
public:
|
|
static const int kSPOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0);
|
|
static const int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1);
|
|
DEFINE_TYPED_FRAME_SIZES(2);
|
|
|
|
static const int kCallerFPOffset = 0 * kPointerSize;
|
|
static const int kCallerPCOffset = +1 * kPointerSize;
|
|
|
|
// FP-relative displacement of the caller's SP. It points just
|
|
// below the saved PC.
|
|
static const int kCallerSPDisplacement = +2 * kPointerSize;
|
|
|
|
static const int kConstantPoolOffset = 0; // Not used
|
|
};
|
|
|
|
|
|
class JavaScriptFrameConstants : public AllStatic {
|
|
public:
|
|
// FP-relative.
|
|
static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
|
|
static const int kLastParameterOffset = +2 * kPointerSize;
|
|
static const int kFunctionOffset = StandardFrameConstants::kFunctionOffset;
|
|
|
|
// Caller SP-relative.
|
|
static const int kParam0Offset = -2 * kPointerSize;
|
|
static const int kReceiverOffset = -1 * kPointerSize;
|
|
};
|
|
|
|
|
|
} // namespace internal
|
|
} // namespace v8
|
|
|
|
#endif // V8_X87_FRAMES_X87_H_
|