Home | History | Annotate | Download | only in Option
      1 //===--- OptParser.td - Common Option Parsing Interfaces ------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 //  This file defines the common interfaces used by the option parsing TableGen
     11 //  backend.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 // Define the kinds of options.
     16 
     17 class OptionKind<string name, int precedence = 0, bit sentinel = 0> {
     18   string Name = name;
     19   // The kind precedence, kinds with lower precedence are matched first.
     20   int Precedence = precedence;
     21   // Indicate a sentinel option.
     22   bit Sentinel = sentinel;
     23 }
     24 
     25 // An option group.
     26 def KIND_GROUP : OptionKind<"Group">;
     27 // The input option kind.
     28 def KIND_INPUT : OptionKind<"Input", 1, 1>;
     29 // The unknown option kind.
     30 def KIND_UNKNOWN : OptionKind<"Unknown", 2, 1>;
     31 // A flag with no values.
     32 def KIND_FLAG : OptionKind<"Flag">;
     33 // An option which prefixes its (single) value.
     34 def KIND_JOINED : OptionKind<"Joined", 1>;
     35 // An option which is followed by its value.
     36 def KIND_SEPARATE : OptionKind<"Separate">;
     37 // An option followed by its values, which are separated by commas.
     38 def KIND_COMMAJOINED : OptionKind<"CommaJoined">;
     39 // An option which is which takes multiple (separate) arguments.
     40 def KIND_MULTIARG : OptionKind<"MultiArg">;
     41 // An option which is either joined to its (non-empty) value, or followed by its
     42 // value.
     43 def KIND_JOINED_OR_SEPARATE : OptionKind<"JoinedOrSeparate">;
     44 // An option which is both joined to its (first) value, and followed by its
     45 // (second) value.
     46 def KIND_JOINED_AND_SEPARATE : OptionKind<"JoinedAndSeparate">;
     47 // An option which consumes all remaining arguments if there are any.
     48 def KIND_REMAINING_ARGS : OptionKind<"RemainingArgs">;
     49 // An option which consumes an optional joined argument and any other remaining
     50 // arguments.
     51 def KIND_REMAINING_ARGS_JOINED : OptionKind<"RemainingArgsJoined">;
     52 
     53 // Define the option flags.
     54 
     55 class OptionFlag {}
     56 
     57 // HelpHidden - The option should not be displayed in --help, even if it has
     58 // help text. Clients *can* use this in conjunction with the OptTable::PrintHelp
     59 // arguments to implement hidden help groups.
     60 def HelpHidden : OptionFlag;
     61 
     62 // RenderAsInput - The option should not render the name when rendered as an
     63 // input (i.e., the option is rendered as values).
     64 def RenderAsInput : OptionFlag;
     65 
     66 // RenderJoined - The option should be rendered joined, even if separate (only
     67 // sensible on single value separate options).
     68 def RenderJoined : OptionFlag;
     69 
     70 // RenderSeparate - The option should be rendered separately, even if joined
     71 // (only sensible on joined options).
     72 def RenderSeparate : OptionFlag;
     73 
     74 // Define the option group class.
     75 
     76 class OptionGroup<string name> {
     77   string EnumName = ?; // Uses the def name if undefined.
     78   string Name = name;
     79   string HelpText = ?;
     80   OptionGroup Group = ?;
     81   list<OptionFlag> Flags = [];
     82 }
     83 
     84 // Define the option class.
     85 
     86 class Option<list<string> prefixes, string name, OptionKind kind> {
     87   string EnumName = ?; // Uses the def name if undefined.
     88   list<string> Prefixes = prefixes;
     89   string Name = name;
     90   OptionKind Kind = kind;
     91   // Used by MultiArg option kind.
     92   int NumArgs = 0;
     93   string HelpText = ?;
     94   string MetaVarName = ?;
     95   list<OptionFlag> Flags = [];
     96   OptionGroup Group = ?;
     97   Option Alias = ?;
     98   list<string> AliasArgs = [];
     99 }
    100 
    101 // Helpers for defining options.
    102 
    103 class Flag<list<string> prefixes, string name>
    104   : Option<prefixes, name, KIND_FLAG>;
    105 class Joined<list<string> prefixes, string name>
    106   : Option<prefixes, name, KIND_JOINED>;
    107 class Separate<list<string> prefixes, string name>
    108   : Option<prefixes, name, KIND_SEPARATE>;
    109 class CommaJoined<list<string> prefixes, string name>
    110   : Option<prefixes, name, KIND_COMMAJOINED>;
    111 class MultiArg<list<string> prefixes, string name, int numargs>
    112   : Option<prefixes, name, KIND_MULTIARG> {
    113   int NumArgs = numargs;
    114 }
    115 class JoinedOrSeparate<list<string> prefixes, string name>
    116   : Option<prefixes, name, KIND_JOINED_OR_SEPARATE>;
    117 class JoinedAndSeparate<list<string> prefixes, string name>
    118   : Option<prefixes, name, KIND_JOINED_AND_SEPARATE>;
    119 
    120 // Mix-ins for adding optional attributes.
    121 
    122 class Alias<Option alias> { Option Alias = alias; }
    123 class AliasArgs<list<string> aliasargs> { list<string> AliasArgs = aliasargs; }
    124 class EnumName<string name> { string EnumName = name; }
    125 class Flags<list<OptionFlag> flags> { list<OptionFlag> Flags = flags; }
    126 class Group<OptionGroup group> { OptionGroup Group = group; }
    127 class HelpText<string text> { string HelpText = text; }
    128 class MetaVarName<string name> { string MetaVarName = name; }
    129 
    130 // Predefined options.
    131 
    132 // FIXME: Have generator validate that these appear in correct position (and
    133 // aren't duplicated).
    134 def INPUT : Option<[], "<input>", KIND_INPUT>;
    135 def UNKNOWN : Option<[], "<unknown>", KIND_UNKNOWN>;
    136