Option.h revision e375c4a02ac6e18b166a067b8226e15a1ab009e7
11eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar//===--- Option.h - Abstract Driver Options ---------------------*- C++ -*-===//
21eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar//
31eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar//                     The LLVM Compiler Infrastructure
41eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar//
51eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// This file is distributed under the University of Illinois Open Source
61eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar// License. See LICENSE.TXT for details.
71eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar//
81eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar//===----------------------------------------------------------------------===//
91eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
101eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar#ifndef CLANG_DRIVER_OPTION_H_
111eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar#define CLANG_DRIVER_OPTION_H_
121eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
139e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar#include "clang/Driver/OptSpecifier.h"
142c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar#include "llvm/Support/Casting.h"
152c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::isa;
162c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::cast;
172c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::cast_or_null;
182c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::dyn_cast;
192c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::dyn_cast_or_null;
202c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
211eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbarnamespace clang {
221eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbarnamespace driver {
231eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class Arg;
24f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  class InputArgList;
251eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class OptionGroup;
261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
271eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// Option - Abstract representation for a single form of driver
281eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// argument.
291eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  ///
301eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// An Option class represents a form of option that the driver
311eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// takes, for example how many arguments the option has and how
321eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// they can be provided. Individual option instances store
331eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// additional information about what group the option is a member
341eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// of (if any), if the option is an alias, and a number of
351eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// flags. At runtime the driver parses the command line into
361eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// concrete Arg instances, each of which corresponds to a
371eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// particular Option instance.
381eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class Option {
391eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
401eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    enum OptionClass {
412c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      GroupClass = 0,
422c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      InputClass,
432c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      UnknownClass,
442c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      FlagClass,
452c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      JoinedClass,
462c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      SeparateClass,
472c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      CommaJoinedClass,
482c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      MultiArgClass,
492c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      JoinedOrSeparateClass,
502c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      JoinedAndSeparateClass
511eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    };
521eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
53e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    enum RenderStyleKind {
54e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderCommaJoinedStyle,
55e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderJoinedStyle,
56e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderSeparateStyle,
57e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderValuesStyle
58e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    };
59e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar
601eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  private:
611eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    OptionClass Kind;
621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
639e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    /// The option ID.
649e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    OptSpecifier ID;
6530b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar
661eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// The option name.
671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const char *Name;
681eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
691eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// Group this option is a member of, if any.
701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const OptionGroup *Group;
711eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
721eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// Option that this is an alias for, if any.
731eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const Option *Alias;
741eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
75e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    /// Unsupported options will be rejected.
760f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool Unsupported : 1;
770f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
780f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    /// Treat this option like a linker input?
790f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool LinkerInput : 1;
801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
810f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    /// When rendering as an input, don't render the option.
820f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
830f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    // FIXME: We should ditch the render/renderAsInput distinction.
840f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool NoOptAsInput : 1;
850f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
86e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    /// The style to using when rendering arguments parsed by this option.
87e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    unsigned RenderStyle : 2;
880f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
891e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    /// This option is only consumed by the driver.
901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    bool DriverOption : 1;
916d954d788925e6b80077ef379c8eeb028cc31d0eDaniel Dunbar
921e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    /// This option should not report argument unused errors.
931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    bool NoArgumentUnused : 1;
941e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar
951eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  protected:
969e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    Option(OptionClass Kind, OptSpecifier ID, const char *Name,
972c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar           const OptionGroup *Group, const Option *Alias);
98d35e63106d7b4b76275c85c88ee715c4356f2a6bDaniel Dunbar  public:
99d35e63106d7b4b76275c85c88ee715c4356f2a6bDaniel Dunbar    virtual ~Option();
1001eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1019e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    unsigned getID() const { return ID.getID(); }
1021eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    OptionClass getKind() const { return Kind; }
1031eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const char *getName() const { return Name; }
1041eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const OptionGroup *getGroup() const { return Group; }
1051eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const Option *getAlias() const { return Alias; }
1061eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1070f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool isUnsupported() const { return Unsupported; }
1080f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    void setUnsupported(bool Value) { Unsupported = Value; }
1090f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
1100f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool isLinkerInput() const { return LinkerInput; }
1110f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    void setLinkerInput(bool Value) { LinkerInput = Value; }
1120f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
1136d954d788925e6b80077ef379c8eeb028cc31d0eDaniel Dunbar    bool hasNoOptAsInput() const { return NoOptAsInput; }
1140f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    void setNoOptAsInput(bool Value) { NoOptAsInput = Value; }
1151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
116e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    RenderStyleKind getRenderStyle() const {
117e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      return RenderStyleKind(RenderStyle);
118e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    }
119e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    void setRenderStyle(RenderStyleKind Value) { RenderStyle = Value; }
1201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
121f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar    bool isDriverOption() const { return DriverOption; }
122f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar    void setDriverOption(bool Value) { DriverOption = Value; }
123f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar
1241e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    bool hasNoArgumentUnused() const { return NoArgumentUnused; }
1251e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    void setNoArgumentUnused(bool Value) { NoArgumentUnused = Value; }
1261e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar
127f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar    bool hasForwardToGCC() const { return !DriverOption && !LinkerInput; }
1280f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
1291eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// getUnaliasedOption - Return the final option this option
1301eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// aliases (itself, if the option has no alias).
1311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const Option *getUnaliasedOption() const {
1321eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar      if (Alias) return Alias->getUnaliasedOption();
1331eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar      return this;
1341eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    }
1351eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1361eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// getRenderName - Return the name to use when rendering this
1371eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// option.
1381eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const char *getRenderName() const {
1391eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar      return getUnaliasedOption()->getName();
1401eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    }
1411eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1421eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// matches - Predicate for whether this option is part of the
1431eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// given option (which may be a group).
144b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    ///
145b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    /// Note that matches against options which are an alias should never be
146b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    /// done -- aliases do not participate in matching and so such a query will
147b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    /// always be false.
1489e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    bool matches(OptSpecifier ID) const;
1491eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1501eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// accept - Potentially accept the current argument, returning a
1511eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// new Arg instance, or 0 if the option does not accept this
152b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// argument (or the argument is missing values).
1531eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    ///
154b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// If the option accepts the current argument, accept() sets
155b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// Index to the position where argument parsing should resume
156b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// (even if the argument is missing values).
157f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const = 0;
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1592c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    void dump() const;
1602c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
1612c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const Option *) { return true; }
1621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
1631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1641eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// OptionGroup - A set of options which are can be handled uniformly
1651eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// by the driver.
1661eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class OptionGroup : public Option {
1671eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
1689e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    OptionGroup(OptSpecifier ID, const char *Name, const OptionGroup *Group);
1691eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
170f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
1712c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
1721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
1731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::GroupClass;
1742c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
1752c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const OptionGroup *) { return true; }
1761eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1781eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  // Dummy option classes.
1791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1801eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// InputOption - Dummy option class for representing driver inputs.
1811eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class InputOption : public Option {
1821eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
183a0289fda5b5d67ad49596a5e1f62e1f9db497d06Daniel Dunbar    InputOption(OptSpecifier ID);
1841eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
185f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
1862c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
1871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::InputClass;
1892c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
1902c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const InputOption *) { return true; }
1911eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
1921eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1931eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// UnknownOption - Dummy option class for represent unknown arguments.
1941eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class UnknownOption : public Option {
1951eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
196a0289fda5b5d67ad49596a5e1f62e1f9db497d06Daniel Dunbar    UnknownOption(OptSpecifier ID);
1971eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
198f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
1992c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::UnknownClass;
2022c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2032c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const UnknownOption *) { return true; }
2041eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2051eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2061eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  // Normal options.
2071eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2081eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class FlagOption : public Option {
2091eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
2109e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    FlagOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
21130b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar               const Option *Alias);
2121eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
213f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
2142c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::FlagClass;
2172c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2182c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const FlagOption *) { return true; }
2191eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2201eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2211eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class JoinedOption : public Option {
2222c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2239e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    JoinedOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
2242c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar                 const Option *Alias);
2251eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
226f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
2272c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::JoinedClass;
2302c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2312c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const JoinedOption *) { return true; }
2321eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2331eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2342c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  class SeparateOption : public Option {
2352c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2369e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    SeparateOption(OptSpecifier ID, const char *Name,
2379e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                   const OptionGroup *Group, const Option *Alias);
2381eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
239f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
2402c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::SeparateClass;
2432c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2442c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const SeparateOption *) { return true; }
2451eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2461eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2472c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  class CommaJoinedOption : public Option {
2482c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2499e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    CommaJoinedOption(OptSpecifier ID, const char *Name,
25030b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar                      const OptionGroup *Group, const Option *Alias);
2511eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
252f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
2532c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::CommaJoinedClass;
2562c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2572c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const CommaJoinedOption *) { return true; }
2581eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2591eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2603c9cc6bfe933766a8b4177a3f69841b2344ec48aDaniel Dunbar  // FIXME: Fold MultiArgOption into SeparateOption?
2613c9cc6bfe933766a8b4177a3f69841b2344ec48aDaniel Dunbar
2621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// MultiArgOption - An option which takes multiple arguments (these
2631eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// are always separate arguments).
2641eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class MultiArgOption : public Option {
2651eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    unsigned NumArgs;
2661eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2671eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
2689e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    MultiArgOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
2692c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar                   const Option *Alias, unsigned NumArgs);
2701eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2711eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    unsigned getNumArgs() const { return NumArgs; }
2721eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
273f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
2742c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::MultiArgClass;
2772c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2782c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const MultiArgOption *) { return true; }
2791eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2801eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2811eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// JoinedOrSeparateOption - An option which either literally
2821eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// prefixes its (non-empty) value, or is follwed by a value.
2831eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class JoinedOrSeparateOption : public Option {
2842c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2859e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    JoinedOrSeparateOption(OptSpecifier ID, const char *Name,
28630b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar                           const OptionGroup *Group, const Option *Alias);
2871eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
288f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
2892c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::JoinedOrSeparateClass;
2922c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2932c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const JoinedOrSeparateOption *) { return true; }
2941eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2951eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2961eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// JoinedAndSeparateOption - An option which literally prefixes its
2971eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// value and is followed by another value.
2981eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class JoinedAndSeparateOption : public Option {
2992c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
3009e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    JoinedAndSeparateOption(OptSpecifier ID, const char *Name,
30130b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar                            const OptionGroup *Group, const Option *Alias);
3021eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
303f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
3042c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
3051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
3061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::JoinedAndSeparateClass;
3072c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
3082c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const JoinedAndSeparateOption *) { return true; }
3091eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
3101eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
3111eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar} // end namespace driver
3121eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar} // end namespace clang
3131eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
3141eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar#endif
315