123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- Option.h - Abstract Driver Options -----------------------*- C++ -*-===//
- //
- // 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
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_OPTION_OPTION_H
- #define LLVM_OPTION_OPTION_H
- #include "llvm/ADT/SmallVector.h"
- #include "llvm/ADT/StringRef.h"
- #include "llvm/Option/OptSpecifier.h"
- #include "llvm/Option/OptTable.h"
- #include "llvm/Support/ErrorHandling.h"
- #include <cassert>
- #include <string>
- namespace llvm {
- class raw_ostream;
- namespace opt {
- class Arg;
- class ArgList;
- /// ArgStringList - Type used for constructing argv lists for subprocesses.
- using ArgStringList = SmallVector<const char *, 16>;
- /// Base flags for all options. Custom flags may be added after.
- enum DriverFlag {
- HelpHidden = (1 << 0),
- RenderAsInput = (1 << 1),
- RenderJoined = (1 << 2),
- RenderSeparate = (1 << 3)
- };
- /// Option - Abstract representation for a single form of driver
- /// argument.
- ///
- /// An Option class represents a form of option that the driver
- /// takes, for example how many arguments the option has and how
- /// they can be provided. Individual option instances store
- /// additional information about what group the option is a member
- /// of (if any), if the option is an alias, and a number of
- /// flags. At runtime the driver parses the command line into
- /// concrete Arg instances, each of which corresponds to a
- /// particular Option instance.
- class Option {
- public:
- enum OptionClass {
- GroupClass = 0,
- InputClass,
- UnknownClass,
- FlagClass,
- JoinedClass,
- ValuesClass,
- SeparateClass,
- RemainingArgsClass,
- RemainingArgsJoinedClass,
- CommaJoinedClass,
- MultiArgClass,
- JoinedOrSeparateClass,
- JoinedAndSeparateClass
- };
- enum RenderStyleKind {
- RenderCommaJoinedStyle,
- RenderJoinedStyle,
- RenderSeparateStyle,
- RenderValuesStyle
- };
- protected:
- const OptTable::Info *Info;
- const OptTable *Owner;
- public:
- Option(const OptTable::Info *Info, const OptTable *Owner);
- bool isValid() const {
- return Info != nullptr;
- }
- unsigned getID() const {
- assert(Info && "Must have a valid info!");
- return Info->ID;
- }
- OptionClass getKind() const {
- assert(Info && "Must have a valid info!");
- return OptionClass(Info->Kind);
- }
- /// Get the name of this option without any prefix.
- StringRef getName() const {
- assert(Info && "Must have a valid info!");
- return Info->Name;
- }
- const Option getGroup() const {
- assert(Info && "Must have a valid info!");
- assert(Owner && "Must have a valid owner!");
- return Owner->getOption(Info->GroupID);
- }
- const Option getAlias() const {
- assert(Info && "Must have a valid info!");
- assert(Owner && "Must have a valid owner!");
- return Owner->getOption(Info->AliasID);
- }
- /// Get the alias arguments as a \0 separated list.
- /// E.g. ["foo", "bar"] would be returned as "foo\0bar\0".
- const char *getAliasArgs() const {
- assert(Info && "Must have a valid info!");
- assert((!Info->AliasArgs || Info->AliasArgs[0] != 0) &&
- "AliasArgs should be either 0 or non-empty.");
- return Info->AliasArgs;
- }
- /// Get the default prefix for this option.
- StringRef getPrefix() const {
- return Info->Prefixes.empty()
- ? StringRef()
- : static_cast<const StringRef &>(Info->Prefixes[0]);
- }
- /// Get the name of this option with the default prefix.
- std::string getPrefixedName() const {
- std::string Ret(getPrefix());
- Ret += getName();
- return Ret;
- }
- /// Get the help text for this option.
- StringRef getHelpText() const {
- assert(Info && "Must have a valid info!");
- return Info->HelpText;
- }
- /// Get the meta-variable list for this option.
- StringRef getMetaVar() const {
- assert(Info && "Must have a valid info!");
- return Info->MetaVar;
- }
- unsigned getNumArgs() const { return Info->Param; }
- bool hasNoOptAsInput() const { return Info->Flags & RenderAsInput;}
- RenderStyleKind getRenderStyle() const {
- if (Info->Flags & RenderJoined)
- return RenderJoinedStyle;
- if (Info->Flags & RenderSeparate)
- return RenderSeparateStyle;
- switch (getKind()) {
- case GroupClass:
- case InputClass:
- case UnknownClass:
- return RenderValuesStyle;
- case JoinedClass:
- case JoinedAndSeparateClass:
- return RenderJoinedStyle;
- case CommaJoinedClass:
- return RenderCommaJoinedStyle;
- case FlagClass:
- case ValuesClass:
- case SeparateClass:
- case MultiArgClass:
- case JoinedOrSeparateClass:
- case RemainingArgsClass:
- case RemainingArgsJoinedClass:
- return RenderSeparateStyle;
- }
- llvm_unreachable("Unexpected kind!");
- }
- /// Test if this option has the flag \a Val.
- bool hasFlag(unsigned Val) const {
- return Info->Flags & Val;
- }
- /// getUnaliasedOption - Return the final option this option
- /// aliases (itself, if the option has no alias).
- const Option getUnaliasedOption() const {
- const Option Alias = getAlias();
- if (Alias.isValid()) return Alias.getUnaliasedOption();
- return *this;
- }
- /// getRenderName - Return the name to use when rendering this
- /// option.
- StringRef getRenderName() const {
- return getUnaliasedOption().getName();
- }
- /// matches - Predicate for whether this option is part of the
- /// given option (which may be a group).
- ///
- /// Note that matches against options which are an alias should never be
- /// done -- aliases do not participate in matching and so such a query will
- /// always be false.
- bool matches(OptSpecifier ID) const;
- /// Potentially accept the current argument, returning a new Arg instance,
- /// or 0 if the option does not accept this argument (or the argument is
- /// missing values).
- ///
- /// If the option accepts the current argument, accept() sets
- /// Index to the position where argument parsing should resume
- /// (even if the argument is missing values).
- ///
- /// \p CurArg The argument to be matched. It may be shorter than the
- /// underlying storage to represent a Joined argument.
- /// \p GroupedShortOption If true, we are handling the fallback case of
- /// parsing a prefix of the current argument as a short option.
- std::unique_ptr<Arg> accept(const ArgList &Args, StringRef CurArg,
- bool GroupedShortOption, unsigned &Index) const;
- private:
- std::unique_ptr<Arg> acceptInternal(const ArgList &Args, StringRef CurArg,
- unsigned &Index) const;
- public:
- void print(raw_ostream &O) const;
- void dump() const;
- };
- } // end namespace opt
- } // end namespace llvm
- #endif // LLVM_OPTION_OPTION_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|