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 
     50 // Define the option flags.
     51 
     52 class OptionFlag {}
     53 
     54 // HelpHidden - The option should not be displayed in --help, even if it has
     55 // help text. Clients *can* use this in conjunction with the OptTable::PrintHelp
     56 // arguments to implement hidden help groups.
     57 def HelpHidden : OptionFlag;
     58 
     59 // RenderAsInput - The option should not render the name when rendered as an
     60 // input (i.e., the option is rendered as values).
     61 def RenderAsInput : OptionFlag;
     62 
     63 // RenderJoined - The option should be rendered joined, even if separate (only
     64 // sensible on single value separate options).
     65 def RenderJoined : OptionFlag;
     66 
     67 // RenderSeparate - The option should be rendered separately, even if joined
     68 // (only sensible on joined options).
     69 def RenderSeparate : OptionFlag;
     70 
     71 // Define the option group class.
     72 
     73 class OptionGroup<string name> {
     74   string EnumName = ?; // Uses the def name if undefined.
     75   string Name = name;
     76   string HelpText = ?;
     77   OptionGroup Group = ?;
     78 }
     79 
     80 // Define the option class.
     81 
     82 class Option<list<string> prefixes, string name, OptionKind kind> {
     83   string EnumName = ?; // Uses the def name if undefined.
     84   list<string> Prefixes = prefixes;
     85   string Name = name;
     86   OptionKind Kind = kind;
     87   // Used by MultiArg option kind.
     88   int NumArgs = 0;
     89   string HelpText = ?;
     90   string MetaVarName = ?;
     91   list<OptionFlag> Flags = [];
     92   OptionGroup Group = ?;
     93   Option Alias = ?;
     94   list<string> AliasArgs = [];
     95 }
     96 
     97 // Helpers for defining options.
     98 
     99 class Flag<list<string> prefixes, string name>
    100   : Option<prefixes, name, KIND_FLAG>;
    101 class Joined<list<string> prefixes, string name>
    102   : Option<prefixes, name, KIND_JOINED>;
    103 class Separate<list<string> prefixes, string name>
    104   : Option<prefixes, name, KIND_SEPARATE>;
    105 class CommaJoined<list<string> prefixes, string name>
    106   : Option<prefixes, name, KIND_COMMAJOINED>;
    107 class MultiArg<list<string> prefixes, string name, int numargs>
    108   : Option<prefixes, name, KIND_MULTIARG> {
    109   int NumArgs = numargs;
    110 }
    111 class JoinedOrSeparate<list<string> prefixes, string name>
    112   : Option<prefixes, name, KIND_JOINED_OR_SEPARATE>;
    113 class JoinedAndSeparate<list<string> prefixes, string name>
    114   : Option<prefixes, name, KIND_JOINED_AND_SEPARATE>;
    115 
    116 // Mix-ins for adding optional attributes.
    117 
    118 class Alias<Option alias> { Option Alias = alias; }
    119 class AliasArgs<list<string> aliasargs> { list<string> AliasArgs = aliasargs; }
    120 class EnumName<string name> { string EnumName = name; }
    121 class Flags<list<OptionFlag> flags> { list<OptionFlag> Flags = flags; }
    122 class Group<OptionGroup group> { OptionGroup Group = group; }
    123 class HelpText<string text> { string HelpText = text; }
    124 class MetaVarName<string name> { string MetaVarName = name; }
    125 
    126 // Predefined options.
    127 
    128 // FIXME: Have generator validate that these appear in correct position (and
    129 // aren't duplicated).
    130 def INPUT : Option<[], "<input>", KIND_INPUT>;
    131 def UNKNOWN : Option<[], "<unknown>", KIND_UNKNOWN>;
    132