Add error message on crash, fix infinite loop, extend asm listing

This commit is contained in:
drmortalwombat 2022-02-02 08:58:35 +01:00
parent ce6714006c
commit c6133ce7c0
9 changed files with 134 additions and 33 deletions

View File

@ -603,6 +603,44 @@ NativeCodeDisassembler::~NativeCodeDisassembler(void)
} }
void NativeCodeDisassembler::DumpMemory(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker)
{
fprintf(file, "--------------------------------------------------------------------\n");
if (proc && proc->mIdent)
fprintf(file, "%s:\n", proc->mIdent->mString);
else if (ident)
fprintf(file, "%s:\n", ident->mString);
char tbuffer[10], abuffer[100];
int ip = start;
while (ip < start + size)
{
int n = 16;
if (ip + n > start + size)
n = start + size - ip;
fprintf(file, "%04x : __ __ __ BYT", ip);
for (int i = 0; i < n; i++)
fprintf(file, " %02x", memory[ip + i]);
for(int i=n; i<16; i++)
fprintf(file, " ");
fprintf(file, " : ");
for (int i = 0; i < n; i++)
{
int k = memory[ip + i];
if (k >= 32 && k < 128)
fprintf(file, "%c", k);
else
fprintf(file, ".");
}
fprintf(file, "\n");
ip += n;
}
}
void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident * ident, Linker* linker) void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident * ident, Linker* linker)
{ {
fprintf(file, "--------------------------------------------------------------------\n"); fprintf(file, "--------------------------------------------------------------------\n");

View File

@ -27,6 +27,7 @@ public:
~NativeCodeDisassembler(void); ~NativeCodeDisassembler(void);
void Disassemble(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker); void Disassemble(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker);
void DumpMemory(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker);
protected: protected:
const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc); const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc);
const char* AddrName(int addr, char* buffer, Linker* linker); const char* AddrName(int addr, char* buffer, Linker* linker);

View File

@ -4579,12 +4579,48 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(void)
if (sz >= 2) if (sz >= 2)
{ {
if (mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_RELATIONAL_OPERATOR && mInstructions[sz - 1]->mSrc[0].mTemp == mInstructions[sz - 2]->mDst.mTemp) if (mInstructions[sz - 1]->mCode == IC_BRANCH && mInstructions[sz - 2]->mCode == IC_RELATIONAL_OPERATOR &&
mInstructions[sz - 1]->mSrc[0].mTemp == mInstructions[sz - 2]->mDst.mTemp && IsIntegerType(mInstructions[sz - 2]->mSrc[0].mType))
{ {
int s1 = mInstructions[sz - 2]->mSrc[1].mTemp, s0 = mInstructions[sz - 2]->mSrc[0].mTemp; int s1 = mInstructions[sz - 2]->mSrc[1].mTemp, s0 = mInstructions[sz - 2]->mSrc[0].mTemp;
switch (mInstructions[sz - 2]->mOperator) switch (mInstructions[sz - 2]->mOperator)
{ {
#if 1
case IA_CMPEQ:
if (s0 < 0)
{
mTrueValueRange[s1].mMinState = IntegerValueRange::S_BOUND;
mTrueValueRange[s1].mMinValue = mInstructions[sz - 2]->mSrc[0].mIntConst;
mTrueValueRange[s1].mMaxState = IntegerValueRange::S_BOUND;
mTrueValueRange[s1].mMaxValue = mInstructions[sz - 2]->mSrc[0].mIntConst;
}
else if (s1 < 0)
{
mTrueValueRange[s0].mMinState = IntegerValueRange::S_BOUND;
mTrueValueRange[s0].mMinValue = mInstructions[sz - 2]->mSrc[1].mIntConst;
mTrueValueRange[s0].mMaxState = IntegerValueRange::S_BOUND;
mTrueValueRange[s0].mMaxValue = mInstructions[sz - 2]->mSrc[1].mIntConst;
}
break;
case IA_CMPNE:
if (s0 < 0)
{
mFalseValueRange[s1].mMinState = IntegerValueRange::S_BOUND;
mFalseValueRange[s1].mMinValue = mInstructions[sz - 2]->mSrc[0].mIntConst;
mFalseValueRange[s1].mMaxState = IntegerValueRange::S_BOUND;
mFalseValueRange[s1].mMaxValue = mInstructions[sz - 2]->mSrc[0].mIntConst;
}
else if (s1 < 0)
{
mFalseValueRange[s0].mMinState = IntegerValueRange::S_BOUND;
mFalseValueRange[s0].mMinValue = mInstructions[sz - 2]->mSrc[1].mIntConst;
mFalseValueRange[s0].mMaxState = IntegerValueRange::S_BOUND;
mFalseValueRange[s0].mMaxValue = mInstructions[sz - 2]->mSrc[1].mIntConst;
}
break;
#endif
case IA_CMPLS: case IA_CMPLS:
if (s0 < 0) if (s0 < 0)
{ {
@ -7586,10 +7622,10 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
} }
int di = mInstructions.Size() - 1; int di = mInstructions.Size() - 1;
if (mInstructions[di - 1]->mCode == IC_RELATIONAL_OPERATOR) if (di > 0 && mInstructions[di - 1]->mCode == IC_RELATIONAL_OPERATOR)
{ {
di--; di--;
if (mInstructions[di - 1]->mDst.mTemp == mInstructions[di]->mSrc[0].mTemp || mInstructions[di - 1]->mDst.mTemp == mInstructions[di]->mSrc[1].mTemp) if (di > 0 && mInstructions[di - 1]->mDst.mTemp == mInstructions[di]->mSrc[0].mTemp || mInstructions[di - 1]->mDst.mTemp == mInstructions[di]->mSrc[1].mTemp)
di--; di--;
} }

View File

@ -644,6 +644,11 @@ bool Linker::WriteAsmFile(const char* filename)
else else
mNativeDisassembler.Disassemble(file, mCartridge[obj->mRegion->mCartridge] - 0x8000, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); mNativeDisassembler.Disassemble(file, mCartridge[obj->mRegion->mCartridge] - 0x8000, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this);
break; break;
case LOT_DATA:
if (obj->mRegion->mCartridge < 0)
mNativeDisassembler.DumpMemory(file, mMemory, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this);
else
mNativeDisassembler.DumpMemory(file, mCartridge[obj->mRegion->mCartridge] - 0x8000, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this);
} }
} }
} }

