159191Skris//===--- OptParser.td - Common Option Parsing Interfaces ------------------===// 259191Skris// 359191Skris// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 459191Skris// See https://llvm.org/LICENSE.txt for license information. 559191Skris// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6109998Smarkm// 759191Skris//===----------------------------------------------------------------------===// 859191Skris// 959191Skris// This file defines the common interfaces used by the option parsing TableGen 1059191Skris// backend. 11160814Ssimon// 12109998Smarkm//===----------------------------------------------------------------------===// 1359191Skris 1459191Skris// Define the kinds of options. 1559191Skris 1659191Skrisclass OptionKind<string name, int precedence = 0, bit sentinel = 0> { 1759191Skris string Name = name; 1859191Skris // The kind precedence, kinds with lower precedence are matched first. 1959191Skris int Precedence = precedence; 2059191Skris // Indicate a sentinel option. 2159191Skris bit Sentinel = sentinel; 2259191Skris} 2359191Skris 2459191Skris// An option group. 2559191Skrisdef KIND_GROUP : OptionKind<"Group">; 2659191Skris// The input option kind. 2759191Skrisdef KIND_INPUT : OptionKind<"Input", 1, 1>; 2859191Skris// The unknown option kind. 2959191Skrisdef KIND_UNKNOWN : OptionKind<"Unknown", 2, 1>; 3059191Skris// A flag with no values. 3159191Skrisdef KIND_FLAG : OptionKind<"Flag">; 3259191Skris// An option which prefixes its (single) value. 3359191Skrisdef KIND_JOINED : OptionKind<"Joined", 1>; 3459191Skris// An option which is followed by its value. 3559191Skrisdef KIND_SEPARATE : OptionKind<"Separate">; 3659191Skris// An option followed by its values, which are separated by commas. 3759191Skrisdef KIND_COMMAJOINED : OptionKind<"CommaJoined">; 3859191Skris// An option which is which takes multiple (separate) arguments. 3959191Skrisdef KIND_MULTIARG : OptionKind<"MultiArg">; 4059191Skris// An option which is either joined to its (non-empty) value, or followed by its 4159191Skris// value. 4259191Skrisdef KIND_JOINED_OR_SEPARATE : OptionKind<"JoinedOrSeparate">; 4359191Skris// An option which is both joined to its (first) value, and followed by its 4459191Skris// (second) value. 4559191Skrisdef KIND_JOINED_AND_SEPARATE : OptionKind<"JoinedAndSeparate">; 4659191Skris// An option which consumes all remaining arguments if there are any. 4759191Skrisdef KIND_REMAINING_ARGS : OptionKind<"RemainingArgs">; 4859191Skris// An option which consumes an optional joined argument and any other remaining 4959191Skris// arguments. 5059191Skrisdef KIND_REMAINING_ARGS_JOINED : OptionKind<"RemainingArgsJoined">; 5159191Skris 5259191Skris// Define the option flags. 5359191Skris 5459191Skrisclass OptionFlag {} 5559191Skris 5659191Skris// HelpHidden - The option should not be displayed in --help, even if it has 5759191Skris// help text. Clients *can* use this in conjunction with the OptTable::PrintHelp 5859191Skris// arguments to implement hidden help groups. 5959191Skrisdef HelpHidden : OptionFlag; 6059191Skris 6159191Skris// RenderAsInput - The option should not render the name when rendered as an 6259191Skris// input (i.e., the option is rendered as values). 6359191Skrisdef RenderAsInput : OptionFlag; 6459191Skris 6559191Skris// RenderJoined - The option should be rendered joined, even if separate (only 6659191Skris// sensible on single value separate options). 6759191Skrisdef RenderJoined : OptionFlag; 6859191Skris 6959191Skris// RenderSeparate - The option should be rendered separately, even if joined 7059191Skris// (only sensible on joined options). 7159191Skrisdef RenderSeparate : OptionFlag; 7259191Skris 7359191Skris// Define the option group class. 7459191Skris 7559191Skrisclass OptionGroup<string name> { 7659191Skris string EnumName = ?; // Uses the def name if undefined. 7759191Skris string Name = name; 7859191Skris string HelpText = ?; 7959191Skris OptionGroup Group = ?; 8059191Skris list<OptionFlag> Flags = []; 8159191Skris} 8259191Skris 8359191Skris// Define the option class. 8459191Skris 8559191Skrisclass Option<list<string> prefixes, string name, OptionKind kind> { 8659191Skris string EnumName = ?; // Uses the def name if undefined. 8759191Skris list<string> Prefixes = prefixes; 8859191Skris string Name = name; 8959191Skris OptionKind Kind = kind; 9059191Skris // Used by MultiArg option kind. 9159191Skris int NumArgs = 0; 9259191Skris string HelpText = ?; 9359191Skris string MetaVarName = ?; 9459191Skris string Values = ?; 9559191Skris code ValuesCode = ?; 9659191Skris list<OptionFlag> Flags = []; 9759191Skris OptionGroup Group = ?; 9859191Skris Option Alias = ?; 9959191Skris list<string> AliasArgs = []; 10059191Skris} 10159191Skris 10259191Skris// Helpers for defining options. 10359191Skris 10459191Skrisclass Flag<list<string> prefixes, string name> 10559191Skris : Option<prefixes, name, KIND_FLAG>; 10659191Skrisclass Joined<list<string> prefixes, string name> 10759191Skris : Option<prefixes, name, KIND_JOINED>; 10859191Skrisclass Separate<list<string> prefixes, string name> 10959191Skris : Option<prefixes, name, KIND_SEPARATE>; 11059191Skrisclass CommaJoined<list<string> prefixes, string name> 11159191Skris : Option<prefixes, name, KIND_COMMAJOINED>; 11259191Skrisclass MultiArg<list<string> prefixes, string name, int numargs> 11359191Skris : Option<prefixes, name, KIND_MULTIARG> { 11459191Skris int NumArgs = numargs; 11559191Skris} 11659191Skrisclass JoinedOrSeparate<list<string> prefixes, string name> 11759191Skris : Option<prefixes, name, KIND_JOINED_OR_SEPARATE>; 11859191Skrisclass JoinedAndSeparate<list<string> prefixes, string name> 11959191Skris : Option<prefixes, name, KIND_JOINED_AND_SEPARATE>; 12059191Skris 12159191Skris// Mix-ins for adding optional attributes. 12259191Skris 12359191Skrisclass Alias<Option alias> { Option Alias = alias; } 12459191Skrisclass AliasArgs<list<string> aliasargs> { list<string> AliasArgs = aliasargs; } 12559191Skrisclass EnumName<string name> { string EnumName = name; } 12659191Skrisclass Flags<list<OptionFlag> flags> { list<OptionFlag> Flags = flags; } 12759191Skrisclass Group<OptionGroup group> { OptionGroup Group = group; } 12859191Skrisclass HelpText<string text> { string HelpText = text; } 12959191Skrisclass MetaVarName<string name> { string MetaVarName = name; } 13059191Skrisclass Values<string value> { string Values = value; } 13159191Skrisclass ValuesCode<code valuecode> { code ValuesCode = valuecode; } 13259191Skris 13359191Skris// Predefined options. 13459191Skris 13559191Skris// FIXME: Have generator validate that these appear in correct position (and 13659191Skris// aren't duplicated). 13759191Skrisdef INPUT : Option<[], "<input>", KIND_INPUT>; 13859191Skrisdef UNKNOWN : Option<[], "<unknown>", KIND_UNKNOWN>; 13959191Skris