DependenciesScanner: report user module version for textual Swift interfaces

This commit is contained in:
Xi Ge
2024-08-06 14:48:53 -07:00
parent 370bcec229
commit 98f4ad840a
14 changed files with 60 additions and 16 deletions

View File

@@ -217,6 +217,10 @@ SWIFTSCAN_PUBLIC swiftscan_string_ref_t
swiftscan_swift_textual_detail_get_module_cache_key( swiftscan_swift_textual_detail_get_module_cache_key(
swiftscan_module_details_t details); swiftscan_module_details_t details);
SWIFTSCAN_PUBLIC swiftscan_string_ref_t
swiftscan_swift_textual_detail_get_user_module_version(
swiftscan_module_details_t details);
//=== Swift Binary Module Details query APIs ------------------------------===// //=== Swift Binary Module Details query APIs ------------------------------===//
SWIFTSCAN_PUBLIC swiftscan_string_ref_t SWIFTSCAN_PUBLIC swiftscan_string_ref_t

View File

@@ -294,12 +294,16 @@ public:
/// Details common to Swift textual (interface or source) modules /// Details common to Swift textual (interface or source) modules
CommonSwiftTextualModuleDependencyDetails textualModuleDetails; CommonSwiftTextualModuleDependencyDetails textualModuleDetails;
/// The user module version of this textual module interface.
const std::string userModuleVersion;
SwiftInterfaceModuleDependenciesStorage( SwiftInterfaceModuleDependenciesStorage(
StringRef moduleOutputPath, StringRef swiftInterfaceFile, StringRef moduleOutputPath, StringRef swiftInterfaceFile,
ArrayRef<StringRef> compiledModuleCandidates, ArrayRef<StringRef> compiledModuleCandidates,
ArrayRef<StringRef> buildCommandLine, ArrayRef<LinkLibrary> linkLibraries, ArrayRef<StringRef> buildCommandLine, ArrayRef<LinkLibrary> linkLibraries,
ArrayRef<StringRef> extraPCMArgs, StringRef contextHash, bool isFramework, ArrayRef<StringRef> extraPCMArgs, StringRef contextHash, bool isFramework,
bool isStatic, StringRef RootID, StringRef moduleCacheKey) bool isStatic, StringRef RootID, StringRef moduleCacheKey,
StringRef userModuleVersion)
: ModuleDependencyInfoStorageBase(ModuleDependencyKind::SwiftInterface, : ModuleDependencyInfoStorageBase(ModuleDependencyKind::SwiftInterface,
linkLibraries, moduleCacheKey), linkLibraries, moduleCacheKey),
moduleOutputPath(moduleOutputPath), moduleOutputPath(moduleOutputPath),
@@ -307,7 +311,8 @@ public:
compiledModuleCandidates(compiledModuleCandidates.begin(), compiledModuleCandidates(compiledModuleCandidates.begin(),
compiledModuleCandidates.end()), compiledModuleCandidates.end()),
contextHash(contextHash), isFramework(isFramework), isStatic(isStatic), contextHash(contextHash), isFramework(isFramework), isStatic(isStatic),
textualModuleDetails(extraPCMArgs, buildCommandLine, RootID) {} textualModuleDetails(extraPCMArgs, buildCommandLine, RootID),
userModuleVersion(userModuleVersion) {}
ModuleDependencyInfoStorageBase *clone() const override { ModuleDependencyInfoStorageBase *clone() const override {
return new SwiftInterfaceModuleDependenciesStorage(*this); return new SwiftInterfaceModuleDependenciesStorage(*this);
@@ -592,12 +597,14 @@ public:
ArrayRef<StringRef> compiledCandidates, ArrayRef<StringRef> buildCommands, ArrayRef<StringRef> compiledCandidates, ArrayRef<StringRef> buildCommands,
ArrayRef<LinkLibrary> linkLibraries, ArrayRef<StringRef> extraPCMArgs, ArrayRef<LinkLibrary> linkLibraries, ArrayRef<StringRef> extraPCMArgs,
StringRef contextHash, bool isFramework, bool isStatic, StringRef contextHash, bool isFramework, bool isStatic,
StringRef CASFileSystemRootID, StringRef moduleCacheKey) { StringRef CASFileSystemRootID, StringRef moduleCacheKey,
StringRef userModuleVersion) {
return ModuleDependencyInfo( return ModuleDependencyInfo(
std::make_unique<SwiftInterfaceModuleDependenciesStorage>( std::make_unique<SwiftInterfaceModuleDependenciesStorage>(
moduleOutputPath, swiftInterfaceFile, compiledCandidates, moduleOutputPath, swiftInterfaceFile, compiledCandidates,
buildCommands, linkLibraries, extraPCMArgs, contextHash, buildCommands, linkLibraries, extraPCMArgs, contextHash,
isFramework, isStatic, CASFileSystemRootID, moduleCacheKey)); isFramework, isStatic, CASFileSystemRootID, moduleCacheKey,
userModuleVersion));
} }
/// Describe the module dependencies for a serialized or parsed Swift module. /// Describe the module dependencies for a serialized or parsed Swift module.

