blob: 9c373741770b0268d5e3a15e9c6ac4a656e8cf51 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===--- 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
17class 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.
26def KIND_GROUP : OptionKind<"Group">;
27// The input option kind.
28def KIND_INPUT : OptionKind<"Input", 1, 1>;
29// The unknown option kind.
30def KIND_UNKNOWN : OptionKind<"Unknown", 2, 1>;
31// A flag with no values.
32def KIND_FLAG : OptionKind<"Flag">;
33// An option which prefixes its (single) value.
34def KIND_JOINED : OptionKind<"Joined", 1>;
35// An option which is followed by its value.
36def KIND_SEPARATE : OptionKind<"Separate">;
37// An option followed by its values, which are separated by commas.
38def KIND_COMMAJOINED : OptionKind<"CommaJoined">;
39// An option which is which takes multiple (separate) arguments.
40def KIND_MULTIARG : OptionKind<"MultiArg">;
41// An option which is either joined to its (non-empty) value, or followed by its
42// value.
43def KIND_JOINED_OR_SEPARATE : OptionKind<"JoinedOrSeparate">;
44// An option which is both joined to its (first) value, and followed by its
45// (second) value.
46def KIND_JOINED_AND_SEPARATE : OptionKind<"JoinedAndSeparate">;
47// An option which consumes all remaining arguments if there are any.
48def KIND_REMAINING_ARGS : OptionKind<"RemainingArgs">;
49// An option which consumes an optional joined argument and any other remaining
50// arguments.
51def KIND_REMAINING_ARGS_JOINED : OptionKind<"RemainingArgsJoined">;
52
53// Define the option flags.
54
55class 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.
60def 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).
64def RenderAsInput : OptionFlag;
65
66// RenderJoined - The option should be rendered joined, even if separate (only
67// sensible on single value separate options).
68def RenderJoined : OptionFlag;
69
70// RenderSeparate - The option should be rendered separately, even if joined
71// (only sensible on joined options).
72def RenderSeparate : OptionFlag;
73
74// Define the option group class.
75
76class 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
86class 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 string Values = ?;
96 code ValuesCode = ?;
97 list<OptionFlag> Flags = [];
98 OptionGroup Group = ?;
99 Option Alias = ?;
100 list<string> AliasArgs = [];
101}
102
103// Helpers for defining options.
104
105class Flag<list<string> prefixes, string name>
106 : Option<prefixes, name, KIND_FLAG>;
107class Joined<list<string> prefixes, string name>
108 : Option<prefixes, name, KIND_JOINED>;
109class Separate<list<string> prefixes, string name>
110 : Option<prefixes, name, KIND_SEPARATE>;
111class CommaJoined<list<string> prefixes, string name>
112 : Option<prefixes, name, KIND_COMMAJOINED>;
113class MultiArg<list<string> prefixes, string name, int numargs>
114 : Option<prefixes, name, KIND_MULTIARG> {
115 int NumArgs = numargs;
116}
117class JoinedOrSeparate<list<string> prefixes, string name>
118 : Option<prefixes, name, KIND_JOINED_OR_SEPARATE>;
119class JoinedAndSeparate<list<string> prefixes, string name>
120 : Option<prefixes, name, KIND_JOINED_AND_SEPARATE>;
121
122// Mix-ins for adding optional attributes.
123
124class Alias<Option alias> { Option Alias = alias; }
125class AliasArgs<list<string> aliasargs> { list<string> AliasArgs = aliasargs; }
126class EnumName<string name> { string EnumName = name; }
127class Flags<list<OptionFlag> flags> { list<OptionFlag> Flags = flags; }
128class Group<OptionGroup group> { OptionGroup Group = group; }
129class HelpText<string text> { string HelpText = text; }
130class MetaVarName<string name> { string MetaVarName = name; }
131class Values<string value> { string Values = value; }
132class ValuesCode<code valuecode> { code ValuesCode = valuecode; }
133
134// Predefined options.
135
136// FIXME: Have generator validate that these appear in correct position (and
137// aren't duplicated).
138def INPUT : Option<[], "<input>", KIND_INPUT>;
139def UNKNOWN : Option<[], "<unknown>", KIND_UNKNOWN>;