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