Clang Project

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