TableGen.cpp revision 1.1.1.1
1//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//
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 file contains the main function for Clang's TableGen.
10//
11//===----------------------------------------------------------------------===//
12
13#include "TableGenBackends.h" // Declares all backends.
14#include "ClangASTEmitters.h"
15#include "llvm/Support/CommandLine.h"
16#include "llvm/Support/PrettyStackTrace.h"
17#include "llvm/Support/Signals.h"
18#include "llvm/TableGen/Error.h"
19#include "llvm/TableGen/Main.h"
20#include "llvm/TableGen/Record.h"
21
22using namespace llvm;
23using namespace clang;
24
25enum ActionType {
26  PrintRecords,
27  DumpJSON,
28  GenClangAttrClasses,
29  GenClangAttrParserStringSwitches,
30  GenClangAttrSubjectMatchRulesParserStringSwitches,
31  GenClangAttrImpl,
32  GenClangAttrList,
33  GenClangAttrSubjectMatchRuleList,
34  GenClangAttrPCHRead,
35  GenClangAttrPCHWrite,
36  GenClangAttrHasAttributeImpl,
37  GenClangAttrSpellingListIndex,
38  GenClangAttrASTVisitor,
39  GenClangAttrTemplateInstantiate,
40  GenClangAttrParsedAttrList,
41  GenClangAttrParsedAttrImpl,
42  GenClangAttrParsedAttrKinds,
43  GenClangAttrTextNodeDump,
44  GenClangAttrNodeTraverse,
45  GenClangDiagsDefs,
46  GenClangDiagGroups,
47  GenClangDiagsIndexName,
48  GenClangCommentNodes,
49  GenClangDeclNodes,
50  GenClangStmtNodes,
51  GenClangTypeNodes,
52  GenClangOpcodes,
53  GenClangSACheckers,
54  GenClangCommentHTMLTags,
55  GenClangCommentHTMLTagsProperties,
56  GenClangCommentHTMLNamedCharacterReferences,
57  GenClangCommentCommandInfo,
58  GenClangCommentCommandList,
59  GenClangOpenCLBuiltins,
60  GenArmNeon,
61  GenArmFP16,
62  GenArmNeonSema,
63  GenArmNeonTest,
64  GenArmMveHeader,
65  GenArmMveBuiltinDef,
66  GenArmMveBuiltinSema,
67  GenArmMveBuiltinCG,
68  GenArmMveBuiltinAliases,
69  GenAttrDocs,
70  GenDiagDocs,
71  GenOptDocs,
72  GenDataCollectors,
73  GenTestPragmaAttributeSupportedAttributes
74};
75
76namespace {
77cl::opt<ActionType> Action(
78    cl::desc("Action to perform:"),
79    cl::values(
80        clEnumValN(PrintRecords, "print-records",
81                   "Print all records to stdout (default)"),
82        clEnumValN(DumpJSON, "dump-json",
83                   "Dump all records as machine-readable JSON"),
84        clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
85                   "Generate clang attribute clases"),
86        clEnumValN(GenClangAttrParserStringSwitches,
87                   "gen-clang-attr-parser-string-switches",
88                   "Generate all parser-related attribute string switches"),
89        clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches,
90                   "gen-clang-attr-subject-match-rules-parser-string-switches",
91                   "Generate all parser-related attribute subject match rule"
92                   "string switches"),
93        clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
94                   "Generate clang attribute implementations"),
95        clEnumValN(GenClangAttrList, "gen-clang-attr-list",
96                   "Generate a clang attribute list"),
97        clEnumValN(GenClangAttrSubjectMatchRuleList,
98                   "gen-clang-attr-subject-match-rule-list",
99                   "Generate a clang attribute subject match rule list"),
100        clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
101                   "Generate clang PCH attribute reader"),
102        clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
103                   "Generate clang PCH attribute writer"),
104        clEnumValN(GenClangAttrHasAttributeImpl,
105                   "gen-clang-attr-has-attribute-impl",
106                   "Generate a clang attribute spelling list"),
107        clEnumValN(GenClangAttrSpellingListIndex,
108                   "gen-clang-attr-spelling-index",
109                   "Generate a clang attribute spelling index"),
110        clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor",
111                   "Generate a recursive AST visitor for clang attributes"),
112        clEnumValN(GenClangAttrTemplateInstantiate,
113                   "gen-clang-attr-template-instantiate",
114                   "Generate a clang template instantiate code"),
115        clEnumValN(GenClangAttrParsedAttrList,
116                   "gen-clang-attr-parsed-attr-list",
117                   "Generate a clang parsed attribute list"),
118        clEnumValN(GenClangAttrParsedAttrImpl,
119                   "gen-clang-attr-parsed-attr-impl",
120                   "Generate the clang parsed attribute helpers"),
121        clEnumValN(GenClangAttrParsedAttrKinds,
122                   "gen-clang-attr-parsed-attr-kinds",
123                   "Generate a clang parsed attribute kinds"),
124        clEnumValN(GenClangAttrTextNodeDump, "gen-clang-attr-text-node-dump",
125                   "Generate clang attribute text node dumper"),
126        clEnumValN(GenClangAttrNodeTraverse, "gen-clang-attr-node-traverse",
127                   "Generate clang attribute traverser"),
128        clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
129                   "Generate Clang diagnostics definitions"),
130        clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
131                   "Generate Clang diagnostic groups"),
132        clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
133                   "Generate Clang diagnostic name index"),
134        clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
135                   "Generate Clang AST comment nodes"),
136        clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
137                   "Generate Clang AST declaration nodes"),
138        clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
139                   "Generate Clang AST statement nodes"),
140        clEnumValN(GenClangTypeNodes, "gen-clang-type-nodes",
141                   "Generate Clang AST type nodes"),
142        clEnumValN(GenClangOpcodes, "gen-clang-opcodes",
143                   "Generate Clang constexpr interpreter opcodes"),
144        clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
145                   "Generate Clang Static Analyzer checkers"),
146        clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
147                   "Generate efficient matchers for HTML tag "
148                   "names that are used in documentation comments"),
149        clEnumValN(GenClangCommentHTMLTagsProperties,
150                   "gen-clang-comment-html-tags-properties",
151                   "Generate efficient matchers for HTML tag "
152                   "properties"),
153        clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
154                   "gen-clang-comment-html-named-character-references",
155                   "Generate function to translate named character "
156                   "references to UTF-8 sequences"),
157        clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
158                   "Generate command properties for commands that "
159                   "are used in documentation comments"),
160        clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
161                   "Generate list of commands that are used in "
162                   "documentation comments"),
163        clEnumValN(GenClangOpenCLBuiltins, "gen-clang-opencl-builtins",
164                   "Generate OpenCL builtin declaration handlers"),
165        clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
166        clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"),
167        clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
168                   "Generate ARM NEON sema support for clang"),
169        clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
170                   "Generate ARM NEON tests for clang"),
171        clEnumValN(GenArmMveHeader, "gen-arm-mve-header",
172                   "Generate arm_mve.h for clang"),
173        clEnumValN(GenArmMveBuiltinDef, "gen-arm-mve-builtin-def",
174                   "Generate ARM MVE builtin definitions for clang"),
175        clEnumValN(GenArmMveBuiltinSema, "gen-arm-mve-builtin-sema",
176                   "Generate ARM MVE builtin sema checks for clang"),
177        clEnumValN(GenArmMveBuiltinCG, "gen-arm-mve-builtin-codegen",
178                   "Generate ARM MVE builtin code-generator for clang"),
179        clEnumValN(GenArmMveBuiltinAliases, "gen-arm-mve-builtin-aliases",
180                   "Generate list of valid ARM MVE builtin aliases for clang"),
181        clEnumValN(GenAttrDocs, "gen-attr-docs",
182                   "Generate attribute documentation"),
183        clEnumValN(GenDiagDocs, "gen-diag-docs",
184                   "Generate diagnostic documentation"),
185        clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"),
186        clEnumValN(GenDataCollectors, "gen-clang-data-collectors",
187                   "Generate data collectors for AST nodes"),
188        clEnumValN(GenTestPragmaAttributeSupportedAttributes,
189                   "gen-clang-test-pragma-attribute-supported-attributes",
190                   "Generate a list of attributes supported by #pragma clang "
191                   "attribute for testing purposes")));
192
193cl::opt<std::string>
194ClangComponent("clang-component",
195               cl::desc("Only use warnings from specified component"),
196               cl::value_desc("component"), cl::Hidden);
197
198bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
199  switch (Action) {
200  case PrintRecords:
201    OS << Records;           // No argument, dump all contents
202    break;
203  case DumpJSON:
204    EmitJSON(Records, OS);
205    break;
206  case GenClangAttrClasses:
207    EmitClangAttrClass(Records, OS);
208    break;
209  case GenClangAttrParserStringSwitches:
210    EmitClangAttrParserStringSwitches(Records, OS);
211    break;
212  case GenClangAttrSubjectMatchRulesParserStringSwitches:
213    EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS);
214    break;
215  case GenClangAttrImpl:
216    EmitClangAttrImpl(Records, OS);
217    break;
218  case GenClangAttrList:
219    EmitClangAttrList(Records, OS);
220    break;
221  case GenClangAttrSubjectMatchRuleList:
222    EmitClangAttrSubjectMatchRuleList(Records, OS);
223    break;
224  case GenClangAttrPCHRead:
225    EmitClangAttrPCHRead(Records, OS);
226    break;
227  case GenClangAttrPCHWrite:
228    EmitClangAttrPCHWrite(Records, OS);
229    break;
230  case GenClangAttrHasAttributeImpl:
231    EmitClangAttrHasAttrImpl(Records, OS);
232    break;
233  case GenClangAttrSpellingListIndex:
234    EmitClangAttrSpellingListIndex(Records, OS);
235    break;
236  case GenClangAttrASTVisitor:
237    EmitClangAttrASTVisitor(Records, OS);
238    break;
239  case GenClangAttrTemplateInstantiate:
240    EmitClangAttrTemplateInstantiate(Records, OS);
241    break;
242  case GenClangAttrParsedAttrList:
243    EmitClangAttrParsedAttrList(Records, OS);
244    break;
245  case GenClangAttrParsedAttrImpl:
246    EmitClangAttrParsedAttrImpl(Records, OS);
247    break;
248  case GenClangAttrParsedAttrKinds:
249    EmitClangAttrParsedAttrKinds(Records, OS);
250    break;
251  case GenClangAttrTextNodeDump:
252    EmitClangAttrTextNodeDump(Records, OS);
253    break;
254  case GenClangAttrNodeTraverse:
255    EmitClangAttrNodeTraverse(Records, OS);
256    break;
257  case GenClangDiagsDefs:
258    EmitClangDiagsDefs(Records, OS, ClangComponent);
259    break;
260  case GenClangDiagGroups:
261    EmitClangDiagGroups(Records, OS);
262    break;
263  case GenClangDiagsIndexName:
264    EmitClangDiagsIndexName(Records, OS);
265    break;
266  case GenClangCommentNodes:
267    EmitClangASTNodes(Records, OS, CommentNodeClassName, "");
268    break;
269  case GenClangDeclNodes:
270    EmitClangASTNodes(Records, OS, DeclNodeClassName, "Decl");
271    EmitClangDeclContext(Records, OS);
272    break;
273  case GenClangStmtNodes:
274    EmitClangASTNodes(Records, OS, StmtNodeClassName, "");
275    break;
276  case GenClangTypeNodes:
277    EmitClangTypeNodes(Records, OS);
278    break;
279  case GenClangOpcodes:
280    EmitClangOpcodes(Records, OS);
281    break;
282  case GenClangSACheckers:
283    EmitClangSACheckers(Records, OS);
284    break;
285  case GenClangCommentHTMLTags:
286    EmitClangCommentHTMLTags(Records, OS);
287    break;
288  case GenClangCommentHTMLTagsProperties:
289    EmitClangCommentHTMLTagsProperties(Records, OS);
290    break;
291  case GenClangCommentHTMLNamedCharacterReferences:
292    EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
293    break;
294  case GenClangCommentCommandInfo:
295    EmitClangCommentCommandInfo(Records, OS);
296    break;
297  case GenClangCommentCommandList:
298    EmitClangCommentCommandList(Records, OS);
299    break;
300  case GenClangOpenCLBuiltins:
301    EmitClangOpenCLBuiltins(Records, OS);
302    break;
303  case GenArmNeon:
304    EmitNeon(Records, OS);
305    break;
306  case GenArmFP16:
307    EmitFP16(Records, OS);
308    break;
309  case GenArmNeonSema:
310    EmitNeonSema(Records, OS);
311    break;
312  case GenArmNeonTest:
313    EmitNeonTest(Records, OS);
314    break;
315  case GenArmMveHeader:
316    EmitMveHeader(Records, OS);
317    break;
318  case GenArmMveBuiltinDef:
319    EmitMveBuiltinDef(Records, OS);
320    break;
321  case GenArmMveBuiltinSema:
322    EmitMveBuiltinSema(Records, OS);
323    break;
324  case GenArmMveBuiltinCG:
325    EmitMveBuiltinCG(Records, OS);
326    break;
327  case GenArmMveBuiltinAliases:
328    EmitMveBuiltinAliases(Records, OS);
329    break;
330  case GenAttrDocs:
331    EmitClangAttrDocs(Records, OS);
332    break;
333  case GenDiagDocs:
334    EmitClangDiagDocs(Records, OS);
335    break;
336  case GenOptDocs:
337    EmitClangOptDocs(Records, OS);
338    break;
339  case GenDataCollectors:
340    EmitClangDataCollectors(Records, OS);
341    break;
342  case GenTestPragmaAttributeSupportedAttributes:
343    EmitTestPragmaAttributeSupportedAttributes(Records, OS);
344    break;
345  }
346
347  return false;
348}
349}
350
351int main(int argc, char **argv) {
352  sys::PrintStackTraceOnErrorSignal(argv[0]);
353  PrettyStackTraceProgram X(argc, argv);
354  cl::ParseCommandLineOptions(argc, argv);
355
356  llvm_shutdown_obj Y;
357
358  return TableGenMain(argv[0], &ClangTableGenMain);
359}
360
361#ifdef __has_feature
362#if __has_feature(address_sanitizer)
363#include <sanitizer/lsan_interface.h>
364// Disable LeakSanitizer for this binary as it has too many leaks that are not
365// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
366int __lsan_is_turned_off() { return 1; }
367#endif  // __has_feature(address_sanitizer)
368#endif  // defined(__has_feature)
369