View File

@@ -214,7 +214,8 @@ struct InterfaceSubContextDelegate {
SourceLoc diagLoc, SourceLoc diagLoc,
llvm::function_ref<std::error_code(ASTContext&, ModuleDecl*, llvm::function_ref<std::error_code(ASTContext&, ModuleDecl*,
ArrayRef<StringRef>, ArrayRef<StringRef>,
ArrayRef<StringRef>, StringRef)> action) = 0; ArrayRef<StringRef>, StringRef,
StringRef)> action) = 0;
virtual std::error_code runInSubCompilerInstance(StringRef moduleName, virtual std::error_code runInSubCompilerInstance(StringRef moduleName,
StringRef interfacePath, StringRef interfacePath,
StringRef sdkPath, StringRef sdkPath,

View File

@@ -132,6 +132,9 @@ typedef struct {
/// Macro dependecies. /// Macro dependecies.
swiftscan_macro_dependency_set_t *macro_dependencies; swiftscan_macro_dependency_set_t *macro_dependencies;
/// User module version
swiftscan_string_ref_t user_module_version;
} swiftscan_swift_textual_details_t; } swiftscan_swift_textual_details_t;
/// Swift modules with only a binary module file. /// Swift modules with only a binary module file.

View File

@@ -150,7 +150,8 @@ using SwiftInterfaceModuleDetailsLayout =
DependencyIDArrayIDField, // swiftOverlayDependencies DependencyIDArrayIDField, // swiftOverlayDependencies
IdentifierIDField, // CASFileSystemRootID IdentifierIDField, // CASFileSystemRootID
IdentifierIDField, // bridgingHeaderIncludeTree IdentifierIDField, // bridgingHeaderIncludeTree
IdentifierIDField // moduleCacheKey IdentifierIDField, // moduleCacheKey
IdentifierIDField // UserModuleVersion
>; >;
using SwiftSourceModuleDetailsLayout = using SwiftSourceModuleDetailsLayout =

View File

@@ -688,7 +688,7 @@ public:
SourceLoc diagLoc, SourceLoc diagLoc,
llvm::function_ref<std::error_code(ASTContext&, ModuleDecl*, llvm::function_ref<std::error_code(ASTContext&, ModuleDecl*,
ArrayRef<StringRef>, ArrayRef<StringRef>, ArrayRef<StringRef>, ArrayRef<StringRef>,
StringRef)> action) override; StringRef, StringRef)> action) override;
std::error_code runInSubCompilerInstance(StringRef moduleName, std::error_code runInSubCompilerInstance(StringRef moduleName,
StringRef interfacePath, StringRef interfacePath,
StringRef sdkPath, StringRef sdkPath,

View File

@@ -456,6 +456,9 @@ void writeJSON(llvm::raw_ostream &out,
swiftTextualDeps->module_cache_key, 5, swiftTextualDeps->module_cache_key, 5,
/*trailingComma=*/true); /*trailingComma=*/true);
} }
writeJSONSingleField(out, "userModuleVersion",
swiftTextualDeps->user_module_version, 5,
/*trailingComma=*/true);
writeMacroDependencies(out, swiftTextualDeps->macro_dependencies, 5, writeMacroDependencies(out, swiftTextualDeps->macro_dependencies, 5,
/*trailingComma=*/true); /*trailingComma=*/true);
writeJSONSingleField(out, "isFramework", swiftTextualDeps->is_framework, writeJSONSingleField(out, "isFramework", swiftTextualDeps->is_framework,

View File

@@ -255,14 +255,15 @@ bool ModuleDependenciesCacheDeserializer::readGraph(SwiftDependencyScanningServi
extraPCMArgsArrayID, contextHashID, isFramework, isStatic, bridgingHeaderFileID, extraPCMArgsArrayID, contextHashID, isFramework, isStatic, bridgingHeaderFileID,
sourceFilesArrayID, bridgingSourceFilesArrayID, sourceFilesArrayID, bridgingSourceFilesArrayID,
bridgingModuleDependenciesArrayID, overlayDependencyIDArrayID, bridgingModuleDependenciesArrayID, overlayDependencyIDArrayID,
CASFileSystemRootID, bridgingHeaderIncludeTreeID, moduleCacheKeyID; CASFileSystemRootID, bridgingHeaderIncludeTreeID, moduleCacheKeyID,
userModuleVersionID;
SwiftInterfaceModuleDetailsLayout::readRecord( SwiftInterfaceModuleDetailsLayout::readRecord(
Scratch, outputPathFileID, interfaceFileID, Scratch, outputPathFileID, interfaceFileID,
compiledModuleCandidatesArrayID, buildCommandLineArrayID, compiledModuleCandidatesArrayID, buildCommandLineArrayID,
extraPCMArgsArrayID, contextHashID, isFramework, isStatic, bridgingHeaderFileID, extraPCMArgsArrayID, contextHashID, isFramework, isStatic, bridgingHeaderFileID,
sourceFilesArrayID, bridgingSourceFilesArrayID, sourceFilesArrayID, bridgingSourceFilesArrayID,
bridgingModuleDependenciesArrayID, overlayDependencyIDArrayID, bridgingModuleDependenciesArrayID, overlayDependencyIDArrayID,
CASFileSystemRootID, bridgingHeaderIncludeTreeID, moduleCacheKeyID); CASFileSystemRootID, bridgingHeaderIncludeTreeID, moduleCacheKeyID, userModuleVersionID);
auto outputModulePath = getIdentifier(outputPathFileID); auto outputModulePath = getIdentifier(outputPathFileID);
if (!outputModulePath) if (!outputModulePath)
@@ -304,13 +305,17 @@ bool ModuleDependenciesCacheDeserializer::readGraph(SwiftDependencyScanningServi
auto moduleCacheKey = getIdentifier(moduleCacheKeyID); auto moduleCacheKey = getIdentifier(moduleCacheKeyID);
if (!moduleCacheKeyID) if (!moduleCacheKeyID)
llvm::report_fatal_error("Bad moduleCacheKey"); llvm::report_fatal_error("Bad moduleCacheKey");
auto userModuleVersion = getIdentifier(userModuleVersionID);
if (!userModuleVersion)
llvm::report_fatal_error("Bad userModuleVersion");
// TODO: LinkLibraries, MacroDependencies // TODO: LinkLibraries, MacroDependencies
// Form the dependencies storage object // Form the dependencies storage object
auto moduleDep = ModuleDependencyInfo::forSwiftInterfaceModule( auto moduleDep = ModuleDependencyInfo::forSwiftInterfaceModule(
outputModulePath.value(), optionalSwiftInterfaceFile.value(), outputModulePath.value(), optionalSwiftInterfaceFile.value(),
compiledCandidatesRefs, buildCommandRefs, {}, extraPCMRefs, compiledCandidatesRefs, buildCommandRefs, {}, extraPCMRefs,
*contextHash, isFramework, isStatic, *rootFileSystemID, *moduleCacheKey); *contextHash, isFramework, isStatic, *rootFileSystemID, *moduleCacheKey,
*userModuleVersion);
// Add imports of this module // Add imports of this module
for (const auto &moduleName : currentModuleImports) for (const auto &moduleName : currentModuleImports)
@@ -1007,7 +1012,8 @@ void ModuleDependenciesCacheSerializer::writeModuleInfo(
getIdentifier(swiftTextDeps->textualModuleDetails.CASFileSystemRootID), getIdentifier(swiftTextDeps->textualModuleDetails.CASFileSystemRootID),
getIdentifier(swiftTextDeps->textualModuleDetails getIdentifier(swiftTextDeps->textualModuleDetails
.CASBridgingHeaderIncludeTreeRootID), .CASBridgingHeaderIncludeTreeRootID),
getIdentifier(swiftTextDeps->moduleCacheKey)); getIdentifier(swiftTextDeps->moduleCacheKey),
getIdentifier(swiftTextDeps->userModuleVersion));
break; break;
} }
case swift::ModuleDependencyKind::SwiftSource: { case swift::ModuleDependencyKind::SwiftSource: {

View File

@@ -701,7 +701,8 @@ generateFullDependencyGraph(const CompilerInstance &instance,
.CASBridgingHeaderIncludeTreeRootID.c_str()), .CASBridgingHeaderIncludeTreeRootID.c_str()),
create_clone(swiftTextualDeps->moduleCacheKey.c_str()), create_clone(swiftTextualDeps->moduleCacheKey.c_str()),
createMacroDependencySet( createMacroDependencySet(
swiftTextualDeps->textualModuleDetails.macroDependencies)}; swiftTextualDeps->textualModuleDetails.macroDependencies),
create_clone(swiftTextualDeps->userModuleVersion.c_str())};
} else if (swiftSourceDeps) { } else if (swiftSourceDeps) {
swiftscan_string_ref_t moduleInterfacePath = create_null(); swiftscan_string_ref_t moduleInterfacePath = create_null();
swiftscan_string_ref_t bridgingHeaderPath = swiftscan_string_ref_t bridgingHeaderPath =

View File

@@ -2135,15 +2135,18 @@ InterfaceSubContextDelegateImpl::runInSubContext(StringRef moduleName,
StringRef outputPath, StringRef outputPath,
SourceLoc diagLoc, SourceLoc diagLoc,
llvm::function_ref<std::error_code(ASTContext&, ModuleDecl*, ArrayRef<StringRef>, llvm::function_ref<std::error_code(ASTContext&, ModuleDecl*, ArrayRef<StringRef>,
ArrayRef<StringRef>, StringRef)> action) { ArrayRef<StringRef>, StringRef, StringRef)> action) {
return runInSubCompilerInstance(moduleName, interfacePath, sdkPath, outputPath, return runInSubCompilerInstance(moduleName, interfacePath, sdkPath, outputPath,
diagLoc, /*silenceErrors=*/false, diagLoc, /*silenceErrors=*/false,
[&](SubCompilerInstanceInfo &info){ [&](SubCompilerInstanceInfo &info){
std::string UserModuleVer = info.Instance->getInvocation().getFrontendOptions()
.UserModuleVersion.getAsString();
return action(info.Instance->getASTContext(), return action(info.Instance->getASTContext(),
info.Instance->getMainModule(), info.Instance->getMainModule(),
info.BuildArguments, info.BuildArguments,
info.ExtraPCMArgs, info.ExtraPCMArgs,
info.Hash); info.Hash,
UserModuleVer);
}); });
} }

