summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/jit/codegen.h30
-rw-r--r--src/jit/codegencommon.cpp16
-rw-r--r--src/jit/codegenlegacy.cpp12
-rw-r--r--src/jit/codegenlinear.cpp4
-rw-r--r--src/jit/codegenxarch.cpp20
5 files changed, 56 insertions, 26 deletions
diff --git a/src/jit/codegen.h b/src/jit/codegen.h
index cb5a597478..b40b49676e 100755
--- a/src/jit/codegen.h
+++ b/src/jit/codegen.h
@@ -162,6 +162,36 @@ private:
//
unsigned genStackLevel;
+ void SubtractStackLevel(unsigned adjustment)
+ {
+ assert(genStackLevel >= adjustment);
+ unsigned newStackLevel = genStackLevel - adjustment;
+ if (genStackLevel != newStackLevel)
+ {
+ JITDUMP("Adjusting stack level from %d to %d\n", genStackLevel, newStackLevel);
+ }
+ genStackLevel = newStackLevel;
+ }
+
+ void AddStackLevel(unsigned adjustment)
+ {
+ unsigned newStackLevel = genStackLevel + adjustment;
+ if (genStackLevel != newStackLevel)
+ {
+ JITDUMP("Adjusting stack level from %d to %d\n", genStackLevel, newStackLevel);
+ }
+ genStackLevel = newStackLevel;
+ }
+
+ void SetStackLevel(unsigned newStackLevel)
+ {
+ if (genStackLevel != newStackLevel)
+ {
+ JITDUMP("Setting stack level from %d to %d\n", genStackLevel, newStackLevel);
+ }
+ genStackLevel = newStackLevel;
+ }
+
#if STACK_PROBES
// Stack Probes
bool genNeedPrologStackProbe;
diff --git a/src/jit/codegencommon.cpp b/src/jit/codegencommon.cpp
index 15a0bd3be3..fde4a673e8 100644
--- a/src/jit/codegencommon.cpp
+++ b/src/jit/codegencommon.cpp
@@ -1663,14 +1663,14 @@ void CodeGen::genAdjustStackLevel(BasicBlock* block)
{
noway_assert(block->bbFlags & BBF_JMP_TARGET);
- genStackLevel = compiler->fgThrowHlpBlkStkLevel(block) * sizeof(int);
+ SetStackLevel(compiler->fgThrowHlpBlkStkLevel(block) * sizeof(int));
if (genStackLevel != 0)
{
#ifdef _TARGET_X86_
getEmitter()->emitMarkStackLvl(genStackLevel);
inst_RV_IV(INS_add, REG_SPBASE, genStackLevel, EA_PTRSIZE);
- genStackLevel = 0;
+ SetStackLevel(0);
#else // _TARGET_X86_
NYI("Need emitMarkStackLvl()");
#endif // _TARGET_X86_
@@ -3927,12 +3927,12 @@ void CodeGen::genGCWriteBarrier(GenTreePtr tgt, GCInfo::WriteBarrierForm wbf)
}
#endif // DEBUG
#endif // 0
- genStackLevel += 4;
+ AddStackLevel(4);
inst_IV(INS_push, wbKind);
genEmitHelperCall(helper,
4, // argSize
EA_PTRSIZE); // retSize
- genStackLevel -= 4;
+ SubtractStackLevel(4);
}
else
{
@@ -7567,7 +7567,7 @@ void CodeGen::genProfilingEnterCallback(regNumber initReg, bool* pInitRegZeroed)
/* Restore the stack level */
- genStackLevel = saveStackLvl2;
+ SetStackLevel(saveStackLvl2);
#else // target
NYI("Emit Profiler Enter callback");
@@ -7796,7 +7796,7 @@ void CodeGen::genProfilingLeaveCallback(unsigned helper /*= CORINFO_HELP_PROF_FC
#endif // target
/* Restore the stack level */
- genStackLevel = saveStackLvl2;
+ SetStackLevel(saveStackLvl2);
}
#endif // PROFILING_SUPPORTED
@@ -11148,7 +11148,7 @@ unsigned CodeGen::getFirstArgWithStackSlot()
//
void CodeGen::genSinglePush()
{
- genStackLevel += sizeof(void*);
+ AddStackLevel(REGSIZE_BYTES);
}
//------------------------------------------------------------------------
@@ -11156,7 +11156,7 @@ void CodeGen::genSinglePush()
//
void CodeGen::genSinglePop()
{
- genStackLevel -= sizeof(void*);
+ SubtractStackLevel(REGSIZE_BYTES);
}
//------------------------------------------------------------------------
diff --git a/src/jit/codegenlegacy.cpp b/src/jit/codegenlegacy.cpp
index 922a9b1d70..90795802ce 100644
--- a/src/jit/codegenlegacy.cpp
+++ b/src/jit/codegenlegacy.cpp
@@ -5226,7 +5226,7 @@ void CodeGen::genCodeForTreeLeaf_GT_JMP(GenTreePtr tree)
#endif //_TARGET_X86_
/* Restore the stack level */
- genStackLevel = saveStackLvl2;
+ SetStackLevel(saveStackLvl2);
}
#endif // PROFILING_SUPPORTED
@@ -12744,7 +12744,7 @@ void CodeGen::genCodeForBBlist()
/* Both stacks are always empty on entry to a basic block */
- genStackLevel = 0;
+ SetStackLevel(0);
#if FEATURE_STACK_FP_X87
genResetFPstkLevel();
#endif // FEATURE_STACK_FP_X87
@@ -12950,7 +12950,7 @@ void CodeGen::genCodeForBBlist()
}
}
- genStackLevel -= savedStkLvl;
+ SubtractStackLevel(savedStkLvl);
gcInfo.gcMarkRegSetNpt(gcrefRegs | byrefRegs);
@@ -16347,7 +16347,7 @@ size_t CodeGen::genPushArgList(GenTreePtr call)
}
inst_RV_IV(INS_sub, REG_SPBASE, stkDisp, EA_PTRSIZE);
- genStackLevel += stkDisp;
+ AddStackLevel(stkDisp);
while (curDisp < stkDisp)
{
@@ -18571,7 +18571,7 @@ regMaskTP CodeGen::genCodeForCall(GenTreePtr call, bool valUsed)
#endif //_TARGET_X86_
/* Restore the stack level */
- genStackLevel = saveStackLvl2;
+ SetStackLevel(saveStackLvl2);
}
#endif // PROFILING_SUPPORTED
@@ -19669,7 +19669,7 @@ regMaskTP CodeGen::genCodeForCall(GenTreePtr call, bool valUsed)
/* The function will pop all arguments before returning */
- genStackLevel = saveStackLvl;
+ SetStackLevel(saveStackLvl);
/* No trashed registers may possibly hold a pointer at this point */
CLANG_FORMAT_COMMENT_ANCHOR;
diff --git a/src/jit/codegenlinear.cpp b/src/jit/codegenlinear.cpp
index ccba5d257b..c8fcd88c10 100644
--- a/src/jit/codegenlinear.cpp
+++ b/src/jit/codegenlinear.cpp
@@ -296,7 +296,7 @@ void CodeGen::genCodeForBBlist()
/* Both stacks are always empty on entry to a basic block */
- genStackLevel = 0;
+ SetStackLevel(0);
genAdjustStackLevel(block);
savedStkLvl = genStackLevel;
@@ -490,7 +490,7 @@ void CodeGen::genCodeForBBlist()
}
}
- genStackLevel -= savedStkLvl;
+ SubtractStackLevel(savedStkLvl);
#ifdef DEBUG
// compCurLife should be equal to the liveOut set, except that we don't keep
diff --git a/src/jit/codegenxarch.cpp b/src/jit/codegenxarch.cpp
index 6acbe58508..7639e8bac1 100644
--- a/src/jit/codegenxarch.cpp
+++ b/src/jit/codegenxarch.cpp
@@ -5196,7 +5196,7 @@ void CodeGen::genCallInstruction(GenTreePtr node)
#if defined(_TARGET_X86_)
// The call will pop its arguments.
- genStackLevel -= stackArgBytes;
+ SubtractStackLevel(stackArgBytes);
#endif // defined(_TARGET_X86_)
// Update GC info:
@@ -7535,7 +7535,7 @@ bool CodeGen::genAdjustStackForPutArgStk(GenTreePutArgStk* putArgStk)
{
const unsigned argSize = genTypeSize(putArgStk);
inst_RV_IV(INS_sub, REG_SPBASE, argSize, EA_PTRSIZE);
- genStackLevel += argSize;
+ AddStackLevel(argSize);
m_pushStkArg = false;
return true;
}
@@ -7579,7 +7579,7 @@ bool CodeGen::genAdjustStackForPutArgStk(GenTreePutArgStk* putArgStk)
{
m_pushStkArg = false;
inst_RV_IV(INS_sub, REG_SPBASE, argSize, EA_PTRSIZE);
- genStackLevel += argSize;
+ AddStackLevel(argSize);
return true;
}
}
@@ -7667,7 +7667,7 @@ void CodeGen::genPutArgStkFieldList(GenTreePutArgStk* putArgStk)
{
inst_IV(INS_push, 0);
currentOffset -= pushSize;
- genStackLevel += pushSize;
+ AddStackLevel(pushSize);
adjustment -= pushSize;
}
m_pushStkArg = true;
@@ -7689,7 +7689,7 @@ void CodeGen::genPutArgStkFieldList(GenTreePutArgStk* putArgStk)
// Adjust the stack pointer to the next slot boundary.
inst_RV_IV(INS_sub, REG_SPBASE, adjustment, EA_PTRSIZE);
currentOffset -= adjustment;
- genStackLevel += adjustment;
+ AddStackLevel(adjustment);
}
// Does it need to be in a byte register?
@@ -7742,7 +7742,7 @@ void CodeGen::genPutArgStkFieldList(GenTreePutArgStk* putArgStk)
}
}
currentOffset -= TARGET_POINTER_SIZE;
- genStackLevel += TARGET_POINTER_SIZE;
+ AddStackLevel(TARGET_POINTER_SIZE);
}
else
{
@@ -7788,7 +7788,7 @@ void CodeGen::genPutArgStkFieldList(GenTreePutArgStk* putArgStk)
{
// We don't expect padding at the beginning of a struct, but it could happen with explicit layout.
inst_RV_IV(INS_sub, REG_SPBASE, currentOffset, EA_PTRSIZE);
- genStackLevel += currentOffset;
+ AddStackLevel(currentOffset);
}
}
#endif // _TARGET_X86_
@@ -7848,7 +7848,7 @@ void CodeGen::genPutArgStk(GenTreePutArgStk* putArgStk)
{
inst_IV(INS_push, data->gtIntCon.gtIconVal);
}
- genStackLevel += argSize;
+ AddStackLevel(argSize);
}
else if (data->OperGet() == GT_FIELD_LIST)
{
@@ -7947,7 +7947,7 @@ void CodeGen::genPushReg(var_types type, regNumber srcReg)
inst_RV_IV(INS_sub, REG_SPBASE, size, EA_PTRSIZE);
getEmitter()->emitIns_AR_R(ins, attr, srcReg, REG_SPBASE, 0);
}
- genStackLevel += size;
+ AddStackLevel(size);
}
#endif // _TARGET_X86_
@@ -8145,7 +8145,7 @@ void CodeGen::genPutStructArgStk(GenTreePutArgStk* putArgStk)
{
getEmitter()->emitIns_S(INS_push, slotAttr, srcLclNum, srcLclOffset + offset);
}
- genStackLevel += TARGET_POINTER_SIZE;
+ AddStackLevel(TARGET_POINTER_SIZE);
}
#else // !defined(_TARGET_X86_)