mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Merge pull request #82031 from artemcm/RemovePlaceholdersInDepScanner
[Dependency Scanning] Remove obsolete placeholder module concept
This commit is contained in:
@@ -36,7 +36,6 @@ typedef enum {
|
||||
// SwiftInterface and SwiftSource.
|
||||
SWIFTSCAN_DEPENDENCY_INFO_SWIFT_TEXTUAL = 0,
|
||||
SWIFTSCAN_DEPENDENCY_INFO_SWIFT_BINARY = 1,
|
||||
SWIFTSCAN_DEPENDENCY_INFO_SWIFT_PLACEHOLDER = 2,
|
||||
SWIFTSCAN_DEPENDENCY_INFO_CLANG = 3
|
||||
} swiftscan_dependency_info_kind_t;
|
||||
|
||||
@@ -310,7 +309,8 @@ swiftscan_swift_binary_detail_get_module_cache_key(
|
||||
SWIFTSCAN_PUBLIC swiftscan_string_ref_t
|
||||
swiftscan_swift_binary_detail_get_user_module_version(
|
||||
swiftscan_module_details_t details);
|
||||
//=== Swift Placeholder Module Details query APIs -------------------------===//
|
||||
|
||||
//=== Swift Placeholder Module Details query APIs - DEPRECATED -----------===//
|
||||
|
||||
SWIFTSCAN_PUBLIC swiftscan_string_ref_t
|
||||
swiftscan_swift_placeholder_detail_get_compiled_module_path(
|
||||
|
||||
@@ -360,14 +360,6 @@ ERROR(explicit_swift_module_map_corrupted,none,
|
||||
"explicit Swift module map from %0 is malformed",
|
||||
(StringRef))
|
||||
|
||||
ERROR(placeholder_dependency_module_map_missing,none,
|
||||
"cannot open Swift placeholder dependency module map from %0",
|
||||
(StringRef))
|
||||
|
||||
ERROR(placeholder_dependency_module_map_corrupted,none,
|
||||
"Swift placeholder dependency module map from %0 is malformed",
|
||||
(StringRef))
|
||||
|
||||
ERROR(const_extract_protocol_list_input_file_missing,none,
|
||||
"cannot open constant extraction protocol list input file from %0",
|
||||
(StringRef))
|
||||
|
||||
@@ -69,30 +69,7 @@ enum class ModuleDependencyKind : int8_t {
|
||||
Clang,
|
||||
// Used to model the translation unit's source module
|
||||
SwiftSource,
|
||||
// Placeholder dependencies are a kind of dependencies used only by the
|
||||
// dependency scanner. They are swift modules that the scanner will not be
|
||||
// able to locate in its search paths and which are the responsibility of the
|
||||
// scanner's client to ensure are provided.
|
||||
//
|
||||
// Placeholder dependencies will be specified in the scanner's output
|
||||
// dependency graph where it is the responsibility of the scanner's client to
|
||||
// ensure required post-processing takes place to "resolve" them. In order to
|
||||
// do so, the client (swift driver, or any other client build system) is
|
||||
// expected to have access to a full dependency graph of all placeholder
|
||||
// dependencies and be able to replace placeholder nodes in the dependency
|
||||
// graph with their full dependency trees, `uniquing` common dependency module
|
||||
// nodes in the process.
|
||||
//
|
||||
// One example where placeholder dependencies are employed is when using
|
||||
// SwiftPM in Explicit Module Build mode. SwiftPM constructs a build plan for
|
||||
// all targets ahead-of-time. When planning a build for a target that depends
|
||||
// on other targets, the dependency scanning action is not able to locate
|
||||
// dependency target modules, because they have not yet been built. Instead,
|
||||
// the build system treats them as placeholder dependencies and resolves them
|
||||
// with `actual` dependencies in a post-processing step once dependency graphs
|
||||
// of all targets, individually, have been computed.
|
||||
SwiftPlaceholder,
|
||||
LastKind = SwiftPlaceholder + 1
|
||||
LastKind = SwiftSource + 1
|
||||
};
|
||||
|
||||
/// This is used to idenfity a specific macro plugin dependency.
|
||||
@@ -542,39 +519,6 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/// Describes an placeholder Swift module dependency module stub.
|
||||
///
|
||||
/// This class is mostly an implementation detail for \c ModuleDependencyInfo.
|
||||
|
||||
class SwiftPlaceholderModuleDependencyStorage
|
||||
: public ModuleDependencyInfoStorageBase {
|
||||
public:
|
||||
SwiftPlaceholderModuleDependencyStorage(StringRef compiledModulePath,
|
||||
StringRef moduleDocPath,
|
||||
StringRef sourceInfoPath)
|
||||
: ModuleDependencyInfoStorageBase(ModuleDependencyKind::SwiftPlaceholder, {}, {},
|
||||
{}),
|
||||
compiledModulePath(compiledModulePath), moduleDocPath(moduleDocPath),
|
||||
sourceInfoPath(sourceInfoPath) {}
|
||||
|
||||
ModuleDependencyInfoStorageBase *clone() const override {
|
||||
return new SwiftPlaceholderModuleDependencyStorage(*this);
|
||||
}
|
||||
|
||||
/// The path to the .swiftmodule file.
|
||||
const std::string compiledModulePath;
|
||||
|
||||
/// The path to the .swiftModuleDoc file.
|
||||
const std::string moduleDocPath;
|
||||
|
||||
/// The path to the .swiftSourceInfo file.
|
||||
const std::string sourceInfoPath;
|
||||
|
||||
static bool classof(const ModuleDependencyInfoStorageBase *base) {
|
||||
return base->dependencyKind == ModuleDependencyKind::SwiftPlaceholder;
|
||||
}
|
||||
};
|
||||
|
||||
// MARK: Module Dependency Info
|
||||
/// Describes the dependencies of a given module.
|
||||
///
|
||||
@@ -675,16 +619,6 @@ public:
|
||||
CASFileSystemRootID, clangIncludeTreeRoot, moduleCacheKey, IsSystem));
|
||||
}
|
||||
|
||||
/// Describe a placeholder dependency swift module.
|
||||
static ModuleDependencyInfo
|
||||
forPlaceholderSwiftModuleStub(StringRef compiledModulePath,
|
||||
StringRef moduleDocPath,
|
||||
StringRef sourceInfoPath) {
|
||||
return ModuleDependencyInfo(
|
||||
std::make_unique<SwiftPlaceholderModuleDependencyStorage>(
|
||||
compiledModulePath, moduleDocPath, sourceInfoPath));
|
||||
}
|
||||
|
||||
/// Retrieve the module-level imports.
|
||||
ArrayRef<ScannerImportStatementInfo> getModuleImports() const {
|
||||
return storage->moduleImports;
|
||||
@@ -903,7 +837,7 @@ public:
|
||||
bool isTestableImport(StringRef moduleName) const;
|
||||
|
||||
/// Whether the dependencies are for a Swift module: either Textual, Source,
|
||||
/// Binary, or Placeholder.
|
||||
/// or Binary
|
||||
bool isSwiftModule() const;
|
||||
|
||||
/// Whether the dependencies are for a textual interface Swift module or a
|
||||
@@ -919,9 +853,6 @@ public:
|
||||
/// Whether the dependencies are for a binary Swift module.
|
||||
bool isSwiftBinaryModule() const;
|
||||
|
||||
/// Whether this represents a placeholder module stub
|
||||
bool isSwiftPlaceholderModule() const;
|
||||
|
||||
/// Whether the dependencies are for a Clang module.
|
||||
bool isClangModule() const;
|
||||
|
||||
@@ -940,10 +871,6 @@ public:
|
||||
/// Retrieve the dependencies for a Clang module.
|
||||
const ClangModuleDependencyStorage *getAsClangModule() const;
|
||||
|
||||
/// Retrieve the dependencies for a placeholder dependency module stub.
|
||||
const SwiftPlaceholderModuleDependencyStorage *
|
||||
getAsPlaceholderDependencyModule() const;
|
||||
|
||||
/// Add a dependency on the given module, if it was not already in the set.
|
||||
void
|
||||
addOptionalModuleImport(StringRef module, bool isExported,
|
||||
|
||||
@@ -43,7 +43,6 @@ struct swiftscan_dependency_info_s {
|
||||
/// "swiftInterface"
|
||||
/// "swiftSource"
|
||||
/// "swiftBinary"
|
||||
/// "swiftPlaceholder"
|
||||
/// "clang""
|
||||
swiftscan_string_ref_t module_name;
|
||||
|
||||
@@ -192,19 +191,6 @@ typedef struct {
|
||||
swiftscan_string_ref_t user_module_version;
|
||||
} swiftscan_swift_binary_details_t;
|
||||
|
||||
/// Swift placeholder modules carry additional details that specify their
|
||||
/// module doc path and source info paths.
|
||||
typedef struct {
|
||||
/// The path to the pre-compiled binary module
|
||||
swiftscan_string_ref_t compiled_module_path;
|
||||
|
||||
/// The path to the .swiftModuleDoc file.
|
||||
swiftscan_string_ref_t module_doc_path;
|
||||
|
||||
/// The path to the .swiftSourceInfo file.
|
||||
swiftscan_string_ref_t module_source_info_path;
|
||||
} swiftscan_swift_placeholder_details_t;
|
||||
|
||||
/// Clang modules are built from a module map file.
|
||||
typedef struct {
|
||||
/// The path to the module map used to build this module.
|
||||
@@ -231,7 +217,6 @@ struct swiftscan_module_details_s {
|
||||
union {
|
||||
swiftscan_swift_textual_details_t swift_textual_details;
|
||||
swiftscan_swift_binary_details_t swift_binary_details;
|
||||
swiftscan_swift_placeholder_details_t swift_placeholder_details;
|
||||
swiftscan_clang_details_t clang_details;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -68,14 +68,12 @@ public:
|
||||
/// Construct a dependency scanning tool.
|
||||
DependencyScanningTool();
|
||||
|
||||
/// Collect the full module dependency graph for the input, ignoring any
|
||||
/// placeholder modules.
|
||||
/// Collect the full module dependency graph for the input.
|
||||
///
|
||||
/// \returns a \c StringError with the diagnostic output if errors
|
||||
/// occurred, \c swiftscan_dependency_result_t otherwise.
|
||||
llvm::ErrorOr<swiftscan_dependency_graph_t>
|
||||
getDependencies(ArrayRef<const char *> Command,
|
||||
const llvm::StringSet<> &PlaceholderModules,
|
||||
StringRef WorkingDirectory);
|
||||
|
||||
/// Collect the set of imports for the input module
|
||||
|
||||
@@ -39,7 +39,7 @@ using llvm::BCVBR;
|
||||
|
||||
/// Every .moddepcache file begins with these 4 bytes, for easy identification.
|
||||
const unsigned char MODULE_DEPENDENCY_CACHE_FORMAT_SIGNATURE[] = {'I', 'M', 'D','C'};
|
||||
const unsigned MODULE_DEPENDENCY_CACHE_FORMAT_VERSION_MAJOR = 9;
|
||||
const unsigned MODULE_DEPENDENCY_CACHE_FORMAT_VERSION_MAJOR = 10;
|
||||
/// Increment this on every change.
|
||||
const unsigned MODULE_DEPENDENCY_CACHE_FORMAT_VERSION_MINOR = 3;
|
||||
|
||||
@@ -112,7 +112,6 @@ enum {
|
||||
OPTIONAL_IMPORT_STATEMENT_ARRAY_NODE,
|
||||
SWIFT_INTERFACE_MODULE_DETAILS_NODE,
|
||||
SWIFT_SOURCE_MODULE_DETAILS_NODE,
|
||||
SWIFT_PLACEHOLDER_MODULE_DETAILS_NODE,
|
||||
SWIFT_BINARY_MODULE_DETAILS_NODE,
|
||||
CLANG_MODULE_DETAILS_NODE,
|
||||
IDENTIFIER_NODE,
|
||||
@@ -208,7 +207,6 @@ using OptionalImportStatementArrayLayout =
|
||||
// - SwiftInterfaceModuleDetails
|
||||
// - SwiftSourceModuleDetails
|
||||
// - SwiftBinaryModuleDetails
|
||||
// - SwiftPlaceholderModuleDetails
|
||||
// - ClangModuleDetails
|
||||
using ModuleInfoLayout =
|
||||
BCRecordLayout<MODULE_NODE, // ID
|
||||
@@ -273,13 +271,6 @@ using SwiftBinaryModuleDetailsLayout =
|
||||
IdentifierIDField // UserModuleVersion
|
||||
>;
|
||||
|
||||
using SwiftPlaceholderModuleDetailsLayout =
|
||||
BCRecordLayout<SWIFT_PLACEHOLDER_MODULE_DETAILS_NODE, // ID
|
||||
FileIDField, // compiledModulePath
|
||||
FileIDField, // moduleDocPath
|
||||
FileIDField // moduleSourceInfoPath
|
||||
>;
|
||||
|
||||
using ClangModuleDetailsLayout =
|
||||
BCRecordLayout<CLANG_MODULE_DETAILS_NODE, // ID
|
||||
FileIDField, // pcmOutputPath
|
||||
|
||||
@@ -258,10 +258,6 @@ def const_gather_protocols_file
|
||||
: Separate<["-"], "const-gather-protocols-file">, MetaVarName<"<path>">,
|
||||
HelpText<"Specify a list of protocols for extraction of conformances' const values'">;
|
||||
|
||||
def placeholder_dependency_module_map
|
||||
: Separate<["-"], "placeholder-dependency-module-map-file">, MetaVarName<"<path>">,
|
||||
HelpText<"Specify a JSON file containing information of external Swift module dependencies">;
|
||||
|
||||
def import_prescan : Flag<["-"], "import-prescan">,
|
||||
HelpText<"When performing a dependency scan, only identify all imports of the main Swift module sources">;
|
||||
|
||||
|
||||
@@ -83,51 +83,6 @@ public:
|
||||
return MDS->getKind() == MDS_plain;
|
||||
}
|
||||
};
|
||||
|
||||
/// A ModuleLoader that loads placeholder dependency module stubs specified in
|
||||
/// -placeholder-dependency-module-map-file
|
||||
/// This loader is used only in dependency scanning to inform the scanner that a
|
||||
/// set of modules constitute placeholder dependencies that are not visible to
|
||||
/// the scanner but will nevertheless be provided by the scanner's clients. This
|
||||
/// "loader" will not attempt to load any module files.
|
||||
class PlaceholderSwiftModuleScanner : public SwiftModuleScanner {
|
||||
/// Scan the given placeholder module map
|
||||
void parsePlaceholderModuleMap(StringRef fileName);
|
||||
|
||||
llvm::StringMap<ExplicitSwiftModuleInputInfo> PlaceholderDependencyModuleMap;
|
||||
llvm::BumpPtrAllocator Allocator;
|
||||
|
||||
public:
|
||||
PlaceholderSwiftModuleScanner(ASTContext &ctx, ModuleLoadingMode LoadMode,
|
||||
Identifier moduleName,
|
||||
StringRef PlaceholderDependencyModuleMap,
|
||||
InterfaceSubContextDelegate &astDelegate,
|
||||
StringRef moduleOutputPath,
|
||||
StringRef sdkModuleOutputPath)
|
||||
: SwiftModuleScanner(ctx, LoadMode, moduleName, astDelegate,
|
||||
moduleOutputPath, sdkModuleOutputPath, {},
|
||||
MDS_placeholder) {
|
||||
// FIXME: Find a better place for this map to live, to avoid
|
||||
// doing the parsing on every module.
|
||||
if (!PlaceholderDependencyModuleMap.empty()) {
|
||||
parsePlaceholderModuleMap(PlaceholderDependencyModuleMap);
|
||||
}
|
||||
}
|
||||
|
||||
virtual bool
|
||||
findModule(ImportPath::Element moduleID,
|
||||
SmallVectorImpl<char> *moduleInterfacePath,
|
||||
SmallVectorImpl<char> *moduleInterfaceSourcePath,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
|
||||
bool skipBuildingInterface, bool isTestableDependencyLookup,
|
||||
bool &isFramework, bool &isSystemModule) override;
|
||||
|
||||
static bool classof(const SwiftModuleScanner *MDS) {
|
||||
return MDS->getKind() == MDS_placeholder;
|
||||
}
|
||||
};
|
||||
} // namespace swift
|
||||
|
||||
#endif // SWIFT_SCANNINGLOADERS_H
|
||||
|
||||
@@ -36,7 +36,7 @@ ModuleDependencyInfoStorageBase::~ModuleDependencyInfoStorageBase() {}
|
||||
|
||||
bool ModuleDependencyInfo::isSwiftModule() const {
|
||||
return isSwiftInterfaceModule() || isSwiftSourceModule() ||
|
||||
isSwiftBinaryModule() || isSwiftPlaceholderModule();
|
||||
isSwiftBinaryModule();
|
||||
}
|
||||
|
||||
bool ModuleDependencyInfo::isTextualSwiftModule() const {
|
||||
@@ -66,10 +66,6 @@ bool ModuleDependencyInfo::isSwiftBinaryModule() const {
|
||||
return isa<SwiftBinaryModuleDependencyStorage>(storage.get());
|
||||
}
|
||||
|
||||
bool ModuleDependencyInfo::isSwiftPlaceholderModule() const {
|
||||
return isa<SwiftPlaceholderModuleDependencyStorage>(storage.get());
|
||||
}
|
||||
|
||||
bool ModuleDependencyInfo::isClangModule() const {
|
||||
return isa<ClangModuleDependencyStorage>(storage.get());
|
||||
}
|
||||
@@ -97,12 +93,6 @@ ModuleDependencyInfo::getAsClangModule() const {
|
||||
return dyn_cast<ClangModuleDependencyStorage>(storage.get());
|
||||
}
|
||||
|
||||
/// Retrieve the dependencies for a placeholder dependency module stub.
|
||||
const SwiftPlaceholderModuleDependencyStorage *
|
||||
ModuleDependencyInfo::getAsPlaceholderDependencyModule() const {
|
||||
return dyn_cast<SwiftPlaceholderModuleDependencyStorage>(storage.get());
|
||||
}
|
||||
|
||||
void ModuleDependencyInfo::addTestableImport(ImportPath::Module module) {
|
||||
assert(getAsSwiftSourceModule() && "Expected source module for addTestableImport.");
|
||||
dyn_cast<SwiftSourceModuleDependenciesStorage>(storage.get())->addTestableImport(module);
|
||||
@@ -388,11 +378,6 @@ std::string ModuleDependencyInfo::getModuleOutputPath() const {
|
||||
cast<SwiftBinaryModuleDependencyStorage>(storage.get());
|
||||
return swiftBinaryStorage->compiledModulePath;
|
||||
}
|
||||
case swift::ModuleDependencyKind::SwiftPlaceholder: {
|
||||
auto swiftPlaceholderStorage =
|
||||
cast<SwiftPlaceholderModuleDependencyStorage>(storage.get());
|
||||
return swiftPlaceholderStorage->compiledModulePath;
|
||||
}
|
||||
default:
|
||||
llvm_unreachable("Unexpected dependency kind");
|
||||
}
|
||||
@@ -876,8 +861,6 @@ ModuleDependenciesCache::findSwiftDependency(StringRef moduleName) const {
|
||||
return found;
|
||||
if (auto found = findDependency(moduleName, ModuleDependencyKind::SwiftSource))
|
||||
return found;
|
||||
if (auto found = findDependency(moduleName, ModuleDependencyKind::SwiftPlaceholder))
|
||||
return found;
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
|
||||
@@ -240,9 +240,6 @@ ModuleDependencyInfo::collectCrossImportOverlayNames(
|
||||
case swift::ModuleDependencyKind::SwiftSource: {
|
||||
return result;
|
||||
}
|
||||
case swift::ModuleDependencyKind::SwiftPlaceholder: {
|
||||
return result;
|
||||
}
|
||||
case swift::ModuleDependencyKind::LastKind:
|
||||
llvm_unreachable("Unhandled dependency kind.");
|
||||
}
|
||||
|
||||
@@ -134,7 +134,6 @@ void writeEncodedModuleIdJSONValue(llvm::raw_ostream &out,
|
||||
out << "{\n";
|
||||
static const std::string textualPrefix("swiftTextual");
|
||||
static const std::string binaryPrefix("swiftBinary");
|
||||
static const std::string placeholderPrefix("swiftPlaceholder");
|
||||
static const std::string clangPrefix("clang");
|
||||
std::string valueStr = get_C_string(value);
|
||||
std::string moduleKind;
|
||||
@@ -146,10 +145,6 @@ void writeEncodedModuleIdJSONValue(llvm::raw_ostream &out,
|
||||
// FIXME: rename to be consistent in the clients (swift-driver)
|
||||
moduleKind = "swiftPrebuiltExternal";
|
||||
moduleName = valueStr.substr(binaryPrefix.size() + 1);
|
||||
} else if (!valueStr.compare(0, placeholderPrefix.size(),
|
||||
placeholderPrefix)) {
|
||||
moduleKind = "swiftPlaceholder";
|
||||
moduleName = valueStr.substr(placeholderPrefix.size() + 1);
|
||||
} else {
|
||||
moduleKind = "clang";
|
||||
moduleName = valueStr.substr(clangPrefix.size() + 1);
|
||||
@@ -365,13 +360,6 @@ getAsTextualDependencyModule(swiftscan_module_details_t details) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static const swiftscan_swift_placeholder_details_t *
|
||||
getAsPlaceholderDependencyModule(swiftscan_module_details_t details) {
|
||||
if (details->kind == SWIFTSCAN_DEPENDENCY_INFO_SWIFT_PLACEHOLDER)
|
||||
return &details->swift_placeholder_details;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static const swiftscan_swift_binary_details_t *
|
||||
getAsBinaryDependencyModule(swiftscan_module_details_t details) {
|
||||
if (details->kind == SWIFTSCAN_DEPENDENCY_INFO_SWIFT_BINARY)
|
||||
@@ -418,8 +406,6 @@ void writeJSON(llvm::raw_ostream &out,
|
||||
out << ",\n";
|
||||
out.indent(2 * 2);
|
||||
out << "{\n";
|
||||
auto swiftPlaceholderDeps =
|
||||
getAsPlaceholderDependencyModule(moduleInfo.details);
|
||||
auto swiftTextualDeps = getAsTextualDependencyModule(moduleInfo.details);
|
||||
auto swiftBinaryDeps = getAsBinaryDependencyModule(moduleInfo.details);
|
||||
auto clangDeps = getAsClangDependencyModule(moduleInfo.details);
|
||||
@@ -432,9 +418,7 @@ void writeJSON(llvm::raw_ostream &out,
|
||||
std::string(get_C_string(moduleInfo.module_name));
|
||||
std::string moduleName =
|
||||
moduleKindAndName.substr(moduleKindAndName.find(":") + 1);
|
||||
if (swiftPlaceholderDeps)
|
||||
modulePath = get_C_string(swiftPlaceholderDeps->compiled_module_path);
|
||||
else if (swiftBinaryDeps)
|
||||
if (swiftBinaryDeps)
|
||||
modulePath = get_C_string(swiftBinaryDeps->compiled_module_path);
|
||||
else if (clangDeps || swiftTextualDeps)
|
||||
modulePath = get_C_string(moduleInfo.module_path);
|
||||
@@ -590,25 +574,6 @@ void writeJSON(llvm::raw_ostream &out,
|
||||
"swiftOverlayDependencies", 5,
|
||||
/*trailingComma=*/false);
|
||||
}
|
||||
} else if (swiftPlaceholderDeps) {
|
||||
out << "\"swiftPlaceholder\": {\n";
|
||||
|
||||
// Module doc file
|
||||
if (swiftPlaceholderDeps->module_doc_path.data &&
|
||||
get_C_string(swiftPlaceholderDeps->module_doc_path)[0] != '\0')
|
||||
writeJSONSingleField(out, "moduleDocPath",
|
||||
swiftPlaceholderDeps->module_doc_path,
|
||||
/*indentLevel=*/5,
|
||||
/*trailingComma=*/true);
|
||||
|
||||
// Module Source Info file
|
||||
if (swiftPlaceholderDeps->module_source_info_path.data &&
|
||||
get_C_string(swiftPlaceholderDeps->module_source_info_path)[0] !=
|
||||
'\0')
|
||||
writeJSONSingleField(out, "moduleSourceInfoPath",
|
||||
swiftPlaceholderDeps->module_source_info_path,
|
||||
/*indentLevel=*/5,
|
||||
/*trailingComma=*/false);
|
||||
} else if (swiftBinaryDeps) {
|
||||
bool hasOverlayDependencies =
|
||||
swiftBinaryDeps->swift_overlay_module_dependencies &&
|
||||
|
||||
@@ -271,7 +271,6 @@ DependencyScanningTool::DependencyScanningTool()
|
||||
llvm::ErrorOr<swiftscan_dependency_graph_t>
|
||||
DependencyScanningTool::getDependencies(
|
||||
ArrayRef<const char *> Command,
|
||||
const llvm::StringSet<> &PlaceholderModules,
|
||||
StringRef WorkingDirectory) {
|
||||
// There may be errors as early as in instance initialization, so we must ensure
|
||||
// we can catch those.
|
||||
|
||||
@@ -751,34 +751,6 @@ bool ModuleDependenciesCacheDeserializer::readGraph(
|
||||
break;
|
||||
}
|
||||
|
||||
case SWIFT_PLACEHOLDER_MODULE_DETAILS_NODE: {
|
||||
if (!hasCurrentModule)
|
||||
llvm::report_fatal_error(
|
||||
"Unexpected SWIFT_PLACEHOLDER_MODULE_DETAILS_NODE record");
|
||||
unsigned compiledModulePathID, moduleDocPathID, moduleSourceInfoPathID;
|
||||
SwiftPlaceholderModuleDetailsLayout::readRecord(
|
||||
Scratch, compiledModulePathID, moduleDocPathID,
|
||||
moduleSourceInfoPathID);
|
||||
|
||||
auto compiledModulePath = getIdentifier(compiledModulePathID);
|
||||
if (!compiledModulePath)
|
||||
llvm::report_fatal_error("Bad compiled module path");
|
||||
auto moduleDocPath = getIdentifier(moduleDocPathID);
|
||||
if (!moduleDocPath)
|
||||
llvm::report_fatal_error("Bad module doc path");
|
||||
auto moduleSourceInfoPath = getIdentifier(moduleSourceInfoPathID);
|
||||
if (!moduleSourceInfoPath)
|
||||
llvm::report_fatal_error("Bad module source info path");
|
||||
|
||||
// Form the dependencies storage object
|
||||
auto moduleDep = ModuleDependencyInfo::forPlaceholderSwiftModuleStub(
|
||||
*compiledModulePath, *moduleDocPath, *moduleSourceInfoPath);
|
||||
|
||||
cache.recordDependency(currentModuleName, std::move(moduleDep));
|
||||
hasCurrentModule = false;
|
||||
break;
|
||||
}
|
||||
|
||||
case CLANG_MODULE_DETAILS_NODE: {
|
||||
if (!hasCurrentModule)
|
||||
llvm::report_fatal_error("Unexpected CLANG_MODULE_DETAILS_NODE record");
|
||||
@@ -1013,7 +985,6 @@ ModuleDependenciesCacheDeserializer::getModuleDependencyIDArray(unsigned n) {
|
||||
if (encodedIdentifierStringArray) {
|
||||
static const std::string textualPrefix("swiftTextual");
|
||||
static const std::string binaryPrefix("swiftBinary");
|
||||
static const std::string placeholderPrefix("swiftPlaceholder");
|
||||
static const std::string clangPrefix("clang");
|
||||
std::vector<ModuleDependencyID> result;
|
||||
for (const auto &encodedIdentifierString : *encodedIdentifierStringArray) {
|
||||
@@ -1028,11 +999,6 @@ ModuleDependenciesCacheDeserializer::getModuleDependencyIDArray(unsigned n) {
|
||||
auto moduleName =
|
||||
encodedIdentifierString.substr(binaryPrefix.size() + 1);
|
||||
id = {moduleName, ModuleDependencyKind::SwiftBinary};
|
||||
} else if (!encodedIdentifierString.compare(0, placeholderPrefix.size(),
|
||||
placeholderPrefix)) {
|
||||
auto moduleName =
|
||||
encodedIdentifierString.substr(placeholderPrefix.size() + 1);
|
||||
id = {moduleName, ModuleDependencyKind::SwiftPlaceholder};
|
||||
} else {
|
||||
auto moduleName =
|
||||
encodedIdentifierString.substr(clangPrefix.size() + 1);
|
||||
@@ -1268,7 +1234,6 @@ void ModuleDependenciesCacheSerializer::writeBlockInfoBlock() {
|
||||
BLOCK_RECORD(graph_block, SWIFT_INTERFACE_MODULE_DETAILS_NODE);
|
||||
BLOCK_RECORD(graph_block, SWIFT_SOURCE_MODULE_DETAILS_NODE);
|
||||
BLOCK_RECORD(graph_block, SWIFT_BINARY_MODULE_DETAILS_NODE);
|
||||
BLOCK_RECORD(graph_block, SWIFT_PLACEHOLDER_MODULE_DETAILS_NODE);
|
||||
BLOCK_RECORD(graph_block, CLANG_MODULE_DETAILS_NODE);
|
||||
}
|
||||
|
||||
@@ -1668,17 +1633,6 @@ void ModuleDependenciesCacheSerializer::writeModuleInfo(
|
||||
getIdentifier(swiftBinDeps->userModuleVersion));
|
||||
break;
|
||||
}
|
||||
case swift::ModuleDependencyKind::SwiftPlaceholder: {
|
||||
auto swiftPHDeps = dependencyInfo.getAsPlaceholderDependencyModule();
|
||||
assert(swiftPHDeps);
|
||||
SwiftPlaceholderModuleDetailsLayout::emitRecord(
|
||||
Out, ScratchRecord,
|
||||
AbbrCodes[SwiftPlaceholderModuleDetailsLayout::Code],
|
||||
getIdentifier(swiftPHDeps->compiledModulePath),
|
||||
getIdentifier(swiftPHDeps->moduleDocPath),
|
||||
getIdentifier(swiftPHDeps->sourceInfoPath));
|
||||
break;
|
||||
}
|
||||
case swift::ModuleDependencyKind::Clang: {
|
||||
auto clangDeps = dependencyInfo.getAsClangModule();
|
||||
assert(clangDeps);
|
||||
@@ -1936,14 +1890,6 @@ void ModuleDependenciesCacheSerializer::collectStringsAndArrays(
|
||||
[this](auto &sp) { addIdentifier(sp.Path); });
|
||||
break;
|
||||
}
|
||||
case swift::ModuleDependencyKind::SwiftPlaceholder: {
|
||||
auto swiftPHDeps = dependencyInfo->getAsPlaceholderDependencyModule();
|
||||
assert(swiftPHDeps);
|
||||
addIdentifier(swiftPHDeps->compiledModulePath);
|
||||
addIdentifier(swiftPHDeps->moduleDocPath);
|
||||
addIdentifier(swiftPHDeps->sourceInfoPath);
|
||||
break;
|
||||
}
|
||||
case swift::ModuleDependencyKind::SwiftSource: {
|
||||
auto swiftSourceDeps = dependencyInfo->getAsSwiftSourceModule();
|
||||
assert(swiftSourceDeps);
|
||||
@@ -2021,7 +1967,6 @@ void ModuleDependenciesCacheSerializer::writeInterModuleDependenciesCache(
|
||||
registerRecordAbbr<SwiftSourceModuleDetailsLayout>();
|
||||
registerRecordAbbr<SwiftInterfaceModuleDetailsLayout>();
|
||||
registerRecordAbbr<SwiftBinaryModuleDetailsLayout>();
|
||||
registerRecordAbbr<SwiftPlaceholderModuleDetailsLayout>();
|
||||
registerRecordAbbr<ClangModuleDetailsLayout>();
|
||||
|
||||
// Make a pass to collect all unique strings and arrays
|
||||
|
||||
@@ -104,8 +104,7 @@ findPathToDependency(ModuleDependencyID dependency,
|
||||
static bool isSwiftDependencyKind(ModuleDependencyKind Kind) {
|
||||
return Kind == ModuleDependencyKind::SwiftInterface ||
|
||||
Kind == ModuleDependencyKind::SwiftSource ||
|
||||
Kind == ModuleDependencyKind::SwiftBinary ||
|
||||
Kind == ModuleDependencyKind::SwiftPlaceholder;
|
||||
Kind == ModuleDependencyKind::SwiftBinary;
|
||||
}
|
||||
|
||||
// The Swift compiler does not have a concept of a working directory.
|
||||
@@ -1371,8 +1370,7 @@ void ModuleDependencyScanner::resolveSwiftOverlayDependenciesForModule(
|
||||
Identifier moduleIdentifier) {
|
||||
auto moduleName = moduleIdentifier.str();
|
||||
if (cache.hasDependency(moduleName, ModuleDependencyKind::SwiftInterface) ||
|
||||
cache.hasDependency(moduleName, ModuleDependencyKind::SwiftBinary) ||
|
||||
cache.hasDependency(moduleName, ModuleDependencyKind::SwiftPlaceholder))
|
||||
cache.hasDependency(moduleName, ModuleDependencyKind::SwiftBinary))
|
||||
return;
|
||||
|
||||
auto moduleDependencies = withDependencyScanningWorker(
|
||||
@@ -1713,10 +1711,6 @@ void ModuleDependencyScanner::diagnoseScannerFailure(
|
||||
moduleFilePath =
|
||||
entryNode->getAsSwiftBinaryModule()->compiledModulePath;
|
||||
break;
|
||||
case swift::ModuleDependencyKind::SwiftPlaceholder:
|
||||
moduleFilePath =
|
||||
entryNode->getAsPlaceholderDependencyModule()->compiledModulePath;
|
||||
break;
|
||||
case swift::ModuleDependencyKind::Clang:
|
||||
moduleFilePath = entryNode->getAsClangModule()->moduleMapFile;
|
||||
isClang = true;
|
||||
@@ -1751,9 +1745,6 @@ static std::string getModuleDefiningPath(const ModuleDependencyInfo &info) {
|
||||
case swift::ModuleDependencyKind::SwiftBinary:
|
||||
path = info.getAsSwiftBinaryModule()->compiledModulePath;
|
||||
break;
|
||||
case swift::ModuleDependencyKind::SwiftPlaceholder:
|
||||
path = info.getAsPlaceholderDependencyModule()->compiledModulePath;
|
||||
break;
|
||||
case swift::ModuleDependencyKind::Clang:
|
||||
path = info.getAsClangModule()->moduleMapFile;
|
||||
break;
|
||||
|
||||
@@ -92,10 +92,6 @@ public:
|
||||
// Resolve the dependencies for the current moduleID. Return true on error.
|
||||
bool resolve(const std::set<ModuleDependencyID> &dependencies,
|
||||
std::optional<std::set<ModuleDependencyID>> bridgingHeaderDeps) {
|
||||
// No need to resolve dependency for placeholder.
|
||||
if (moduleID.Kind == ModuleDependencyKind::SwiftPlaceholder)
|
||||
return false;
|
||||
|
||||
// If the dependency is already finalized, nothing needs to be done.
|
||||
if (resolvingDepInfo.isFinalized())
|
||||
return false;
|
||||
@@ -116,13 +112,6 @@ public:
|
||||
if (handleSwiftBinaryModuleDependency(depModuleID, *binaryDepDetails))
|
||||
return true;
|
||||
} break;
|
||||
case swift::ModuleDependencyKind::SwiftPlaceholder: {
|
||||
auto placeholderDetails = depInfo.getAsPlaceholderDependencyModule();
|
||||
assert(placeholderDetails && "Expected Swift Placeholder dependency.");
|
||||
if (handleSwiftPlaceholderModuleDependency(depModuleID,
|
||||
*placeholderDetails))
|
||||
return true;
|
||||
} break;
|
||||
case swift::ModuleDependencyKind::Clang: {
|
||||
auto clangDepDetails = depInfo.getAsClangModule();
|
||||
assert(clangDepDetails && "Expected Clang Module dependency.");
|
||||
@@ -195,9 +184,6 @@ private:
|
||||
bool finalize(ModuleDependencyInfo &depInfo,
|
||||
const SwiftInterfaceModuleOutputPathResolution::ResultTy
|
||||
&swiftInterfaceModuleOutputPath) {
|
||||
if (resolvingDepInfo.isSwiftPlaceholderModule())
|
||||
return false;
|
||||
|
||||
if (resolvingDepInfo.isSwiftInterfaceModule())
|
||||
depInfo.setOutputPathAndHash(
|
||||
swiftInterfaceModuleOutputPath.outputPath.str().str(),
|
||||
@@ -287,15 +273,6 @@ private:
|
||||
return false;
|
||||
}
|
||||
|
||||
bool handleSwiftPlaceholderModuleDependency(
|
||||
ModuleDependencyID depModuleID,
|
||||
const SwiftPlaceholderModuleDependencyStorage &placeholderDetails) {
|
||||
if (!resolvingDepInfo.isSwiftSourceModule())
|
||||
commandline.push_back("-swift-module-file=" + depModuleID.ModuleName +
|
||||
"=" + placeholderDetails.compiledModulePath);
|
||||
return false;
|
||||
}
|
||||
|
||||
bool handleClangModuleDependency(
|
||||
ModuleDependencyID depModuleID,
|
||||
const ClangModuleDependencyStorage &clangDepDetails) {
|
||||
@@ -721,9 +698,6 @@ static void bridgeDependencyIDs(const ArrayRef<ModuleDependencyID> dependencies,
|
||||
case ModuleDependencyKind::SwiftBinary:
|
||||
dependencyKindAndName = "swiftBinary";
|
||||
break;
|
||||
case ModuleDependencyKind::SwiftPlaceholder:
|
||||
dependencyKindAndName = "swiftPlaceholder";
|
||||
break;
|
||||
case ModuleDependencyKind::Clang:
|
||||
dependencyKindAndName = "clang";
|
||||
break;
|
||||
@@ -776,7 +750,6 @@ generateFullDependencyGraph(const CompilerInstance &instance,
|
||||
const auto &moduleID = allModules[i];
|
||||
auto &moduleDependencyInfo = cache.findKnownDependency(moduleID);
|
||||
// Collect all the required pieces to build a ModuleInfo
|
||||
auto swiftPlaceholderDeps = moduleDependencyInfo.getAsPlaceholderDependencyModule();
|
||||
auto swiftTextualDeps = moduleDependencyInfo.getAsSwiftInterfaceModule();
|
||||
auto swiftSourceDeps = moduleDependencyInfo.getAsSwiftSourceModule();
|
||||
auto swiftBinaryDeps = moduleDependencyInfo.getAsSwiftBinaryModule();
|
||||
@@ -788,8 +761,6 @@ generateFullDependencyGraph(const CompilerInstance &instance,
|
||||
std::string modulePath;
|
||||
if (swiftTextualDeps)
|
||||
modulePath = swiftTextualDeps->moduleOutputPath;
|
||||
else if (swiftPlaceholderDeps)
|
||||
modulePath = swiftPlaceholderDeps->compiledModulePath;
|
||||
else if (swiftBinaryDeps)
|
||||
modulePath = swiftBinaryDeps->compiledModulePath;
|
||||
else if (clangDeps)
|
||||
@@ -904,12 +875,6 @@ generateFullDependencyGraph(const CompilerInstance &instance,
|
||||
create_clone(swiftSourceDeps->chainedBridgingHeaderPath.c_str()),
|
||||
create_clone(
|
||||
swiftSourceDeps->chainedBridgingHeaderContent.c_str())};
|
||||
} else if (swiftPlaceholderDeps) {
|
||||
details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_PLACEHOLDER;
|
||||
details->swift_placeholder_details = {
|
||||
create_clone(swiftPlaceholderDeps->compiledModulePath.c_str()),
|
||||
create_clone(swiftPlaceholderDeps->moduleDocPath.c_str()),
|
||||
create_clone(swiftPlaceholderDeps->sourceInfoPath.c_str())};
|
||||
} else if (swiftBinaryDeps) {
|
||||
details->kind = SWIFTSCAN_DEPENDENCY_INFO_SWIFT_BINARY;
|
||||
// Create an overlay dependencies set according to the output format
|
||||
@@ -1346,8 +1311,6 @@ swift::dependencies::createEncodedModuleKindAndName(ModuleDependencyID id) {
|
||||
return "swiftTextual:" + id.ModuleName;
|
||||
case ModuleDependencyKind::SwiftBinary:
|
||||
return "swiftBinary:" + id.ModuleName;
|
||||
case ModuleDependencyKind::SwiftPlaceholder:
|
||||
return "swiftPlaceholder:" + id.ModuleName;
|
||||
case ModuleDependencyKind::Clang:
|
||||
return "clang:" + id.ModuleName;
|
||||
default:
|
||||
|
||||
@@ -193,8 +193,6 @@ static void validateProfilingArgs(DiagnosticEngine &diags,
|
||||
|
||||
static void validateDependencyScanningArgs(DiagnosticEngine &diags,
|
||||
const ArgList &args) {
|
||||
const Arg *ExternalDependencyMap =
|
||||
args.getLastArg(options::OPT_placeholder_dependency_module_map);
|
||||
const Arg *ScanDependencies = args.getLastArg(options::OPT_scan_dependencies);
|
||||
const Arg *Prescan = args.getLastArg(options::OPT_import_prescan);
|
||||
|
||||
@@ -207,11 +205,6 @@ static void validateDependencyScanningArgs(DiagnosticEngine &diags,
|
||||
const Arg *ValidatePriorCache =
|
||||
args.getLastArg(options::OPT_validate_prior_dependency_scan_cache);
|
||||
|
||||
if (ExternalDependencyMap && !ScanDependencies) {
|
||||
diags.diagnose(SourceLoc(), diag::error_requirement_not_met,
|
||||
"-placeholder-dependency-module-map-file",
|
||||
"-scan-dependencies");
|
||||
}
|
||||
if (Prescan && !ScanDependencies) {
|
||||
diags.diagnose(SourceLoc(), diag::error_requirement_not_met,
|
||||
"-import-prescan", "-scan-dependencies");
|
||||
|
||||
@@ -2441,8 +2441,6 @@ static bool ParseSearchPathArgs(SearchPathOptions &Opts, ArgList &Args,
|
||||
for (auto A: Args.filtered(OPT_candidate_module_file)) {
|
||||
Opts.CandidateCompiledModules.push_back(resolveSearchPath(A->getValue()));
|
||||
}
|
||||
if (const Arg *A = Args.getLastArg(OPT_placeholder_dependency_module_map))
|
||||
Opts.PlaceholderDependencyModuleMap = A->getValue();
|
||||
|
||||
if (const Arg *A = Args.getLastArg(OPT_const_gather_protocols_file))
|
||||
Opts.ConstGatherProtocolListFilePath = A->getValue();
|
||||
|
||||
@@ -899,14 +899,6 @@ bool CompilerInstance::setUpModuleLoaders() {
|
||||
FEOpts.SerializeModuleInterfaceDependencyHashes,
|
||||
FEOpts.shouldTrackSystemDependencies(),
|
||||
RequireOSSAModules_t(Invocation.getSILOptions()));
|
||||
auto mainModuleName = Context->getIdentifier(FEOpts.ModuleName);
|
||||
std::unique_ptr<PlaceholderSwiftModuleScanner> PSMS =
|
||||
std::make_unique<PlaceholderSwiftModuleScanner>(
|
||||
*Context, MLM, mainModuleName,
|
||||
Context->SearchPathOpts.PlaceholderDependencyModuleMap, ASTDelegate,
|
||||
getInvocation().getFrontendOptions().ExplicitModulesOutputPath,
|
||||
getInvocation().getFrontendOptions().ExplicitSDKModulesOutputPath);
|
||||
Context->addModuleLoader(std::move(PSMS));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -83,56 +83,6 @@ std::error_code SwiftModuleScanner::findModuleFilesInDirectory(
|
||||
return dependencies.getError();
|
||||
}
|
||||
|
||||
bool PlaceholderSwiftModuleScanner::findModule(
|
||||
ImportPath::Element moduleID, SmallVectorImpl<char> *moduleInterfacePath,
|
||||
SmallVectorImpl<char> *moduleInterfaceSourcePath,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
|
||||
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
|
||||
bool skipBuildingInterface, bool isTestableDependencyLookup,
|
||||
bool &isFramework, bool &isSystemModule) {
|
||||
StringRef moduleName = Ctx.getRealModuleName(moduleID.Item).str();
|
||||
auto it = PlaceholderDependencyModuleMap.find(moduleName);
|
||||
if (it == PlaceholderDependencyModuleMap.end()) {
|
||||
return false;
|
||||
}
|
||||
auto &moduleInfo = it->getValue();
|
||||
auto dependencies = ModuleDependencyInfo::forPlaceholderSwiftModuleStub(
|
||||
moduleInfo.modulePath,
|
||||
moduleInfo.moduleDocPath.has_value() ? moduleInfo.moduleDocPath.value()
|
||||
: "",
|
||||
moduleInfo.moduleSourceInfoPath.has_value()
|
||||
? moduleInfo.moduleSourceInfoPath.value()
|
||||
: "");
|
||||
this->dependencies = std::move(dependencies);
|
||||
return true;
|
||||
}
|
||||
|
||||
void PlaceholderSwiftModuleScanner::parsePlaceholderModuleMap(
|
||||
StringRef fileName) {
|
||||
ExplicitModuleMapParser parser(Allocator);
|
||||
llvm::StringMap<ExplicitClangModuleInputInfo> ClangDependencyModuleMap;
|
||||
llvm::StringMap<std::string> ModuleAliases;
|
||||
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> fileBufOrErr =
|
||||
llvm::MemoryBuffer::getFile(fileName);
|
||||
if (!fileBufOrErr) {
|
||||
Ctx.Diags.diagnose(SourceLoc(), diag::explicit_swift_module_map_missing,
|
||||
fileName);
|
||||
return;
|
||||
}
|
||||
auto result = parser.parseSwiftExplicitModuleMap(
|
||||
(*fileBufOrErr)->getMemBufferRef(), PlaceholderDependencyModuleMap,
|
||||
ClangDependencyModuleMap, ModuleAliases);
|
||||
if (result == std::errc::invalid_argument) {
|
||||
Ctx.Diags.diagnose(SourceLoc(),
|
||||
diag::placeholder_dependency_module_map_corrupted,
|
||||
fileName);
|
||||
} else if (result == std::errc::no_such_file_or_directory) {
|
||||
Ctx.Diags.diagnose(
|
||||
SourceLoc(), diag::placeholder_dependency_module_map_missing, fileName);
|
||||
}
|
||||
}
|
||||
|
||||
static std::vector<std::string> getCompiledCandidates(ASTContext &ctx,
|
||||
StringRef moduleName,
|
||||
StringRef interfacePath) {
|
||||
@@ -297,36 +247,20 @@ ModuleDependencyVector SerializedModuleLoaderBase::getModuleDependencies(
|
||||
auto modulePath = builder.get();
|
||||
auto moduleId = modulePath.front().Item;
|
||||
|
||||
// Instantiate dependency scanning "loaders".
|
||||
SmallVector<std::unique_ptr<SwiftModuleScanner>, 2> scanners;
|
||||
// Placeholder dependencies must be resolved first, to prevent the
|
||||
// ModuleDependencyScanner from first discovering artifacts of a previous
|
||||
// build. Such artifacts are captured as compiledModuleCandidates in the
|
||||
// dependency graph of the placeholder dependency module itself.
|
||||
// FIXME: submodules?
|
||||
scanners.push_back(std::make_unique<PlaceholderSwiftModuleScanner>(
|
||||
Ctx, LoadMode, moduleId, Ctx.SearchPathOpts.PlaceholderDependencyModuleMap,
|
||||
delegate, moduleOutputPath, sdkModuleOutputPath));
|
||||
scanners.push_back(std::make_unique<SwiftModuleScanner>(
|
||||
auto scanner = std::make_unique<SwiftModuleScanner>(
|
||||
Ctx, LoadMode, moduleId, delegate, moduleOutputPath, sdkModuleOutputPath,
|
||||
swiftModuleClangCC1CommandLineArgs,
|
||||
SwiftModuleScanner::MDS_plain));
|
||||
swiftModuleClangCC1CommandLineArgs, SwiftModuleScanner::MDS_plain);
|
||||
|
||||
// Check whether there is a module with this name that we can import.
|
||||
assert(isa<PlaceholderSwiftModuleScanner>(scanners[0].get()) &&
|
||||
"Expected PlaceholderSwiftModuleScanner as the first dependency "
|
||||
"scanner loader.");
|
||||
for (auto &scanner : scanners) {
|
||||
if (scanner->canImportModule(modulePath, SourceLoc(), nullptr,
|
||||
isTestableDependencyLookup)) {
|
||||
if (scanner->canImportModule(modulePath, SourceLoc(), nullptr,
|
||||
isTestableDependencyLookup)) {
|
||||
|
||||
ModuleDependencyVector moduleDependnecies;
|
||||
moduleDependnecies.push_back(
|
||||
std::make_pair(ModuleDependencyID{moduleName.str().str(),
|
||||
scanner->dependencies->getKind()},
|
||||
*(scanner->dependencies)));
|
||||
return moduleDependnecies;
|
||||
}
|
||||
ModuleDependencyVector moduleDependnecies;
|
||||
moduleDependnecies.push_back(
|
||||
std::make_pair(ModuleDependencyID{moduleName.str().str(),
|
||||
scanner->dependencies->getKind()},
|
||||
*(scanner->dependencies)));
|
||||
return moduleDependnecies;
|
||||
}
|
||||
|
||||
return {};
|
||||
|
||||
@@ -93,14 +93,6 @@ void swiftscan_dependency_info_details_dispose(
|
||||
swiftscan_string_dispose(
|
||||
details_impl->swift_binary_details.user_module_version);
|
||||
break;
|
||||
case SWIFTSCAN_DEPENDENCY_INFO_SWIFT_PLACEHOLDER:
|
||||
swiftscan_string_dispose(
|
||||
details_impl->swift_placeholder_details.compiled_module_path);
|
||||
swiftscan_string_dispose(
|
||||
details_impl->swift_placeholder_details.module_doc_path);
|
||||
swiftscan_string_dispose(
|
||||
details_impl->swift_placeholder_details.module_source_info_path);
|
||||
break;
|
||||
case SWIFTSCAN_DEPENDENCY_INFO_CLANG:
|
||||
swiftscan_string_dispose(details_impl->clang_details.module_map_path);
|
||||
swiftscan_string_dispose(details_impl->clang_details.context_hash);
|
||||
@@ -168,7 +160,7 @@ swiftscan_dependency_graph_create(swiftscan_scanner_t scanner,
|
||||
|
||||
// Execute the scan and bridge the result
|
||||
auto ScanResult = ScanningTool->getDependencies(
|
||||
Compilation, {},
|
||||
Compilation,
|
||||
swift::c_string_utils::get_C_string(invocation->working_directory));
|
||||
if (ScanResult.getError())
|
||||
return nullptr;
|
||||
@@ -433,23 +425,23 @@ swiftscan_swift_binary_detail_get_user_module_version(
|
||||
return details->swift_binary_details.user_module_version;
|
||||
}
|
||||
|
||||
//=== Swift Placeholder Module Details query APIs -------------------------===//
|
||||
//=== Swift Placeholder Module Details query APIs - DEPRECATED -----------===//
|
||||
|
||||
swiftscan_string_ref_t
|
||||
swiftscan_swift_placeholder_detail_get_compiled_module_path(
|
||||
swiftscan_module_details_t details) {
|
||||
return details->swift_placeholder_details.module_source_info_path;
|
||||
return swift::c_string_utils::create_null();
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t swiftscan_swift_placeholder_detail_get_module_doc_path(
|
||||
swiftscan_module_details_t details) {
|
||||
return details->swift_placeholder_details.module_source_info_path;
|
||||
return swift::c_string_utils::create_null();
|
||||
}
|
||||
|
||||
swiftscan_string_ref_t
|
||||
swiftscan_swift_placeholder_detail_get_module_source_info_path(
|
||||
swiftscan_module_details_t details) {
|
||||
return details->swift_placeholder_details.module_source_info_path;
|
||||
return swift::c_string_utils::create_null();
|
||||
}
|
||||
|
||||
//=== Clang Module Details query APIs -------------------------------------===//
|
||||
|
||||
@@ -13,14 +13,12 @@ import Foundation
|
||||
|
||||
enum ModuleDependencyId: Hashable {
|
||||
case swift(String)
|
||||
case swiftPlaceholder(String)
|
||||
case swiftPrebuiltExternal(String)
|
||||
case clang(String)
|
||||
|
||||
var moduleName: String {
|
||||
switch self {
|
||||
case .swift(let name): return name
|
||||
case .swiftPlaceholder(let name): return name
|
||||
case .swiftPrebuiltExternal(let name): return name
|
||||
case .clang(let name): return name
|
||||
}
|
||||
@@ -30,7 +28,6 @@ enum ModuleDependencyId: Hashable {
|
||||
extension ModuleDependencyId: Codable {
|
||||
enum CodingKeys: CodingKey {
|
||||
case swift
|
||||
case swiftPlaceholder
|
||||
case swiftPrebuiltExternal
|
||||
case clang
|
||||
}
|
||||
@@ -42,16 +39,11 @@ extension ModuleDependencyId: Codable {
|
||||
self = .swift(moduleName)
|
||||
} catch {
|
||||
do {
|
||||
let moduleName = try container.decode(String.self, forKey: .swiftPlaceholder)
|
||||
self = .swiftPlaceholder(moduleName)
|
||||
let moduleName = try container.decode(String.self, forKey: .swiftPrebuiltExternal)
|
||||
self = .swiftPrebuiltExternal(moduleName)
|
||||
} catch {
|
||||
do {
|
||||
let moduleName = try container.decode(String.self, forKey: .swiftPrebuiltExternal)
|
||||
self = .swiftPrebuiltExternal(moduleName)
|
||||
} catch {
|
||||
let moduleName = try container.decode(String.self, forKey: .clang)
|
||||
self = .clang(moduleName)
|
||||
}
|
||||
let moduleName = try container.decode(String.self, forKey: .clang)
|
||||
self = .clang(moduleName)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -61,8 +53,6 @@ extension ModuleDependencyId: Codable {
|
||||
switch self {
|
||||
case .swift(let moduleName):
|
||||
try container.encode(moduleName, forKey: .swift)
|
||||
case .swiftPlaceholder(let moduleName):
|
||||
try container.encode(moduleName, forKey: .swiftPlaceholder)
|
||||
case .swiftPrebuiltExternal(let moduleName):
|
||||
try container.encode(moduleName, forKey: .swiftPrebuiltExternal)
|
||||
case .clang(let moduleName):
|
||||
@@ -99,15 +89,6 @@ struct SwiftModuleDetails: Codable {
|
||||
var swiftOverlayDependencies: [ModuleDependencyId]?
|
||||
}
|
||||
|
||||
/// Details specific to Swift placeholder dependencies.
|
||||
struct SwiftPlaceholderModuleDetails: Codable {
|
||||
/// The path to the .swiftModuleDoc file.
|
||||
var moduleDocPath: String?
|
||||
|
||||
/// The path to the .swiftSourceInfo file.
|
||||
var moduleSourceInfoPath: String?
|
||||
}
|
||||
|
||||
/// Details specific to Swift externally-pre-built modules.
|
||||
struct SwiftPrebuiltExternalModuleDetails: Codable {
|
||||
/// The path to the already-compiled module that must be used instead of
|
||||
@@ -152,10 +133,6 @@ struct ModuleInfo: Codable {
|
||||
/// a bridging header.
|
||||
case swift(SwiftModuleDetails)
|
||||
|
||||
/// Swift placeholder modules carry additional details that specify their
|
||||
/// module doc path and source info paths.
|
||||
case swiftPlaceholder(SwiftPlaceholderModuleDetails)
|
||||
|
||||
/// Swift externally-prebuilt modules must communicate the path to pre-built binary artifacts
|
||||
case swiftPrebuiltExternal(SwiftPrebuiltExternalModuleDetails)
|
||||
|
||||
@@ -167,7 +144,6 @@ struct ModuleInfo: Codable {
|
||||
extension ModuleInfo.Details: Codable {
|
||||
enum CodingKeys: CodingKey {
|
||||
case swift
|
||||
case swiftPlaceholder
|
||||
case swiftPrebuiltExternal
|
||||
case clang
|
||||
}
|
||||
@@ -179,18 +155,12 @@ extension ModuleInfo.Details: Codable {
|
||||
self = .swift(details)
|
||||
} catch {
|
||||
do {
|
||||
let details = try container.decode(SwiftPlaceholderModuleDetails.self,
|
||||
forKey: .swiftPlaceholder)
|
||||
self = .swiftPlaceholder(details)
|
||||
let details = try container.decode(SwiftPrebuiltExternalModuleDetails.self,
|
||||
forKey: .swiftPrebuiltExternal)
|
||||
self = .swiftPrebuiltExternal(details)
|
||||
} catch {
|
||||
do {
|
||||
let details = try container.decode(SwiftPrebuiltExternalModuleDetails.self,
|
||||
forKey: .swiftPrebuiltExternal)
|
||||
self = .swiftPrebuiltExternal(details)
|
||||
} catch {
|
||||
let details = try container.decode(ClangModuleDetails.self, forKey: .clang)
|
||||
self = .clang(details)
|
||||
}
|
||||
let details = try container.decode(ClangModuleDetails.self, forKey: .clang)
|
||||
self = .clang(details)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -200,8 +170,6 @@ extension ModuleInfo.Details: Codable {
|
||||
switch self {
|
||||
case .swift(let details):
|
||||
try container.encode(details, forKey: .swift)
|
||||
case .swiftPlaceholder(let details):
|
||||
try container.encode(details, forKey: .swiftPlaceholder)
|
||||
case .swiftPrebuiltExternal(let details):
|
||||
try container.encode(details, forKey: .swiftPrebuiltExternal)
|
||||
case .clang(let details):
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
// RUN: mkdir -p %t/clang-module-cache
|
||||
// RUN: mkdir -p %t/inputs
|
||||
|
||||
// RUN: echo "[{" > %/t/inputs/map.json
|
||||
// RUN: echo "\"moduleName\": \"SomeExternalModule\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"modulePath\": \"%/t/inputs/SomeExternalModule.swiftmodule\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"docPath\": \"%/t/inputs/SomeExternalModule.swiftdoc\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"sourceInfoPath\": \"%/t/inputs/SomeExternalModule.swiftsourceinfo\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map.json
|
||||
// RUN: echo "}]" >> %/t/inputs/map.json
|
||||
|
||||
// RUN: %target-swift-frontend -scan-dependencies -module-load-mode prefer-interface -module-cache-path %t/clang-module-cache %s -placeholder-dependency-module-map-file %t/inputs/map.json -o %t/deps.json -I %S/Inputs/CHeaders -I %S/Inputs/Swift -emit-dependencies -emit-dependencies-path %t/deps.d -import-objc-header %S/Inputs/CHeaders/Bridging.h -swift-version 4
|
||||
// RUN: %validate-json %t/deps.json | %FileCheck %s
|
||||
|
||||
// Ensure that round-trip serialization does not affect result
|
||||
// RUN: %target-swift-frontend -scan-dependencies -module-load-mode prefer-interface -test-dependency-scan-cache-serialization -module-cache-path %t/clang-module-cache %s -placeholder-dependency-module-map-file %t/inputs/map.json -o %t/deps.json -I %S/Inputs/CHeaders -I %S/Inputs/Swift -emit-dependencies -emit-dependencies-path %t/deps.d -import-objc-header %S/Inputs/CHeaders/Bridging.h -swift-version 4
|
||||
// RUN: %validate-json %t/deps.json | %FileCheck %s
|
||||
|
||||
// REQUIRES: executable_test
|
||||
// REQUIRES: objc_interop
|
||||
#if canImport(SomeExternalModule)
|
||||
import SomeExternalModule
|
||||
#endif
|
||||
|
||||
// CHECK: "mainModuleName": "deps"
|
||||
|
||||
/// --------Main module
|
||||
// CHECK-LABEL: "modulePath": "deps.swiftmodule",
|
||||
// CHECK-NEXT: sourceFiles
|
||||
// CHECK-NEXT: can_import_placeholder.swift
|
||||
|
||||
// CHECK: directDependencies
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-DAG: "swift": "F"
|
||||
// CHECK-DAG: "swiftPlaceholder": "SomeExternalModule"
|
||||
// CHECK-DAG: "swift": "Swift"
|
||||
// CHECK-DAG: "swift": "SwiftOnoneSupport"
|
||||
// CHECK-DAG: "swift": "_Concurrency"
|
||||
// CHECK-DAG: "swift": "_StringProcessing"
|
||||
// CHECK-DAG: "clang": "_SwiftConcurrencyShims"
|
||||
// CHECK: ],
|
||||
@@ -1,96 +0,0 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
// RUN: mkdir -p %t/clang-module-cache
|
||||
// RUN: mkdir -p %t/inputs
|
||||
|
||||
// RUN: echo "[{" > %/t/inputs/map.json
|
||||
// RUN: echo "\"moduleName\": \"SomeExternalModule\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"modulePath\": \"%/t/inputs/SomeExternalModule.swiftmodule\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"docPath\": \"%/t/inputs/SomeExternalModule.swiftdoc\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"sourceInfoPath\": \"%/t/inputs/SomeExternalModule.swiftsourceinfo\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"isFramework\": false" >> %/t/inputs/map.json
|
||||
// RUN: echo "}]" >> %/t/inputs/map.json
|
||||
|
||||
// RUN: %target-swift-frontend -scan-dependencies -module-load-mode prefer-interface -module-cache-path %t/clang-module-cache %s -placeholder-dependency-module-map-file %t/inputs/map.json -o %t/deps.json -I %S/Inputs/CHeaders -I %S/Inputs/Swift -emit-dependencies -emit-dependencies-path %t/deps.d -import-objc-header %S/Inputs/CHeaders/Bridging.h -swift-version 4
|
||||
|
||||
// Check the contents of the JSON output
|
||||
// RUN: %validate-json %t/deps.json | %FileCheck %s
|
||||
|
||||
// Check the make-style dependencies file
|
||||
// RUN: %FileCheck %s -check-prefix CHECK-MAKE-DEPS < %t/deps.d
|
||||
|
||||
// Check that the JSON parses correctly into the canonical Swift data
|
||||
// structures.
|
||||
|
||||
// RUN: mkdir -p %t/PrintGraph
|
||||
// RUN: cp %S/Inputs/PrintGraph.swift %t/main.swift
|
||||
// RUN: %target-build-swift %S/Inputs/ModuleDependencyGraph.swift %t/main.swift -o %t/main
|
||||
// RUN: %target-codesign %t/main
|
||||
// RUN: %target-run %t/main %t/deps.json
|
||||
|
||||
// Ensure that round-trip serialization does not affect result
|
||||
// RUN: %target-swift-frontend -scan-dependencies -module-load-mode prefer-interface -test-dependency-scan-cache-serialization -module-cache-path %t/clang-module-cache %s -placeholder-dependency-module-map-file %t/inputs/map.json -o %t/deps.json -I %S/Inputs/CHeaders -I %S/Inputs/Swift -import-objc-header %S/Inputs/CHeaders/Bridging.h -swift-version 4
|
||||
// RUN: %validate-json %t/deps.json | %FileCheck %s
|
||||
|
||||
// REQUIRES: executable_test
|
||||
// REQUIRES: objc_interop
|
||||
import SomeExternalModule
|
||||
|
||||
// CHECK: "mainModuleName": "deps"
|
||||
|
||||
/// --------Main module
|
||||
// CHECK-LABEL: "modulePath": "deps.swiftmodule",
|
||||
// CHECK-NEXT: sourceFiles
|
||||
// CHECK-NEXT: module_deps_external.swift
|
||||
|
||||
// CHECK: directDependencies
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-DAG: "clang": "F"
|
||||
// CHECK-DAG: "swiftPlaceholder": "SomeExternalModule"
|
||||
// CHECK-DAG: "swift": "Swift"
|
||||
// CHECK-DAG: "swift": "SwiftOnoneSupport"
|
||||
// CHECK-DAG: "swift": "_Concurrency"
|
||||
// CHECK-DAG: "swift": "_StringProcessing"
|
||||
// CHECK-DAG: "clang": "_SwiftConcurrencyShims"
|
||||
// CHECK: ],
|
||||
|
||||
// CHECK: "bridgingHeader":
|
||||
// CHECK-NEXT: "path":
|
||||
// CHECK-SAME: Bridging.h
|
||||
|
||||
// CHECK-NEXT: "sourceFiles":
|
||||
// CHECK-NEXT: Bridging.h
|
||||
// CHECK-NEXT: BridgingOther.h
|
||||
|
||||
// CHECK: "moduleDependencies": [
|
||||
// CHECK-NEXT: "F"
|
||||
// CHECK-NEXT: ],
|
||||
|
||||
// CHECK: "swiftOverlayDependencies": [
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "swift": "F"
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-NEXT: ]
|
||||
|
||||
/// --------Swift external module SomeExternalModule
|
||||
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}SomeExternalModule.swiftmodule",
|
||||
// CHECK-NEXT: "details": {
|
||||
// CHECK-NEXT: "swiftPlaceholder": {
|
||||
// CHECK-NEXT: "moduleDocPath": "BUILD_DIR/{{.*}}/ScanDependencies/Output/module_deps_external.swift.tmp/inputs/SomeExternalModule.swiftdoc",
|
||||
// CHECK-NEXT: "moduleSourceInfoPath": "BUILD_DIR/{{.*}}/ScanDependencies/Output/module_deps_external.swift.tmp/inputs/SomeExternalModule.swiftsourceinfo"
|
||||
|
||||
/// --------Swift module Swift
|
||||
// CHECK-LABEL: "modulePath": "{{.*}}{{/|\\}}Swift-{{.*}}.swiftmodule",
|
||||
|
||||
// CHECK: directDependencies
|
||||
// CHECK-NEXT: {
|
||||
// CHECK-NEXT: "clang": "SwiftShims"
|
||||
|
||||
/// --------Clang module SwiftShims
|
||||
// CHECK-LABEL: "modulePath": "{{.*}}/SwiftShims-{{.*}}.pcm",
|
||||
|
||||
// Check make-style dependencies
|
||||
// CHECK-MAKE-DEPS: module_deps_external.swift
|
||||
// CHECK-MAKE-DEPS-SAME: Bridging.h
|
||||
// CHECK-MAKE-DEPS-SAME: BridgingOther.h
|
||||
// CHECK-MAKE-DEPS-SAME: module.modulemap
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
// RUN: %empty-directory(%t)
|
||||
// RUN: mkdir -p %t/clang-module-cache
|
||||
// RUN: mkdir -p %t/inputs
|
||||
|
||||
// RUN: echo "[{" > %/t/inputs/map.json
|
||||
// RUN: echo "\"moduleName\": \"Darwin\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"modulePath\": \"%/t/inputs/Darwin.swiftmodule\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"docPath\": \"%/t/inputs/Darwin.swiftdoc\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"sourceInfoPath\": \"%/t/inputs/Darwin.swiftsourceinfo\"," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"isFramework\": false," >> %/t/inputs/map.json
|
||||
// RUN: echo "\"isSystem\": true" >> %/t/inputs/map.json
|
||||
// RUN: echo "}]" >> %/t/inputs/map.json
|
||||
|
||||
// RUN: %target-swift-frontend -scan-dependencies -module-cache-path %t/clang-module-cache %s -placeholder-dependency-module-map-file %t/inputs/map.json -o %t/deps.json
|
||||
|
||||
// Check the contents of the JSON output
|
||||
// RUN: %validate-json %t/deps.json > %t/validated_deps.json
|
||||
// RUN: %FileCheck %s < %t/validated_deps.json
|
||||
|
||||
// REQUIRES: executable_test
|
||||
// REQUIRES: objc_interop
|
||||
// REQUIRES: OS=macosx
|
||||
import Metal
|
||||
|
||||
// Ensure the dependency on Darwin is captured even though it is a placeholder
|
||||
|
||||
// CHECK: "modulePath": "{{.*}}{{/|\\}}Metal-{{.*}}.swiftmodule",
|
||||
// CHECK: "directDependencies": [
|
||||
// CHECK: {
|
||||
// CHECK: "swiftPlaceholder": "Darwin"
|
||||
// CHECK: },
|
||||
@@ -175,7 +175,7 @@ export *\n\
|
||||
for (auto &command : CommandStrArr) {
|
||||
Command.push_back(command.c_str());
|
||||
}
|
||||
auto DependenciesOrErr = ScannerTool.getDependencies(Command, {}, {});
|
||||
auto DependenciesOrErr = ScannerTool.getDependencies(Command, {});
|
||||
ASSERT_FALSE(DependenciesOrErr.getError());
|
||||
auto Dependencies = DependenciesOrErr.get();
|
||||
// TODO: Output/verify dependency graph correctness
|
||||
@@ -309,7 +309,7 @@ public func funcB() { }\n"));
|
||||
|
||||
auto ScanDiagnosticConsumer = std::make_shared<DependencyScanDiagnosticCollector>();
|
||||
|
||||
auto DependenciesOrErr = ScannerTool.getDependencies(Command, {}, {});
|
||||
auto DependenciesOrErr = ScannerTool.getDependencies(Command, {});
|
||||
|
||||
// Ensure a hollow output with diagnostic info is produced
|
||||
ASSERT_FALSE(DependenciesOrErr.getError());
|
||||
|
||||
Reference in New Issue
Block a user