Merge pull request #27635 from varungandhi-apple/vg-robustify-module-trace-emission

Make module trace emission more robust.
This commit is contained in:
Varun Gandhi
2019-10-15 20:45:04 -07:00
committed by GitHub
13 changed files with 286 additions and 86 deletions

View File

@@ -347,6 +347,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) {
@@ -422,6 +423,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,
@@ -449,6 +451,7 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
auto result = findModuleFilesInDirectory(moduleID, currPath,
targetFileNames.module, targetFileNames.moduleDoc,
targetFileNames.moduleSourceInfo,
moduleInterfacePath,
moduleBuffer, moduleDocBuffer,
moduleSourceInfoBuffer);
if (!result) {
@@ -502,7 +505,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;
@@ -569,6 +572,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,
@@ -590,7 +594,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,
@@ -821,9 +826,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(
@@ -843,13 +854,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;
}
@@ -868,8 +880,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();
}
@@ -905,7 +921,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;
}
@@ -940,6 +957,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) {