Fix disassembler choking on long names

This commit is contained in:
drmortalwombat 2022-04-12 18:22:38 +02:00
parent 6331ec5707
commit 1ee7845bb4
3 changed files with 56 additions and 14 deletions

View File

@ -59,7 +59,7 @@ const char* ByteCodeDisassembler::AddrName(int addr, char* buffer, Linker* linke
LinkerObject* obj = linker->FindObjectByAddr(addr);
if (obj && obj->mIdent)
{
sprintf_s(buffer, 40, "%s + %d", obj->mIdent->mString, addr - obj->mAddress);
sprintf_s(buffer, 160, "%s + %d", obj->mIdent->mString, addr - obj->mAddress);
return buffer;
}
}
@ -76,7 +76,7 @@ void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int bank
else if (ident)
fprintf(file, "%s:\n", ident->mString);
char tbuffer[100], abuffer[100];
char tbuffer[160], abuffer[160];
#if 0
for (int i = 0; i < proc->mTemporaries.Size(); i++)
printf("T%d = $%.2x\n", i, BC_REG_TMP + proc->mTempOffset[i]);
@ -674,7 +674,7 @@ void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int ba
else if (ident)
fprintf(file, "%s:\n", ident->mString);
char tbuffer[100], abuffer[100];
char tbuffer[160], abuffer[160];
int ip = start;
while (ip < start + size)
@ -756,7 +756,7 @@ const char* NativeCodeDisassembler::AddrName(int addr, char* buffer, Linker* lin
LinkerObject* obj = linker->FindObjectByAddr(addr);
if (obj && obj->mIdent)
{
sprintf_s(buffer, 40, "; (%s + %d)", obj->mIdent->mString, addr - obj->mAddress);
sprintf_s(buffer, 160, "; (%s + %d)", obj->mIdent->mString, addr - obj->mAddress);
return buffer;
}
}

View File

@ -13172,7 +13172,7 @@ bool NativeCodeBasicBlock::MoveLoadImmStoreAbsoluteUp(int at)
}
j--;
}
else if (mIns[j - 1].mType == ASMIT_STA && mIns[j - 1].mMode == mIns[at + 1].mMode && mIns[j - 1].mLinkerObject == mIns[at + 1].mLinkerObject && mIns[j - 1].mAddress != mIns[at + 1].mAddress)
else if (mIns[j - 1].mType == ASMIT_STA && mIns[j - 1].mMode == mIns[at + 1].mMode && !(mIns[j - 1].mLinkerObject == mIns[at + 1].mLinkerObject && mIns[j - 1].mAddress == mIns[at + 1].mAddress))
j--;
else
return false;
@ -16785,7 +16785,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
for (int i = 2; i + 1 < mIns.Size(); i++)
{
if (mIns[i + 0].mType == ASMIT_LDA && (mIns[i + 0].mMode == ASMIM_IMMEDIATE || mIns[i + 0].mMode == ASMIM_ZERO_PAGE) &&
mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ABSOLUTE || mIns[i + 1].mMode == ASMIM_ZERO_PAGE))
mIns[i + 1].mType == ASMIT_STA && (mIns[i + 1].mMode == ASMIM_ABSOLUTE || mIns[i + 1].mMode == ASMIM_ZERO_PAGE) && !(mIns[i + 1].mFlags & NCIF_VOLATILE))
{
if (MoveLoadImmStoreAbsoluteUp(i + 0))
changed = true;
@ -17291,6 +17291,23 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
mIns[i + 1].mType = ASMIT_STA;
progress = true;
}
else if (
mIns[i + 0].mType == ASMIT_ROL && mIns[i + 0].mMode == ASMIM_IMPLIED &&
mIns[i + 1].mType == ASMIT_LSR && mIns[i + 1].mMode == ASMIM_IMPLIED && !(mIns[i + 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z)))
{
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true;
}
else if (
mIns[i + 0].mType == ASMIT_ROR && mIns[i + 0].mMode == ASMIM_IMPLIED &&
mIns[i + 1].mType == ASMIT_ASL && mIns[i + 1].mMode == ASMIM_IMPLIED && !(mIns[i + 1].mLive & (LIVE_CPU_REG_A | LIVE_CPU_REG_Z)))
{
mIns[i + 0].mType = ASMIT_NOP; mIns[i + 0].mMode = ASMIM_IMPLIED;
mIns[i + 1].mType = ASMIT_NOP; mIns[i + 1].mMode = ASMIM_IMPLIED;
progress = true;
}
else if (
mIns[i + 0].mType == ASMIT_TXA &&
mIns[i + 1].mType == ASMIT_TAX)
@ -18974,7 +18991,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
else if (
mIns[i + 0].IsShift() && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
mIns[i + 1].mType == ASMIT_CLC &&
mIns[i + 2].mType == ASMIT_LDA && (mIns[i + 2].mMode == ASMIM_IMMEDIATE || mIns[i + 2].mMode == ASMIM_IMMEDIATE_ADDRESS) &&
mIns[i + 2].mType == ASMIT_LDA && (mIns[i + 2].mMode == ASMIM_IMMEDIATE || mIns[i + 2].mMode == ASMIM_IMMEDIATE_ADDRESS || mIns[i + 2].mMode == ASMIM_ZERO_PAGE && mIns[i + 2].mAddress != mIns[i + 0].mAddress) &&
mIns[i + 3].mType == ASMIT_ADC && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && mIns[i + 3].mAddress == mIns[i + 0].mAddress &&
!(mIns[i + 3].mLive & LIVE_MEM))
{

View File

@ -3347,6 +3347,7 @@ void Parser::ParsePragma(void)
int flags = 0;
Expression* exp;
Declaration* dstart = nullptr, * dend = nullptr;
LinkerSectionType type = LST_DATA;
ConsumeToken(TK_COMMA);
@ -3357,22 +3358,46 @@ void Parser::ParsePragma(void)
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Integer number for flags expected");
if (ConsumeTokenIf(TK_COMMA))
{
if (mScanner->mToken != TK_COMMA)
{
exp = ParseExpression();
if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE)
dstart = exp->mDecValue;
}
if (ConsumeTokenIf(TK_COMMA))
{
if (mScanner->mToken != TK_COMMA)
{
exp = ParseExpression();
if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE)
dend = exp->mDecValue;
}
if (ConsumeTokenIf(TK_COMMA))
{
if (mScanner->mToken == TK_IDENT)
{
if (!strcmp(mScanner->mTokenIdent->mString, "bss"))
type = LST_BSS;
else if (!strcmp(mScanner->mTokenIdent->mString, "data"))
type = LST_DATA;
else
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Unknown section type");
}
else
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Identifier expected");
mScanner->NextToken();
}
}
}
LinkerSection* lsec = mCompilationUnits->mLinker->FindSection(sectionIdent);
if (!lsec)
lsec = mCompilationUnits->mLinker->AddSection(sectionIdent, LST_DATA);
lsec = mCompilationUnits->mLinker->AddSection(sectionIdent, type);
if (dstart)
{