Add error message on crash, fix infinite loop, extend asm listing
This commit is contained in:
parent
ce6714006c
commit
c6133ce7c0
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
@ -67,13 +67,13 @@ int main(int argc, const char** argv)
|
||||||
char strProductName[100], strProductVersion[200];
|
char strProductName[100], strProductVersion[200];
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
GetProductAndVersion(strProductName, strProductVersion);
|
GetProductAndVersion(strProductName, strProductVersion);
|
||||||
|
|
||||||
DWORD length = ::GetModuleFileNameA(NULL, basePath, sizeof(basePath));
|
DWORD length = ::GetModuleFileNameA(NULL, basePath, sizeof(basePath));
|
||||||
|
|
||||||
#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);
|
||||||
|
@ -83,8 +83,8 @@ int main(int argc, const char** argv)
|
||||||
#else
|
#else
|
||||||
int length = readlink("/proc/self/exe", basePath, sizeof(basePath));
|
int length = readlink("/proc/self/exe", basePath, sizeof(basePath));
|
||||||
|
|
||||||
// strcpy(basePath, argv[0]);
|
// strcpy(basePath, argv[0]);
|
||||||
// int length = strlen(basePath);
|
// int length = strlen(basePath);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
while (length > 0 && basePath[length - 1] != '/' && basePath[length - 1] != '\\')
|
while (length > 0 && basePath[length - 1] != '/' && basePath[length - 1] != '\\')
|
||||||
|
@ -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
|
||||||
|
}
|
|
@ -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"
|
||||||
|
|
|
@ -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.
Loading…
Reference in New Issue