Skip to content

Commit fb30e07

Browse files
authored
Merge pull request #84475 from artemcm/NoCanImportFailOnWrongArch
Do not fail the build on only finding incompatible-architecture modules on `canImport` queries
2 parents 5fb006b + 48c2a32 commit fb30e07

File tree

10 files changed

+126
-68
lines changed

10 files changed

+126
-68
lines changed

include/swift/Frontend/ModuleInterfaceLoader.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ class ExplicitSwiftModuleLoader: public SerializedModuleLoaderBase {
152152
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
153153
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
154154
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
155-
bool skipBuildingInterface, bool isTestableDependencyLookup,
155+
bool isCanImportLookup, bool isTestableDependencyLookup,
156156
bool &isFramework, bool &isSystemModule) override;
157157

158158
std::error_code findModuleFilesInDirectory(
@@ -162,7 +162,7 @@ class ExplicitSwiftModuleLoader: public SerializedModuleLoaderBase {
162162
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
163163
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
164164
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
165-
bool SkipBuildingInterface, bool IsFramework,
165+
bool isCanImportLookup, bool IsFramework,
166166
bool IsTestableDependencyLookup = false) override;
167167

168168
bool canImportModule(ImportPath::Module named, SourceLoc loc,
@@ -201,7 +201,7 @@ class ExplicitCASModuleLoader : public SerializedModuleLoaderBase {
201201
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
202202
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
203203
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
204-
bool skipBuildingInterface, bool isTestableDependencyLookup,
204+
bool isCanImportLookup, bool isTestableDependencyLookup,
205205
bool &isFramework, bool &isSystemModule) override;
206206

207207
std::error_code findModuleFilesInDirectory(
@@ -211,7 +211,7 @@ class ExplicitCASModuleLoader : public SerializedModuleLoaderBase {
211211
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
212212
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
213213
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
214-
bool SkipBuildingInterface, bool IsFramework,
214+
bool IsCanImportLookup, bool IsFramework,
215215
bool IsTestableDependencyLookup = false) override;
216216

217217
bool canImportModule(ImportPath::Module named, SourceLoc loc,
@@ -561,7 +561,7 @@ class ModuleInterfaceLoader : public SerializedModuleLoaderBase {
561561
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
562562
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
563563
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
564-
bool SkipBuildingInterface, bool IsFramework,
564+
bool IsCanImportLookup, bool IsFramework,
565565
bool IsTestableDependencyLookup = false) override;
566566

567567
bool isCached(StringRef DepPath) override;

include/swift/Serialization/ScanningLoaders.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,19 @@ class SwiftModuleScanner : public SerializedModuleLoaderBase {
6363
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
6464
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
6565
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
66-
bool SkipBuildingInterface, bool IsFramework,
66+
bool IsCanImportLookup, bool IsFramework,
6767
bool IsTestableDependencyLookup) override;
6868

6969
bool canImportModule(ImportPath::Module named, SourceLoc loc,
7070
ModuleVersionInfo *versionInfo,
7171
bool isTestableImport) override;
7272

73+
bool handlePossibleTargetMismatch(
74+
SourceLoc sourceLocation,
75+
StringRef moduleName,
76+
const SerializedModuleBaseName &BaseName,
77+
bool isCanImportLookup) override;
78+
7379
virtual void collectVisibleTopLevelModuleNames(
7480
SmallVectorImpl<Identifier> &names) const override {
7581
llvm_unreachable("Not used");

include/swift/Serialization/SerializedModuleLoader.h

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class SerializedModuleLoaderBase : public ModuleLoader {
103103
std::unique_ptr<llvm::MemoryBuffer> *moduleBuffer,
104104
std::unique_ptr<llvm::MemoryBuffer> *moduleDocBuffer,
105105
std::unique_ptr<llvm::MemoryBuffer> *moduleSourceInfoBuffer,
106-
bool skipBuildingInterface, bool isTestableDependencyLookup,
106+
bool isCanImportLookup, bool isTestableDependencyLookup,
107107
bool &isFramework, bool &isSystemModule);
108108

109109
/// Attempts to search the provided directory for a loadable serialized
@@ -125,8 +125,8 @@ class SerializedModuleLoaderBase : public ModuleLoader {
125125
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
126126
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
127127
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
128-
bool SkipBuildingInterface, bool IsFramework,
129-
bool isTestableDependencyLookup = false) = 0;
128+
bool IsCanImportLookup, bool IsFramework,
129+
bool IsTestableDependencyLookup = false) = 0;
130130

131131
std::error_code
132132
openModuleFile(
@@ -151,13 +151,23 @@ class SerializedModuleLoaderBase : public ModuleLoader {
151151
/// to list the architectures that \e are present.
152152
///
153153
/// \returns true if an error diagnostic was emitted
154-
virtual bool maybeDiagnoseTargetMismatch(
154+
virtual bool handlePossibleTargetMismatch(
155155
SourceLoc sourceLocation,
156156
StringRef moduleName,
157-
const SerializedModuleBaseName &BaseName) {
157+
const SerializedModuleBaseName &baseName,
158+
bool isCanImportLookup) {
158159
return false;
159160
}
160161

162+
/// Assuming the \c baseName is a target-specific Swift module path,
163+
/// for a missing target variant, collect all adjacent binary module
164+
/// files to build a list of discovered modules for incompatible
165+
/// architectures.
166+
static void identifyArchitectureVariants(
167+
ASTContext &Ctx,
168+
const SerializedModuleBaseName &baseName,
169+
std::vector<std::string> &incompatibleArchModules);
170+
161171
/// Determines if the provided path is a cached artifact for dependency
162172
/// tracking purposes.
163173
virtual bool isCached(StringRef DepPath) {
@@ -278,13 +288,14 @@ class ImplicitSerializedModuleLoader : public SerializedModuleLoaderBase {
278288
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
279289
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
280290
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
281-
bool SkipBuildingInterface, bool IsFramework,
282-
bool isTestableDependencyLookup = false) override;
291+
bool IsCanImportLookup, bool IsFramework,
292+
bool IsTestableDependencyLookup = false) override;
283293

284-
bool maybeDiagnoseTargetMismatch(
294+
bool handlePossibleTargetMismatch(
285295
SourceLoc sourceLocation,
286296
StringRef moduleName,
287-
const SerializedModuleBaseName &BaseName) override;
297+
const SerializedModuleBaseName &BaseName,
298+
bool isCanImportLookup) override;
288299

289300
public:
290301
virtual ~ImplicitSerializedModuleLoader();
@@ -336,14 +347,9 @@ class MemoryBufferSerializedModuleLoader : public SerializedModuleLoaderBase {
336347
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
337348
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
338349
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
339-
bool SkipBuildingInterface, bool IsFramework,
350+
bool IsCanImportLookup, bool IsFramework,
340351
bool IsTestableDependencyLookup = false) override;
341352

342-
bool maybeDiagnoseTargetMismatch(
343-
SourceLoc sourceLocation,
344-
StringRef moduleName,
345-
const SerializedModuleBaseName &BaseName) override;
346-
347353
bool BypassResilience;
348354
public:
349355
virtual ~MemoryBufferSerializedModuleLoader();

lib/Frontend/ModuleInterfaceLoader.cpp

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,8 +1336,8 @@ std::error_code ModuleInterfaceLoader::findModuleFilesInDirectory(
13361336
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
13371337
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
13381338
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
1339-
bool skipBuildingInterface, bool IsFramework,
1340-
bool isTestableImport) {
1339+
bool IsCanImportLookup, bool IsFramework,
1340+
bool IsTestableImport) {
13411341

13421342
// If running in OnlySerialized mode, ModuleInterfaceLoader
13431343
// should not have been constructed at all.
@@ -1361,11 +1361,9 @@ std::error_code ModuleInterfaceLoader::findModuleFilesInDirectory(
13611361
if (ModuleInterfaceSourcePath)
13621362
ModuleInterfaceSourcePath->assign(InPath->begin(), InPath->end());
13631363

1364-
// If we've been told to skip building interfaces, we are done here and do
1365-
// not need to have the module actually built. For example, if we are
1366-
// currently answering a `canImport` query, it is enough to have found
1367-
// the interface.
1368-
if (skipBuildingInterface) {
1364+
// If we are currently answering a `canImport` query, it is enough to have
1365+
// found the interface.
1366+
if (IsCanImportLookup) {
13691367
if (ModuleInterfacePath)
13701368
ModuleInterfacePath->assign(InPath->begin(), InPath->end());
13711369
return std::error_code();
@@ -2317,7 +2315,7 @@ bool ExplicitSwiftModuleLoader::findModule(
23172315
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
23182316
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
23192317
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
2320-
bool skipBuildingInterface, bool isTestableDependencyLookup,
2318+
bool IsCanImportLookup, bool isTestableDependencyLookup,
23212319
bool &IsFramework, bool &IsSystemModule) {
23222320
// Find a module with an actual, physical name on disk, in case
23232321
// -module-alias is used (otherwise same).
@@ -2396,7 +2394,7 @@ std::error_code ExplicitSwiftModuleLoader::findModuleFilesInDirectory(
23962394
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
23972395
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
23982396
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
2399-
bool skipBuildingInterface, bool IsFramework,
2397+
bool IsCanImportLookup, bool IsFramework,
24002398
bool IsTestableDependencyLookup) {
24012399
llvm_unreachable("Not supported in the Explicit Swift Module Loader.");
24022400
return std::make_error_code(std::errc::not_supported);
@@ -2674,7 +2672,7 @@ bool ExplicitCASModuleLoader::findModule(
26742672
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
26752673
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
26762674
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
2677-
bool skipBuildingInterface, bool isTestableDependencyLookup,
2675+
bool IsCanImportLookup, bool IsTestableDependencyLookup,
26782676
bool &IsFramework, bool &IsSystemModule) {
26792677
// Find a module with an actual, physical name on disk, in case
26802678
// -module-alias is used (otherwise same).
@@ -2763,7 +2761,7 @@ std::error_code ExplicitCASModuleLoader::findModuleFilesInDirectory(
27632761
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
27642762
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
27652763
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
2766-
bool skipBuildingInterface, bool IsFramework,
2764+
bool IsCanImportLookup, bool IsFramework,
27672765
bool IsTestableDependencyLookup) {
27682766
llvm_unreachable("Not supported in the Explicit Swift Module Loader.");
27692767
return std::make_error_code(std::errc::not_supported);

lib/Serialization/ScanningLoaders.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ std::error_code SwiftModuleScanner::findModuleFilesInDirectory(
4646
std::unique_ptr<llvm::MemoryBuffer> *ModuleBuffer,
4747
std::unique_ptr<llvm::MemoryBuffer> *ModuleDocBuffer,
4848
std::unique_ptr<llvm::MemoryBuffer> *ModuleSourceInfoBuffer,
49-
bool skipBuildingInterface, bool IsFramework,
49+
bool IsCanImportLookup, bool IsFramework,
5050
bool isTestableDependencyLookup) {
5151
using namespace llvm::sys;
5252

@@ -107,6 +107,21 @@ bool SwiftModuleScanner::canImportModule(
107107
path, loc, versionInfo, isTestableDependencyLookup);
108108
}
109109

110+
bool SwiftModuleScanner::handlePossibleTargetMismatch(
111+
SourceLoc sourceLocation, StringRef moduleName,
112+
const SerializedModuleBaseName &absoluteBaseName,
113+
bool isCanImportLookup) {
114+
std::vector<std::string> foundIncompatibleArchModules;
115+
identifyArchitectureVariants(Ctx, absoluteBaseName,
116+
foundIncompatibleArchModules);
117+
118+
for (const auto &modulePath : foundIncompatibleArchModules)
119+
incompatibleCandidates.push_back({modulePath,
120+
"invalid architecture"});
121+
122+
return false;
123+
}
124+
110125
static std::vector<std::string> getCompiledCandidates(ASTContext &ctx,
111126
StringRef moduleName,
112127
StringRef interfacePath) {

0 commit comments

Comments
 (0)