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
7496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  bool isValid() const {
75dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    return Info != nullptr;
7696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
7796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
7896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned getID() const {
7996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    assert(Info && "Must have a valid info!");
8096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Info->ID;
8196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
8296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  OptionClass getKind() const {
8496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    assert(Info && "Must have a valid info!");
8596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return OptionClass(Info->Kind);
8696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
8796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
8896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief Get the name of this option without any prefix.
8996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  StringRef getName() const {
9096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    assert(Info && "Must have a valid info!");
9196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Info->Name;
9296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
9396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
9496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Option getGroup() const {
9596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    assert(Info && "Must have a valid info!");
9696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    assert(Owner && "Must have a valid owner!");
9796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Owner->getOption(Info->GroupID);
9896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
9996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
10096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Option getAlias() const {
10196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    assert(Info && "Must have a valid info!");
10296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    assert(Owner && "Must have a valid owner!");
10396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Owner->getOption(Info->AliasID);
10496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
10596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
1069dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg  /// \brief Get the alias arguments as a \0 separated list.
1079dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg  /// E.g. ["foo", "bar"] would be returned as "foo\0bar\0".
1089dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg  const char *getAliasArgs() const {
1099dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg    assert(Info && "Must have a valid info!");
1109dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg    assert((!Info->AliasArgs || Info->AliasArgs[0] != 0) &&
1119dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg           "AliasArgs should be either 0 or non-empty.");
1129dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg
1139dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg    return Info->AliasArgs;
1149dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg  }
1159dd8c0cffe7de82900823c05159bba765120f1e3Hans Wennborg
11696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief Get the default prefix for this option.
11796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  StringRef getPrefix() const {
11896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    const char *Prefix = *Info->Prefixes;
11996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Prefix ? Prefix : StringRef();
12096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
12196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
12296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// \brief Get the name of this option with the default prefix.
12396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  std::string getPrefixedName() const {
12496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    std::string Ret = getPrefix();
12596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    Ret += getName();
12696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Ret;
12796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
12896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
12996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  unsigned getNumArgs() const { return Info->Param; }
13096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
13196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  bool hasNoOptAsInput() const { return Info->Flags & RenderAsInput;}
13296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
13396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  RenderStyleKind getRenderStyle() const {
13496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (Info->Flags & RenderJoined)
13596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      return RenderJoinedStyle;
13696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (Info->Flags & RenderSeparate)
13796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      return RenderSeparateStyle;
13896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    switch (getKind()) {
13996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    case GroupClass:
14096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    case InputClass:
14196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    case UnknownClass:
14296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      return RenderValuesStyle;
14396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    case JoinedClass:
14496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    case JoinedAndSeparateClass:
14596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      return RenderJoinedStyle;
14696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    case CommaJoinedClass:
14796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      return RenderCommaJoinedStyle;
14896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    case FlagClass:
14996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    case SeparateClass:
15096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    case MultiArgClass:
15196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    case JoinedOrSeparateClass:
152af9e3557552c341615052a05d4eeb36d7fd5c33fHans Wennborg    case RemainingArgsClass:
15396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer      return RenderSeparateStyle;
15496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    }
15596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    llvm_unreachable("Unexpected kind!");
15696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
15796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
15896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// Test if this option has the flag \a Val.
15996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  bool hasFlag(unsigned Val) const {
16096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return Info->Flags & Val;
16196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
16296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
16396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// getUnaliasedOption - Return the final option this option
16496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// aliases (itself, if the option has no alias).
16596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  const Option getUnaliasedOption() const {
16696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    const Option Alias = getAlias();
16796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    if (Alias.isValid()) return Alias.getUnaliasedOption();
16896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return *this;
16996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
17096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
17196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// getRenderName - Return the name to use when rendering this
17296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// option.
17396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  StringRef getRenderName() const {
17496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    return getUnaliasedOption().getName();
17596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  }
17696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
17796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// matches - Predicate for whether this option is part of the
17896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// given option (which may be a group).
17996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  ///
18096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// Note that matches against options which are an alias should never be
18196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// done -- aliases do not participate in matching and so such a query will
18296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// always be false.
18396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  bool matches(OptSpecifier ID) const;
18496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
18596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// accept - Potentially accept the current argument, returning a
18696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// new Arg instance, or 0 if the option does not accept this
18796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// argument (or the argument is missing values).
18896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  ///
18996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// If the option accepts the current argument, accept() sets
19096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// Index to the position where argument parsing should resume
19196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  /// (even if the argument is missing values).
19296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  ///
19301371af2c419e3a302552030755db0c3225bc91bDmitri Gribenko  /// \param ArgSize The number of bytes taken up by the matched Option prefix
19401371af2c419e3a302552030755db0c3225bc91bDmitri Gribenko  ///                and name. This is used to determine where joined values
19501371af2c419e3a302552030755db0c3225bc91bDmitri Gribenko  ///                start.
19696a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  Arg *accept(const ArgList &Args, unsigned &Index, unsigned ArgSize) const;
19796a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
19896a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  void dump() const;
19996a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer};
20096a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
20196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} // end namespace opt
20296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer} // end namespace llvm
20396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer
20496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer#endif
205