View File

@ -636,9 +636,9 @@ uint8* Parser::ParseStringLiteral(int msize)
uint8* d = new uint8[msize]; uint8* d = new uint8[msize];
int i = 0; int i = 0;
while (mScanner->mTokenString[i]) while (i < size)
{ {
d[i] = mCharMap[mScanner->mTokenString[i]]; d[i] = mCharMap[(uint8)mScanner->mTokenString[i]];
i++; i++;
} }
@ -661,9 +661,9 @@ uint8* Parser::ParseStringLiteral(int msize)
uint8* nd = new uint8[msize]; uint8* nd = new uint8[msize];
memcpy(nd, d, size); memcpy(nd, d, size);
int i = 0; int i = 0;
while (mScanner->mTokenString[i]) while (i < s)
{ {
nd[i + size] = mCharMap[mScanner->mTokenString[i]]; nd[i + size] = mCharMap[(uint8)mScanner->mTokenString[i]];
i++; i++;
} }
size += s; size += s;
@ -1199,7 +1199,7 @@ Expression* Parser::ParseSimpleExpression(void)
break; break;
case TK_CHARACTER: case TK_CHARACTER:
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER); dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
dec->mInteger = mCharMap[mScanner->mTokenInteger]; dec->mInteger = mCharMap[(unsigned char)mScanner->mTokenInteger];
dec->mBase = TheUnsignedIntTypeDeclaration; dec->mBase = TheUnsignedIntTypeDeclaration;
exp = new Expression(mScanner->mLocation, EX_CONSTANT); exp = new Expression(mScanner->mLocation, EX_CONSTANT);
exp->mDecValue = dec; exp->mDecValue = dec;
@ -1266,23 +1266,24 @@ Expression* Parser::ParseSimpleExpression(void)
case TK_STRING: case TK_STRING:
{ {
dec = new Declaration(mScanner->mLocation, DT_CONST_DATA); dec = new Declaration(mScanner->mLocation, DT_CONST_DATA);
dec->mSize = strlen(mScanner->mTokenString) + 1; int size = strlen(mScanner->mTokenString);
dec->mSize = size + 1;
dec->mVarIndex = -1; dec->mVarIndex = -1;
dec->mSection = mCodeSection; dec->mSection = mCodeSection;
dec->mBase = new Declaration(mScanner->mLocation, DT_TYPE_ARRAY); dec->mBase = new Declaration(mScanner->mLocation, DT_TYPE_ARRAY);
dec->mBase->mSize = dec->mSize; dec->mBase->mSize = dec->mSize;
dec->mBase->mBase = TheConstCharTypeDeclaration; dec->mBase->mBase = TheConstCharTypeDeclaration;
dec->mBase->mFlags |= DTF_DEFINED; dec->mBase->mFlags |= DTF_DEFINED;
uint8* d = new uint8[dec->mSize + 1]; uint8* d = new uint8[size + 1];
dec->mData = d; dec->mData = d;
int i = 0; int i = 0;
while (mScanner->mTokenString[i]) while (i < size)
{ {
d[i] = mCharMap[mScanner->mTokenString[i]]; d[i] = mCharMap[(uint8)mScanner->mTokenString[i]];
i++; i++;
} }
d[i] = 0; d[size] = 0;
exp = new Expression(mScanner->mLocation, EX_CONSTANT); exp = new Expression(mScanner->mLocation, EX_CONSTANT);
exp->mDecValue = dec; exp->mDecValue = dec;
@ -1294,16 +1295,17 @@ Expression* Parser::ParseSimpleExpression(void)
while (mScanner->mToken == TK_STRING) while (mScanner->mToken == TK_STRING)
{ {
int s = strlen(mScanner->mTokenString); int s = strlen(mScanner->mTokenString);
uint8* d = new uint8[dec->mSize + s + 1]; uint8* d = new uint8[size + s + 1];
memcpy(d, dec->mData, dec->mSize - 1); memcpy(d, dec->mData, size);
int i = 0; int i = 0;
while (mScanner->mTokenString[i]) while (i < s)
{ {
d[i + dec->mSize] = mCharMap[mScanner->mTokenString[i]]; d[size + i] = mCharMap[(uint8)mScanner->mTokenString[i]];
i++; i++;
} }
d[i + dec->mSize] = 0; size += s;
dec->mSize += s; d[size] = 0;
dec->mSize = size + 1;
delete[] dec->mData; delete[] dec->mData;
dec->mData = d; dec->mData = d;
mScanner->NextToken(); mScanner->NextToken();
@ -2256,7 +2258,7 @@ Expression* Parser::ParseAssemblerBaseOperand(Declaration* pcasm, int pcoffset)
break; break;
case TK_CHARACTER: case TK_CHARACTER:
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER); dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
dec->mInteger = mCharMap[mScanner->mTokenInteger]; dec->mInteger = mCharMap[(unsigned char)mScanner->mTokenInteger];
dec->mBase = TheUnsignedIntTypeDeclaration; dec->mBase = TheUnsignedIntTypeDeclaration;
exp = new Expression(mScanner->mLocation, EX_CONSTANT); exp = new Expression(mScanner->mLocation, EX_CONSTANT);
exp->mDecValue = dec; exp->mDecValue = dec;

View File

@ -56,7 +56,7 @@ bool GetProductAndVersion(char* strProductName, char* strProductVersion)
} }
#endif #endif
int main(int argc, const char** argv) int main2(int argc, const char** argv)
{ {
InitDeclarations(); InitDeclarations();
InitAssembler(); InitAssembler();
@ -73,7 +73,7 @@ int main(int argc, const char** argv)
#else #else
strcpy(strProductName, "oscar64"); strcpy(strProductName, "oscar64");
strcpy(strProductVersion, "1.4.77"); strcpy(strProductVersion, "1.4.78");
#ifdef __APPLE__ #ifdef __APPLE__
uint32_t length = sizeof(basePath); uint32_t length = sizeof(basePath);
@ -241,3 +241,22 @@ int main(int argc, const char** argv)
return 0; return 0;
} }
int main(int argc, const char** argv)
{
#ifdef _WIN32
__try
{
#endif
return main2(argc, argv);
#ifdef _WIN32
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("oscar64 crashed.");
return 30;
}
#endif
}

View File

@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,4,77,0 FILEVERSION 1,4,78,0
PRODUCTVERSION 1,4,77,0 PRODUCTVERSION 1,4,78,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -43,12 +43,12 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "oscar64" VALUE "CompanyName", "oscar64"
VALUE "FileDescription", "oscar64 compiler" VALUE "FileDescription", "oscar64 compiler"
VALUE "FileVersion", "1.4.77.0" VALUE "FileVersion", "1.4.78.0"
VALUE "InternalName", "oscar64.exe" VALUE "InternalName", "oscar64.exe"
VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "LegalCopyright", "Copyright (C) 2021"
VALUE "OriginalFilename", "oscar64.exe" VALUE "OriginalFilename", "oscar64.exe"
VALUE "ProductName", "oscar64" VALUE "ProductName", "oscar64"
VALUE "ProductVersion", "1.4.77.0" VALUE "ProductVersion", "1.4.78.0"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View File

@ -3570,15 +3570,15 @@
{ {
"Name" = "8:Microsoft Visual Studio" "Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:oscar64" "ProductName" = "8:oscar64"
"ProductCode" = "8:{29AA2963-64EB-4255-A8A4-228932C24DE6}" "ProductCode" = "8:{A63EF9D9-9EA0-4598-BE7F-C7F90A3FFEAA}"
"PackageCode" = "8:{99D21284-BC74-4D9D-A5F1-41EC43AE23AC}" "PackageCode" = "8:{B344F37B-0769-452A-BFC4-40EB21102D3C}"
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}" "UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
"AspNetVersion" = "8:2.0.50727.0" "AspNetVersion" = "8:2.0.50727.0"
"RestartWWWService" = "11:FALSE" "RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE" "RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE" "InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:1.4.77" "ProductVersion" = "8:1.4.78"
"Manufacturer" = "8:oscar64" "Manufacturer" = "8:oscar64"
"ARPHELPTELEPHONE" = "8:" "ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:" "ARPHELPLINK" = "8:"

Binary file not shown.