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

View File

@ -13172,7 +13172,7 @@ bool NativeCodeBasicBlock::MoveLoadImmStoreAbsoluteUp(int at)
} }
j--; 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--; j--;
else else
return false; return false;
@ -16785,7 +16785,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
for (int i = 2; i + 1 < mIns.Size(); i++) 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) && 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)) if (MoveLoadImmStoreAbsoluteUp(i + 0))
changed = true; changed = true;
@ -17291,6 +17291,23 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
mIns[i + 1].mType = ASMIT_STA; mIns[i + 1].mType = ASMIT_STA;
progress = true; 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 ( else if (
mIns[i + 0].mType == ASMIT_TXA && mIns[i + 0].mType == ASMIT_TXA &&
mIns[i + 1].mType == ASMIT_TAX) mIns[i + 1].mType == ASMIT_TAX)
@ -18974,7 +18991,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass
else if ( else if (
mIns[i + 0].IsShift() && mIns[i + 0].mMode == ASMIM_ZERO_PAGE && mIns[i + 0].IsShift() && mIns[i + 0].mMode == ASMIM_ZERO_PAGE &&
mIns[i + 1].mType == ASMIT_CLC && 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].mType == ASMIT_ADC && mIns[i + 3].mMode == ASMIM_ZERO_PAGE && mIns[i + 3].mAddress == mIns[i + 0].mAddress &&
!(mIns[i + 3].mLive & LIVE_MEM)) !(mIns[i + 3].mLive & LIVE_MEM))
{ {

View File

@ -3347,6 +3347,7 @@ void Parser::ParsePragma(void)
int flags = 0; int flags = 0;
Expression* exp; Expression* exp;
Declaration* dstart = nullptr, * dend = nullptr; Declaration* dstart = nullptr, * dend = nullptr;
LinkerSectionType type = LST_DATA;
ConsumeToken(TK_COMMA); ConsumeToken(TK_COMMA);
@ -3357,22 +3358,46 @@ void Parser::ParsePragma(void)
mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Integer number for flags expected"); mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Integer number for flags expected");
if (ConsumeTokenIf(TK_COMMA)) if (ConsumeTokenIf(TK_COMMA))
{
if (mScanner->mToken != TK_COMMA)
{ {
exp = ParseExpression(); exp = ParseExpression();
if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE) if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE)
dstart = exp->mDecValue; dstart = exp->mDecValue;
}
if (ConsumeTokenIf(TK_COMMA)) if (ConsumeTokenIf(TK_COMMA))
{
if (mScanner->mToken != TK_COMMA)
{ {
exp = ParseExpression(); exp = ParseExpression();
if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE) if (exp->mDecValue && exp->mDecValue->mType == DT_VARIABLE)
dend = exp->mDecValue; 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); LinkerSection* lsec = mCompilationUnits->mLinker->FindSection(sectionIdent);
if (!lsec) if (!lsec)
lsec = mCompilationUnits->mLinker->AddSection(sectionIdent, LST_DATA); lsec = mCompilationUnits->mLinker->AddSection(sectionIdent, type);
if (dstart) if (dstart)
{ {