Optimize simple virtual with const return to table lookup
This commit is contained in:
parent
6ff2409596
commit
07dc6dc4db
|
@ -244,6 +244,21 @@ void Compiler::CompleteTemplateExpansion(void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsSimpleConstReturn(Declaration * mdec)
|
||||||
|
{
|
||||||
|
if (mdec->mBase->mBase->IsSimpleType() && mdec->mBase->mParams->mNext == nullptr)
|
||||||
|
{
|
||||||
|
Expression* ex = mdec->mValue;
|
||||||
|
if (ex->mType == EX_SCOPE)
|
||||||
|
ex = ex->mLeft;
|
||||||
|
|
||||||
|
if (ex->mType == EX_RETURN && ex->mLeft->mType == EX_CONSTANT)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void Compiler::BuildVTables(void)
|
void Compiler::BuildVTables(void)
|
||||||
{
|
{
|
||||||
// Connect vdecs with parents
|
// Connect vdecs with parents
|
||||||
|
@ -279,74 +294,153 @@ void Compiler::BuildVTables(void)
|
||||||
{
|
{
|
||||||
vdec->mScope->Iterate([=](const Ident* mident, Declaration* mdec)
|
vdec->mScope->Iterate([=](const Ident* mident, Declaration* mdec)
|
||||||
{
|
{
|
||||||
Declaration* vtabt = new Declaration(mdec->mLocation, DT_TYPE_ARRAY);
|
bool simpleConst = vdec->mSize > 0;
|
||||||
vtabt->mBase = mdec->mBase->ToStriped(vdec->mSize);
|
|
||||||
vtabt->mSize = vdec->mSize * 2;
|
|
||||||
vtabt->mStride = 1;
|
|
||||||
vtabt->mStripe = 1;
|
|
||||||
vtabt->mFlags |= DTF_CONST | DTF_DEFINED;
|
|
||||||
|
|
||||||
Declaration* vtaba = new Declaration(mdec->mLocation, DT_VARIABLE);
|
|
||||||
vtaba->mFlags = DTF_CONST | DTF_GLOBAL | DTF_DEFINED;
|
|
||||||
vtaba->mBase = vtabt;
|
|
||||||
vtaba->mSize = vtabt->mSize;
|
|
||||||
vtaba->mValue = new Expression(mdec->mLocation, EX_CONSTANT);
|
|
||||||
vtaba->mValue->mDecType = vtabt;
|
|
||||||
vtaba->mValue->mDecValue = new Declaration(mdec->mLocation, DT_CONST_STRUCT);
|
|
||||||
vtaba->mIdent = mdec->mIdent;
|
|
||||||
vtaba->mQualIdent = mdec->mQualIdent->Mangle("$vtable");
|
|
||||||
vtaba->mSection = mdec->mSection;
|
|
||||||
vtaba->mOffset = - vdec->mVarIndex;
|
|
||||||
|
|
||||||
Declaration* last = nullptr;
|
|
||||||
|
|
||||||
for (int i = 0; i < vdec->mSize; i++)
|
for (int i = 0; i < vdec->mSize; i++)
|
||||||
|
if (!IsSimpleConstReturn(mdec->mCalled[i]))
|
||||||
|
simpleConst = false;
|
||||||
|
|
||||||
|
if (simpleConst)
|
||||||
{
|
{
|
||||||
Declaration* vmdec = mdec->mCalled[i];
|
Declaration* vtabt = new Declaration(mdec->mLocation, DT_TYPE_ARRAY);
|
||||||
|
vtabt->mBase = mdec->mBase->mBase->ToConstType()->ToStriped(vdec->mSize);
|
||||||
|
vtabt->mSize = vdec->mSize * mdec->mBase->mBase->mSize;
|
||||||
|
vtabt->mStride = 1;
|
||||||
|
vtabt->mStripe = 1;
|
||||||
|
vtabt->mFlags |= DTF_CONST | DTF_DEFINED;
|
||||||
|
|
||||||
Expression* texp = new Expression(vmdec->mLocation, EX_CONSTANT);
|
Declaration* vtaba = new Declaration(mdec->mLocation, DT_VARIABLE);
|
||||||
texp->mDecType = vtabt->mBase;
|
vtaba->mFlags = DTF_CONST | DTF_GLOBAL | DTF_DEFINED;
|
||||||
texp->mDecValue = vmdec;
|
vtaba->mBase = vtabt;
|
||||||
|
vtaba->mSize = vtabt->mSize;
|
||||||
|
vtaba->mValue = new Expression(mdec->mLocation, EX_CONSTANT);
|
||||||
|
vtaba->mValue->mDecType = vtabt;
|
||||||
|
vtaba->mValue->mDecValue = new Declaration(mdec->mLocation, DT_CONST_STRUCT);
|
||||||
|
vtaba->mIdent = mdec->mIdent;
|
||||||
|
vtaba->mQualIdent = mdec->mQualIdent->Mangle("$vltable");
|
||||||
|
vtaba->mSection = mdec->mSection;
|
||||||
|
vtaba->mOffset = -vdec->mVarIndex;
|
||||||
|
|
||||||
Declaration* cdec = new Declaration(vmdec->mLocation, DT_CONST_POINTER);
|
Declaration* last = nullptr;
|
||||||
cdec->mValue = texp;
|
|
||||||
cdec->mBase = vtabt->mBase;
|
|
||||||
cdec->mOffset = i;
|
|
||||||
|
|
||||||
if (last)
|
for (int i = 0; i < vdec->mSize; i++)
|
||||||
last->mNext = cdec;
|
{
|
||||||
else
|
Declaration* vmdec = mdec->mCalled[i];
|
||||||
vtaba->mValue->mDecValue->mParams = cdec;
|
|
||||||
last = cdec;
|
Expression* texp = vmdec->mValue;
|
||||||
|
if (texp->mType == EX_SCOPE)
|
||||||
|
texp = texp->mLeft;
|
||||||
|
texp = texp->mLeft;
|
||||||
|
|
||||||
|
Declaration* cdec = texp->mDecValue->Clone();
|
||||||
|
cdec->mOffset = i;
|
||||||
|
|
||||||
|
if (last)
|
||||||
|
last->mNext = cdec;
|
||||||
|
else
|
||||||
|
vtaba->mValue->mDecValue->mParams = cdec;
|
||||||
|
last = cdec;
|
||||||
|
}
|
||||||
|
|
||||||
|
Expression* vexp = new Expression(mdec->mLocation, EX_QUALIFY);
|
||||||
|
vexp->mLeft = new Expression(mdec->mLocation, EX_PREFIX);
|
||||||
|
vexp->mLeft->mDecType = mdec->mBase->mParams->mBase->mBase;
|
||||||
|
vexp->mLeft->mToken = TK_MUL;
|
||||||
|
vexp->mLeft->mLeft = new Expression(mdec->mLocation, EX_VARIABLE);
|
||||||
|
vexp->mLeft->mLeft->mDecType = mdec->mBase->mParams->mBase;
|
||||||
|
vexp->mLeft->mLeft->mDecValue = mdec->mBase->mParams;
|
||||||
|
|
||||||
|
vexp->mDecValue = new Declaration(mdec->mLocation, DT_ELEMENT);
|
||||||
|
vexp->mDecValue->mBase = TheCharTypeDeclaration;
|
||||||
|
vexp->mDecValue->mOffset = vdec->mOffset;
|
||||||
|
vexp->mDecValue->mSize = 1;
|
||||||
|
vexp->mDecType = TheCharTypeDeclaration;
|
||||||
|
|
||||||
|
Expression* ecall = new Expression(mdec->mLocation, EX_RETURN);
|
||||||
|
ecall->mLeft = new Expression(mdec->mLocation, EX_INDEX);
|
||||||
|
ecall->mLeft->mDecType = mdec->mBase->mBase;
|
||||||
|
ecall->mDecType = mdec->mBase->mBase;
|
||||||
|
ecall->mLeft->mLeft = new Expression(mdec->mLocation, EX_VARIABLE);
|
||||||
|
ecall->mLeft->mLeft->mDecType = vtabt;
|
||||||
|
ecall->mLeft->mLeft->mDecValue = vtaba;
|
||||||
|
ecall->mLeft->mRight = vexp;
|
||||||
|
|
||||||
|
mdec->mCalled.SetSize(0);
|
||||||
|
|
||||||
|
mdec->mFlags |= DTF_DEFINED;
|
||||||
|
mdec->mBase->mFlags &= ~DTF_VIRTUAL;
|
||||||
|
mdec->mValue = ecall;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Declaration* vtabt = new Declaration(mdec->mLocation, DT_TYPE_ARRAY);
|
||||||
|
vtabt->mBase = mdec->mBase->ToStriped(vdec->mSize);
|
||||||
|
vtabt->mSize = vdec->mSize * 2;
|
||||||
|
vtabt->mStride = 1;
|
||||||
|
vtabt->mStripe = 1;
|
||||||
|
vtabt->mFlags |= DTF_CONST | DTF_DEFINED;
|
||||||
|
|
||||||
// mCompilationUnits->AddReferenced(vtaba);
|
Declaration* vtaba = new Declaration(mdec->mLocation, DT_VARIABLE);
|
||||||
|
vtaba->mFlags = DTF_CONST | DTF_GLOBAL | DTF_DEFINED;
|
||||||
|
vtaba->mBase = vtabt;
|
||||||
|
vtaba->mSize = vtabt->mSize;
|
||||||
|
vtaba->mValue = new Expression(mdec->mLocation, EX_CONSTANT);
|
||||||
|
vtaba->mValue->mDecType = vtabt;
|
||||||
|
vtaba->mValue->mDecValue = new Declaration(mdec->mLocation, DT_CONST_STRUCT);
|
||||||
|
vtaba->mIdent = mdec->mIdent;
|
||||||
|
vtaba->mQualIdent = mdec->mQualIdent->Mangle("$vtable");
|
||||||
|
vtaba->mSection = mdec->mSection;
|
||||||
|
vtaba->mOffset = -vdec->mVarIndex;
|
||||||
|
|
||||||
Expression* vexp = new Expression(mdec->mLocation, EX_QUALIFY);
|
Declaration* last = nullptr;
|
||||||
vexp->mLeft = new Expression(mdec->mLocation, EX_PREFIX);
|
|
||||||
vexp->mLeft->mDecType = mdec->mBase->mParams->mBase->mBase;
|
|
||||||
vexp->mLeft->mToken = TK_MUL;
|
|
||||||
vexp->mLeft->mLeft = new Expression(mdec->mLocation, EX_VARIABLE);
|
|
||||||
vexp->mLeft->mLeft->mDecType = mdec->mBase->mParams->mBase;
|
|
||||||
vexp->mLeft->mLeft->mDecValue = mdec->mBase->mParams;
|
|
||||||
|
|
||||||
vexp->mDecValue = new Declaration(mdec->mLocation, DT_ELEMENT);
|
for (int i = 0; i < vdec->mSize; i++)
|
||||||
vexp->mDecValue->mBase = TheCharTypeDeclaration;
|
{
|
||||||
vexp->mDecValue->mOffset = vdec->mOffset;
|
Declaration* vmdec = mdec->mCalled[i];
|
||||||
vexp->mDecValue->mSize = 1;
|
|
||||||
vexp->mDecType = TheCharTypeDeclaration;
|
|
||||||
|
|
||||||
Expression* ecall = new Expression(mdec->mLocation, EX_DISPATCH);
|
Expression* texp = new Expression(vmdec->mLocation, EX_CONSTANT);
|
||||||
ecall->mLeft = new Expression(mdec->mLocation, EX_INDEX);
|
texp->mDecType = vtabt->mBase;
|
||||||
ecall->mLeft->mDecType = mdec->mBase;
|
texp->mDecValue = vmdec;
|
||||||
ecall->mDecType = vtabt->mBase;
|
|
||||||
ecall->mLeft->mLeft = new Expression(mdec->mLocation, EX_VARIABLE);
|
|
||||||
ecall->mLeft->mLeft->mDecType = vtabt;
|
|
||||||
ecall->mLeft->mLeft->mDecValue = vtaba;
|
|
||||||
ecall->mLeft->mRight = vexp;
|
|
||||||
|
|
||||||
mdec->mFlags |= DTF_DEFINED;
|
Declaration* cdec = new Declaration(vmdec->mLocation, DT_CONST_POINTER);
|
||||||
mdec->mValue = ecall;
|
cdec->mValue = texp;
|
||||||
|
cdec->mBase = vtabt->mBase;
|
||||||
|
cdec->mOffset = i;
|
||||||
|
|
||||||
|
if (last)
|
||||||
|
last->mNext = cdec;
|
||||||
|
else
|
||||||
|
vtaba->mValue->mDecValue->mParams = cdec;
|
||||||
|
last = cdec;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mCompilationUnits->AddReferenced(vtaba);
|
||||||
|
|
||||||
|
Expression* vexp = new Expression(mdec->mLocation, EX_QUALIFY);
|
||||||
|
vexp->mLeft = new Expression(mdec->mLocation, EX_PREFIX);
|
||||||
|
vexp->mLeft->mDecType = mdec->mBase->mParams->mBase->mBase;
|
||||||
|
vexp->mLeft->mToken = TK_MUL;
|
||||||
|
vexp->mLeft->mLeft = new Expression(mdec->mLocation, EX_VARIABLE);
|
||||||
|
vexp->mLeft->mLeft->mDecType = mdec->mBase->mParams->mBase;
|
||||||
|
vexp->mLeft->mLeft->mDecValue = mdec->mBase->mParams;
|
||||||
|
|
||||||
|
vexp->mDecValue = new Declaration(mdec->mLocation, DT_ELEMENT);
|
||||||
|
vexp->mDecValue->mBase = TheCharTypeDeclaration;
|
||||||
|
vexp->mDecValue->mOffset = vdec->mOffset;
|
||||||
|
vexp->mDecValue->mSize = 1;
|
||||||
|
vexp->mDecType = TheCharTypeDeclaration;
|
||||||
|
|
||||||
|
Expression* ecall = new Expression(mdec->mLocation, EX_DISPATCH);
|
||||||
|
ecall->mLeft = new Expression(mdec->mLocation, EX_INDEX);
|
||||||
|
ecall->mLeft->mDecType = mdec->mBase;
|
||||||
|
ecall->mDecType = vtabt->mBase;
|
||||||
|
ecall->mLeft->mLeft = new Expression(mdec->mLocation, EX_VARIABLE);
|
||||||
|
ecall->mLeft->mLeft->mDecType = vtabt;
|
||||||
|
ecall->mLeft->mLeft->mDecValue = vtaba;
|
||||||
|
ecall->mLeft->mRight = vexp;
|
||||||
|
|
||||||
|
mdec->mFlags |= DTF_DEFINED;
|
||||||
|
mdec->mValue = ecall;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1244,6 +1244,11 @@ Declaration* Declaration::Clone(void)
|
||||||
ndec->mAlignment = mAlignment;
|
ndec->mAlignment = mAlignment;
|
||||||
ndec->mSection = mSection;
|
ndec->mSection = mSection;
|
||||||
ndec->mVTable = mVTable;
|
ndec->mVTable = mVTable;
|
||||||
|
ndec->mInteger = mInteger;
|
||||||
|
ndec->mNumber = mNumber;
|
||||||
|
ndec->mMinValue = mMinValue;
|
||||||
|
ndec->mMaxValue = mMaxValue;
|
||||||
|
ndec->mCompilerOptions = mCompilerOptions;
|
||||||
|
|
||||||
return ndec;
|
return ndec;
|
||||||
}
|
}
|
||||||
|
|
|
@ -801,7 +801,7 @@ const char* NativeCodeDisassembler::AddrName(int bank, int addr, char* buffer, I
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i < obj->mRanges.Size() && (addr - obj->mAddress < obj->mRanges[i].mOffset || addr - obj->mAddress - obj->mRanges[i].mOffset >= obj->mRanges[i].mSize))
|
while (i < obj->mRanges.Size() && (addr - obj->mAddress < obj->mRanges[i].mOffset || addr - obj->mAddress - obj->mRanges[i].mOffset >= obj->mRanges[i].mSize))
|
||||||
i++;
|
i++;
|
||||||
if (i < obj->mRanges.Size())
|
if (i < obj->mRanges.Size() && obj->mRanges[i].mIdent)
|
||||||
sprintf_s(buffer, 160, "; (%s.%s + %d)", obj->mIdent->mString, obj->mRanges[i].mIdent->mString, addr - obj->mAddress - obj->mRanges[i].mOffset);
|
sprintf_s(buffer, 160, "; (%s.%s + %d)", obj->mIdent->mString, obj->mRanges[i].mIdent->mString, addr - obj->mAddress - obj->mRanges[i].mOffset);
|
||||||
else
|
else
|
||||||
sprintf_s(buffer, 160, "; (%s + %d)", obj->mIdent->mString, addr - obj->mAddress);
|
sprintf_s(buffer, 160, "; (%s + %d)", obj->mIdent->mString, addr - obj->mAddress);
|
||||||
|
|
Loading…
Reference in New Issue