diff --git a/IDEHelper/Backend/BeIRCodeGen.cpp b/IDEHelper/Backend/BeIRCodeGen.cpp index 76ce9ded..89da21bd 100644 --- a/IDEHelper/Backend/BeIRCodeGen.cpp +++ b/IDEHelper/Backend/BeIRCodeGen.cpp @@ -244,7 +244,29 @@ void BeIRCodeGen::Hash(BeHashContext& hashCtx) hashCtx.Mixin(mPtrSize); hashCtx.Mixin(mIsOptimized); if (mBeModule != NULL) - mBeModule->Hash(hashCtx); + mBeModule->Hash(hashCtx); + + Array structHashList; + + for (auto beType : mBeContext->mTypes) + { + if (!beType->IsStruct()) + continue; + auto beStructType = (BeStructType*)beType; + if (beStructType->mHashId != -1) + continue; + structHashList.Add(beStructType); + } + + structHashList.Sort([](BeStructType* lhs, BeStructType* rhs) + { + return lhs->mName < rhs->mName; + }); + + for (auto beStructType : structHashList) + { + beStructType->HashReference(hashCtx); + } } bool BeIRCodeGen::IsModuleEmpty() diff --git a/IDEHelper/Compiler/BfCodeGen.cpp b/IDEHelper/Compiler/BfCodeGen.cpp index 63d3ab00..ac048b3b 100644 --- a/IDEHelper/Compiler/BfCodeGen.cpp +++ b/IDEHelper/Compiler/BfCodeGen.cpp @@ -112,6 +112,15 @@ void BfCodeGenDirectoryData::Write() String fileName = GetDataFileName(); if (!fileStream.Open(fileName, "wb")) { + String directory = GetFileDir(fileName); + if (!DirectoryExists(directory)) + { + // Someone else (or the user) cleared this directory + DoBfLog(2, "BfCodeGen cleared cache because '%s' was removed\n", directory.c_str()); + mFileMap.Clear(); + return; + } + mError = "Failed to write to " + fileName; return; }