| //===- Args.cpp -----------------------------------------------------------===// | |
| // | |
| // The LLVM Linker | |
| // | |
| // This file is distributed under the University of Illinois Open Source | |
| // License. See LICENSE.TXT for details. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "lld/Common/Args.h" | |
| #include "lld/Common/ErrorHandler.h" | |
| #include "llvm/ADT/SmallVector.h" | |
| #include "llvm/ADT/StringExtras.h" | |
| #include "llvm/ADT/StringRef.h" | |
| #include "llvm/Option/ArgList.h" | |
| using namespace llvm; | |
| using namespace lld; | |
| int lld::args::getInteger(opt::InputArgList &Args, unsigned Key, int Default) { | |
| auto *A = Args.getLastArg(Key); | |
| if (!A) | |
| return Default; | |
| int V; | |
| if (to_integer(A->getValue(), V, 10)) | |
| return V; | |
| StringRef Spelling = Args.getArgString(A->getIndex()); | |
| error(Spelling + ": number expected, but got '" + A->getValue() + "'"); | |
| return 0; | |
| } | |
| 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; | |
| } | |
| 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::getLines(MemoryBufferRef MB) { | |
| SmallVector<StringRef, 0> Arr; | |
| MB.getBuffer().split(Arr, '\n'); | |
| std::vector<StringRef> Ret; | |
| for (StringRef S : Arr) { | |
| S = S.trim(); | |
| if (!S.empty() && S[0] != '#') | |
| Ret.push_back(S); | |
| } | |
| return Ret; | |
| } |