1 //===--- Option.h - Abstract Driver Options ---------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_OPTION_OPTION_H
11 #define LLVM_OPTION_OPTION_H
13 #include "llvm/ADT/SmallVector.h"
14 #include "llvm/ADT/StringRef.h"
15 #include "llvm/Option/OptTable.h"
16 #include "llvm/Support/ErrorHandling.h"
22 /// ArgStringList - Type used for constructing argv lists for subprocesses.
23 typedef SmallVector<const char*, 16> ArgStringList;
25 /// Base flags for all options. Custom flags may be added after.
27 HelpHidden = (1 << 0),
28 RenderAsInput = (1 << 1),
29 RenderJoined = (1 << 2),
30 RenderSeparate = (1 << 3)
33 /// Option - Abstract representation for a single form of driver
36 /// An Option class represents a form of option that the driver
37 /// takes, for example how many arguments the option has and how
38 /// they can be provided. Individual option instances store
39 /// additional information about what group the option is a member
40 /// of (if any), if the option is an alias, and a number of
41 /// flags. At runtime the driver parses the command line into
42 /// concrete Arg instances, each of which corresponds to a
43 /// particular Option instance.
55 JoinedOrSeparateClass,
56 JoinedAndSeparateClass
59 enum RenderStyleKind {
60 RenderCommaJoinedStyle,
67 const OptTable::Info *Info;
68 const OptTable *Owner;
71 Option(const OptTable::Info *Info, const OptTable *Owner);
74 bool isValid() const {
78 unsigned getID() const {
79 assert(Info && "Must have a valid info!");
83 OptionClass getKind() const {
84 assert(Info && "Must have a valid info!");
85 return OptionClass(Info->Kind);
88 /// \brief Get the name of this option without any prefix.
89 StringRef getName() const {
90 assert(Info && "Must have a valid info!");
94 const Option getGroup() const {
95 assert(Info && "Must have a valid info!");
96 assert(Owner && "Must have a valid owner!");
97 return Owner->getOption(Info->GroupID);
100 const Option getAlias() const {
101 assert(Info && "Must have a valid info!");
102 assert(Owner && "Must have a valid owner!");
103 return Owner->getOption(Info->AliasID);
106 /// \brief Get the default prefix for this option.
107 StringRef getPrefix() const {
108 const char *Prefix = *Info->Prefixes;
109 return Prefix ? Prefix : StringRef();
112 /// \brief Get the name of this option with the default prefix.
113 std::string getPrefixedName() const {
114 std::string Ret = getPrefix();
119 unsigned getNumArgs() const { return Info->Param; }
121 bool hasNoOptAsInput() const { return Info->Flags & RenderAsInput;}
123 RenderStyleKind getRenderStyle() const {
124 if (Info->Flags & RenderJoined)
125 return RenderJoinedStyle;
126 if (Info->Flags & RenderSeparate)
127 return RenderSeparateStyle;
132 return RenderValuesStyle;
134 case JoinedAndSeparateClass:
135 return RenderJoinedStyle;
136 case CommaJoinedClass:
137 return RenderCommaJoinedStyle;
141 case JoinedOrSeparateClass:
142 return RenderSeparateStyle;
144 llvm_unreachable("Unexpected kind!");
147 /// Test if this option has the flag \a Val.
148 bool hasFlag(unsigned Val) const {
149 return Info->Flags & Val;
152 /// getUnaliasedOption - Return the final option this option
153 /// aliases (itself, if the option has no alias).
154 const Option getUnaliasedOption() const {
155 const Option Alias = getAlias();
156 if (Alias.isValid()) return Alias.getUnaliasedOption();
160 /// getRenderName - Return the name to use when rendering this
162 StringRef getRenderName() const {
163 return getUnaliasedOption().getName();
166 /// matches - Predicate for whether this option is part of the
167 /// given option (which may be a group).
169 /// Note that matches against options which are an alias should never be
170 /// done -- aliases do not participate in matching and so such a query will
172 bool matches(OptSpecifier ID) const;
174 /// accept - Potentially accept the current argument, returning a
175 /// new Arg instance, or 0 if the option does not accept this
176 /// argument (or the argument is missing values).
178 /// If the option accepts the current argument, accept() sets
179 /// Index to the position where argument parsing should resume
180 /// (even if the argument is missing values).
182 /// \parm ArgSize The number of bytes taken up by the matched Option prefix
183 /// and name. This is used to determine where joined values
185 Arg *accept(const ArgList &Args, unsigned &Index, unsigned ArgSize) const;
190 } // end namespace opt
191 } // end namespace llvm