Skip to content

Commit 70ba0aa

Browse files
committed
[NFC] Extract helper for loading arch-specific modules
1 parent 652cdfc commit 70ba0aa

File tree

1 file changed

+41
-53
lines changed

1 file changed

+41
-53
lines changed

lib/Serialization/SerializedModuleLoader.cpp

Lines changed: 41 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -183,45 +183,56 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
183183
isFramework = false;
184184

185185
llvm::SmallString<256> currPath;
186-
for (auto path : Ctx.SearchPathOpts.ImportSearchPaths) {
187-
std::error_code result;
188-
189-
currPath = path;
190-
llvm::sys::path::append(currPath, fileNames.module.str());
191-
llvm::ErrorOr<llvm::vfs::Status> statResult = fs.status(currPath);
192186

193-
if (statResult && statResult->isDirectory()) {
194-
// A .swiftmodule directory contains architecture-specific files.
187+
/// Returns true if a target-specific module file was found, false if an error
188+
/// was diagnosed, or None if neither one happened and the search should
189+
/// continue.
190+
auto findTargetSpecificModuleFiles = [&]() -> Optional<bool> {
191+
auto result = findModuleFilesInDirectory(moduleID, currPath,
192+
archFileNames.module,
193+
archFileNames.moduleDoc,
194+
moduleBuffer, moduleDocBuffer);
195+
196+
if (result == std::errc::no_such_file_or_directory &&
197+
!alternateArchName.empty()) {
195198
result = findModuleFilesInDirectory(moduleID, currPath,
196-
archFileNames.module,
197-
archFileNames.moduleDoc,
199+
alternateArchFileNames.module,
200+
alternateArchFileNames.moduleDoc,
198201
moduleBuffer, moduleDocBuffer);
202+
}
199203

200-
if (result == std::errc::no_such_file_or_directory &&
201-
!alternateArchName.empty()) {
202-
result = findModuleFilesInDirectory(moduleID, currPath,
203-
alternateArchFileNames.module,
204-
alternateArchFileNames.moduleDoc,
205-
moduleBuffer, moduleDocBuffer);
204+
if (result == std::errc::no_such_file_or_directory) {
205+
if (maybeDiagnoseArchitectureMismatch(moduleID.second, moduleName,
206+
archName, currPath)) {
207+
return false;
206208
}
209+
}
207210

208-
if (result == std::errc::no_such_file_or_directory) {
209-
if (maybeDiagnoseArchitectureMismatch(moduleID.second, moduleName,
210-
archName, currPath)) {
211-
return false;
212-
}
213-
}
211+
if (!result)
212+
return true;
213+
else
214+
return None;
215+
};
214216

217+
for (auto path : Ctx.SearchPathOpts.ImportSearchPaths) {
218+
currPath = path;
219+
llvm::sys::path::append(currPath, fileNames.module.str());
220+
llvm::ErrorOr<llvm::vfs::Status> statResult = fs.status(currPath);
221+
222+
if (statResult && statResult->isDirectory()) {
223+
// A .swiftmodule directory contains architecture-specific files.
224+
if (auto outcome = findTargetSpecificModuleFiles())
225+
return *outcome;
215226
} else {
216227
// We can't just return the error; the path we're looking for might not
217228
// be "Foo.swiftmodule".
218-
result = findModuleFilesInDirectory(moduleID, path,
219-
fileNames.module.str(),
220-
fileNames.moduleDoc.str(),
221-
moduleBuffer, moduleDocBuffer);
229+
auto result = findModuleFilesInDirectory(moduleID, path,
230+
fileNames.module.str(),
231+
fileNames.moduleDoc.str(),
232+
moduleBuffer, moduleDocBuffer);
233+
if (!result)
234+
return true;
222235
}
223-
if (!result)
224-
return true;
225236
}
226237

227238
{
@@ -241,27 +252,7 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
241252
// Frameworks always use architecture-specific files within a .swiftmodule
242253
// directory.
243254
llvm::sys::path::append(currPath, "Modules", fileNames.module.str());
244-
auto err = findModuleFilesInDirectory(moduleID, currPath,
245-
archFileNames.module,
246-
archFileNames.moduleDoc,
247-
moduleBuffer, moduleDocBuffer);
248-
249-
if (err == std::errc::no_such_file_or_directory &&
250-
!alternateArchName.empty()) {
251-
err = findModuleFilesInDirectory(moduleID, currPath,
252-
alternateArchFileNames.module,
253-
alternateArchFileNames.moduleDoc,
254-
moduleBuffer, moduleDocBuffer);
255-
}
256-
257-
if (err == std::errc::no_such_file_or_directory) {
258-
if (maybeDiagnoseArchitectureMismatch(moduleID.second, moduleName,
259-
archName, currPath)) {
260-
return false;
261-
}
262-
}
263-
264-
return !err;
255+
return findTargetSpecificModuleFiles().getValueOr(false);
265256
};
266257

267258
for (const auto &framepath : Ctx.SearchPathOpts.FrameworkSearchPaths) {
@@ -296,10 +287,7 @@ SerializedModuleLoaderBase::findModule(AccessPathElem moduleID,
296287
// Apple platforms always use architecture-specific files within a
297288
// .swiftmodule directory for the stdlib.
298289
llvm::sys::path::append(currPath, fileNames.module.str());
299-
return !findModuleFilesInDirectory(moduleID, currPath,
300-
archFileNames.module,
301-
archFileNames.moduleDoc,
302-
moduleBuffer, moduleDocBuffer);
290+
return findTargetSpecificModuleFiles().getValueOr(false);
303291
}
304292
// Non-Apple platforms always use single-architecture swiftmodules.
305293
return !findModuleFilesInDirectory(moduleID, currPath,

0 commit comments

Comments
 (0)