Option.h revision bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2
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" 152c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar#include "llvm/Support/Casting.h" 162c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::isa; 172c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::cast; 182c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::cast_or_null; 192c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::dyn_cast; 202c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbarusing llvm::dyn_cast_or_null; 212c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 221eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbarnamespace clang { 231eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbarnamespace driver { 241eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class Arg; 25785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar class ArgList; 261eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class OptionGroup; 271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 281eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// Option - Abstract representation for a single form of driver 291eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// argument. 301eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// 311eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// An Option class represents a form of option that the driver 321eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// takes, for example how many arguments the option has and how 331eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// they can be provided. Individual option instances store 341eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// additional information about what group the option is a member 351eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// of (if any), if the option is an alias, and a number of 361eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// flags. At runtime the driver parses the command line into 371eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// concrete Arg instances, each of which corresponds to a 381eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// particular Option instance. 391eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class Option { 401eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 411eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar enum OptionClass { 422c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar GroupClass = 0, 432c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar InputClass, 442c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar UnknownClass, 452c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar FlagClass, 462c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar JoinedClass, 472c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar SeparateClass, 482c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar CommaJoinedClass, 492c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar MultiArgClass, 502c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar JoinedOrSeparateClass, 512c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar JoinedAndSeparateClass 521eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 531eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 54e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar enum RenderStyleKind { 55e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar RenderCommaJoinedStyle, 56e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar RenderJoinedStyle, 57e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar RenderSeparateStyle, 58e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar RenderValuesStyle 59e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar }; 60e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar 611eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar private: 621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar OptionClass Kind; 631eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 649e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar /// The option ID. 659e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar OptSpecifier ID; 6630b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar 671eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// The option name. 68bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor llvm::StringRef Name; 691eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 701eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// Group this option is a member of, if any. 711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const OptionGroup *Group; 721eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 731eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// Option that this is an alias for, if any. 741eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const Option *Alias; 751eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 76e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar /// Unsupported options will be rejected. 770f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar bool Unsupported : 1; 780f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar 790f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar /// Treat this option like a linker input? 800f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar bool LinkerInput : 1; 811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 820f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar /// When rendering as an input, don't render the option. 830f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar 840f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar // FIXME: We should ditch the render/renderAsInput distinction. 850f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar bool NoOptAsInput : 1; 860f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar 87e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar /// The style to using when rendering arguments parsed by this option. 88e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar unsigned RenderStyle : 2; 890f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar 901e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar /// This option is only consumed by the driver. 911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool DriverOption : 1; 926d954d788925e6b80077ef379c8eeb028cc31d0eDaniel Dunbar 931e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar /// This option should not report argument unused errors. 941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bool NoArgumentUnused : 1; 951e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar 96caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar /// This option should not be implicitly forwarded. 97caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar bool NoForward : 1; 98caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar 991eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar protected: 1009e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar Option(OptionClass Kind, OptSpecifier ID, const char *Name, 1012c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar const OptionGroup *Group, const Option *Alias); 102d35e63106d7b4b76275c85c88ee715c4356f2a6bDaniel Dunbar public: 103d35e63106d7b4b76275c85c88ee715c4356f2a6bDaniel Dunbar virtual ~Option(); 1041eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1059e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar unsigned getID() const { return ID.getID(); } 1061eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar OptionClass getKind() const { return Kind; } 107bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor llvm::StringRef getName() const { return Name; } 1081eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const OptionGroup *getGroup() const { return Group; } 1091eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar const Option *getAlias() const { return Alias; } 1101eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1110f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar bool isUnsupported() const { return Unsupported; } 1120f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar void setUnsupported(bool Value) { Unsupported = Value; } 1130f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar 1140f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar bool isLinkerInput() const { return LinkerInput; } 1150f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar void setLinkerInput(bool Value) { LinkerInput = Value; } 1160f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar 1176d954d788925e6b80077ef379c8eeb028cc31d0eDaniel Dunbar bool hasNoOptAsInput() const { return NoOptAsInput; } 1180f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar void setNoOptAsInput(bool Value) { NoOptAsInput = Value; } 1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 120e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar RenderStyleKind getRenderStyle() const { 121e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar return RenderStyleKind(RenderStyle); 122e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar } 123e375c4a02ac6e18b166a067b8226e15a1ab009e7Daniel Dunbar void setRenderStyle(RenderStyleKind Value) { RenderStyle = Value; } 1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 125f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar bool isDriverOption() const { return DriverOption; } 126f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar void setDriverOption(bool Value) { DriverOption = Value; } 127f6dd66b7b80e2fb42628df2593b3948149a53a5fDaniel Dunbar 1281e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar bool hasNoArgumentUnused() const { return NoArgumentUnused; } 1291e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar void setNoArgumentUnused(bool Value) { NoArgumentUnused = Value; } 1301e23f5f963dd6a3cee43ace77578161798e41e2dDaniel Dunbar 131caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar bool hasNoForward() const { return NoForward; } 132caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar void setNoForward(bool Value) { NoForward = Value; } 133caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar 134caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar bool hasForwardToGCC() const { 135caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar return !NoForward && !DriverOption && !LinkerInput; 136caeed1d3a5b366ae8fda5dda9bddc7bbb859c41fDaniel Dunbar } 1370f9098e093089e935066729ea06bc86c23d9a432Daniel Dunbar 1381eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// getUnaliasedOption - Return the final option this option 1391eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// aliases (itself, if the option has no alias). 1401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump const Option *getUnaliasedOption() const { 1411eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar if (Alias) return Alias->getUnaliasedOption(); 1421eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar return this; 1431eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar } 1441eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1451eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// getRenderName - Return the name to use when rendering this 1461eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// option. 147bcf6a8025aa50f3f28cfbd0470cf3e8f5cffbab2Douglas Gregor llvm::StringRef getRenderName() const { 1481eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar return getUnaliasedOption()->getName(); 1491eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar } 1501eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1511eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// matches - Predicate for whether this option is part of the 1521eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// given option (which may be a group). 153b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar /// 154b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar /// Note that matches against options which are an alias should never be 155b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar /// done -- aliases do not participate in matching and so such a query will 156b32aa51ce9b608002a031e8ca682f073e28024cfDaniel Dunbar /// always be false. 1579e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar bool matches(OptSpecifier ID) const; 1581eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 1591eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// accept - Potentially accept the current argument, returning a 1601eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// new Arg instance, or 0 if the option does not accept this 161b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar /// argument (or the argument is missing values). 1621eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// 163b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar /// If the option accepts the current argument, accept() sets 164b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar /// Index to the position where argument parsing should resume 165b0c4df5c4df69a003f26b378eb95961bc7c486e5Daniel Dunbar /// (even if the argument is missing values). 166785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const = 0; 1671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1682c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar void dump() const; 1692c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 1702c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const Option *) { return true; } 1711eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1731eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// OptionGroup - A set of options which are can be handled uniformly 1741eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// by the driver. 1751eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class OptionGroup : public Option { 1761eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 1779e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar OptionGroup(OptSpecifier ID, const char *Name, const OptionGroup *Group); 1781eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 179785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const; 1802c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Option *O) { 1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return O->getKind() == Option::GroupClass; 1832c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar } 1842c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const OptionGroup *) { return true; } 1851eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 1861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1871eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar // Dummy option classes. 1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1891eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// InputOption - Dummy option class for representing driver inputs. 1901eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class InputOption : public Option { 1911eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 192a0289fda5b5d67ad49596a5e1f62e1f9db497d06Daniel Dunbar InputOption(OptSpecifier ID); 1931eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 194785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const; 1952c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 1961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Option *O) { 1971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return O->getKind() == Option::InputClass; 1982c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar } 1992c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const InputOption *) { return true; } 2001eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 2011eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 2021eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// UnknownOption - Dummy option class for represent unknown arguments. 2031eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class UnknownOption : public Option { 2041eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 205a0289fda5b5d67ad49596a5e1f62e1f9db497d06Daniel Dunbar UnknownOption(OptSpecifier ID); 2061eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 207785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const; 2082c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 2091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Option *O) { 2101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return O->getKind() == Option::UnknownClass; 2112c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar } 2122c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const UnknownOption *) { return true; } 2131eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 2141eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 2151eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar // Normal options. 2161eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 2171eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class FlagOption : public Option { 2181eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 2199e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar FlagOption(OptSpecifier ID, const char *Name, const OptionGroup *Group, 22030b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar const Option *Alias); 2211eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 222785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const; 2232c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Option *O) { 2251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return O->getKind() == Option::FlagClass; 2262c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar } 2272c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const FlagOption *) { return true; } 2281eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 2291eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 2301eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class JoinedOption : public Option { 2312c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar public: 2329e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar JoinedOption(OptSpecifier ID, const char *Name, const OptionGroup *Group, 2332c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar const Option *Alias); 2341eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 235785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const; 2362c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 2371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Option *O) { 2381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return O->getKind() == Option::JoinedClass; 2392c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar } 2402c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const JoinedOption *) { return true; } 2411eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 2421eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 2432c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar class SeparateOption : public Option { 2442c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar public: 2459e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar SeparateOption(OptSpecifier ID, const char *Name, 2469e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar const OptionGroup *Group, const Option *Alias); 2471eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 248785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const; 2492c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 2501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Option *O) { 2511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return O->getKind() == Option::SeparateClass; 2522c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar } 2532c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const SeparateOption *) { return true; } 2541eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 2551eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 2562c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar class CommaJoinedOption : public Option { 2572c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar public: 2589e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar CommaJoinedOption(OptSpecifier ID, const char *Name, 25930b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar const OptionGroup *Group, const Option *Alias); 2601eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 261785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const; 2622c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 2631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Option *O) { 2641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return O->getKind() == Option::CommaJoinedClass; 2652c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar } 2662c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const CommaJoinedOption *) { return true; } 2671eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 2681eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 2693c9cc6bfe933766a8b4177a3f69841b2344ec48aDaniel Dunbar // FIXME: Fold MultiArgOption into SeparateOption? 2703c9cc6bfe933766a8b4177a3f69841b2344ec48aDaniel Dunbar 2711eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// MultiArgOption - An option which takes multiple arguments (these 2721eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// are always separate arguments). 2731eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class MultiArgOption : public Option { 2741eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar unsigned NumArgs; 2751eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 2761eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar public: 2779e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar MultiArgOption(OptSpecifier ID, const char *Name, const OptionGroup *Group, 2782c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar const Option *Alias, unsigned NumArgs); 2791eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 2801eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar unsigned getNumArgs() const { return NumArgs; } 2811eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 282785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const; 2832c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 2841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Option *O) { 2851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return O->getKind() == Option::MultiArgClass; 2862c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar } 2872c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const MultiArgOption *) { return true; } 2881eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 2891eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 2901eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// JoinedOrSeparateOption - An option which either literally 2911eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// prefixes its (non-empty) value, or is follwed by a value. 2921eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class JoinedOrSeparateOption : public Option { 2932c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar public: 2949e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar JoinedOrSeparateOption(OptSpecifier ID, const char *Name, 29530b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar const OptionGroup *Group, const Option *Alias); 2961eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 297785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const; 2982c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Option *O) { 3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return O->getKind() == Option::JoinedOrSeparateClass; 3012c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar } 3022c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const JoinedOrSeparateOption *) { return true; } 3031eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 3041eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 3051eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// JoinedAndSeparateOption - An option which literally prefixes its 3061eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar /// value and is followed by another value. 3071eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar class JoinedAndSeparateOption : public Option { 3082c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar public: 3099e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar JoinedAndSeparateOption(OptSpecifier ID, const char *Name, 31030b055f553ffa50ae5413ecf0f0ac8061c58f475Daniel Dunbar const OptionGroup *Group, const Option *Alias); 3111eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 312785e7963343c91c16e6d7c8f301eee145d06da5bDaniel Dunbar virtual Arg *accept(const ArgList &Args, unsigned &Index) const; 3132c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar 3141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump static bool classof(const Option *O) { 3151eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return O->getKind() == Option::JoinedAndSeparateClass; 3162c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar } 3172c6f6f3c170502c5b810102cf85f05732a2aa9d0Daniel Dunbar static bool classof(const JoinedAndSeparateOption *) { return true; } 3181eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar }; 3191eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 3201eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar} // end namespace driver 3211eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar} // end namespace clang 3221eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar 3231eb4e64eed08837b85a375d6a953503daa844f07Daniel Dunbar#endif 324