From 0ee508291b7cec2b0a0d5e7929846d3e40446810 Mon Sep 17 00:00:00 2001 From: Brian Bohe Date: Wed, 20 Mar 2019 10:08:01 -0700 Subject: [PATCH] Adding a flag to able/disable scope info (#23298) * Flag USING_SCOPE_INGO definition * Enclosing siScope's related functions uses with USING_SCOPE_INFO flag definition check * Encapsulating genSetScopeInfo when using siVarScope * Moving comment inside flag defined block * Include siScope/psiScope functions only when flag USING_SCOPE_INFO is defined * Disable scope info * Typo * Adding comment flag name on #endif * Remove redundant access levels/flags * Repeating last accessibility level in case flag is disabled * Setting use of siScope and psiScope as default way of reporting variable homes --- src/jit/codegen.h | 18 ++--- src/jit/codegenarmarch.cpp | 3 +- src/jit/codegencommon.cpp | 71 ++++++++++++------- src/jit/codegeninterface.h | 8 +++ src/jit/codegenlinear.cpp | 10 +-- src/jit/codegenxarch.cpp | 3 +- src/jit/scopeinfo.cpp | 168 ++++++++++++++++++++++---------------------- src/jit/treelifeupdater.cpp | 3 +- 8 files changed, 161 insertions(+), 123 deletions(-) diff --git a/src/jit/codegen.h b/src/jit/codegen.h index be20865..11c81c4 100644 --- a/src/jit/codegen.h +++ b/src/jit/codegen.h @@ -561,8 +561,9 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX siVarLoc* varLoc); void genSetScopeInfo(); +#ifdef USING_SCOPE_INFO + void genSetScopeInfoUsingsiScope(); -protected: /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX @@ -668,7 +669,6 @@ public: const char* siStackVarName(size_t offs, size_t size, unsigned reg, unsigned stkOffs); #endif // LATE_DISASM -public: /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX @@ -749,14 +749,16 @@ protected: void psiEndPrologScope(psiScope* scope); void psSetScopeOffset(psiScope* newScope, LclVarDsc* lclVarDsc1); +#endif // USING_SCOPE_INFO -/***************************************************************************** - * TrnslLocalVarInfo - * - * This struct holds the LocalVarInfo in terms of the generated native code - * after a call to genSetScopeInfo() - */ + /***************************************************************************** + * TrnslLocalVarInfo + * + * This struct holds the LocalVarInfo in terms of the generated native code + * after a call to genSetScopeInfo() + */ +protected: #ifdef DEBUG struct TrnslLocalVarInfo diff --git a/src/jit/codegenarmarch.cpp b/src/jit/codegenarmarch.cpp index 5018013..0c84bed 100644 --- a/src/jit/codegenarmarch.cpp +++ b/src/jit/codegenarmarch.cpp @@ -3860,11 +3860,12 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni #ifdef _TARGET_ARM_ compiler->unwindAllocStack(frameSize); - +#ifdef USING_SCOPE_INFO if (!doubleAlignOrFramePointerUsed()) { psiAdjustStackLevel(frameSize); } +#endif // USING_SCOPE_INFO #endif // _TARGET_ARM_ } diff --git a/src/jit/codegencommon.cpp b/src/jit/codegencommon.cpp index b90cf55..2b5236b 100644 --- a/src/jit/codegencommon.cpp +++ b/src/jit/codegencommon.cpp @@ -732,8 +732,9 @@ void Compiler::compChangeLife(VARSET_VALARG_TP newLife) JITDUMP("\t\t\t\t\t\t\tV%02u becoming live\n", varNum); } } - +#ifdef USING_SCOPE_INFO codeGen->siUpdate(); +#endif // USING_SCOPE_INFO } // Need an explicit instantiation. @@ -3804,11 +3805,12 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, bool* pXtraRegClobbere assert(varDsc->lvSize() >= baseOffset + (unsigned)size); } #endif // !UNIX_AMD64_ABI - +#ifdef USING_SCOPE_INFO if (regArgTab[argNum].slot == 1) { psiMoveToStack(varNum); } +#endif // USING_SCOPE_INFO } /* mark the argument as processed */ @@ -3952,9 +3954,10 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, bool* pXtraRegClobbere regArgMaskLive &= ~genRegMask(varDscSrc->lvArgReg); regArgMaskLive &= ~genRegMask(varDscDest->lvArgReg); - +#ifdef USING_SCOPE_INFO psiMoveToReg(varNumSrc); psiMoveToReg(varNumDest); +#endif // USING_SCOPE_INFO } else #endif // _TARGET_XARCH_ @@ -4016,9 +4019,9 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, bool* pXtraRegClobbere regSet.verifyRegUsed(xtraReg); *pXtraRegClobbered = true; - +#ifdef USING_SCOPE_INFO psiMoveToReg(varNumDest, xtraReg); - +#endif // USING_SCOPE_INFO /* start moving everything to its right place */ while (srcReg != begReg) @@ -4083,9 +4086,9 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, bool* pXtraRegClobbere getEmitter()->emitIns_R_R(insCopy, size, destRegNum, xtraReg); regSet.verifyRegUsed(destRegNum); - +#ifdef USING_SCOPE_INFO psiMoveToReg(varNumSrc); - +#endif // USING_SCOPE_INFO /* mark the beginning register as processed */ regArgTab[srcReg].processed = true; @@ -4269,8 +4272,9 @@ void CodeGen::genFnPrologCalleeRegArgs(regNumber xtraReg, bool* pXtraRegClobbere #endif getEmitter()->emitIns_R_R(ins_Copy(destMemType), size, destRegNum, regNum); - +#ifdef USING_SCOPE_INFO psiMoveToReg(varNum); +#endif // USING_SCOPE_INFO } /* mark the argument as processed */ @@ -4404,8 +4408,9 @@ void CodeGen::genEnregisterIncomingStackArgs() getEmitter()->emitIns_R_S(ins_Load(type), emitTypeSize(type), regNum, varNum, 0); regSet.verifyRegUsed(regNum); - +#ifdef USING_SCOPE_INFO psiMoveToReg(varNum); +#endif // USING_SCOPE_INFO } } @@ -5247,12 +5252,12 @@ void CodeGen::genPushCalleeSavedRegisters() { inst_RV(INS_push, reg, TYP_REF); compiler->unwindPush(reg); - +#ifdef USING_SCOPE_INFO if (!doubleAlignOrFramePointerUsed()) { psiAdjustStackLevel(REGSIZE_BYTES); } - +#endif // USING_SCOPE_INFO rsPushRegs &= ~regBit; } } @@ -7531,7 +7536,9 @@ void CodeGen::genEstablishFramePointer(int delta, bool reportUnwindData) if (delta == 0) { getEmitter()->emitIns_R_R(INS_mov, EA_PTRSIZE, REG_FPBASE, REG_SPBASE); +#ifdef USING_SCOPE_INFO psiMoveESPtoEBP(); +#endif // USING_SCOPE_INFO } else { @@ -7633,12 +7640,13 @@ void CodeGen::genFnProlog() printf("\n__prolog:\n"); } #endif - +#ifdef USING_SCOPE_INFO if (compiler->opts.compScopeInfo && (compiler->info.compVarScopesCount > 0)) { // Create new scopes for the method-parameters for the prolog-block. psiBegProlog(); } +#endif // USING_SCOPE_INFO #ifdef DEBUG @@ -7963,8 +7971,9 @@ void CodeGen::genFnProlog() { inst_RV(INS_push, REG_FPBASE, TYP_REF); compiler->unwindPush(REG_FPBASE); +#ifdef USING_SCOPE_INFO psiAdjustStackLevel(REGSIZE_BYTES); - +#endif // USING_SCOPE_INFO #ifndef _TARGET_AMD64_ // On AMD64, establish the frame pointer after the "sub rsp" genEstablishFramePointer(0, /*reportUnwindData*/ true); #endif // !_TARGET_AMD64_ @@ -8284,12 +8293,12 @@ void CodeGen::genFnProlog() genPrologPadForReJit(); getEmitter()->emitMarkPrologEnd(); } - +#ifdef USING_SCOPE_INFO if (compiler->opts.compScopeInfo && (compiler->info.compVarScopesCount > 0)) { psiEndProlog(); } - +#endif // USING_SCOPE_INFO if (hasGCRef) { getEmitter()->emitSetFrameRangeGCRs(GCrefLo, GCrefHi); @@ -10486,27 +10495,40 @@ void CodeGen::genSetScopeInfo() } noway_assert(compiler->opts.compScopeInfo && (compiler->info.compVarScopesCount > 0)); - noway_assert(psiOpenScopeList.scNext == nullptr); - - unsigned i; - unsigned scopeCnt = siScopeCnt + psiScopeCnt; - compiler->eeSetLVcount(scopeCnt); + unsigned varsHomeCount = 0; +#ifdef USING_SCOPE_INFO + varsHomeCount = siScopeCnt + psiScopeCnt; +#endif // USING_SCOPE_INFO + compiler->eeSetLVcount(varsHomeCount); #ifdef DEBUG - genTrnslLocalVarCount = scopeCnt; - if (scopeCnt) + genTrnslLocalVarCount = varsHomeCount; + if (varsHomeCount) { - genTrnslLocalVarInfo = new (compiler, CMK_DebugOnly) TrnslLocalVarInfo[scopeCnt]; + genTrnslLocalVarInfo = new (compiler, CMK_DebugOnly) TrnslLocalVarInfo[varsHomeCount]; } #endif +#ifdef USING_SCOPE_INFO + genSetScopeInfoUsingsiScope(); +#endif // USING_SCOPE_INFO + + compiler->eeSetLVdone(); +} + +#ifdef USING_SCOPE_INFO +void CodeGen::genSetScopeInfoUsingsiScope() +{ + noway_assert(psiOpenScopeList.scNext == nullptr); + // Record the scopes found for the parameters over the prolog. // The prolog needs to be treated differently as a variable may not // have the same info in the prolog block as is given by compiler->lvaTable. // eg. A register parameter is actually on the stack, before it is loaded to reg. CodeGen::psiScope* scopeP; + unsigned i; for (i = 0, scopeP = psiScopeList.scNext; i < psiScopeCnt; i++, scopeP = scopeP->scNext) { @@ -10563,9 +10585,8 @@ void CodeGen::genSetScopeInfo() genSetScopeInfo(psiScopeCnt + i, startOffs, endOffs - startOffs, scopeL->scVarNum, scopeL->scLVnum, scopeL->scAvailable, &varLoc); } - - compiler->eeSetLVdone(); } +#endif // USING_SCOPE_INFO //------------------------------------------------------------------------ // genSetScopeInfo: Record scope information for debug info diff --git a/src/jit/codegeninterface.h b/src/jit/codegeninterface.h index 94fd8f4..9a67649 100644 --- a/src/jit/codegeninterface.h +++ b/src/jit/codegeninterface.h @@ -25,6 +25,12 @@ #include "jitgcinfo.h" #include "treelifeupdater.h" +// Disable this flag to avoid using psiScope/siScope info to report reporting +// variables' home location during the method/prolog code. +#if 1 +#define USING_SCOPE_INFO +#endif // USING_SCOPE_INFO + // Forward reference types class CodeGenInterface; @@ -385,7 +391,9 @@ private: bool m_cgFullPtrRegMap; public: +#ifdef USING_SCOPE_INFO virtual void siUpdate() = 0; +#endif // USING_SCOPE_INFO /* These are the different addressing modes used to access a local var. * The JIT has to report the location of the locals back to the EE diff --git a/src/jit/codegenlinear.cpp b/src/jit/codegenlinear.cpp index 149bb33..c0a2034 100644 --- a/src/jit/codegenlinear.cpp +++ b/src/jit/codegenlinear.cpp @@ -84,12 +84,13 @@ void CodeGen::genInitializeRegisterState() // iterated. void CodeGen::genInitialize() { +#ifdef USING_SCOPE_INFO // Initialize the line# tracking logic - if (compiler->opts.compScopeInfo) { siInit(); } +#endif // USING_SCOPE_INFO // The current implementation of switch tables requires the first block to have a label so it // can generate offsets to the switch label targets. @@ -350,9 +351,9 @@ void CodeGen::genCodeForBBlist() /* Tell everyone which basic block we're working on */ compiler->compCurBB = block; - +#ifdef USING_SCOPE_INFO siBeginBlock(block); - +#endif // USING_SCOPE_INFO // BBF_INTERNAL blocks don't correspond to any single IL instruction. if (compiler->opts.compDbgInfo && (block->bbFlags & BBF_INTERNAL) && !compiler->fgBBisScratch(block)) // If the block is the distinguished first scratch block, then no need to @@ -508,7 +509,7 @@ void CodeGen::genCodeForBBlist() // This can lead to problems when debugging the generated code. To prevent these issues, make sure // we've generated code for the last IL offset we saw in the block. genEnsureCodeEmitted(currentILOffset); - +#ifdef USING_SCOPE_INFO if (compiler->opts.compScopeInfo && (compiler->info.compVarScopesCount > 0)) { siEndBlock(block); @@ -533,6 +534,7 @@ void CodeGen::genCodeForBBlist() siCloseAllOpenScopes(); } } +#endif // USING_SCOPE_INFO SubtractStackLevel(savedStkLvl); diff --git a/src/jit/codegenxarch.cpp b/src/jit/codegenxarch.cpp index f332b00..9256650 100644 --- a/src/jit/codegenxarch.cpp +++ b/src/jit/codegenxarch.cpp @@ -2333,11 +2333,12 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni } compiler->unwindAllocStack(frameSize); - +#ifdef USING_SCOPE_INFO if (!doubleAlignOrFramePointerUsed()) { psiAdjustStackLevel(frameSize); } +#endif // USING_SCOPE_INFO } //------------------------------------------------------------------------ diff --git a/src/jit/scopeinfo.cpp b/src/jit/scopeinfo.cpp index 3a47a32..9e8d6b9 100644 --- a/src/jit/scopeinfo.cpp +++ b/src/jit/scopeinfo.cpp @@ -131,30 +131,6 @@ bool CodeGenInterface::siVarLoc::vlIsOnStk(regNumber reg, signed offset) const } //------------------------------------------------------------------------ -// siVarLoc: Non-empty constructor of siVarLoc struct -// Arguments: -// varDsc - a "LclVarDsc *" to the variable it is desired to build the "siVarLoc". -// baseReg - a "regNumber" use as a base for the offset. -// offset - a signed amount of bytes distance from "baseReg" for the position of the variable. -// isFramePointerUsed - a boolean variable -// -// Notes: -// Called for every psiScope in "psiScopeList" codegen.h -CodeGenInterface::siVarLoc::siVarLoc(const LclVarDsc* varDsc, regNumber baseReg, int offset, bool isFramePointerUsed) -{ - var_types type = genActualType(varDsc->TypeGet()); - - if (varDsc->lvIsInReg()) - { - siFillRegisterVarLoc(varDsc, type, baseReg, offset, isFramePointerUsed); - } - else - { - siFillStackVarLoc(varDsc, type, baseReg, offset, isFramePointerUsed); - } -} - -//------------------------------------------------------------------------ // Equals: Compares first reference and then values of the structures. // // Arguments: @@ -228,65 +204,6 @@ bool CodeGenInterface::siVarLoc::Equals(const siVarLoc* lhs, const siVarLoc* rhs } //------------------------------------------------------------------------ -// getSiVarLoc: Creates a "CodegenInterface::siVarLoc" instance from using the properties -// of the "psiScope" instance. -// -// Notes: -// Called for every psiScope in "psiScopeList" codegen.h -CodeGenInterface::siVarLoc CodeGen::psiScope::getSiVarLoc() const -{ - CodeGenInterface::siVarLoc varLoc; - - if (scRegister) - { - varLoc.vlType = VLT_REG; - varLoc.vlReg.vlrReg = (regNumber)u1.scRegNum; - } - else - { - varLoc.vlType = VLT_STK; - varLoc.vlStk.vlsBaseReg = (regNumber)u2.scBaseReg; - varLoc.vlStk.vlsOffset = u2.scOffset; - } - - return varLoc; -} - -//------------------------------------------------------------------------ -// getSiVarLoc: Returns a "siVarLoc" instance representing the place where the variable -// is given its description, "baseReg", and "offset" (if needed). -// -// Arguments: -// varDsc - a "LclVarDsc *" to the variable it is desired to build the "siVarLoc". -// scope - a "siScope" Scope info of the variable. -// -// Return Value: -// A "siVarLoc" filled with the correct case struct fields for the variable, which could live -// in a register, an stack position, or a combination of both. -// -// Notes: -// Called for each siScope in siScopeList when "genSetScopeInfo". -CodeGenInterface::siVarLoc CodeGen::getSiVarLoc(const LclVarDsc* varDsc, const siScope* scope) const -{ - // For stack vars, find the base register, and offset - - regNumber baseReg; - signed offset = varDsc->lvStkOffs; - - if (!varDsc->lvFramePointerBased) - { - baseReg = REG_SPBASE; - offset += scope->scStackLevel; - } - else - { - baseReg = REG_FPBASE; - } - - return CodeGenInterface::siVarLoc(varDsc, baseReg, offset, isFramePointerUsed()); -} - -//------------------------------------------------------------------------ // siFillStackVarLoc: Fill "siVarLoc" struct indicating the stack position of the variable // using "LclVarDsc" and "baseReg"/"offset". // @@ -471,6 +388,90 @@ void CodeGenInterface::siVarLoc::siFillRegisterVarLoc( } } +//------------------------------------------------------------------------ +// siVarLoc: Non-empty constructor of siVarLoc struct +// Arguments: +// varDsc - a "LclVarDsc *" to the variable it is desired to build the "siVarLoc". +// baseReg - a "regNumber" use as a base for the offset. +// offset - a signed amount of bytes distance from "baseReg" for the position of the variable. +// isFramePointerUsed - a boolean variable +// +// Notes: +// Called for every psiScope in "psiScopeList" codegen.h +CodeGenInterface::siVarLoc::siVarLoc(const LclVarDsc* varDsc, regNumber baseReg, int offset, bool isFramePointerUsed) +{ + var_types type = genActualType(varDsc->TypeGet()); + + if (varDsc->lvIsInReg()) + { + siFillRegisterVarLoc(varDsc, type, baseReg, offset, isFramePointerUsed); + } + else + { + siFillStackVarLoc(varDsc, type, baseReg, offset, isFramePointerUsed); + } +} + +#ifdef USING_SCOPE_INFO +//------------------------------------------------------------------------ +// getSiVarLoc: Returns a "siVarLoc" instance representing the place where the variable +// is given its description, "baseReg", and "offset" (if needed). +// +// Arguments: +// varDsc - a "LclVarDsc *" to the variable it is desired to build the "siVarLoc". +// scope - a "siScope" Scope info of the variable. +// +// Return Value: +// A "siVarLoc" filled with the correct case struct fields for the variable, which could live +// in a register, an stack position, or a combination of both. +// +// Notes: +// Called for each siScope in siScopeList when "genSetScopeInfo". +CodeGenInterface::siVarLoc CodeGen::getSiVarLoc(const LclVarDsc* varDsc, const siScope* scope) const +{ + // For stack vars, find the base register, and offset + + regNumber baseReg; + signed offset = varDsc->lvStkOffs; + + if (!varDsc->lvFramePointerBased) + { + baseReg = REG_SPBASE; + offset += scope->scStackLevel; + } + else + { + baseReg = REG_FPBASE; + } + + return CodeGenInterface::siVarLoc(varDsc, baseReg, offset, isFramePointerUsed()); +} + +//------------------------------------------------------------------------ +// getSiVarLoc: Creates a "CodegenInterface::siVarLoc" instance from using the properties +// of the "psiScope" instance. +// +// Notes: +// Called for every psiScope in "psiScopeList" codegen.h +CodeGenInterface::siVarLoc CodeGen::psiScope::getSiVarLoc() const +{ + CodeGenInterface::siVarLoc varLoc; + + if (scRegister) + { + varLoc.vlType = VLT_REG; + varLoc.vlReg.vlrReg = (regNumber)u1.scRegNum; + } + else + { + varLoc.vlType = VLT_STK; + varLoc.vlStk.vlsBaseReg = (regNumber)u2.scBaseReg; + varLoc.vlStk.vlsOffset = u2.scOffset; + } + + return varLoc; +} + /*============================================================================ * * Implementation for ScopeInfo @@ -1613,3 +1614,4 @@ void CodeGen::psiEndProlog() psiEndPrologScope(scope); } } +#endif // USING_SCOPE_INFO diff --git a/src/jit/treelifeupdater.cpp b/src/jit/treelifeupdater.cpp index ecfdaee..d5e3ad9 100644 --- a/src/jit/treelifeupdater.cpp +++ b/src/jit/treelifeupdater.cpp @@ -245,8 +245,9 @@ void TreeLifeUpdater::UpdateLifeVar(GenTree* tree) } #endif // DEBUG } - +#ifdef USING_SCOPE_INFO compiler->codeGen->siUpdate(); +#endif // USING_SCOPE_INFO } } -- 2.7.4