From d3bfc731ef82f69b00dfe93b242bdf5f33143b7b Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 13 Jul 2020 09:55:16 -0700 Subject: [PATCH] Improved errors --- IDEHelper/Backend/BeIRCodeGen.cpp | 7 +++ IDEHelper/Compiler/BfIRCodeGen.cpp | 54 +++++++++++++++++++++++- IDEHelper/Compiler/BfIRCodeGen.h | 1 + IDEHelper/Compiler/BfModuleTypeUtils.cpp | 4 +- 4 files changed, 63 insertions(+), 3 deletions(-) diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index 28063e56..0e02de3d 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -291,6 +291,13 @@ void BeIRCodeGen::FatalError(const StringImpl& err) { BeDumpContext dumpCtx; + if (mActiveFunction != NULL) + { + failStr += "Function: "; + failStr += mActiveFunction->mName; + failStr += "\n"; + } + if (mBeModule->mCurDbgLoc != NULL) { failStr += "DbgLoc: "; diff --git a/IDEHelper/Compiler/BfIRCodeGen.cpp b/IDEHelper/Compiler/BfIRCodeGen.cpp index 8fcf3fef..ec2a806e 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.cpp +++ b/IDEHelper/Compiler/BfIRCodeGen.cpp @@ -339,6 +339,48 @@ BfIRCodeGen::~BfIRCodeGen() delete mLLVMContext; } +void BfIRCodeGen::FatalError(const StringImpl &err) +{ + String failStr = "Fatal Error in Module: "; + failStr += mModuleName; + failStr += "\n"; + if (mLLVMModule != NULL) + { + if (mActiveFunction != NULL) + { + failStr += "Function: "; + failStr += mActiveFunction->getName().str(); + failStr += "\n"; + } + + auto loc = mIRBuilder->getCurrentDebugLocation(); + auto dbgLoc = loc.getAsMDNode(); + if (dbgLoc != NULL) + { + std::string str; + llvm::raw_string_ostream os(str); + dbgLoc->print(os); + failStr += "DbgLoc: "; + failStr += str; + failStr += "\n"; + } + + llvm::MDNode* scope = loc.getScope(); + if (scope != NULL) + { + std::string str; + llvm::raw_string_ostream os(str); + scope->print(os); + failStr += "Scope: "; + failStr += str; + failStr += "\n"; + } + } + + failStr += err; + BF_FATAL(failStr); +} + void BfIRCodeGen::Fail(const StringImpl& error) { if (mFailed) @@ -885,6 +927,11 @@ void BfIRCodeGen::Read(llvm::Value*& llvmValue, BfIRCodeGenEntry** codeGenEntry) else if (paramType == BfIRParamType_Arg) { int argIdx = mStream->Read(); + if (argIdx >= mActiveFunction->arg_size()) + { + FatalError(StrFormat("ARG out of bounds %d", argIdx)); + } + BF_ASSERT(argIdx < mActiveFunction->arg_size()); auto argItr = mActiveFunction->arg_begin(); for (int i = 0; i < argIdx; i++) @@ -2624,10 +2671,13 @@ void BfIRCodeGen::HandleNextCmd() break; } - //mIRBuilder->CreateAtomicCmpXchg(); - if (auto funcPtr = llvm::dyn_cast(func)) { +// if (funcPtr->getName() == "__FAILCALL") +// { +// FatalError("__FAILCALL"); +// } + int intrinId = -1; if (mIntrinsicReverseMap.TryGetValue(funcPtr, &intrinId)) { diff --git a/IDEHelper/Compiler/BfIRCodeGen.h b/IDEHelper/Compiler/BfIRCodeGen.h index 4fe69e87..9599b210 100644 --- a/IDEHelper/Compiler/BfIRCodeGen.h +++ b/IDEHelper/Compiler/BfIRCodeGen.h @@ -104,6 +104,7 @@ public: BfIRCodeGen(); ~BfIRCodeGen(); + void FatalError(const StringImpl& str); virtual void Fail(const StringImpl& error) override; void ProcessBfIRData(const BfSizedArray& buffer) override; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 1704d2b0..1c950cd6 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -7065,7 +7065,9 @@ BfTypeDef* BfModule::FindTypeDef(const StringImpl& typeName, int numGenericArgs, if (!mSystem->ParseAtomComposite(typeName, findName)) return NULL; auto result = FindTypeDef(findName, numGenericArgs, typeInstanceOverride, error); - BF_ASSERT((result == NULL) || (result->mTypeCode != BfTypeCode_Extension)); + // Don't allow just finding extensions here. This can happen in some 'using static' cases but generally shouldn't happen + if ((result != NULL) && (result->mTypeCode == BfTypeCode_Extension)) + return NULL; return result; }