From 478f93922deada7fe06cf46ad5e84b5ce4c9145e Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Tue, 27 Jun 2023 18:16:13 +0200 Subject: [PATCH] Error on pointer/integer compare --- oscar64/InterCodeGenerator.cpp | 12 +++++++++-- oscar64/NativeCodeGenerator.cpp | 35 +++++++++++++++++--------------- oscar64/NativeCodeGenerator.h | 8 +++++++- oscar64/Parser.cpp | 2 +- samples/memmap/charsetload.d64 | Bin 174848 -> 174848 bytes 5 files changed, 37 insertions(+), 20 deletions(-) diff --git a/oscar64/InterCodeGenerator.cpp b/oscar64/InterCodeGenerator.cpp index 9fe9cf9..da41554 100644 --- a/oscar64/InterCodeGenerator.cpp +++ b/oscar64/InterCodeGenerator.cpp @@ -2452,8 +2452,16 @@ InterCodeGenerator::ExValue InterCodeGenerator::TranslateExpression(Declaration* if (vl.mType->mType == DT_TYPE_POINTER || vr.mType->mType == DT_TYPE_POINTER) { dtype = vl.mType; - if (vl.mType->IsIntegerType() || vr.mType->IsIntegerType()) - ; + if (vl.mType->IsIntegerType()) + { + if ((mCompilerOptions & COPT_CPLUSPLUS) || exp->mLeft->mType != EX_CONSTANT || exp->mLeft->mDecValue->mInteger != 0) + mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_TYPES, "Cannot compare integer and pointer"); + } + else if (vr.mType->IsIntegerType()) + { + if ((mCompilerOptions & COPT_CPLUSPLUS) || exp->mRight->mType != EX_CONSTANT || exp->mRight->mDecValue->mInteger != 0) + mErrors->Error(exp->mLocation, EERR_INCOMPATIBLE_TYPES, "Cannot compare integer and pointer"); + } else if ((vl.mType->mType == DT_TYPE_POINTER || vl.mType->mType == DT_TYPE_ARRAY) && (vr.mType->mType == DT_TYPE_POINTER || vr.mType->mType == DT_TYPE_ARRAY)) { if (vl.mType->mBase->mType == DT_TYPE_VOID || vr.mType->mBase->mType == DT_TYPE_VOID) diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 308af63..166976a 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -12350,7 +12350,7 @@ void NativeCodeBasicBlock::BuildCollisionTable(NumberSet* collisionSets) } } -void NativeCodeBasicBlock::BuildDominatorTree(NativeCodeBasicBlock* from) +void NativeCodeBasicBlock::BuildDominatorTree(NativeCodeBasicBlock* from, DominatorStacks& stacks) { if (from == this) return; @@ -12360,25 +12360,26 @@ void NativeCodeBasicBlock::BuildDominatorTree(NativeCodeBasicBlock* from) return; else { - ExpandingArray< NativeCodeBasicBlock * > d1, d2; + stacks.d1.SetSize(0); + stacks.d2.SetSize(0); NativeCodeBasicBlock* b = mDominator; while (b) { - d1.Push(b); + stacks.d1.Push(b); b = b->mDominator; } b = from; while (b) { - d2.Push(b); + stacks.d2.Push(b); b = b->mDominator; } b = nullptr; - while (d1.Size() > 0 && d2.Size() > 0 && d1.Last() == d2.Last()) + while (stacks.d1.Size() > 0 && stacks.d2.Size() > 0 && stacks.d1.Last() == stacks.d2.Last()) { - b = d1.Pop(); d2.Pop(); + b = stacks.d1.Pop(); stacks.d2.Pop(); } if (mDominator == b) @@ -12388,9 +12389,9 @@ void NativeCodeBasicBlock::BuildDominatorTree(NativeCodeBasicBlock* from) } if (mTrueJump) - mTrueJump->BuildDominatorTree(this); + mTrueJump->BuildDominatorTree(this, stacks); if (mFalseJump) - mFalseJump->BuildDominatorTree(this); + mFalseJump->BuildDominatorTree(this, stacks); } @@ -40657,8 +40658,9 @@ void NativeCodeProcedure::RebuildEntry(void) ResetVisited(); mEntryBlock->CollectEntryBlocks(nullptr); + NativeCodeBasicBlock::DominatorStacks stacks; - mEntryBlock->BuildDominatorTree(nullptr); + mEntryBlock->BuildDominatorTree(nullptr, stacks); } void NativeCodeProcedure::Optimize(void) @@ -41523,13 +41525,14 @@ void NativeCodeProcedure::ResetPatched(void) { for (int i = 0; i < mBlocks.Size(); i++) { - mBlocks[i]->mPatched = false; - mBlocks[i]->mPatchFail = false; - mBlocks[i]->mPatchChecked = false; - mBlocks[i]->mPatchStart = false; - mBlocks[i]->mPatchLoop = false; - mBlocks[i]->mPatchLoopChanged = false; - mBlocks[i]->mPatchExit = false; + NativeCodeBasicBlock* b = mBlocks[i]; + b->mPatched = false; + b->mPatchFail = false; + b->mPatchChecked = false; + b->mPatchStart = false; + b->mPatchLoop = false; + b->mPatchLoopChanged = false; + b->mPatchExit = false; } } diff --git a/oscar64/NativeCodeGenerator.h b/oscar64/NativeCodeGenerator.h index b5c8c5e..97e44bb 100644 --- a/oscar64/NativeCodeGenerator.h +++ b/oscar64/NativeCodeGenerator.h @@ -370,7 +370,13 @@ public: NativeCodeBasicBlock * ForwardAccuBranch(bool eq, bool ne, bool pl, bool mi, int limit); bool MergeBasicBlocks(void); void MarkLoopHead(void); - void BuildDominatorTree(NativeCodeBasicBlock * from); + + struct DominatorStacks + { + ExpandingArray< NativeCodeBasicBlock* > d1, d2; + }; + + void BuildDominatorTree(NativeCodeBasicBlock * from, DominatorStacks & stacks); bool MoveLoadStoreUp(int at); bool MoveLoadStoreXUp(int at); diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index 7f523b5..79cbbaf 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -1253,7 +1253,7 @@ void Parser::PrependMemberConstructor(Declaration* pthis, Declaration* cfunc) { Expression* pthisexp = new Expression(pthis->mLocation, EX_VARIABLE); pthisexp->mDecType = pthis; - pthisexp->mDecValue = pthis->mBase->mDestructor->mBase->mParams; + pthisexp->mDecValue = cfunc->mBase->mParams; Expression* thisexp = new Expression(mScanner->mLocation, EX_PREFIX); thisexp->mToken = TK_MUL; diff --git a/samples/memmap/charsetload.d64 b/samples/memmap/charsetload.d64 index 10be50be15aa602a57eabdf0893cd37ca9108bc4..ea91a386155aba5183c7a05d6e7a7fb6eb237590 100644 GIT binary patch delta 660 zcmYL^L1+^}6ozMZ(>6QpCcCI5c3L{oQ(6kGpsn;^CA*0U#fvEjR#?FldK0fbB$rpA z5NR%M1uKnq0#8u%6c8$kQVaw;2hGV!Js9mRH!sDNMAXy&zsLLjpI26MB_ z<93*a`@@VpJTrN2iV*Vh?nj1AIEf5~W{@2+Kc1t<^zVmFe>z7;bx{oa#T*?gU>r;| zAR_t=)WC!&h9M#*49VNaQG*B)h~jIo#DamEIM0xP2@$Zc(cRnPB6~zuoh`DOieV$~ zKzgm5iY?P8(pe_p)OFQ5_@NHO{r_YLqG)wV+o)*^^cSsI)UpR~y3}GokpPEb&%eD$ zPxT?Gnww4LKUkzgg`9yDxL1wrG+BL4g^;udR-H8wWs<8t47wZ=a3KXr5oeM^T8uNv z+oAfLvSf1df*O(Ob}u9)Z-0@z>TEWdILo99T&Cu48PbJJOj`LAWMz6gTF$gwrL|JK zNy(L(m|rnsGMaZG^XFtnX1=8%EwhINF3Dt~0LfV11$SL*rM7CpRjO$fixxh=NS8D3 z-zC*gB%Nkeo?kJ*teRpsKmxWMb&=|3g{L6Vd=zDqkit2Yp MmuPKtN&D*j2J+|cn*aa+ delta 1585 zcmY*ZU5Fc16h8MRo6gQ;Cdt}eGP%)=P8w_*BvrIQP%D{DcV(2)ZlzMiY$1i(BJ@R3 zl&obhMj^66)~pYffP0rtKBC@TP3!Nu;ehJNqv$tL!7|zaPaZmQyT!_=qG~_L!hz| zp^3Z^S&B3sot_J z+<0XIt*b|0Uf7OsB_`y81H?Y(swbl-y^uTRhxPz*Oz+}q>m`>lE6uI+paAGQxw&{* zu01EQ#2%<^k`#a@m@1VmQ>BTjzKhE<^@eOwm8IQ~Hsxu2h^?us7R%JtxqP{z(lrK@ z(==0cxbLtT2$8l4($|_aekf!M-^7LF~ zeHUlSG-a7GRV=@ES1qvz>MBc7nJF}(?_4?8MwX6+0pQ8-`&>R;a3KI}4FinI!gMFhAZ){!zYEV)%V zX^Zrc1aMONO}Zrk9O>>r7!z_srfGeWyW6$fv_8oJs-sRN7WEYVzyNp#nTsfb$atc&mV5s4(+;;QQ-0|8z@& z*(gNa60$KvA|!)=gb4hD;W}VgX5xV4aLuk|iuQkv2X~<1eai+ch+ha1e=wN1Ak9aV zqg~}hcZOr4ayNl7L`v0 zMx5Z;O?H$Oa?jX=6`c@Wcnt+AvDF1eoGXmf#E5cGU>YTCRR4iz8Xb!pC(5IAoE4i; zA6wLHyf}KMz=-{$eu+0Af3--91}p*H+%I(Zl#8^;#><=OW>#2Rp@n!^quLB!9BqPG ztdCiz3iiJSP?zUp{ZfTrUJ#WtU3cIQW4|-yLf3bI(z0^oEQW+gb+=r>%=tyce{#E-Qa77SQ