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