/// \brief Parse the input file to lld::File. error_code ELFFileNode::parse(const LinkingContext &ctx, raw_ostream &diagnostics) { ErrorOr<StringRef> filePath = getPath(ctx); if (error_code ec = filePath.getError()) return ec; if (error_code ec = getBuffer(*filePath)) return ec; if (ctx.logInputFiles()) diagnostics << *filePath << "\n"; if (_isWholeArchive) { std::vector<std::unique_ptr<File>> parsedFiles; error_code ec = ctx.registry().parseFile(_buffer, parsedFiles); if (ec) return ec; assert(parsedFiles.size() == 1); std::unique_ptr<File> f(parsedFiles[0].release()); if (auto archive = reinterpret_cast<const ArchiveLibraryFile *>(f.get())) { // Have this node own the FileArchive object. _archiveFile.reset(archive); f.release(); // Add all members to _files vector return archive->parseAllMembers(_files); } else { // if --whole-archive is around non-archive, just use it as normal. _files.push_back(std::move(f)); return error_code::success(); } } return ctx.registry().parseFile(_buffer, _files); }
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; }
/// \brief Parse the input file to lld::File. std::error_code PECOFFFileNode::parse(const LinkingContext &ctx, raw_ostream &diagnostics) { if (_parsed) return std::error_code(); _parsed = true; ErrorOr<StringRef> filePath = getPath(ctx); if (std::error_code ec = filePath.getError()) { diagnostics << "File not found: " << _path << "\n"; return ec; } if (std::error_code ec = getBuffer(*filePath)) { diagnostics << "Cannot open file: " << *filePath << "\n"; return ec; } if (ctx.logInputFiles()) diagnostics << *filePath << "\n"; return ctx.registry().parseFile(_buffer, _files); }