blob: cfcb82273eb6d812f74f3bba53729d33fa99438e [file] [edit]
//===----------------------------------------------------------------------===//
//
// 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::FlagOrEqClass && Kind != Option::SeparateOrEqClass)
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(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(*A, Alloc))
return createStringError("invalid value '" + Twine(A->getValue()) +
"' in '" + A->getAsString(List) + "'");
return Error::success();
}