Jelajahi Sumber

Improved errors

Brian Fiete 5 tahun lalu
induk
melakukan
d3bfc731ef

+ 7 - 0
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: ";

+ 52 - 2
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<llvm::Function>(func))
 			{
+// 				if (funcPtr->getName() == "__FAILCALL")
+// 				{
+// 					FatalError("__FAILCALL");
+// 				}
+
 				int intrinId = -1;
 				if (mIntrinsicReverseMap.TryGetValue(funcPtr, &intrinId))
 				{

+ 1 - 0
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<uint8>& buffer) override;

+ 3 - 1
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;
 }