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"
14bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor#include "llvm/ADT/StringRef.h"
159594675cc1eb52a054de13c4a21e466643847480Chris Lattner#include "clang/Basic/LLVM.h"
162c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
171eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbarnamespace clang {
181eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbarnamespace driver {
191eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class Arg;
20785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar  class ArgList;
211eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class OptionGroup;
221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
231eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// Option - Abstract representation for a single form of driver
241eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// argument.
251eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  ///
261eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// An Option class represents a form of option that the driver
271eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// takes, for example how many arguments the option has and how
281eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// they can be provided. Individual option instances store
291eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// additional information about what group the option is a member
301eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// of (if any), if the option is an alias, and a number of
311eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// flags. At runtime the driver parses the command line into
321eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// concrete Arg instances, each of which corresponds to a
331eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// particular Option instance.
341eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class Option {
351eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
361eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    enum OptionClass {
372c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      GroupClass = 0,
382c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      InputClass,
392c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      UnknownClass,
402c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      FlagClass,
412c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      JoinedClass,
422c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      SeparateClass,
432c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      CommaJoinedClass,
442c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      MultiArgClass,
452c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      JoinedOrSeparateClass,
462c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar      JoinedAndSeparateClass
471eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    };
481eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
49e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    enum RenderStyleKind {
50e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderCommaJoinedStyle,
51e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderJoinedStyle,
52e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderSeparateStyle,
53e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      RenderValuesStyle
54e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    };
55e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar
561eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  private:
571eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    OptionClass Kind;
581eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
599e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    /// The option ID.
609e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    OptSpecifier ID;
6130b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar
621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// The option name.
63686775deca8b8685eb90801495880e3abdd844c2Chris Lattner    StringRef Name;
641eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
651eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// Group this option is a member of, if any.
661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const OptionGroup *Group;
671eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
681eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// Option that this is an alias for, if any.
691eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const Option *Alias;
701eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
71e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    /// Unsupported options will be rejected.
720f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool Unsupported : 1;
730f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
740f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    /// Treat this option like a linker input?
750f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool LinkerInput : 1;
761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
770f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    /// When rendering as an input, don't render the option.
780f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
790f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    // FIXME: We should ditch the render/renderAsInput distinction.
800f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool NoOptAsInput : 1;
810f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
82e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    /// The style to using when rendering arguments parsed by this option.
83e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    unsigned RenderStyle : 2;
840f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
851e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    /// This option is only consumed by the driver.
861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    bool DriverOption : 1;
876d954d788925e6b80077ef379c8eeb028cc31d0eDaniel Dunbar
881e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    /// This option should not report argument unused errors.
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    bool NoArgumentUnused : 1;
901e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar
91caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    /// This option should not be implicitly forwarded.
92caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    bool NoForward : 1;
93caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar
941eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  protected:
959e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    Option(OptionClass Kind, OptSpecifier ID, const char *Name,
962c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar           const OptionGroup *Group, const Option *Alias);
97d35e63106d7b4b76275c85c88ee715c4356f2a6bDaniel Dunbar  public:
98d35e63106d7b4b76275c85c88ee715c4356f2a6bDaniel Dunbar    virtual ~Option();
991eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1009e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    unsigned getID() const { return ID.getID(); }
1011eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    OptionClass getKind() const { return Kind; }
102686775deca8b8685eb90801495880e3abdd844c2Chris Lattner    StringRef getName() const { return Name; }
1031eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const OptionGroup *getGroup() const { return Group; }
1041eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    const Option *getAlias() const { return Alias; }
1051eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1060f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool isUnsupported() const { return Unsupported; }
1070f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    void setUnsupported(bool Value) { Unsupported = Value; }
1080f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
1090f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    bool isLinkerInput() const { return LinkerInput; }
1100f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    void setLinkerInput(bool Value) { LinkerInput = Value; }
1110f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
1126d954d788925e6b80077ef379c8eeb028cc31d0eDaniel Dunbar    bool hasNoOptAsInput() const { return NoOptAsInput; }
1130f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar    void setNoOptAsInput(bool Value) { NoOptAsInput = Value; }
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    RenderStyleKind getRenderStyle() const {
116e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar      return RenderStyleKind(RenderStyle);
117e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    }
118e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar    void setRenderStyle(RenderStyleKind Value) { RenderStyle = Value; }
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
120f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar    bool isDriverOption() const { return DriverOption; }
121f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar    void setDriverOption(bool Value) { DriverOption = Value; }
122f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar
1231e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    bool hasNoArgumentUnused() const { return NoArgumentUnused; }
1241e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar    void setNoArgumentUnused(bool Value) { NoArgumentUnused = Value; }
1251e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar
126caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    bool hasNoForward() const { return NoForward; }
127caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    void setNoForward(bool Value) { NoForward = Value; }
128caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar
129caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    bool hasForwardToGCC() const {
130caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar      return !NoForward && !DriverOption && !LinkerInput;
131caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar    }
1320f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar
1331eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// getUnaliasedOption - Return the final option this option
1341eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// aliases (itself, if the option has no alias).
1351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const Option *getUnaliasedOption() const {
1361eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar      if (Alias) return Alias->getUnaliasedOption();
1371eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar      return this;
1381eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    }
1391eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1401eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// getRenderName - Return the name to use when rendering this
1411eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// option.
142686775deca8b8685eb90801495880e3abdd844c2Chris Lattner    StringRef getRenderName() const {
1431eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar      return getUnaliasedOption()->getName();
1441eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    }
1451eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1461eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// matches - Predicate for whether this option is part of the
1471eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// given option (which may be a group).
148b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    ///
149b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    /// Note that matches against options which are an alias should never be
150b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    /// done -- aliases do not participate in matching and so such a query will
151b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar    /// always be false.
1529e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    bool matches(OptSpecifier ID) const;
1531eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1541eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// accept - Potentially accept the current argument, returning a
1551eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    /// new Arg instance, or 0 if the option does not accept this
156b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// argument (or the argument is missing values).
1571eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    ///
158b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// If the option accepts the current argument, accept() sets
159b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// Index to the position where argument parsing should resume
160b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar    /// (even if the argument is missing values).
161785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const = 0;
1621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1632c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    void dump() const;
1642c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
1652c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const Option *) { return true; }
1661eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1681eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// OptionGroup - A set of options which are can be handled uniformly
1691eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// by the driver.
1701eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class OptionGroup : public Option {
1711eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
1729e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    OptionGroup(OptSpecifier ID, const char *Name, const OptionGroup *Group);
1731eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
174785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
1752c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
1761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
1771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::GroupClass;
1782c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
1792c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const OptionGroup *) { return true; }
1801eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1821eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  // Dummy option classes.
1831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1841eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// InputOption - Dummy option class for representing driver inputs.
1851eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class InputOption : public Option {
1861eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
187a0289fda5b5d67ad49596a5e1f62e1f9db497d06Daniel Dunbar    InputOption(OptSpecifier ID);
1881eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
189785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
1902c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
1911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
1921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::InputClass;
1932c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
1942c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const InputOption *) { return true; }
1951eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
1961eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
1971eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// UnknownOption - Dummy option class for represent unknown arguments.
1981eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class UnknownOption : public Option {
1991eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
200a0289fda5b5d67ad49596a5e1f62e1f9db497d06Daniel Dunbar    UnknownOption(OptSpecifier ID);
2011eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
202785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2032c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::UnknownClass;
2062c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2072c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const UnknownOption *) { return true; }
2081eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2091eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2101eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  // Normal options.
2111eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2121eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class FlagOption : public Option {
2131eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
2149e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    FlagOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
21530b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar               const Option *Alias);
2161eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
217785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2182c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::FlagClass;
2212c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2222c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const FlagOption *) { return true; }
2231eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2241eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2251eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class JoinedOption : public Option {
2262c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2279e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    JoinedOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
2282c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar                 const Option *Alias);
2291eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
230785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2312c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::JoinedClass;
2342c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2352c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const JoinedOption *) { return true; }
2361eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2371eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2382c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  class SeparateOption : public Option {
2392c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2409e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    SeparateOption(OptSpecifier ID, const char *Name,
2419e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar                   const OptionGroup *Group, const Option *Alias);
2421eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
243785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2442c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::SeparateClass;
2472c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2482c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const SeparateOption *) { return true; }
2491eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2501eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2512c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  class CommaJoinedOption : public Option {
2522c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2539e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    CommaJoinedOption(OptSpecifier ID, const char *Name,
25430b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar                      const OptionGroup *Group, const Option *Alias);
2551eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
256785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2572c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::CommaJoinedClass;
2602c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2612c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const CommaJoinedOption *) { return true; }
2621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2631eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2643c9cc6bfe933766a8b4177a3f69841b2344ec48aDaniel Dunbar  // FIXME: Fold MultiArgOption into SeparateOption?
2653c9cc6bfe933766a8b4177a3f69841b2344ec48aDaniel Dunbar
2661eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// MultiArgOption - An option which takes multiple arguments (these
2671eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// are always separate arguments).
2681eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class MultiArgOption : public Option {
2691eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    unsigned NumArgs;
2701eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2711eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  public:
2729e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    MultiArgOption(OptSpecifier ID, const char *Name, const OptionGroup *Group,
2732c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar                   const Option *Alias, unsigned NumArgs);
2741eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2751eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar    unsigned getNumArgs() const { return NumArgs; }
2761eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
277785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2782c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2791eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::MultiArgClass;
2812c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2822c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const MultiArgOption *) { return true; }
2831eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2841eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
2851eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// JoinedOrSeparateOption - An option which either literally
2861eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// prefixes its (non-empty) value, or is follwed by a value.
2871eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class JoinedOrSeparateOption : public Option {
2882c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
2899e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    JoinedOrSeparateOption(OptSpecifier ID, const char *Name,
29030b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar                           const OptionGroup *Group, const Option *Alias);
2911eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
292785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
2932c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
2951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::JoinedOrSeparateClass;
2962c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
2972c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const JoinedOrSeparateOption *) { return true; }
2981eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
2991eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
3001eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// JoinedAndSeparateOption - An option which literally prefixes its
3011eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  /// value and is followed by another value.
3021eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  class JoinedAndSeparateOption : public Option {
3032c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar  public:
3049e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    JoinedAndSeparateOption(OptSpecifier ID, const char *Name,
30530b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar                            const OptionGroup *Group, const Option *Alias);
3061eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
307785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
3082c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    static bool classof(const Option *O) {
3101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return O->getKind() == Option::JoinedAndSeparateClass;
3112c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    }
3122c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar    static bool classof(const JoinedAndSeparateOption *) { return true; }
3131eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar  };
3141eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
3151eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar} // end namespace driver
3161eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar} // end namespace clang
3171eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar
3181eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar#endif
319