Skip to content

Commit 70441d1

Browse files
authored
Merge pull request #33430 from artemcm/ExplicitFrameworkBuild
[Explicit Module Builds] Distinguish whether an explicit module is a framework.
2 parents 393682d + 721f903 commit 70441d1

16 files changed

+211
-79
lines changed

include/swift/AST/ModuleDependencies.h

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ class SwiftModuleDependenciesStorage : public ModuleDependenciesStorageBase {
107107
/// The hash value that will be used for the generated module
108108
const std::string contextHash;
109109

110+
/// A flag that indicates this dependency is a framework
111+
const bool isFramework;
112+
110113
/// Bridging header file, if there is one.
111114
Optional<std::string> bridgingHeaderFile;
112115

@@ -125,15 +128,16 @@ class SwiftModuleDependenciesStorage : public ModuleDependenciesStorageBase {
125128
ArrayRef<std::string> compiledModuleCandidates,
126129
ArrayRef<StringRef> buildCommandLine,
127130
ArrayRef<StringRef> extraPCMArgs,
128-
StringRef contextHash
131+
StringRef contextHash,
132+
bool isFramework
129133
) : ModuleDependenciesStorageBase(ModuleDependenciesKind::Swift,
130134
compiledModulePath),
131135
swiftInterfaceFile(swiftInterfaceFile),
132136
compiledModuleCandidates(compiledModuleCandidates.begin(),
133137
compiledModuleCandidates.end()),
134138
buildCommandLine(buildCommandLine.begin(), buildCommandLine.end()),
135139
extraPCMArgs(extraPCMArgs.begin(), extraPCMArgs.end()),
136-
contextHash(contextHash) { }
140+
contextHash(contextHash), isFramework(isFramework) { }
137141

138142
ModuleDependenciesStorageBase *clone() const override {
139143
return new SwiftModuleDependenciesStorage(*this);
@@ -242,21 +246,22 @@ class ModuleDependencies {
242246
ArrayRef<std::string> compiledCandidates,
243247
ArrayRef<StringRef> buildCommands,
244248
ArrayRef<StringRef> extraPCMArgs,
245-
StringRef contextHash) {
249+
StringRef contextHash,
250+
bool isFramework) {
246251
std::string compiledModulePath;
247252
return ModuleDependencies(
248253
std::make_unique<SwiftModuleDependenciesStorage>(
249254
compiledModulePath, swiftInterfaceFile, compiledCandidates, buildCommands,
250-
extraPCMArgs, contextHash));
255+
extraPCMArgs, contextHash, isFramework));
251256
}
252257

253258
/// Describe the module dependencies for a serialized or parsed Swift module.
254259
static ModuleDependencies forSwiftModule(
255-
const std::string &compiledModulePath) {
260+
const std::string &compiledModulePath, bool isFramework) {
256261
return ModuleDependencies(
257262
std::make_unique<SwiftModuleDependenciesStorage>(
258263
compiledModulePath, None, ArrayRef<std::string>(), ArrayRef<StringRef>(),
259-
ArrayRef<StringRef>(), StringRef()));
264+
ArrayRef<StringRef>(), StringRef(), isFramework));
260265
}
261266

262267
/// Describe the main Swift module.
@@ -265,7 +270,7 @@ class ModuleDependencies {
265270
return ModuleDependencies(
266271
std::make_unique<SwiftModuleDependenciesStorage>(
267272
compiledModulePath, None, ArrayRef<std::string>(),
268-
ArrayRef<StringRef>(), extraPCMArgs, StringRef()));
273+
ArrayRef<StringRef>(), extraPCMArgs, StringRef(), false));
269274
}
270275

271276
/// Describe the module dependencies for a Clang module that can be

include/swift/Frontend/ModuleInterfaceLoader.h

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,22 @@ class ExplicitSwiftModuleLoader: public SerializedModuleLoaderBase {
133133
explicit ExplicitSwiftModuleLoader(ASTContext &ctx, DependencyTracker *tracker,
134134
ModuleLoadingMode loadMode,
135135
bool IgnoreSwiftSourceInfoFile);
136+
137+
bool findModule(AccessPathElem moduleID,
138+
SmallVectorImpl<char> *moduleInterfacePath,
139+
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
140+
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
141+
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
142+
bool &isFramework, bool &isSystemModule) override;
143+
136144
std::error_code findModuleFilesInDirectory(
137-
AccessPathElem ModuleID,
138-
const SerializedModuleBaseName &BaseName,
139-
SmallVectorImpl<char> *ModuleInterfacePath,
140-
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
141-
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
142-
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) override;
145+
AccessPathElem ModuleID,
146+
const SerializedModuleBaseName &BaseName,
147+
SmallVectorImpl<char> *ModuleInterfacePath,
148+
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
149+
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
150+
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
151+
bool IsFramework) override;
143152

