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