[Caching] Improve diagnostics around swift caching

Improve diagnostics message for swift caching build by trying to emit
the diagnostics early when there is more context to differentiate the
different kind of problems.

After the improvement, CAS Error should be more closer to when there is
functional problem with the CAS, rather than mixing in other kinds of
problem (like scanning dependency failures) when operating with a CAS.

rdar://145676736
(cherry picked from commit 226552bf23)
This commit is contained in:
Steven Wu
2025-04-08 15:57:33 -07:00
parent f6a864a188
commit edb94fb2fb
9 changed files with 178 additions and 127 deletions

View File

@@ -2466,18 +2466,25 @@ struct ExplicitCASModuleLoader::Implementation {
llvm::cas::ActionCache &Cache)
: Ctx(Ctx), CAS(CAS), Cache(Cache) {}
llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>> loadBuffer(StringRef ID) {
std::unique_ptr<llvm::MemoryBuffer> loadBuffer(StringRef ID) {
auto key = CAS.parseID(ID);
if (!key)
return key.takeError();
if (!key) {
Ctx.Diags.diagnose(SourceLoc(), diag::error_invalid_cas_id, ID,
toString(key.takeError()));
return nullptr;
}
auto ref = CAS.getReference(*key);
if (!ref)
return nullptr;
auto loaded = CAS.getProxy(*ref);
if (!loaded)
return loaded.takeError();
if (!loaded) {
Ctx.Diags.diagnose(SourceLoc(), diag::error_cas,
"loading module map from CAS",
toString(loaded.takeError()));
return nullptr;
}
return loaded->getMemoryBuffer();
}
@@ -2490,11 +2497,6 @@ struct ExplicitCASModuleLoader::Implementation {
llvm::StringMap<std::string> ModuleAliases;
auto buf = loadBuffer(ID);
if (!buf) {
Ctx.Diags.diagnose(SourceLoc(), diag::error_cas,
toString(buf.takeError()));
return;
}
if (!*buf) {
Ctx.Diags.diagnose(SourceLoc(), diag::explicit_swift_module_map_missing,
ID);
return;
@@ -2503,7 +2505,7 @@ struct ExplicitCASModuleLoader::Implementation {
llvm::MemoryBuffer::getFile(ID);
auto hasError = parser.parseSwiftExplicitModuleMap(
(*buf)->getMemBufferRef(), ExplicitModuleMap, ExplicitClangModuleMap,
buf->getMemBufferRef(), ExplicitModuleMap, ExplicitClangModuleMap,
ModuleAliases);
if (hasError)
@@ -2555,41 +2557,54 @@ struct ExplicitCASModuleLoader::Implementation {
}
}
llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>>
loadFileBuffer(StringRef ID, StringRef Name) {
std::unique_ptr<llvm::MemoryBuffer>
loadFileBuffer(SourceLoc Loc, StringRef ID, StringRef Name) {
auto outputMissing = [&]() {
Ctx.Diags.diagnose(Loc, diag::error_opening_explicit_module_file, Name);
return nullptr;
};
auto casError = [&](StringRef Stage, llvm::Error Err) {
Ctx.Diags.diagnose(Loc, diag::error_cas, Stage, toString(std::move(Err)));
return nullptr;
};
auto key = CAS.parseID(ID);
if (!key)
return key.takeError();
if (!key) {
Ctx.Diags.diagnose(Loc, diag::error_invalid_cas_id, ID,
toString(key.takeError()));
return nullptr;
}
auto moduleLookup = Cache.get(*key);
if (!moduleLookup)
return moduleLookup.takeError();
return casError("looking up module output cache",
moduleLookup.takeError());
if (!*moduleLookup)
return nullptr;
return outputMissing();
auto moduleRef = CAS.getReference(**moduleLookup);
if (!moduleRef)
return nullptr;
return outputMissing();
auto proxy = CAS.getProxy(*moduleRef);
if (!proxy)
return proxy.takeError();
return casError("loading module build outputs", proxy.takeError());
swift::cas::CompileJobResultSchema schema(CAS);
if (!schema.isRootNode(*proxy))
return nullptr;
return outputMissing();
auto result = schema.load(*moduleRef);
if (!result)
return result.takeError();
return casError("loading module schema", result.takeError());
auto output = result->getOutput(file_types::ID::TY_SwiftModuleFile);
if (!output)
return nullptr;
return outputMissing();
auto buf = CAS.getProxy(output->Object);
if (!buf)
return buf.takeError();
return casError("loading dependency module", result.takeError());
return buf->getMemoryBuffer(Name);
}
@@ -2750,18 +2765,14 @@ bool ExplicitCASModuleLoader::canImportModule(
std::string moduleCASID = it->second.moduleCacheKey
? *it->second.moduleCacheKey
: it->second.modulePath;
auto moduleBuf = Impl.loadFileBuffer(moduleCASID, it->second.modulePath);
auto moduleBuf = Impl.loadFileBuffer(loc, moduleCASID, it->second.modulePath);
if (!moduleBuf) {
Ctx.Diags.diagnose(loc, diag::error_cas, toString(moduleBuf.takeError()));
return false;
}
if (!*moduleBuf) {
Ctx.Diags.diagnose(loc, diag::error_opening_explicit_module_file,
it->second.modulePath);
return false;
}
auto metaData = serialization::validateSerializedAST(
(*moduleBuf)->getBuffer(), Ctx.SILOpts.EnableOSSAModules,
moduleBuf->getBuffer(), Ctx.SILOpts.EnableOSSAModules,
Ctx.LangOpts.SDKName);
versionInfo->setVersion(metaData.userModuleVersion,
ModuleVersionSourceKind::SwiftBinaryModule);