Commit 0914181d authored by svenpanne's avatar svenpanne Committed by Commit bot

Build stack frames for stubs only when needed.

The heuristic is quite naive at the moment (build a frame iff the
register allocator needed spill slots), we can improve that later.

Review URL: https://codereview.chromium.org/933603002

Cr-Commit-Position: refs/heads/master@{#26664}
parent 20b4d6fe
...@@ -777,6 +777,7 @@ void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { ...@@ -777,6 +777,7 @@ void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) {
void CodeGenerator::AssemblePrologue() { void CodeGenerator::AssemblePrologue() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount();
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
bool saved_pp; bool saved_pp;
if (FLAG_enable_ool_constant_pool) { if (FLAG_enable_ool_constant_pool) {
...@@ -805,12 +806,11 @@ void CodeGenerator::AssemblePrologue() { ...@@ -805,12 +806,11 @@ void CodeGenerator::AssemblePrologue() {
__ Prologue(info->IsCodePreAgingActive()); __ Prologue(info->IsCodePreAgingActive());
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} else { } else if (stack_slots > 0) {
__ StubPrologue(); __ StubPrologue();
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} }
int stack_slots = frame()->GetSpillSlotCount();
if (info()->is_osr()) { if (info()->is_osr()) {
// TurboFan OSR-compiled functions cannot be entered directly. // TurboFan OSR-compiled functions cannot be entered directly.
...@@ -834,10 +834,10 @@ void CodeGenerator::AssemblePrologue() { ...@@ -834,10 +834,10 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount();
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
int stack_slots = frame()->GetSpillSlotCount();
if (stack_slots > 0) { if (stack_slots > 0) {
__ add(sp, sp, Operand(stack_slots * kPointerSize)); __ add(sp, sp, Operand(stack_slots * kPointerSize));
} }
...@@ -849,13 +849,15 @@ void CodeGenerator::AssembleReturn() { ...@@ -849,13 +849,15 @@ void CodeGenerator::AssembleReturn() {
} }
__ LeaveFrame(StackFrame::MANUAL); __ LeaveFrame(StackFrame::MANUAL);
__ Ret(); __ Ret();
} else { } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) {
__ LeaveFrame(StackFrame::MANUAL); __ LeaveFrame(StackFrame::MANUAL);
int pop_count = descriptor->IsJSFunctionCall() int pop_count = descriptor->IsJSFunctionCall()
? static_cast<int>(descriptor->JSParameterCount()) ? static_cast<int>(descriptor->JSParameterCount())
: 0; : 0;
__ Drop(pop_count); __ Drop(pop_count);
__ Ret(); __ Ret();
} else {
__ Ret();
} }
} }
......
...@@ -887,6 +887,7 @@ static int AlignedStackSlots(int stack_slots) { ...@@ -887,6 +887,7 @@ static int AlignedStackSlots(int stack_slots) {
void CodeGenerator::AssemblePrologue() { void CodeGenerator::AssemblePrologue() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount();
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
__ SetStackPointer(csp); __ SetStackPointer(csp);
__ Push(lr, fp); __ Push(lr, fp);
...@@ -900,13 +901,12 @@ void CodeGenerator::AssemblePrologue() { ...@@ -900,13 +901,12 @@ void CodeGenerator::AssemblePrologue() {
__ Prologue(info->IsCodePreAgingActive()); __ Prologue(info->IsCodePreAgingActive());
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} else { } else if (stack_slots > 0) {
__ SetStackPointer(jssp); __ SetStackPointer(jssp);
__ StubPrologue(); __ StubPrologue();
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} }
int stack_slots = frame()->GetSpillSlotCount();
if (info()->is_osr()) { if (info()->is_osr()) {
// TurboFan OSR-compiled functions cannot be entered directly. // TurboFan OSR-compiled functions cannot be entered directly.
...@@ -934,10 +934,10 @@ void CodeGenerator::AssemblePrologue() { ...@@ -934,10 +934,10 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount();
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
int stack_slots = frame()->GetSpillSlotCount();
if (stack_slots > 0) { if (stack_slots > 0) {
__ Add(csp, csp, AlignedStackSlots(stack_slots) * kPointerSize); __ Add(csp, csp, AlignedStackSlots(stack_slots) * kPointerSize);
} }
...@@ -948,7 +948,7 @@ void CodeGenerator::AssembleReturn() { ...@@ -948,7 +948,7 @@ void CodeGenerator::AssembleReturn() {
__ Mov(csp, fp); __ Mov(csp, fp);
__ Pop(fp, lr); __ Pop(fp, lr);
__ Ret(); __ Ret();
} else { } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) {
__ Mov(jssp, fp); __ Mov(jssp, fp);
__ Pop(fp, lr); __ Pop(fp, lr);
int pop_count = descriptor->IsJSFunctionCall() int pop_count = descriptor->IsJSFunctionCall()
...@@ -956,6 +956,8 @@ void CodeGenerator::AssembleReturn() { ...@@ -956,6 +956,8 @@ void CodeGenerator::AssembleReturn() {
: 0; : 0;
__ Drop(pop_count); __ Drop(pop_count);
__ Ret(); __ Ret();
} else {
__ Ret();
} }
} }
......
...@@ -1010,7 +1010,7 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1010,7 +1010,7 @@ void CodeGenerator::AssemblePrologue() {
__ Prologue(info->IsCodePreAgingActive()); __ Prologue(info->IsCodePreAgingActive());
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} else { } else if (stack_slots > 0) {
__ StubPrologue(); __ StubPrologue();
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
...@@ -1039,11 +1039,11 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1039,11 +1039,11 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount();
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
const RegList saves = descriptor->CalleeSavedRegisters(); const RegList saves = descriptor->CalleeSavedRegisters();
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
int stack_slots = frame()->GetSpillSlotCount();
if (stack_slots > 0) { if (stack_slots > 0) {
__ add(esp, Immediate(stack_slots * kPointerSize)); __ add(esp, Immediate(stack_slots * kPointerSize));
} }
...@@ -1062,13 +1062,15 @@ void CodeGenerator::AssembleReturn() { ...@@ -1062,13 +1062,15 @@ void CodeGenerator::AssembleReturn() {
__ pop(ebp); // Pop caller's frame pointer. __ pop(ebp); // Pop caller's frame pointer.
__ ret(0); __ ret(0);
} }
} else { } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) {
__ mov(esp, ebp); // Move stack pointer back to frame pointer. __ mov(esp, ebp); // Move stack pointer back to frame pointer.
__ pop(ebp); // Pop caller's frame pointer. __ pop(ebp); // Pop caller's frame pointer.
int pop_count = descriptor->IsJSFunctionCall() int pop_count = descriptor->IsJSFunctionCall()
? static_cast<int>(descriptor->JSParameterCount()) ? static_cast<int>(descriptor->JSParameterCount())
: 0; : 0;
__ ret(pop_count * kPointerSize); __ ret(pop_count * kPointerSize);
} else {
__ ret(0);
} }
} }
......
...@@ -913,6 +913,7 @@ void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { ...@@ -913,6 +913,7 @@ void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) {
void CodeGenerator::AssemblePrologue() { void CodeGenerator::AssemblePrologue() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount();
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
__ Push(ra, fp); __ Push(ra, fp);
__ mov(fp, sp); __ mov(fp, sp);
...@@ -932,12 +933,11 @@ void CodeGenerator::AssemblePrologue() { ...@@ -932,12 +933,11 @@ void CodeGenerator::AssemblePrologue() {
__ Prologue(info->IsCodePreAgingActive()); __ Prologue(info->IsCodePreAgingActive());
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} else { } else if (stack_slots > 0) {
__ StubPrologue(); __ StubPrologue();
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} }
int stack_slots = frame()->GetSpillSlotCount();
if (info()->is_osr()) { if (info()->is_osr()) {
// TurboFan OSR-compiled functions cannot be entered directly. // TurboFan OSR-compiled functions cannot be entered directly.
...@@ -961,10 +961,10 @@ void CodeGenerator::AssemblePrologue() { ...@@ -961,10 +961,10 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount();
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
int stack_slots = frame()->GetSpillSlotCount();
if (stack_slots > 0) { if (stack_slots > 0) {
__ Addu(sp, sp, Operand(stack_slots * kPointerSize)); __ Addu(sp, sp, Operand(stack_slots * kPointerSize));
} }
...@@ -977,13 +977,15 @@ void CodeGenerator::AssembleReturn() { ...@@ -977,13 +977,15 @@ void CodeGenerator::AssembleReturn() {
__ mov(sp, fp); __ mov(sp, fp);
__ Pop(ra, fp); __ Pop(ra, fp);
__ Ret(); __ Ret();
} else { } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) {
__ mov(sp, fp); __ mov(sp, fp);
__ Pop(ra, fp); __ Pop(ra, fp);
int pop_count = descriptor->IsJSFunctionCall() int pop_count = descriptor->IsJSFunctionCall()
? static_cast<int>(descriptor->JSParameterCount()) ? static_cast<int>(descriptor->JSParameterCount())
: 0; : 0;
__ DropAndRet(pop_count); __ DropAndRet(pop_count);
} else {
__ Ret();
} }
} }
......
...@@ -1043,6 +1043,7 @@ void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { ...@@ -1043,6 +1043,7 @@ void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) {
void CodeGenerator::AssemblePrologue() { void CodeGenerator::AssemblePrologue() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount();
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
__ Push(ra, fp); __ Push(ra, fp);
__ mov(fp, sp); __ mov(fp, sp);
...@@ -1062,12 +1063,11 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1062,12 +1063,11 @@ void CodeGenerator::AssemblePrologue() {
__ Prologue(info->IsCodePreAgingActive()); __ Prologue(info->IsCodePreAgingActive());
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} else { } else if (stack_slots > 0) {
__ StubPrologue(); __ StubPrologue();
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} }
int stack_slots = frame()->GetSpillSlotCount();
if (info()->is_osr()) { if (info()->is_osr()) {
// TurboFan OSR-compiled functions cannot be entered directly. // TurboFan OSR-compiled functions cannot be entered directly.
...@@ -1091,10 +1091,10 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1091,10 +1091,10 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount();
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
int stack_slots = frame()->GetSpillSlotCount();
if (stack_slots > 0) { if (stack_slots > 0) {
__ Daddu(sp, sp, Operand(stack_slots * kPointerSize)); __ Daddu(sp, sp, Operand(stack_slots * kPointerSize));
} }
...@@ -1107,13 +1107,15 @@ void CodeGenerator::AssembleReturn() { ...@@ -1107,13 +1107,15 @@ void CodeGenerator::AssembleReturn() {
__ mov(sp, fp); __ mov(sp, fp);
__ Pop(ra, fp); __ Pop(ra, fp);
__ Ret(); __ Ret();
} else { } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) {
__ mov(sp, fp); __ mov(sp, fp);
__ Pop(ra, fp); __ Pop(ra, fp);
int pop_count = descriptor->IsJSFunctionCall() int pop_count = descriptor->IsJSFunctionCall()
? static_cast<int>(descriptor->JSParameterCount()) ? static_cast<int>(descriptor->JSParameterCount())
: 0; : 0;
__ DropAndRet(pop_count); __ DropAndRet(pop_count);
} else {
__ Ret();
} }
} }
......
...@@ -1178,7 +1178,7 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1178,7 +1178,7 @@ void CodeGenerator::AssemblePrologue() {
__ Prologue(info->IsCodePreAgingActive()); __ Prologue(info->IsCodePreAgingActive());
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
} else { } else if (stack_slots > 0) {
__ StubPrologue(); __ StubPrologue();
frame()->SetRegisterSaveAreaSize( frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp); StandardFrameConstants::kFixedFrameSizeFromFp);
...@@ -1206,10 +1206,10 @@ void CodeGenerator::AssemblePrologue() { ...@@ -1206,10 +1206,10 @@ void CodeGenerator::AssemblePrologue() {
void CodeGenerator::AssembleReturn() { void CodeGenerator::AssembleReturn() {
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
int stack_slots = frame()->GetSpillSlotCount();
if (descriptor->kind() == CallDescriptor::kCallAddress) { if (descriptor->kind() == CallDescriptor::kCallAddress) {
if (frame()->GetRegisterSaveAreaSize() > 0) { if (frame()->GetRegisterSaveAreaSize() > 0) {
// Remove this frame's spill slots first. // Remove this frame's spill slots first.
int stack_slots = frame()->GetSpillSlotCount();
if (stack_slots > 0) { if (stack_slots > 0) {
__ addq(rsp, Immediate(stack_slots * kPointerSize)); __ addq(rsp, Immediate(stack_slots * kPointerSize));
} }
...@@ -1229,13 +1229,15 @@ void CodeGenerator::AssembleReturn() { ...@@ -1229,13 +1229,15 @@ void CodeGenerator::AssembleReturn() {
__ popq(rbp); // Pop caller's frame pointer. __ popq(rbp); // Pop caller's frame pointer.
__ ret(0); __ ret(0);
} }
} else { } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) {
__ movq(rsp, rbp); // Move stack pointer back to frame pointer. __ movq(rsp, rbp); // Move stack pointer back to frame pointer.
__ popq(rbp); // Pop caller's frame pointer. __ popq(rbp); // Pop caller's frame pointer.
int pop_count = descriptor->IsJSFunctionCall() int pop_count = descriptor->IsJSFunctionCall()
? static_cast<int>(descriptor->JSParameterCount()) ? static_cast<int>(descriptor->JSParameterCount())
: 0; : 0;
__ ret(pop_count * kPointerSize); __ ret(pop_count * kPointerSize);
} else {
__ ret(0);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment