| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/Option/LibraryOptions.h" | |
| #include "llvm/Option/ArgList.h" | |
| #include "llvm/Option/OptTable.h" | |
| #include "llvm/Option/Option.h" | |
| #include "llvm/Support/Error.h" | |
| using namespace llvm; | |
| using namespace llvm::opt; | |
| LibraryOptTable::~LibraryOptTable() = default; | |
| void LibraryOptionsParser::forEachOption( | |
| function_ref<void(StringRef, StringRef, StringRef)> Fn) const { | |
| const OptTable &T = Table(); | |
| for (unsigned ID = 1, E = T.getNumOptions(); ID <= E; ++ID) { | |
| unsigned Kind = T.getOptionKind(ID); | |
| if (Kind == Option::GroupClass || Kind == Option::InputClass || | |
| Kind == Option::UnknownClass) | |
| continue; | |
| StringRef V = T.getOptionMetaVar(ID); | |
| std::string MetaVar; | |
| if (Kind == Option::SeparateOrEqClass) | |
| MetaVar = ("=" + (V.empty() ? StringRef("<value>") : V)).str(); | |
| else if (!V.empty()) | |
| MetaVar = ("[=" + V + "]").str(); | |
| Fn(T.getOptionName(ID), MetaVar, T.getOptionHelpText(ID)); | |
| } | |
| } | |
| Error LibraryOptionsParser::parse(void *Opts, ArrayRef<const char *> Args, | |
| unsigned &Consumed, BumpPtrAllocator &Alloc) { | |
| InputArgList List(Args.begin(), Args.end()); | |
| Consumed = 0; | |
| std::unique_ptr<Arg> A = Table().ParseOneArg(List, Consumed); | |
| Consumed = std::min<unsigned>(Consumed, Args.size()); | |
| if (!A) | |
| return createStringError("option '" + Twine(Args[0]) + | |
| "' requires an argument"); | |
| if (A->getOption().getKind() == Option::UnknownClass) | |
| return createStringError("unknown argument '" + Twine(Args[0]) + "'"); | |
| if (!Apply(Opts, *A, Alloc)) | |
| return createStringError("invalid value '" + Twine(A->getValue()) + | |
| "' in '" + A->getAsString(List) + "'"); | |
| return Error::success(); | |
| } |