static void doList(opt::InputArgList& Args) { // lib.exe prints the contents of the first archive file. std::unique_ptr<MemoryBuffer> B; for (auto *Arg : Args.filtered(OPT_INPUT)) { // Create or open the archive object. ErrorOr<std::unique_ptr<MemoryBuffer>> MaybeBuf = MemoryBuffer::getFile(Arg->getValue(), -1, false); fatalOpenError(errorCodeToError(MaybeBuf.getError()), Arg->getValue()); if (identify_magic(MaybeBuf.get()->getBuffer()) == file_magic::archive) { B = std::move(MaybeBuf.get()); break; } } // lib.exe doesn't print an error if no .lib files are passed. if (!B) return; Error Err = Error::success(); object::Archive Archive(B.get()->getMemBufferRef(), Err); fatalOpenError(std::move(Err), B->getBufferIdentifier()); for (auto &C : Archive.children(Err)) { Expected<StringRef> NameOrErr = C.getName(); fatalOpenError(NameOrErr.takeError(), B->getBufferIdentifier()); StringRef Name = NameOrErr.get(); llvm::outs() << Name << '\n'; } fatalOpenError(std::move(Err), B->getBufferIdentifier()); }
uint64_t lld::args::getZOptionValue(opt::InputArgList &Args, int Id, StringRef Key, uint64_t Default) { for (auto *Arg : Args.filtered(Id)) { std::pair<StringRef, StringRef> KV = StringRef(Arg->getValue()).split('='); if (KV.first == Key) { uint64_t Result = Default; if (!to_integer(KV.second, Result)) error("invalid " + Key + ": " + KV.second); return Result; } } return Default; }
std::vector<StringRef> lld::args::getStrings(opt::InputArgList &Args, int Id) { std::vector<StringRef> V; for (auto *Arg : Args.filtered(Id)) V.push_back(Arg->getValue()); return V; }