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)
|
||||
{
|
||||
fprintf(file, "--------------------------------------------------------------------\n");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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--;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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"
|
||||
|
|
|
@ -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.
Loading…
Reference in New Issue