144153
bool canImportModule(Located<Identifier> mID) override;
145154

@@ -172,6 +181,8 @@ struct ExplicitModuleInfo {
172181
std::string moduleSourceInfoPath;
173182
// Opened buffer for the .swiftmodule file.
174183
std::unique_ptr<llvm::MemoryBuffer> moduleBuffer;
184+
// A flag that indicates whether this module is a framework
185+
bool isFramework;
175186
};
176187

177188
/// Parser of explicit module maps passed into the compiler.
@@ -181,12 +192,14 @@ struct ExplicitModuleInfo {
181192
// "modulePath": "A.swiftmodule",
182193
// "docPath": "A.swiftdoc",
183194
// "sourceInfoPath": "A.swiftsourceinfo"
195+
// "isFramework": false
184196
// },
185197
// {
186198
// "moduleName": "B",
187199
// "modulePath": "B.swiftmodule",
188200
// "docPath": "B.swiftdoc",
189201
// "sourceInfoPath": "B.swiftsourceinfo"
202+
// "isFramework": false
190203
// }
191204
// ]
192205
class ExplicitModuleMapParser {
@@ -248,6 +261,15 @@ class ExplicitModuleMapParser {
248261
result.moduleDocPath = val.str();
249262
} else if (key == "sourceInfoPath") {
250263
result.moduleSourceInfoPath = val.str();
264+
} else if (key == "isFramework") {
265+
auto valStr = val.str();
266+
valStr.erase(std::remove(valStr.begin(), valStr.end(), '\n'), valStr.end());
267+
if (valStr.compare("true") == 0)
268+
result.isFramework = true;
269+
else if (valStr.compare("false") == 0)
270+
result.isFramework = false;
271+
else
272+
llvm_unreachable("Unexpected JSON value for isFramework");
251273
} else {
252274
// Being forgiving for future fields.
253275
continue;
@@ -298,12 +320,13 @@ class ModuleInterfaceLoader : public SerializedModuleLoaderBase {
298320
ModuleInterfaceLoaderOptions Opts;
299321

300322
std::error_code findModuleFilesInDirectory(
301-
AccessPathElem ModuleID,
302-
const SerializedModuleBaseName &BaseName,
303-
SmallVectorImpl<char> *ModuleInterfacePath,
304-
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
305-
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
306-
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) override;
323+
AccessPathElem ModuleID,
324+
const SerializedModuleBaseName &BaseName,
325+
SmallVectorImpl<char> *ModuleInterfacePath,
326+
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
327+
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
328+
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
329+
bool IsFramework) override;
307330

308331
bool isCached(StringRef DepPath) override;
309332
public:

include/swift/Serialization/SerializedModuleLoader.h

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ class SerializedModuleLoaderBase : public ModuleLoader {
7373
StringRef extension) const;
7474

7575
using AccessPathElem = Located<Identifier>;
76-
bool findModule(AccessPathElem moduleID,
77-
SmallVectorImpl<char> *moduleInterfacePath,
78-
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
79-
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
80-
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
81-
bool &isFramework, bool &isSystemModule);
76+
virtual bool findModule(AccessPathElem moduleID,
77+
SmallVectorImpl<char> *moduleInterfacePath,
78+
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
79+
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
80+
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
81+
bool &isFramework, bool &isSystemModule);
8282

8383
/// Attempts to search the provided directory for a loadable serialized
8484
/// .swiftmodule with the provided `ModuleFilename`. Subclasses must
@@ -98,7 +98,8 @@ class SerializedModuleLoaderBase : public ModuleLoader {
9898
SmallVectorImpl<char> *ModuleInterfacePath,
9999
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
100100
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
101-
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) = 0;
101+
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
102+
bool IsFramework) = 0;
102103

103104
std::error_code
104105
openModuleFile(
@@ -229,7 +230,8 @@ class ImplicitSerializedModuleLoader : public SerializedModuleLoaderBase {
229230
SmallVectorImpl<char> *ModuleInterfacePath,
230231
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
231232
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
232-
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) override;
233+
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
234+
bool IsFramework) override;
233235

234236
bool maybeDiagnoseTargetMismatch(
235237
SourceLoc sourceLocation,
@@ -274,7 +276,8 @@ class MemoryBufferSerializedModuleLoader : public SerializedModuleLoaderBase {
274276
SmallVectorImpl<char> *ModuleInterfacePath,
275277
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
276278
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
277-
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) override;
279+
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
280+
bool IsFramework) override;
278281

279282
bool maybeDiagnoseTargetMismatch(
280283
SourceLoc sourceLocation,

lib/Frontend/ModuleInterfaceLoader.cpp

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,8 @@ std::error_code ModuleInterfaceLoader::findModuleFilesInDirectory(
950950
SmallVectorImpl<char> *ModuleInterfacePath,
951951
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
952952
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
953-
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) {
953+
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
954+
bool IsFramework) {
954955

955956
// If running in OnlySerialized mode, ModuleInterfaceLoader
956957
// should not have been constructed at all.
@@ -1521,36 +1522,38 @@ ExplicitSwiftModuleLoader::ExplicitSwiftModuleLoader(
15211522

15221523
ExplicitSwiftModuleLoader::~ExplicitSwiftModuleLoader() { delete &Impl; }
15231524

1524-
std::error_code ExplicitSwiftModuleLoader::findModuleFilesInDirectory(
1525-
AccessPathElem ModuleID,
1526-
const SerializedModuleBaseName &BaseName,
1527-
SmallVectorImpl<char> *ModuleInterfacePath,
1528-
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
1529-
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
1530-
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) {
1525+
bool ExplicitSwiftModuleLoader::findModule(AccessPathElem ModuleID,
1526+
SmallVectorImpl<char> *ModuleInterfacePath,
1527+
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
1528+
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
1529+
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
1530+
bool &IsFramework, bool &IsSystemModule) {
15311531
StringRef moduleName = ModuleID.Item.str();
15321532
auto it = Impl.ExplicitModuleMap.find(moduleName);
15331533
// If no explicit module path is given matches the name, return with an
15341534
// error code.
15351535
if (it == Impl.ExplicitModuleMap.end()) {
1536-
return std::make_error_code(std::errc::not_supported);
1536+
return false;
15371537
}
15381538
auto &moduleInfo = it->getValue();
15391539
if (moduleInfo.moduleBuffer) {
15401540
// We found an explicit module matches the given name, give the buffer
15411541
// back to the caller side.
15421542
*ModuleBuffer = std::move(moduleInfo.moduleBuffer);
1543-
return std::error_code();
1543+
return true;
15441544
}
15451545

1546+
// Set IsFramework bit according to the moduleInfo
1547+
IsFramework = moduleInfo.isFramework;
1548+
15461549
auto &fs = *Ctx.SourceMgr.getFileSystem();
15471550
// Open .swiftmodule file
15481551
auto moduleBuf = fs.getBufferForFile(moduleInfo.modulePath);
15491552
if (!moduleBuf) {
15501553
// We cannot read the module content, diagnose.
15511554
Ctx.Diags.diagnose(SourceLoc(), diag::error_opening_explicit_module_file,
15521555
moduleInfo.modulePath);
1553-
return moduleBuf.getError();
1556+
return false;
15541557
}
15551558

15561559
assert(moduleBuf);
@@ -1566,13 +1569,13 @@ std::error_code ExplicitSwiftModuleLoader::findModuleFilesInDirectory(
15661569
// We cannot read the module content, diagnose.
15671570
Ctx.Diags.diagnose(SourceLoc(), diag::error_opening_explicit_module_file,
15681571
moduleInfo.modulePath);
1569-
return moduleBuf.getError();
1572+
return false;
15701573
}
15711574
} else {
15721575
// We cannot read the module content, diagnose.
15731576
Ctx.Diags.diagnose(SourceLoc(), diag::error_opening_explicit_module_file,
15741577
moduleInfo.modulePath);
1575-
return forwardingModule.getError();
1578+
return false;
15761579
}
15771580
}
15781581
assert(moduleBuf);
@@ -1591,7 +1594,19 @@ std::error_code ExplicitSwiftModuleLoader::findModuleFilesInDirectory(
15911594
if (moduleSourceInfoBuf)
15921595
*ModuleSourceInfoBuffer = std::move(moduleSourceInfoBuf.get());
15931596
}
1594-
return std::error_code();
1597+
return true;
1598+
}
1599+
1600+
std::error_code ExplicitSwiftModuleLoader::findModuleFilesInDirectory(
1601+
AccessPathElem ModuleID,
1602+
const SerializedModuleBaseName &BaseName,
1603+
SmallVectorImpl<char> *ModuleInterfacePath,
1604+
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
1605+
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
1606+
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
1607+
bool IsFramework) {
1608+
llvm_unreachable("Not supported in the Explicit Swift Module Loader.");
1609+
return std::make_error_code(std::errc::not_supported);
15951610
}
15961611

15971612
bool ExplicitSwiftModuleLoader::canImportModule(

lib/FrontendTool/ScanDependencies.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,13 @@ namespace {
216216
out << "\"";
217217
}
218218

219+
/// Write a boolean value as JSON.
220+
void writeJSONValue(llvm::raw_ostream &out,
221+
bool value,
222+
unsigned indentLevel) {
223+
out.write_escaped(value ? "true" : "false");
224+
}
225+
219226
/// Write a module identifier.
220227
void writeJSONValue(llvm::raw_ostream &out,
221228
const ModuleDependencyID &module,
@@ -397,6 +404,11 @@ static void writeJSON(llvm::raw_ostream &out,
397404
swiftDeps->compiledModulePath, 5,
398405
/*trailingComma=*/false);
399406
}
407+
writeJSONSingleField(
408+
out, "isFramework",
409+
swiftDeps->isFramework, 5,
410+
/*trailingComma=*/!swiftDeps->extraPCMArgs.empty() ||
411+
swiftDeps->bridgingHeaderFile.hasValue());
400412
if (!swiftDeps->extraPCMArgs.empty()) {
401413
out.indent(5 * 2);
402414
out << "\"extraPcmArgs\": [\n";

lib/Serialization/ModuleDependencyScanner.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class ModuleDependencyScanner : public SerializedModuleLoaderBase {
3434

3535
/// Scan the given interface file to determine dependencies.
3636
ErrorOr<ModuleDependencies> scanInterfaceFile(
37-
Twine moduleInterfacePath);
37+
Twine moduleInterfacePath, bool isFramework);
3838

3939
InterfaceSubContextDelegate &astDelegate;
4040
public:
@@ -58,7 +58,8 @@ class ModuleDependencyScanner : public SerializedModuleLoaderBase {
5858
SmallVectorImpl<char> *ModuleInterfacePath,
5959
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
6060
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
61-
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) override {
61+
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
62+
bool IsFramework) override {
6263
using namespace llvm::sys;
6364

6465
auto &fs = *Ctx.SourceMgr.getFileSystem();
@@ -80,7 +81,7 @@ class ModuleDependencyScanner : public SerializedModuleLoaderBase {
8081
}
8182
}
8283
assert(fs.exists(InPath));
83-
auto dependencies = scanInterfaceFile(InPath);
84+
auto dependencies = scanInterfaceFile(InPath, IsFramework);
8485
if (dependencies) {
8586
this->dependencies = std::move(dependencies.get());
8687
return std::error_code();
@@ -142,7 +143,8 @@ class PlaceholderSwiftModuleScanner : public ModuleDependencyScanner {
142143
SmallVectorImpl<char> *ModuleInterfacePath,
143144
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
144145
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
145-
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer) override {
146+
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
147+
bool IsFramework) override {
146148
StringRef moduleName = ModuleID.Item.str();
147149
auto it = PlaceholderDependencyModuleMap.find(moduleName);
148150
// If no placeholder module stub path is given matches the name, return with an
@@ -172,7 +174,7 @@ static std::vector<std::string> getCompiledCandidates(ASTContext &ctx,
172174
}
173175

174176
ErrorOr<ModuleDependencies> ModuleDependencyScanner::scanInterfaceFile(
175-
Twine moduleInterfacePath) {
177+
Twine moduleInterfacePath, bool isFramework) {
176178
// Create a module filename.
177179
// FIXME: Query the module interface loader to determine an appropriate
178180
// name for the module, which includes an appropriate hash.
@@ -181,6 +183,7 @@ ErrorOr<ModuleDependencies> ModuleDependencyScanner::scanInterfaceFile(
181183
llvm::sys::path::replace_extension(modulePath, newExt);
182184
Optional<ModuleDependencies> Result;
183185
std::error_code code;
186+
184187
auto hasError = astDelegate.runInSubContext(moduleName.str(),
185188
moduleInterfacePath.str(),
186189
StringRef(),
@@ -196,7 +199,8 @@ ErrorOr<ModuleDependencies> ModuleDependencyScanner::scanInterfaceFile(
196199
compiledCandidates,
197200
Args,
198201
PCMArgs,
199-
Hash);
202+
Hash,
203+
isFramework);
200204
// Open the interface file.
201205
auto &fs = *Ctx.SourceMgr.getFileSystem();
202206
auto interfaceBuf = fs.getBufferForFile(moduleInterfacePath);

0 commit comments

Comments
 (0)