1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Improved errors

This commit is contained in:
Brian Fiete 2020-07-13 09:55:16 -07:00
parent a69217e296
commit d3bfc731ef
4 changed files with 63 additions and 3 deletions

View file

@ -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: ";

View file

@ -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))
{

View file

@ -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;

View file

@ -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;
}