View File

@@ -154,7 +154,7 @@ SwiftModuleScanner::scanInterfaceFile(Twine moduleInterfacePath,
realModuleName.str(), moduleInterfacePath.str(), sdkPath, realModuleName.str(), moduleInterfacePath.str(), sdkPath,
StringRef(), SourceLoc(), StringRef(), SourceLoc(),
[&](ASTContext &Ctx, ModuleDecl *mainMod, ArrayRef<StringRef> BaseArgs, [&](ASTContext &Ctx, ModuleDecl *mainMod, ArrayRef<StringRef> BaseArgs,
ArrayRef<StringRef> PCMArgs, StringRef Hash) { ArrayRef<StringRef> PCMArgs, StringRef Hash, StringRef UserModVer) {
assert(mainMod); assert(mainMod);
std::string InPath = moduleInterfacePath.str(); std::string InPath = moduleInterfacePath.str();
auto compiledCandidates = auto compiledCandidates =
@@ -247,7 +247,7 @@ SwiftModuleScanner::scanInterfaceFile(Twine moduleInterfacePath,
Result = ModuleDependencyInfo::forSwiftInterfaceModule( Result = ModuleDependencyInfo::forSwiftInterfaceModule(
outputPathBase.str().str(), InPath, compiledCandidatesRefs, outputPathBase.str().str(), InPath, compiledCandidatesRefs,
ArgsRefs, linkLibraries, PCMArgs, Hash, isFramework, isStatic, {}, ArgsRefs, linkLibraries, PCMArgs, Hash, isFramework, isStatic, {},
/*module-cache-key*/ ""); /*module-cache-key*/ "", UserModVer);
if (Ctx.CASOpts.EnableCaching) { if (Ctx.CASOpts.EnableCaching) {
std::vector<std::string> clangDependencyFiles; std::vector<std::string> clangDependencyFiles;

View File

@@ -4,6 +4,8 @@
// RUN: %empty-directory(%t/DependencyModules) // RUN: %empty-directory(%t/DependencyModules)
// Emit a textual module dependency // Emit a textual module dependency
// RUN: %target-swift-frontend -emit-module -emit-module-interface-path %t/DependencyModules/TextualFoo.swiftinterface -module-cache-path %t/clang-module-cache -module-name TextualFoo %s -D TEXTUAL_FOO -user-module-version 12.3.4
// RUN: %target-swift-frontend -emit-module -emit-module-path %t/DependencyModules/Foo.swiftmodule -module-cache-path %t/clang-module-cache -module-name Foo %s -D FOO -user-module-version 42.3.3 // RUN: %target-swift-frontend -emit-module -emit-module-path %t/DependencyModules/Foo.swiftmodule -module-cache-path %t/clang-module-cache -module-name Foo %s -D FOO -user-module-version 42.3.3
// RUN: %target-swift-frontend -scan-dependencies -module-cache-path %t/clang-module-cache %s -o %t/deps.json -I %t/DependencyModules/ -module-name main // RUN: %target-swift-frontend -scan-dependencies -module-cache-path %t/clang-module-cache %s -o %t/deps.json -I %t/DependencyModules/ -module-name main
@@ -15,9 +17,14 @@
public func foo() {} public func foo() {}
#elseif TEXTUAL_FOO
#else #else
import Foo import Foo
import TextualFoo
#endif #endif
// CHECK: "userModuleVersion": "12.3.4"
// CHECK: "userModuleVersion": "42.3.3.0" // CHECK: "userModuleVersion": "42.3.3.0"

View File

@@ -74,6 +74,8 @@ void swiftscan_dependency_info_details_dispose(
details_impl->swift_textual_details.module_cache_key); details_impl->swift_textual_details.module_cache_key);
swiftscan_macro_dependency_dispose( swiftscan_macro_dependency_dispose(
details_impl->swift_textual_details.macro_dependencies); details_impl->swift_textual_details.macro_dependencies);
swiftscan_string_dispose(
details_impl->swift_textual_details.user_module_version);
break; break;
case SWIFTSCAN_DEPENDENCY_INFO_SWIFT_BINARY: case SWIFTSCAN_DEPENDENCY_INFO_SWIFT_BINARY:
swiftscan_string_dispose( swiftscan_string_dispose(
@@ -393,6 +395,11 @@ swiftscan_string_ref_t swiftscan_swift_textual_detail_get_module_cache_key(
return details->swift_textual_details.module_cache_key; return details->swift_textual_details.module_cache_key;
} }
swiftscan_string_ref_t swiftscan_swift_textual_detail_get_user_module_version(
swiftscan_module_details_t details) {
return details->swift_textual_details.user_module_version;
}
//=== Swift Binary Module Details query APIs ------------------------------===// //=== Swift Binary Module Details query APIs ------------------------------===//
swiftscan_string_ref_t swiftscan_swift_binary_detail_get_compiled_module_path( swiftscan_string_ref_t swiftscan_swift_binary_detail_get_compiled_module_path(

View File

@@ -24,6 +24,7 @@ swiftscan_swift_textual_detail_get_is_framework
swiftscan_swift_textual_detail_get_swift_overlay_dependencies swiftscan_swift_textual_detail_get_swift_overlay_dependencies
swiftscan_swift_textual_detail_get_cas_fs_root_id swiftscan_swift_textual_detail_get_cas_fs_root_id
swiftscan_swift_textual_detail_get_module_cache_key swiftscan_swift_textual_detail_get_module_cache_key
swiftscan_swift_textual_detail_get_user_module_version
swiftscan_swift_binary_detail_get_compiled_module_path swiftscan_swift_binary_detail_get_compiled_module_path
swiftscan_swift_binary_detail_get_module_doc_path swiftscan_swift_binary_detail_get_module_doc_path
swiftscan_swift_binary_detail_get_module_source_info_path swiftscan_swift_binary_detail_get_module_source_info_path