196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===--- Option.h - Abstract Driver Options ---------------------*- C++ -*-===// 296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// The LLVM Compiler Infrastructure 496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// This file is distributed under the University of Illinois Open Source 696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// License. See LICENSE.TXT for details. 796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer// 896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer//===----------------------------------------------------------------------===// 996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 10674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_OPTION_OPTION_H 11674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_OPTION_OPTION_H 1296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 1396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/ADT/SmallVector.h" 1458a2cbef4aac9ee7d530dfb690c78d6fc11a2371Chandler Carruth#include "llvm/ADT/StringRef.h" 1596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Option/OptTable.h" 1696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#include "llvm/Support/ErrorHandling.h" 1796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 1896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencernamespace llvm { 1996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencernamespace opt { 2096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerclass Arg; 2196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerclass ArgList; 2296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// ArgStringList - Type used for constructing argv lists for subprocesses. 2396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencertypedef SmallVector<const char*, 16> ArgStringList; 2496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 2596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// Base flags for all options. Custom flags may be added after. 2696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerenum DriverFlag { 2796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer HelpHidden = (1 << 0), 2896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer RenderAsInput = (1 << 1), 2996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer RenderJoined = (1 << 2), 3096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer RenderSeparate = (1 << 3) 3196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}; 3296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 3396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// Option - Abstract representation for a single form of driver 3496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// argument. 3596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// 3696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// An Option class represents a form of option that the driver 3796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// takes, for example how many arguments the option has and how 3896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// they can be provided. Individual option instances store 3996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// additional information about what group the option is a member 4096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// of (if any), if the option is an alias, and a number of 4196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// flags. At runtime the driver parses the command line into 4296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// concrete Arg instances, each of which corresponds to a 4396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer/// particular Option instance. 4496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerclass Option { 4596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerpublic: 4696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer enum OptionClass { 4796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer GroupClass = 0, 4896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer InputClass, 4996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer UnknownClass, 5096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer FlagClass, 5196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer JoinedClass, 5296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer SeparateClass, 53af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg RemainingArgsClass, 5496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer CommaJoinedClass, 5596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer MultiArgClass, 5696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer JoinedOrSeparateClass, 5796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer JoinedAndSeparateClass 5896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer }; 5996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 6096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer enum RenderStyleKind { 6196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer RenderCommaJoinedStyle, 6296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer RenderJoinedStyle, 6396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer RenderSeparateStyle, 6496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer RenderValuesStyle 6596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer }; 6696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 6796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerprotected: 6896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const OptTable::Info *Info; 6996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const OptTable *Owner; 7096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 7196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencerpublic: 7296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Option(const OptTable::Info *Info, const OptTable *Owner); 7396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer ~Option(); 7496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 7596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer bool isValid() const { 76dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Info != nullptr; 7796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 7896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 7996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer unsigned getID() const { 8096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer assert(Info && "Must have a valid info!"); 8196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Info->ID; 8296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 8396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 8496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer OptionClass getKind() const { 8596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer assert(Info && "Must have a valid info!"); 8696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return OptionClass(Info->Kind); 8796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 8896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 8996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// \brief Get the name of this option without any prefix. 9096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef getName() const { 9196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer assert(Info && "Must have a valid info!"); 9296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Info->Name; 9396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 9496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 9596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const Option getGroup() const { 9696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer assert(Info && "Must have a valid info!"); 9796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer assert(Owner && "Must have a valid owner!"); 9896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Owner->getOption(Info->GroupID); 9996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 10096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 10196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const Option getAlias() const { 10296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer assert(Info && "Must have a valid info!"); 10396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer assert(Owner && "Must have a valid owner!"); 10496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Owner->getOption(Info->AliasID); 10596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 10696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 1079dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg /// \brief Get the alias arguments as a \0 separated list. 1089dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg /// E.g. ["foo", "bar"] would be returned as "foo\0bar\0". 1099dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg const char *getAliasArgs() const { 1109dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg assert(Info && "Must have a valid info!"); 1119dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg assert((!Info->AliasArgs || Info->AliasArgs[0] != 0) && 1129dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg "AliasArgs should be either 0 or non-empty."); 1139dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg 1149dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg return Info->AliasArgs; 1159dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg } 1169dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg 11796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// \brief Get the default prefix for this option. 11896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef getPrefix() const { 11996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const char *Prefix = *Info->Prefixes; 12096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Prefix ? Prefix : StringRef(); 12196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 12296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 12396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// \brief Get the name of this option with the default prefix. 12496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer std::string getPrefixedName() const { 12596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer std::string Ret = getPrefix(); 12696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Ret += getName(); 12796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Ret; 12896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 12996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 13096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer unsigned getNumArgs() const { return Info->Param; } 13196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 13296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer bool hasNoOptAsInput() const { return Info->Flags & RenderAsInput;} 13396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 13496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer RenderStyleKind getRenderStyle() const { 13596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (Info->Flags & RenderJoined) 13696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return RenderJoinedStyle; 13796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (Info->Flags & RenderSeparate) 13896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return RenderSeparateStyle; 13996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer switch (getKind()) { 14096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case GroupClass: 14196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case InputClass: 14296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case UnknownClass: 14396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return RenderValuesStyle; 14496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case JoinedClass: 14596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case JoinedAndSeparateClass: 14696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return RenderJoinedStyle; 14796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case CommaJoinedClass: 14896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return RenderCommaJoinedStyle; 14996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case FlagClass: 15096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case SeparateClass: 15196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case MultiArgClass: 15296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer case JoinedOrSeparateClass: 153af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg case RemainingArgsClass: 15496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return RenderSeparateStyle; 15596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 15696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer llvm_unreachable("Unexpected kind!"); 15796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 15896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 15996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// Test if this option has the flag \a Val. 16096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer bool hasFlag(unsigned Val) const { 16196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return Info->Flags & Val; 16296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 16396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 16496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// getUnaliasedOption - Return the final option this option 16596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// aliases (itself, if the option has no alias). 16696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const Option getUnaliasedOption() const { 16796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer const Option Alias = getAlias(); 16896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer if (Alias.isValid()) return Alias.getUnaliasedOption(); 16996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return *this; 17096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 17196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 17296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// getRenderName - Return the name to use when rendering this 17396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// option. 17496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer StringRef getRenderName() const { 17596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer return getUnaliasedOption().getName(); 17696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer } 17796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 17896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// matches - Predicate for whether this option is part of the 17996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// given option (which may be a group). 18096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// 18196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// Note that matches against options which are an alias should never be 18296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// done -- aliases do not participate in matching and so such a query will 18396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// always be false. 18496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer bool matches(OptSpecifier ID) const; 18596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 18696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// accept - Potentially accept the current argument, returning a 18796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// new Arg instance, or 0 if the option does not accept this 18896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// argument (or the argument is missing values). 18996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// 19096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// If the option accepts the current argument, accept() sets 19196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// Index to the position where argument parsing should resume 19296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// (even if the argument is missing values). 19396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer /// 19401371af2c419e3a302552030755db0c3225bc91bDmitri Gribenko /// \param ArgSize The number of bytes taken up by the matched Option prefix 19501371af2c419e3a302552030755db0c3225bc91bDmitri Gribenko /// and name. This is used to determine where joined values 19601371af2c419e3a302552030755db0c3225bc91bDmitri Gribenko /// start. 19796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer Arg *accept(const ArgList &Args, unsigned &Index, unsigned ArgSize) const; 19896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 19996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer void dump() const; 20096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer}; 20196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 20296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} // end namespace opt 20396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} // end namespace llvm 20496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer 20596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#endif 206