Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Unified Diff: src/arm64/macro-assembler-arm64.cc

Issue 1696043002: [runtime] Unify and simplify how frames are marked (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix merge problems Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/arm64/macro-assembler-arm64.cc
diff --git a/src/arm64/macro-assembler-arm64.cc b/src/arm64/macro-assembler-arm64.cc
index c4a3a998506ccfebb46a1dc8ce08fb4dcbb0c088..530182cdb7ce8707f0a28aec70de1a6dd9be19b5 100644
--- a/src/arm64/macro-assembler-arm64.cc
+++ b/src/arm64/macro-assembler-arm64.cc
@@ -2711,18 +2711,17 @@ void MacroAssembler::TruncateHeapNumberToI(Register result,
Bind(&done);
}
-
-void MacroAssembler::StubPrologue() {
+void MacroAssembler::StubPrologue(StackFrame::Type type, int frame_slots) {
UseScratchRegisterScope temps(this);
+ frame_slots -= TypedFrameConstants::kFixedSlotCountAboveFp;
Register temp = temps.AcquireX();
- __ Mov(temp, Smi::FromInt(StackFrame::STUB));
- // Compiled stubs don't age, and so they don't need the predictable code
- // ageing sequence.
- __ Push(lr, fp, cp, temp);
- __ Add(fp, StackPointer(), StandardFrameConstants::kFixedFrameSizeFromFp);
+ Mov(temp, Smi::FromInt(type));
+ Push(lr, fp);
+ Mov(fp, StackPointer());
+ Claim(frame_slots);
+ str(temp, MemOperand(fp, TypedFrameConstants::kFrameTypeOffset));
}
-
void MacroAssembler::Prologue(bool code_pre_aging) {
if (code_pre_aging) {
Code* stub = Code::GetPreAgedCodeAgeStub(isolate());
@@ -2754,18 +2753,26 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) {
Register type_reg = temps.AcquireX();
Register code_reg = temps.AcquireX();
- Push(lr, fp, cp);
- Mov(type_reg, Smi::FromInt(type));
- Mov(code_reg, Operand(CodeObject()));
- Push(type_reg, code_reg);
- // jssp[4] : lr
- // jssp[3] : fp
- // jssp[2] : cp
- // jssp[1] : type
- // jssp[0] : code object
-
- // Adjust FP to point to saved FP.
- Add(fp, jssp, StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize);
+ if (type == StackFrame::INTERNAL) {
+ Mov(type_reg, Smi::FromInt(type));
+ Push(lr, fp);
+ Push(type_reg);
+ Mov(code_reg, Operand(CodeObject()));
+ Push(code_reg);
+ Add(fp, jssp, InternalFrameConstants::kFixedFrameSizeFromFp);
+ // jssp[4] : lr
+ // jssp[3] : fp
+ // jssp[1] : type
+ // jssp[0] : [code object]
+ } else {
+ Mov(type_reg, Smi::FromInt(type));
+ Push(lr, fp);
+ Push(type_reg);
+ Add(fp, jssp, TypedFrameConstants::kFixedFrameSizeFromFp);
+ // jssp[2] : lr
+ // jssp[1] : fp
+ // jssp[0] : type
+ }
}
@@ -2806,20 +2813,23 @@ void MacroAssembler::EnterExitFrame(bool save_doubles,
DCHECK(jssp.Is(StackPointer()));
// Set up the new stack frame.
- Mov(scratch, Operand(CodeObject()));
Push(lr, fp);
Mov(fp, StackPointer());
- Push(xzr, scratch);
+ Mov(scratch, Smi::FromInt(StackFrame::EXIT));
+ Push(scratch);
+ Push(xzr);
+ Mov(scratch, Operand(CodeObject()));
+ Push(scratch);
// fp[8]: CallerPC (lr)
// fp -> fp[0]: CallerFP (old fp)
- // fp[-8]: Space reserved for SPOffset.
- // jssp -> fp[-16]: CodeObject()
- STATIC_ASSERT((2 * kPointerSize) ==
- ExitFrameConstants::kCallerSPDisplacement);
+ // fp[-8]: STUB marker
+ // fp[-16]: Space reserved for SPOffset.
+ // jssp -> fp[-24]: CodeObject()
+ STATIC_ASSERT((2 * kPointerSize) == ExitFrameConstants::kCallerSPOffset);
STATIC_ASSERT((1 * kPointerSize) == ExitFrameConstants::kCallerPCOffset);
STATIC_ASSERT((0 * kPointerSize) == ExitFrameConstants::kCallerFPOffset);
- STATIC_ASSERT((-1 * kPointerSize) == ExitFrameConstants::kSPOffset);
- STATIC_ASSERT((-2 * kPointerSize) == ExitFrameConstants::kCodeOffset);
+ STATIC_ASSERT((-2 * kPointerSize) == ExitFrameConstants::kSPOffset);
+ STATIC_ASSERT((-3 * kPointerSize) == ExitFrameConstants::kCodeOffset);
// Save the frame pointer and context pointer in the top frame.
Mov(scratch, Operand(ExternalReference(Isolate::kCEntryFPAddress,
@@ -2829,8 +2839,7 @@ void MacroAssembler::EnterExitFrame(bool save_doubles,
isolate())));
Str(cp, MemOperand(scratch));
- STATIC_ASSERT((-2 * kPointerSize) ==
- ExitFrameConstants::kLastExitFrameField);
+ STATIC_ASSERT((-3 * kPointerSize) == ExitFrameConstants::kLastExitFrameField);
if (save_doubles) {
ExitFramePreserveFPRegs();
}
@@ -2841,9 +2850,10 @@ void MacroAssembler::EnterExitFrame(bool save_doubles,
Claim(extra_space + 1, kXRegSize);
// fp[8]: CallerPC (lr)
// fp -> fp[0]: CallerFP (old fp)
- // fp[-8]: Space reserved for SPOffset.
- // fp[-16]: CodeObject()
- // fp[-16 - fp_size]: Saved doubles (if save_doubles is true).
+ // fp[-8]: STUB marker
+ // fp[-16]: Space reserved for SPOffset.
+ // fp[-24]: CodeObject()
+ // fp[-24 - fp_size]: Saved doubles (if save_doubles is true).
// jssp[8]: Extra space reserved for caller (if extra_space != 0).
// jssp -> jssp[0]: Space reserved for the return address.
@@ -2853,9 +2863,10 @@ void MacroAssembler::EnterExitFrame(bool save_doubles,
// fp[8]: CallerPC (lr)
// fp -> fp[0]: CallerFP (old fp)
- // fp[-8]: Space reserved for SPOffset.
- // fp[-16]: CodeObject()
- // fp[-16 - fp_size]: Saved doubles (if save_doubles is true).
+ // fp[-8]: STUB marker
+ // fp[-16]: Space reserved for SPOffset.
+ // fp[-24]: CodeObject()
+ // fp[-24 - fp_size]: Saved doubles (if save_doubles is true).
// csp[8]: Memory reserved for the caller if extra_space != 0.
// Alignment padding, if necessary.
// csp -> csp[0]: Space reserved for the return address.
@@ -3738,8 +3749,19 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
DCHECK(!AreAliased(holder_reg, scratch1, scratch2));
Label same_contexts;
- // Load current lexical context from the stack frame.
- Ldr(scratch1, MemOperand(fp, StandardFrameConstants::kContextOffset));
+ // Load current lexical context from the active StandardFrame, which
+ // may require crawling past STUB frames.
+ Label load_context;
+ Label has_context;
+ Mov(scratch2, fp);
+ bind(&load_context);
+ Ldr(scratch1,
+ MemOperand(scratch2, CommonFrameConstants::kContextOrFrameTypeOffset));
+ JumpIfNotSmi(scratch1, &has_context);
+ Ldr(scratch2, MemOperand(scratch2, CommonFrameConstants::kCallerFPOffset));
+ B(&load_context);
+ bind(&has_context);
+
// In debug mode, make sure the lexical context is set.
#ifdef DEBUG
Cmp(scratch1, 0);

Powered by Google App Engine
This is Rietveld 408576698