FileVector loadFile(LinkingContext &ctx, StringRef path, bool wholeArchive) { ErrorOr<std::unique_ptr<MemoryBuffer>> mb = MemoryBuffer::getFileOrSTDIN(path); if (std::error_code ec = mb.getError()) return makeErrorFile(path, ec); std::vector<std::unique_ptr<File>> files; if (std::error_code ec = ctx.registry().loadFile(std::move(mb.get()), files)) return makeErrorFile(path, ec); if (wholeArchive) return parseMemberFiles(files); return files; }
FileVector parseMemberFiles(std::unique_ptr<File> file) { std::vector<std::unique_ptr<File>> members; if (auto *archive = dyn_cast<ArchiveLibraryFile>(file.get())) { if (std::error_code ec = archive->parseAllMembers(members)) return makeErrorFile(file->path(), ec); } else { members.push_back(std::move(file)); } return members; }