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()); }
int lld::args::getInteger(opt::InputArgList &Args, unsigned Key, int Default) { int V = Default; if (auto *Arg = Args.getLastArg(Key)) { StringRef S = Arg->getValue(); if (!to_integer(S, V, 10)) error(Arg->getSpelling() + ": number expected, but got '" + S + "'"); } return V; }
static cl::TokenizerCallback getQuotingStyle(opt::InputArgList &Args) { if (auto *Arg = Args.getLastArg(OPT_rsp_quoting)) { StringRef S = Arg->getValue(); if (S != "windows" && S != "posix") error("invalid response file quoting: " + S); if (S == "windows") return cl::TokenizeWindowsCommandLine; return cl::TokenizeGNUCommandLine; } if (Triple(sys::getProcessTriple()).getOS() == Triple::Win32) return cl::TokenizeWindowsCommandLine; return cl::TokenizeGNUCommandLine; }
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; }
// Parse -color-diagnostics={auto,always,never} or -no-color-diagnostics. static bool getColorDiagnostics(opt::InputArgList &Args) { auto *Arg = Args.getLastArg(OPT_color_diagnostics, OPT_color_diagnostics_eq, OPT_no_color_diagnostics); if (!Arg) return ErrorOS->has_colors(); if (Arg->getOption().getID() == OPT_color_diagnostics) return true; if (Arg->getOption().getID() == OPT_no_color_diagnostics) return false; StringRef S = Arg->getValue(); if (S == "auto") return ErrorOS->has_colors(); if (S == "always") return true; if (S != "never") error("unknown option: -color-diagnostics=" + S); return false; }
// Parse -color-diagnostics={auto,always,never} or -no-color-diagnostics. static bool getColorDiagnostics(opt::InputArgList &Args) { bool Default = (ErrorOS == &errs() && Process::StandardErrHasColors()); auto *Arg = Args.getLastArg(OPT_color_diagnostics, OPT_color_diagnostics_eq, OPT_no_color_diagnostics); if (!Arg) return Default; if (Arg->getOption().getID() == OPT_color_diagnostics) return true; if (Arg->getOption().getID() == OPT_no_color_diagnostics) return false; StringRef S = Arg->getValue(); if (S == "auto") return Default; if (S == "always") return true; if (S != "never") error("unknown option: -color-diagnostics=" + S); return false; }
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; }