fix mixup of stack and fast call in virtual function parameter offsets

This commit is contained in:
drmortalwombat 2025-05-01 10:21:35 +02:00
parent 6caed58be4
commit 347898ea53
2 changed files with 23 additions and 5 deletions

View File

@ -393,7 +393,7 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
if (procDec->mValue && procDec->mValue->mType == EX_DISPATCH)
{
Declaration* maxf = nullptr;
Declaration* maxf = nullptr, * reff = nullptr;
bool stackCall = false;
@ -402,7 +402,10 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
Declaration* cf = procDec->mCalled[i];
if (cf->mBase->mFlags & DTF_STACKCALL)
{
stackCall = true;
reff = cf;
}
if (!maxf)
maxf = cf;
@ -410,6 +413,9 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
maxf = cf;
}
if (!reff)
reff = maxf;
for (int i = 0; i < procDec->mCalled.Size(); i++)
{
Declaration* cf = procDec->mCalled[i];
@ -420,9 +426,9 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
cf->mBase->mFlags |= DTF_STACKCALL;
}
if (cf != maxf)
if (cf != reff)
{
Declaration* fp = cf->mBase->mParams, * mp = maxf->mBase->mParams;
Declaration* fp = cf->mBase->mParams, * mp = reff->mBase->mParams;
while (fp)
{
fp->mVarIndex = mp->mVarIndex;
@ -431,10 +437,11 @@ void GlobalAnalyzer::CheckFastcall(Declaration* procDec, bool head)
}
assert(!mp);
cf->mBase->mFastCallBase = cf->mFastCallBase = maxf->mBase->mFastCallBase;
cf->mBase->mFastCallSize = cf->mFastCallSize = maxf->mBase->mFastCallSize;
}
if (cf != maxf)
cf->mBase->mFastCallBase = cf->mFastCallBase = maxf->mBase->mFastCallBase;
}
procDec->mFastCallBase = procDec->mBase->mFastCallBase;

View File

@ -23229,7 +23229,15 @@ bool NativeCodeBasicBlock::LoopRegisterXYMap(void)
{
pblock->mIns.Push(NativeCodeInstruction(pblock->mBranchIns, ASMIT_LDX, ASMIM_ZERO_PAGE, mini));
if (pblock->mExitRequiredRegs[CPU_REG_Z])
{
int i = pblock->mIns.Size() - 1;
while (i >= 0 && !(pblock->mIns[i].ChangesAccu()))
{
pblock->mIns[i].mLive |= LIVE_CPU_REG_A;
i--;
}
pblock->mIns.Push(NativeCodeInstruction(pblock->mBranchIns, ASMIT_ORA, ASMIM_IMMEDIATE, 0));
}
pblock->mExitRequiredRegs += CPU_REG_X;
for (int i = 0; i < eblocks.Size(); i++)
@ -55417,6 +55425,9 @@ void NativeCodeProcedure::Optimize(void)
if (!changed && mEntryBlock->LoopRegisterXYMap())
changed = true;
#endif
CheckBlocks(true);
ResetVisited();
if (!changed && mEntryBlock->OptimizeGenericLoop(this))
changed = true;