blob: 164559d59aa73a2967e33dbeb13993b841400800 [file] [log] [blame]
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001//===-- DirectiveBase.td - Base directive definition file --*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This is the base definition file directives and clauses.
10//
11//===----------------------------------------------------------------------===//
12
13
14// General information about the directive language.
15class DirectiveLanguage {
16 // Name of the directive language such as omp or acc.
17 string name = ?;
18
19 // The C++ namespace that code of this directive language should be placed
20 // into. This namespace is nested in llvm namespace.
21 //
22 // By default, uses the name of the directive language as the only namespace.
23 // To avoid placing in any namespace, use "". To specify nested namespaces,
24 // use "::" as the delimiter, e.g., given "A::B", ops will be placed in
25 // `namespace A { namespace B { <directives-clauses> } }`.
26 string cppNamespace = name;
27
28 // Optional prefix used for the generation of the enumerator in the Directive
29 // enum.
30 string directivePrefix = "";
31
32 // Optional prefix used for the generation of the enumerator in the Clause
33 // enum.
34 string clausePrefix = "";
35
36 // Make the enum values available in the namespace. This allows us to
37 // write something like Enum_X if we have a `using namespace cppNamespace`.
38 bit makeEnumAvailableInNamespace = false;
39
40 // Generate include and macro to enable LLVM BitmaskEnum.
41 bit enableBitmaskEnumInNamespace = false;
42
43 // Header file included in the implementation code generated. Ususally the
44 // output file of the declaration code generation. Can be left blank.
45 string includeHeader = "";
46
47 // EnumSet class name used for clauses to generated the allowed clauses map.
48 string clauseEnumSetClass = "";
49
50 // Class holding the clauses in the flang parse-tree.
51 string flangClauseBaseClass = "";
52}
53
54// Information about values accepted by enum-like clauses
55class ClauseVal<string n, int v, bit uv> {
56 // Name of the clause value.
57 string name = n;
58
59 // Integer value of the clause.
60 int value = v;
61
62 // Can user specify this value?
63 bit isUserValue = uv;
64
65 // Set clause value used by default when unknown.
66 bit isDefault = false;
67}
68
69// Information about a specific clause.
70class Clause<string c> {
71 // Name of the clause.
72 string name = c;
73
74 // Define an alternative name return in get<LanguageName>ClauseName function.
75 string alternativeName = "";
76
77 // Optional class holding value of the clause in clang AST.
78 string clangClass = "";
79
80 // Optional class holding the clause in flang AST. If left blank, the class
81 // is assumed to be the name of the clause with capitalized word and
82 // underscores removed.
83 // ex: async -> Async
84 // num_threads -> NumThreads
85 string flangClass = "";
86
87 // Optional class holding value of the clause in flang AST.
88 string flangClassValue = "";
89
90 // If set to true, value is optional. Not optional by default.
91 bit isValueOptional = false;
92
93 // Name of enum when there is a list of allowed clause values.
94 string enumClauseValue = "";
95
96 // List of allowed clause values
97 list<ClauseVal> allowedClauseValues = [];
98 // If set to true, value class is part of a list. Single class by default.
99 bit isValueList = false;
100
101 // Define a default value such as "*".
102 string defaultValue = "";
103
104 // Is clause implicit? If clause is set as implicit, the default kind will
105 // be return in get<LanguageName>ClauseKind instead of their own kind.
106 bit isImplicit = false;
107
108 // Set clause used by default when unknown. Function returning the kind
109 // of enumeration will use this clause as the default.
110 bit isDefault = false;
111}
112
113// Hold information about clause validity by version.
114class VersionedClause<Clause c, int min = 1, int max = 0x7FFFFFFF> {
115 // Actual clause.
116 Clause clause = c;
117
118 // Mininum version number where this clause is valid.
119 int minVersion = min;
120
121 // Maximum version number where this clause is valid.
122 int maxVersion = max;
123}
124
125// Information about a specific directive.
126class Directive<string d> {
127 // Name of the directive. Can be composite directive sepearted by whitespace.
128 string name = d;
129
130 // Define an alternative name return in get<LanguageName>DirectiveName
131 // function.
132 string alternativeName = "";
133
134 // Clauses cannot appear twice in the three allowed lists below. Also, since
135 // required implies allowed, the same clause cannot appear in both the
136 // allowedClauses and requiredClauses lists.
137
138 // List of allowed clauses for the directive.
139 list<VersionedClause> allowedClauses = [];
140
141 // List of clauses that are allowed to appear only once.
142 list<VersionedClause> allowedOnceClauses = [];
143
144 // List of clauses that are allowed but mutually exclusive.
145 list<VersionedClause> allowedExclusiveClauses = [];
146
147 // List of clauses that are required.
148 list<VersionedClause> requiredClauses = [];
149
150 // Set directive used by default when unknown.
151 bit isDefault = false;
152}