diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index 5fff51e1..97c06ec8 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -1123,7 +1123,10 @@ void BeIRCodeGen::Read(BeMDNode*& llvmMD) } void BeIRCodeGen::HandleNextCmd() -{ +{ + if (mFailed) + return; + int curId = mCmdCount; BfIRCmd cmd = (BfIRCmd)mStream->Read(); @@ -1192,6 +1195,11 @@ void BeIRCodeGen::HandleNextCmd() mBeModule->print(outStream, NULL);*/ } break; + case BfIRCmd_Abort: + { + Fail("Stream aborted"); + } + break; case BfIRCmd_SetType: { CMD_PARAM(int, typeId); @@ -1236,6 +1244,13 @@ void BeIRCodeGen::HandleNextCmd() CMD_PARAM(int, instSize); CMD_PARAM(int, instAlign); CMD_PARAM(bool, isPacked); + + if ((type == NULL) || (type->mTypeCode != BeTypeCode_Struct)) + { + Fail("StructSetBody invalid type"); + break; + } + BF_ASSERT(type->mTypeCode == BeTypeCode_Struct); auto structType = (BeStructType*)type; mBeContext->SetStructBody(structType, members, isPacked); diff --git a/IDEHelper/Backend/BeIRCodeGen.h b/IDEHelper/Backend/BeIRCodeGen.h index 3a2c3dfc..c78cc3b9 100644 --- a/IDEHelper/Backend/BeIRCodeGen.h +++ b/IDEHelper/Backend/BeIRCodeGen.h @@ -82,7 +82,7 @@ public: BeContext* mBeContext; BeModule* mBeModule; Array mSavedDebugLocs; - bool mHasDebugLoc; + bool mHasDebugLoc; int mCmdCount; Dictionary mResults; diff --git a/IDEHelper/Compiler/BfIRBuilder.cpp b/IDEHelper/Compiler/BfIRBuilder.cpp index 7049dd0f..d63ac1be 100644 --- a/IDEHelper/Compiler/BfIRBuilder.cpp +++ b/IDEHelper/Compiler/BfIRBuilder.cpp @@ -2217,6 +2217,12 @@ void BfIRBuilder::WriteIR(const StringImpl& fileName) NEW_CMD_INSERTED; } +void BfIRBuilder::AbortStream() +{ + WriteCmd(BfIRCmd_Abort); + NEW_CMD_INSERTED; +} + void BfIRBuilder::Module_SetTargetTriple(const StringImpl& targetTriple, const StringImpl& targetCPU) { WriteCmd(BfIRCmd_Module_SetTargetTriple, targetTriple, targetCPU); @@ -2774,7 +2780,11 @@ void BfIRBuilder::CreateTypeDeclaration(BfType* type, bool forceDbgDefine) if (!type->IsDeclared()) populateModule->PopulateType(type, BfPopulateType_Declaration); - BF_ASSERT(type->IsDeclared()); + if (!type->IsDeclared()) + { + AbortStream(); + return; + } #ifdef BFIR_RENTRY_CHECK ReEntryCheck reEntryCheck(&mDeclReentrySet, type); diff --git a/IDEHelper/Compiler/BfIRBuilder.h b/IDEHelper/Compiler/BfIRBuilder.h index 57924a93..146c27ee 100644 --- a/IDEHelper/Compiler/BfIRBuilder.h +++ b/IDEHelper/Compiler/BfIRBuilder.h @@ -161,6 +161,7 @@ enum BfIRCmd : uint8 BfIRCmd_Module_SetTargetTriple, BfIRCmd_Module_AddModuleFlag, BfIRCmd_WriteIR, + BfIRCmd_Abort, BfIRCmd_SetType, BfIRCmd_SetInstType, @@ -1199,6 +1200,7 @@ public: void SetBackend(bool isBeefBackend); void RemoveIRCodeGen(); void WriteIR(const StringImpl& fileName); + void AbortStream(); void Module_SetTargetTriple(const StringImpl& targetTriple, const StringImpl& targetCPU); void Module_AddModuleFlag(const StringImpl& flag, int val); diff --git a/IDEHelper/Compiler/BfIRCodeGen.cpp b/IDEHelper/Compiler/BfIRCodeGen.cpp index 5e05a918..97d1b061 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.cpp +++ b/IDEHelper/Compiler/BfIRCodeGen.cpp @@ -2029,6 +2029,9 @@ void BfIRCodeGen::InitTarget() void BfIRCodeGen::HandleNextCmd() { + if (mFailed) + return; + int curId = mCmdCount; BfIRCmd cmd = (BfIRCmd)mStream->Read(); @@ -2091,6 +2094,9 @@ void BfIRCodeGen::HandleNextCmd() mLLVMModule->print(outStream, NULL); } break; + case BfIRCmd_Abort: + Fail("Stream aborted"); + break; case BfIRCmd_SetType: { CMD_PARAM(int, typeId); diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 9640d050..1760022e 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -11097,7 +11097,7 @@ BfMethodInstance* BfModule::GetRawMethodInstanceAtIdx(BfTypeInstance* typeInstan { if (mCompiler->EnsureCeUnpaused(typeInstance)) { - BF_FATAL("OOB in GetRawMethodInstanceAtIdx"); + InternalError("OOB in GetRawMethodInstanceAtIdx"); } return NULL; }