Chromium Code Reviews| Index: src/x64/macro-assembler-x64.cc |
| diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc |
| index a7fb0dc742f27c3d184846e4538f49d89550c1ed..b47a54118c714b80d21dcd13b9ec0d6cfdbff93a 100644 |
| --- a/src/x64/macro-assembler-x64.cc |
| +++ b/src/x64/macro-assembler-x64.cc |
| @@ -4356,15 +4356,12 @@ void MacroAssembler::FloodFunctionIfStepping(Register fun, Register new_target, |
| bind(&skip_flooding); |
| } |
| - |
| -void MacroAssembler::StubPrologue() { |
| - pushq(rbp); // Caller's frame pointer. |
| - movp(rbp, rsp); |
| - Push(rsi); // Callee's context. |
| - Push(Smi::FromInt(StackFrame::STUB)); |
| +void MacroAssembler::StubPrologue(StackFrame::Type type) { |
| + pushq(rbp); // Caller's frame pointer. |
| + movp(rbp, rsp); |
| + Push(Smi::FromInt(type)); |
| } |
| - |
| void MacroAssembler::Prologue(bool code_pre_aging) { |
| PredictableCodeSizeScope predictible_code_size_scope(this, |
| kNoCodeAgeSequenceLength); |
| @@ -4399,10 +4396,11 @@ void MacroAssembler::EnterFrame(StackFrame::Type type, |
| void MacroAssembler::EnterFrame(StackFrame::Type type) { |
| pushq(rbp); |
| movp(rbp, rsp); |
| - Push(rsi); // Context. |
| Push(Smi::FromInt(type)); |
| - Move(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); |
| - Push(kScratchRegister); |
| + if (type == StackFrame::INTERNAL) { |
| + Move(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); |
| + Push(kScratchRegister); |
| + } |
| if (emit_debug_code()) { |
| Move(kScratchRegister, |
| isolate()->factory()->undefined_value(), |
| @@ -4416,7 +4414,8 @@ void MacroAssembler::EnterFrame(StackFrame::Type type) { |
| void MacroAssembler::LeaveFrame(StackFrame::Type type) { |
| if (emit_debug_code()) { |
| Move(kScratchRegister, Smi::FromInt(type)); |
| - cmpp(Operand(rbp, StandardFrameConstants::kMarkerOffset), kScratchRegister); |
| + cmpp(Operand(rbp, CommonFrameConstants::kContextOrFrameTypeOffset), |
| + kScratchRegister); |
| Check(equal, kStackFrameTypesMustMatch); |
| } |
| movp(rsp, rbp); |
| @@ -4427,15 +4426,16 @@ void MacroAssembler::LeaveFrame(StackFrame::Type type) { |
| void MacroAssembler::EnterExitFramePrologue(bool save_rax) { |
| // Set up the frame structure on the stack. |
| // All constants are relative to the frame pointer of the exit frame. |
| - DCHECK(ExitFrameConstants::kCallerSPDisplacement == |
| - kFPOnStackSize + kPCOnStackSize); |
| - DCHECK(ExitFrameConstants::kCallerPCOffset == kFPOnStackSize); |
| - DCHECK(ExitFrameConstants::kCallerFPOffset == 0 * kPointerSize); |
| + DCHECK_EQ(kFPOnStackSize + kPCOnStackSize, |
| + ExitFrameConstants::kCallerSPDisplacement); |
| + DCHECK_EQ(kFPOnStackSize, ExitFrameConstants::kCallerPCOffset); |
| + DCHECK_EQ(0 * kPointerSize, ExitFrameConstants::kCallerFPOffset); |
| pushq(rbp); |
| movp(rbp, rsp); |
| // Reserve room for entry stack pointer and push the code object. |
| - DCHECK(ExitFrameConstants::kSPOffset == -1 * kPointerSize); |
| + Push(Smi::FromInt(StackFrame::EXIT)); |
| + DCHECK_EQ(-2 * kPointerSize, ExitFrameConstants::kSPOffset); |
| Push(Immediate(0)); // Saved entry sp, patched before call. |
| Move(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); |
| Push(kScratchRegister); // Accessed from EditFrame::code_slot. |
| @@ -4462,7 +4462,7 @@ void MacroAssembler::EnterExitFrameEpilogue(int arg_stack_space, |
| int space = XMMRegister::kMaxNumRegisters * kDoubleSize + |
| arg_stack_space * kRegisterSize; |
| subp(rsp, Immediate(space)); |
| - int offset = -2 * kPointerSize; |
| + int offset = -ExitFrameConstants::kFixedFrameSizeFromFp; |
| const RegisterConfiguration* config = |
| RegisterConfiguration::ArchDefault(RegisterConfiguration::CRANKSHAFT); |
| for (int i = 0; i < config->num_allocatable_double_registers(); ++i) { |
| @@ -4509,7 +4509,7 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles, bool pop_arguments) { |
| // Registers: |
| // r15 : argv |
| if (save_doubles) { |
| - int offset = -2 * kPointerSize; |
| + int offset = -ExitFrameConstants::kFixedFrameSizeFromFp; |
| const RegisterConfiguration* config = |
| RegisterConfiguration::ArchDefault(RegisterConfiguration::CRANKSHAFT); |
| for (int i = 0; i < config->num_allocatable_double_registers(); ++i) { |
| @@ -4572,8 +4572,23 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, |
| DCHECK(!holder_reg.is(scratch)); |
| DCHECK(!scratch.is(kScratchRegister)); |
| - // Load current lexical context from the stack frame. |
| - movp(scratch, Operand(rbp, StandardFrameConstants::kContextOffset)); |
| + // Load current lexical context from the active StandardFrame, which |
| + // may require crawling past STUB frames. |
| + Label load_context; |
| + Label has_context; |
| + movp(scratch, rbp); |
| + bind(&load_context); |
| + DCHECK(SmiValuesAre32Bits()); |
| + int smi_tag_offset = kSmiShift / kBitsPerByte; |
| + cmpl(MemOperand(scratch, CommonFrameConstants::kContextOrFrameTypeOffset + |
| + smi_tag_offset), |
| + Immediate(StackFrame::STUB)); |
| + j(not_equal, &has_context); |
| + movp(scratch, MemOperand(scratch, CommonFrameConstants::kCallerFPOffset)); |
| + jmp(&load_context); |
| + bind(&has_context); |
| + movp(scratch, |
| + MemOperand(scratch, CommonFrameConstants::kContextOrFrameTypeOffset)); |
|
Jakob Kummerow
2016/03/09 14:19:43
This is crashing in the wild, because |scratch| ca
|
| // When generating debug code, make sure the lexical context is set. |
| if (emit_debug_code()) { |