mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[Frontend] Make the module trace emission more robust.
✔ More informative error messages in case of crashes. ✔ Handling and documenting different cases. ✔ Test cases for different cases. ✔ Make SDKDependencies.swift pass again.
This commit is contained in:
@@ -344,6 +344,7 @@ std::error_code SerializedModuleLoaderBase::openModuleFiles(
|
||||
std::error_code SerializedModuleLoader::findModuleFilesInDirectory(
|
||||
AccessPathElem ModuleID, StringRef DirPath, StringRef ModuleFilename,
|
||||
StringRef ModuleDocFilename, StringRef ModuleSourceInfoFileName,
|
||||
SmallVectorImpl<char> *ModuleInterfacePath,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) {
|
||||
@@ -419,6 +420,7 @@ struct ModuleFilenamePair {
|
||||
|
||||
bool
|
||||
SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
|
||||
SmallVectorImpl<char> *moduleInterfacePath,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
|
||||
@@ -446,6 +448,7 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
|
||||
auto result = findModuleFilesInDirectory(moduleID, currPath,
|
||||
targetFileNames.module, targetFileNames.moduleDoc,
|
||||
targetFileNames.moduleSourceInfo,
|
||||
moduleInterfacePath,
|
||||
moduleBuffer, moduleDocBuffer,
|
||||
moduleSourceInfoBuffer);
|
||||
if (!result) {
|
||||
@@ -499,7 +502,7 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
|
||||
|
||||
auto result = findModuleFilesInDirectory(
|
||||
moduleID, path, fileNames.module.str(), fileNames.moduleDoc.str(),
|
||||
fileNames.moduleSourceInfo.str(),
|
||||
fileNames.moduleSourceInfo.str(), moduleInterfacePath,
|
||||
moduleBuffer, moduleDocBuffer, moduleSourceInfoBuffer);
|
||||
if (!result)
|
||||
return true;
|
||||
@@ -566,6 +569,7 @@ getOSAndVersionForDiagnostics(const llvm::Triple &triple) {
|
||||
|
||||
FileUnit *SerializedModuleLoaderBase::loadAST(
|
||||
ModuleDecl &M, Optional<SourceLoc> diagLoc,
|
||||
StringRef moduleInterfacePath,
|
||||
std::unique_ptr<llvm::MemoryBuffer> moduleInputBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> moduleDocInputBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> moduleSourceInfoInputBuffer,
|
||||
@@ -587,7 +591,8 @@ FileUnit *SerializedModuleLoaderBase::loadAST(
|
||||
serialization::ExtendedValidationInfo extendedInfo;
|
||||
std::unique_ptr<ModuleFile> loadedModuleFile;
|
||||
serialization::ValidationInfo loadInfo =
|
||||
ModuleFile::load(std::move(moduleInputBuffer),
|
||||
ModuleFile::load(moduleInterfacePath,
|
||||
std::move(moduleInputBuffer),
|
||||
std::move(moduleDocInputBuffer),
|
||||
std::move(moduleSourceInfoInputBuffer),
|
||||
isFramework, loadedModuleFile,
|
||||
@@ -818,9 +823,15 @@ void swift::serialization::diagnoseSerializedASTLoadFailure(
|
||||
bool SerializedModuleLoaderBase::canImportModule(
|
||||
std::pair<Identifier, SourceLoc> mID) {
|
||||
// Look on disk.
|
||||
SmallVector<char, 0> *unusedModuleInterfacePath = nullptr;
|
||||
std::unique_ptr<llvm::MemoryBuffer> *unusedModuleBuffer = nullptr;
|
||||
std::unique_ptr<llvm::MemoryBuffer> *unusedModuleDocBuffer = nullptr;
|
||||
std::unique_ptr<llvm::MemoryBuffer> *unusedModuleSourceInfoBuffer = nullptr;
|
||||
bool isFramework = false;
|
||||
bool isSystemModule = false;
|
||||
return findModule(mID, nullptr, nullptr, nullptr, isFramework, isSystemModule);
|
||||
return findModule(mID, unusedModuleInterfacePath, unusedModuleBuffer,
|
||||
unusedModuleDocBuffer, unusedModuleSourceInfoBuffer,
|
||||
isFramework, isSystemModule);
|
||||
}
|
||||
|
||||
bool MemoryBufferSerializedModuleLoader::canImportModule(
|
||||
@@ -840,13 +851,14 @@ SerializedModuleLoaderBase::loadModule(SourceLoc importLoc,
|
||||
bool isFramework = false;
|
||||
bool isSystemModule = false;
|
||||
|
||||
llvm::SmallString<256> moduleInterfacePath;
|
||||
std::unique_ptr<llvm::MemoryBuffer> moduleInputBuffer;
|
||||
std::unique_ptr<llvm::MemoryBuffer> moduleDocInputBuffer;
|
||||
std::unique_ptr<llvm::MemoryBuffer> moduleSourceInfoInputBuffer;
|
||||
|
||||
// Look on disk.
|
||||
if (!findModule(moduleID, &moduleInputBuffer, &moduleDocInputBuffer,
|
||||
&moduleSourceInfoInputBuffer,
|
||||
if (!findModule(moduleID, &moduleInterfacePath, &moduleInputBuffer,
|
||||
&moduleDocInputBuffer, &moduleSourceInfoInputBuffer,
|
||||
isFramework, isSystemModule)) {
|
||||
return nullptr;
|
||||
}
|
||||
@@ -865,8 +877,12 @@ SerializedModuleLoaderBase::loadModule(SourceLoc importLoc,
|
||||
Ctx.LoadedModules[moduleID.first] = M;
|
||||
SWIFT_DEFER { M->setHasResolvedImports(); };
|
||||
|
||||
if (!loadAST(*M, moduleID.second, std::move(moduleInputBuffer),
|
||||
std::move(moduleDocInputBuffer), std::move(moduleSourceInfoInputBuffer),
|
||||
StringRef moduleInterfacePathStr =
|
||||
Ctx.AllocateCopy(moduleInterfacePath.str());
|
||||
|
||||
if (!loadAST(*M, moduleID.second, moduleInterfacePathStr,
|
||||
std::move(moduleInputBuffer), std::move(moduleDocInputBuffer),
|
||||
std::move(moduleSourceInfoInputBuffer),
|
||||
isFramework, /*treatAsPartialModule*/false)) {
|
||||
M->setFailedToLoad();
|
||||
}
|
||||
@@ -902,7 +918,8 @@ MemoryBufferSerializedModuleLoader::loadModule(SourceLoc importLoc,
|
||||
auto *M = ModuleDecl::create(moduleID.first, Ctx);
|
||||
SWIFT_DEFER { M->setHasResolvedImports(); };
|
||||
|
||||
if (!loadAST(*M, moduleID.second, std::move(moduleInputBuffer), {}, {},
|
||||
if (!loadAST(*M, moduleID.second, /*moduleInterfacePath*/ "",
|
||||
std::move(moduleInputBuffer), {}, {},
|
||||
isFramework, treatAsPartialModule)) {
|
||||
return nullptr;
|
||||
}
|
||||
@@ -937,6 +954,7 @@ void SerializedModuleLoaderBase::loadObjCMethods(
|
||||
std::error_code MemoryBufferSerializedModuleLoader::findModuleFilesInDirectory(
|
||||
AccessPathElem ModuleID, StringRef DirPath, StringRef ModuleFilename,
|
||||
StringRef ModuleDocFilename, StringRef ModuleSourceInfoFilename,
|
||||
SmallVectorImpl<char> *ModuleInterfacePath,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) {
|
||||
|
||||
Reference in New Issue
Block a user