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)
{
fprintf(file, "--------------------------------------------------------------------\n");

View File

@ -27,6 +27,7 @@ public:
~NativeCodeDisassembler(void);
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:
const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc);
const char* AddrName(int addr, char* buffer, Linker* linker);

View File

@ -4579,12 +4579,48 @@ void InterCodeBasicBlock::UpdateLocalIntegerRangeSets(void)
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;
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:
if (s0 < 0)
{
@ -7586,10 +7622,10 @@ void InterCodeBasicBlock::SingleBlockLoopOptimisation(const NumberSet& aliasedPa
}
int di = mInstructions.Size() - 1;
if (mInstructions[di - 1]->mCode == IC_RELATIONAL_OPERATOR)
if (di > 0 && mInstructions[di - 1]->mCode == IC_RELATIONAL_OPERATOR)
{
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--;
}

View File

@ -644,6 +644,11 @@ bool Linker::WriteAsmFile(const char* filename)
else
mNativeDisassembler.Disassemble(file, mCartridge[obj->mRegion->mCartridge] - 0x8000, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this);
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];
int i = 0;
while (mScanner->mTokenString[i])
while (i < size)
{
d[i] = mCharMap[mScanner->mTokenString[i]];
d[i] = mCharMap[(uint8)mScanner->mTokenString[i]];
i++;
}
@ -661,9 +661,9 @@ uint8* Parser::ParseStringLiteral(int msize)
uint8* nd = new uint8[msize];
memcpy(nd, d, size);
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++;
}
size += s;
@ -1199,7 +1199,7 @@ Expression* Parser::ParseSimpleExpression(void)
break;
case TK_CHARACTER:
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
dec->mInteger = mCharMap[mScanner->mTokenInteger];
dec->mInteger = mCharMap[(unsigned char)mScanner->mTokenInteger];
dec->mBase = TheUnsignedIntTypeDeclaration;
exp = new Expression(mScanner->mLocation, EX_CONSTANT);
exp->mDecValue = dec;
@ -1266,23 +1266,24 @@ Expression* Parser::ParseSimpleExpression(void)
case TK_STRING:
{
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->mSection = mCodeSection;
dec->mBase = new Declaration(mScanner->mLocation, DT_TYPE_ARRAY);
dec->mBase->mSize = dec->mSize;
dec->mBase->mBase = TheConstCharTypeDeclaration;
dec->mBase->mFlags |= DTF_DEFINED;
uint8* d = new uint8[dec->mSize + 1];
uint8* d = new uint8[size + 1];
dec->mData = d;
int i = 0;
while (mScanner->mTokenString[i])
while (i < size)
{
d[i] = mCharMap[mScanner->mTokenString[i]];
d[i] = mCharMap[(uint8)mScanner->mTokenString[i]];
i++;
}
d[i] = 0;
d[size] = 0;
exp = new Expression(mScanner->mLocation, EX_CONSTANT);
exp->mDecValue = dec;
@ -1294,16 +1295,17 @@ Expression* Parser::ParseSimpleExpression(void)
while (mScanner->mToken == TK_STRING)
{
int s = strlen(mScanner->mTokenString);
uint8* d = new uint8[dec->mSize + s + 1];
memcpy(d, dec->mData, dec->mSize - 1);
uint8* d = new uint8[size + s + 1];
memcpy(d, dec->mData, size);
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++;
}
d[i + dec->mSize] = 0;
dec->mSize += s;
size += s;
d[size] = 0;
dec->mSize = size + 1;
delete[] dec->mData;
dec->mData = d;
mScanner->NextToken();
@ -2256,7 +2258,7 @@ Expression* Parser::ParseAssemblerBaseOperand(Declaration* pcasm, int pcoffset)
break;
case TK_CHARACTER:
dec = new Declaration(mScanner->mLocation, DT_CONST_INTEGER);
dec->mInteger = mCharMap[mScanner->mTokenInteger];
dec->mInteger = mCharMap[(unsigned char)mScanner->mTokenInteger];
dec->mBase = TheUnsignedIntTypeDeclaration;
exp = new Expression(mScanner->mLocation, EX_CONSTANT);
exp->mDecValue = dec;

View File

@ -56,7 +56,7 @@ bool GetProductAndVersion(char* strProductName, char* strProductVersion)
}
#endif
int main(int argc, const char** argv)
int main2(int argc, const char** argv)
{
InitDeclarations();
InitAssembler();
@ -67,13 +67,13 @@ int main(int argc, const char** argv)
char strProductName[100], strProductVersion[200];
#ifdef _WIN32
GetProductAndVersion(strProductName, strProductVersion);
GetProductAndVersion(strProductName, strProductVersion);
DWORD length = ::GetModuleFileNameA(NULL, basePath, sizeof(basePath));
DWORD length = ::GetModuleFileNameA(NULL, basePath, sizeof(basePath));
#else
strcpy(strProductName, "oscar64");
strcpy(strProductVersion, "1.4.77");
strcpy(strProductVersion, "1.4.78");
#ifdef __APPLE__
uint32_t length = sizeof(basePath);
@ -83,8 +83,8 @@ int main(int argc, const char** argv)
#else
int length = readlink("/proc/self/exe", basePath, sizeof(basePath));
// strcpy(basePath, argv[0]);
// int length = strlen(basePath);
// strcpy(basePath, argv[0]);
// int length = strlen(basePath);
#endif
#endif
while (length > 0 && basePath[length - 1] != '/' && basePath[length - 1] != '\\')
@ -241,3 +241,22 @@ int main(int argc, const char** argv)
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
FILEVERSION 1,4,77,0
PRODUCTVERSION 1,4,77,0
FILEVERSION 1,4,78,0
PRODUCTVERSION 1,4,78,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -43,12 +43,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "oscar64"
VALUE "FileDescription", "oscar64 compiler"
VALUE "FileVersion", "1.4.77.0"
VALUE "FileVersion", "1.4.78.0"
VALUE "InternalName", "oscar64.exe"
VALUE "LegalCopyright", "Copyright (C) 2021"
VALUE "OriginalFilename", "oscar64.exe"
VALUE "ProductName", "oscar64"
VALUE "ProductVersion", "1.4.77.0"
VALUE "ProductVersion", "1.4.78.0"
END
END
BLOCK "VarFileInfo"

View File

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

Binary file not shown.