blob: d0f8a7564496bfe81deffa62e04a5898b972509b [file] [log] [blame]
Peter Collingbournebee583f2011-10-06 13:03:08 +00001//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Peter Collingbournebee583f2011-10-06 13:03:08 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the main function for Clang's TableGen.
10//
11//===----------------------------------------------------------------------===//
12
Jakob Stoklund Olesen995e0e12012-06-13 05:12:41 +000013#include "TableGenBackends.h" // Declares all backends.
Peter Collingbournebee583f2011-10-06 13:03:08 +000014#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"
Peter Collingbournebee583f2011-10-06 13:03:08 +000020
21using namespace llvm;
Jakob Stoklund Olesen995e0e12012-06-13 05:12:41 +000022using namespace clang;
Peter Collingbournebee583f2011-10-06 13:03:08 +000023
24enum ActionType {
Simon Tathamb092da82018-08-22 09:20:39 +000025 PrintRecords,
26 DumpJSON,
Peter Collingbournebee583f2011-10-06 13:03:08 +000027 GenClangAttrClasses,
Aaron Ballman35db2b32014-01-29 22:13:45 +000028 GenClangAttrParserStringSwitches,
Alex Lorenz9e7bf162017-04-18 14:33:39 +000029 GenClangAttrSubjectMatchRulesParserStringSwitches,
Peter Collingbournebee583f2011-10-06 13:03:08 +000030 GenClangAttrImpl,
31 GenClangAttrList,
Alex Lorenz9e7bf162017-04-18 14:33:39 +000032 GenClangAttrSubjectMatchRuleList,
Peter Collingbournebee583f2011-10-06 13:03:08 +000033 GenClangAttrPCHRead,
34 GenClangAttrPCHWrite,
Aaron Ballman2fbf9942014-03-31 13:14:44 +000035 GenClangAttrHasAttributeImpl,
Michael Han99315932013-01-24 16:46:58 +000036 GenClangAttrSpellingListIndex,
DeLesley Hutchinsc4a82432013-12-30 17:24:36 +000037 GenClangAttrASTVisitor,
DeLesley Hutchinsceec3062012-01-20 22:37:06 +000038 GenClangAttrTemplateInstantiate,
Michael Han4a045172012-03-07 00:12:16 +000039 GenClangAttrParsedAttrList,
Aaron Ballman8ee40b72013-09-09 23:33:17 +000040 GenClangAttrParsedAttrImpl,
Michael Han4a045172012-03-07 00:12:16 +000041 GenClangAttrParsedAttrKinds,
Stephen Kellydb8fac12019-01-11 19:16:01 +000042 GenClangAttrTextNodeDump,
43 GenClangAttrNodeTraverse,
Peter Collingbournebee583f2011-10-06 13:03:08 +000044 GenClangDiagsDefs,
45 GenClangDiagGroups,
46 GenClangDiagsIndexName,
Dmitri Gribenkoec925312012-07-06 00:28:32 +000047 GenClangCommentNodes,
Peter Collingbournebee583f2011-10-06 13:03:08 +000048 GenClangDeclNodes,
49 GenClangStmtNodes,
John McCalla82d2fe2019-10-01 23:13:03 +000050 GenClangTypeNodes,
Nandor Licker950b70d2019-09-13 09:46:16 +000051 GenClangOpcodes,
Peter Collingbournebee583f2011-10-06 13:03:08 +000052 GenClangSACheckers,
Dmitri Gribenko3ca956f2012-08-31 02:21:44 +000053 GenClangCommentHTMLTags,
54 GenClangCommentHTMLTagsProperties,
Dmitri Gribenko28800da2013-01-30 14:29:28 +000055 GenClangCommentHTMLNamedCharacterReferences,
Dmitri Gribenko7acbf002012-09-10 20:32:42 +000056 GenClangCommentCommandInfo,
Dmitri Gribenko2e72dd42013-02-01 20:23:57 +000057 GenClangCommentCommandList,
Sven van Haastregt79a222f2019-06-03 09:39:11 +000058 GenClangOpenCLBuiltins,
Peter Collingbournebee583f2011-10-06 13:03:08 +000059 GenArmNeon,
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +000060 GenArmFP16,
Peter Collingbournebee583f2011-10-06 13:03:08 +000061 GenArmNeonSema,
Aaron Ballman97dba042014-02-17 15:27:10 +000062 GenArmNeonTest,
Richard Smithb6a3b4b2016-09-12 05:58:29 +000063 GenAttrDocs,
Richard Smith081ad4d2017-01-24 19:39:46 +000064 GenDiagDocs,
Alex Lorenz9e7bf162017-04-18 14:33:39 +000065 GenOptDocs,
Johannes Altmanninger1509da02017-09-06 13:20:51 +000066 GenDataCollectors,
Alex Lorenz9e7bf162017-04-18 14:33:39 +000067 GenTestPragmaAttributeSupportedAttributes
Peter Collingbournebee583f2011-10-06 13:03:08 +000068};
69
70namespace {
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000071cl::opt<ActionType> Action(
72 cl::desc("Action to perform:"),
73 cl::values(
Simon Tathamb092da82018-08-22 09:20:39 +000074 clEnumValN(PrintRecords, "print-records",
75 "Print all records to stdout (default)"),
76 clEnumValN(DumpJSON, "dump-json",
77 "Dump all records as machine-readable JSON"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000078 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
79 "Generate clang attribute clases"),
Aaron Ballman35db2b32014-01-29 22:13:45 +000080 clEnumValN(GenClangAttrParserStringSwitches,
81 "gen-clang-attr-parser-string-switches",
82 "Generate all parser-related attribute string switches"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +000083 clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches,
84 "gen-clang-attr-subject-match-rules-parser-string-switches",
85 "Generate all parser-related attribute subject match rule"
86 "string switches"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000087 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
88 "Generate clang attribute implementations"),
89 clEnumValN(GenClangAttrList, "gen-clang-attr-list",
90 "Generate a clang attribute list"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +000091 clEnumValN(GenClangAttrSubjectMatchRuleList,
92 "gen-clang-attr-subject-match-rule-list",
93 "Generate a clang attribute subject match rule list"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000094 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
95 "Generate clang PCH attribute reader"),
96 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
97 "Generate clang PCH attribute writer"),
Aaron Ballman2fbf9942014-03-31 13:14:44 +000098 clEnumValN(GenClangAttrHasAttributeImpl,
99 "gen-clang-attr-has-attribute-impl",
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000100 "Generate a clang attribute spelling list"),
101 clEnumValN(GenClangAttrSpellingListIndex,
102 "gen-clang-attr-spelling-index",
103 "Generate a clang attribute spelling index"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000104 clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor",
DeLesley Hutchinsc4a82432013-12-30 17:24:36 +0000105 "Generate a recursive AST visitor for clang attributes"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000106 clEnumValN(GenClangAttrTemplateInstantiate,
107 "gen-clang-attr-template-instantiate",
108 "Generate a clang template instantiate code"),
Richard Smith66e71682013-10-24 01:07:54 +0000109 clEnumValN(GenClangAttrParsedAttrList,
110 "gen-clang-attr-parsed-attr-list",
111 "Generate a clang parsed attribute list"),
112 clEnumValN(GenClangAttrParsedAttrImpl,
113 "gen-clang-attr-parsed-attr-impl",
114 "Generate the clang parsed attribute helpers"),
115 clEnumValN(GenClangAttrParsedAttrKinds,
116 "gen-clang-attr-parsed-attr-kinds",
117 "Generate a clang parsed attribute kinds"),
Stephen Kellydb8fac12019-01-11 19:16:01 +0000118 clEnumValN(GenClangAttrTextNodeDump, "gen-clang-attr-text-node-dump",
119 "Generate clang attribute text node dumper"),
120 clEnumValN(GenClangAttrNodeTraverse, "gen-clang-attr-node-traverse",
121 "Generate clang attribute traverser"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000122 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
123 "Generate Clang diagnostics definitions"),
124 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
125 "Generate Clang diagnostic groups"),
126 clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
127 "Generate Clang diagnostic name index"),
128 clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
129 "Generate Clang AST comment nodes"),
130 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
131 "Generate Clang AST declaration nodes"),
132 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
133 "Generate Clang AST statement nodes"),
John McCalla82d2fe2019-10-01 23:13:03 +0000134 clEnumValN(GenClangTypeNodes, "gen-clang-type-nodes",
135 "Generate Clang AST type nodes"),
Nandor Licker950b70d2019-09-13 09:46:16 +0000136 clEnumValN(GenClangOpcodes, "gen-clang-opcodes",
137 "Generate Clang constexpr interpreter opcodes"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000138 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
139 "Generate Clang Static Analyzer checkers"),
140 clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
141 "Generate efficient matchers for HTML tag "
142 "names that are used in documentation comments"),
143 clEnumValN(GenClangCommentHTMLTagsProperties,
144 "gen-clang-comment-html-tags-properties",
145 "Generate efficient matchers for HTML tag "
146 "properties"),
147 clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
148 "gen-clang-comment-html-named-character-references",
149 "Generate function to translate named character "
150 "references to UTF-8 sequences"),
151 clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
152 "Generate command properties for commands that "
153 "are used in documentation comments"),
154 clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
155 "Generate list of commands that are used in "
156 "documentation comments"),
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000157 clEnumValN(GenClangOpenCLBuiltins, "gen-clang-opencl-builtins",
158 "Generate OpenCL builtin declaration handlers"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000159 clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +0000160 clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000161 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
162 "Generate ARM NEON sema support for clang"),
163 clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
164 "Generate ARM NEON tests for clang"),
Aaron Ballman97dba042014-02-17 15:27:10 +0000165 clEnumValN(GenAttrDocs, "gen-attr-docs",
166 "Generate attribute documentation"),
Richard Smithb6a3b4b2016-09-12 05:58:29 +0000167 clEnumValN(GenDiagDocs, "gen-diag-docs",
Richard Smith081ad4d2017-01-24 19:39:46 +0000168 "Generate diagnostic documentation"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000169 clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"),
Johannes Altmanninger1509da02017-09-06 13:20:51 +0000170 clEnumValN(GenDataCollectors, "gen-clang-data-collectors",
171 "Generate data collectors for AST nodes"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000172 clEnumValN(GenTestPragmaAttributeSupportedAttributes,
173 "gen-clang-test-pragma-attribute-supported-attributes",
174 "Generate a list of attributes supported by #pragma clang "
175 "attribute for testing purposes")));
Peter Collingbournebee583f2011-10-06 13:03:08 +0000176
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000177cl::opt<std::string>
178ClangComponent("clang-component",
179 cl::desc("Only use warnings from specified component"),
180 cl::value_desc("component"), cl::Hidden);
Peter Collingbournebee583f2011-10-06 13:03:08 +0000181
Sean Silvaf85f39d2012-10-03 21:29:30 +0000182bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
183 switch (Action) {
Simon Tathamb092da82018-08-22 09:20:39 +0000184 case PrintRecords:
185 OS << Records; // No argument, dump all contents
186 break;
187 case DumpJSON:
188 EmitJSON(Records, OS);
189 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000190 case GenClangAttrClasses:
191 EmitClangAttrClass(Records, OS);
192 break;
Aaron Ballman35db2b32014-01-29 22:13:45 +0000193 case GenClangAttrParserStringSwitches:
194 EmitClangAttrParserStringSwitches(Records, OS);
Aaron Ballman4768b312013-11-04 12:55:56 +0000195 break;
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000196 case GenClangAttrSubjectMatchRulesParserStringSwitches:
197 EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS);
198 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000199 case GenClangAttrImpl:
200 EmitClangAttrImpl(Records, OS);
201 break;
202 case GenClangAttrList:
203 EmitClangAttrList(Records, OS);
204 break;
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000205 case GenClangAttrSubjectMatchRuleList:
206 EmitClangAttrSubjectMatchRuleList(Records, OS);
207 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000208 case GenClangAttrPCHRead:
209 EmitClangAttrPCHRead(Records, OS);
210 break;
211 case GenClangAttrPCHWrite:
212 EmitClangAttrPCHWrite(Records, OS);
213 break;
Aaron Ballman2fbf9942014-03-31 13:14:44 +0000214 case GenClangAttrHasAttributeImpl:
215 EmitClangAttrHasAttrImpl(Records, OS);
Sean Silvaf85f39d2012-10-03 21:29:30 +0000216 break;
Michael Han99315932013-01-24 16:46:58 +0000217 case GenClangAttrSpellingListIndex:
218 EmitClangAttrSpellingListIndex(Records, OS);
219 break;
DeLesley Hutchinsc4a82432013-12-30 17:24:36 +0000220 case GenClangAttrASTVisitor:
221 EmitClangAttrASTVisitor(Records, OS);
222 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000223 case GenClangAttrTemplateInstantiate:
224 EmitClangAttrTemplateInstantiate(Records, OS);
225 break;
226 case GenClangAttrParsedAttrList:
227 EmitClangAttrParsedAttrList(Records, OS);
228 break;
Aaron Ballman8ee40b72013-09-09 23:33:17 +0000229 case GenClangAttrParsedAttrImpl:
230 EmitClangAttrParsedAttrImpl(Records, OS);
231 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000232 case GenClangAttrParsedAttrKinds:
233 EmitClangAttrParsedAttrKinds(Records, OS);
234 break;
Stephen Kellydb8fac12019-01-11 19:16:01 +0000235 case GenClangAttrTextNodeDump:
236 EmitClangAttrTextNodeDump(Records, OS);
237 break;
238 case GenClangAttrNodeTraverse:
239 EmitClangAttrNodeTraverse(Records, OS);
Alexander Kornienko5bc364e2013-01-07 17:53:08 +0000240 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000241 case GenClangDiagsDefs:
242 EmitClangDiagsDefs(Records, OS, ClangComponent);
243 break;
244 case GenClangDiagGroups:
245 EmitClangDiagGroups(Records, OS);
246 break;
247 case GenClangDiagsIndexName:
248 EmitClangDiagsIndexName(Records, OS);
249 break;
250 case GenClangCommentNodes:
251 EmitClangASTNodes(Records, OS, "Comment", "");
252 break;
253 case GenClangDeclNodes:
254 EmitClangASTNodes(Records, OS, "Decl", "Decl");
255 EmitClangDeclContext(Records, OS);
256 break;
257 case GenClangStmtNodes:
258 EmitClangASTNodes(Records, OS, "Stmt", "");
259 break;
John McCalla82d2fe2019-10-01 23:13:03 +0000260 case GenClangTypeNodes:
261 EmitClangTypeNodes(Records, OS);
262 break;
Nandor Licker950b70d2019-09-13 09:46:16 +0000263 case GenClangOpcodes:
264 EmitClangOpcodes(Records, OS);
265 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000266 case GenClangSACheckers:
267 EmitClangSACheckers(Records, OS);
268 break;
269 case GenClangCommentHTMLTags:
270 EmitClangCommentHTMLTags(Records, OS);
271 break;
272 case GenClangCommentHTMLTagsProperties:
273 EmitClangCommentHTMLTagsProperties(Records, OS);
274 break;
Dmitri Gribenko28800da2013-01-30 14:29:28 +0000275 case GenClangCommentHTMLNamedCharacterReferences:
276 EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
277 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000278 case GenClangCommentCommandInfo:
279 EmitClangCommentCommandInfo(Records, OS);
280 break;
Dmitri Gribenko2e72dd42013-02-01 20:23:57 +0000281 case GenClangCommentCommandList:
282 EmitClangCommentCommandList(Records, OS);
283 break;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000284 case GenClangOpenCLBuiltins:
285 EmitClangOpenCLBuiltins(Records, OS);
286 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000287 case GenArmNeon:
288 EmitNeon(Records, OS);
289 break;
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +0000290 case GenArmFP16:
291 EmitFP16(Records, OS);
292 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000293 case GenArmNeonSema:
294 EmitNeonSema(Records, OS);
295 break;
296 case GenArmNeonTest:
297 EmitNeonTest(Records, OS);
298 break;
Aaron Ballman97dba042014-02-17 15:27:10 +0000299 case GenAttrDocs:
300 EmitClangAttrDocs(Records, OS);
301 break;
Richard Smithb6a3b4b2016-09-12 05:58:29 +0000302 case GenDiagDocs:
303 EmitClangDiagDocs(Records, OS);
304 break;
Richard Smith081ad4d2017-01-24 19:39:46 +0000305 case GenOptDocs:
306 EmitClangOptDocs(Records, OS);
307 break;
Johannes Altmanninger1509da02017-09-06 13:20:51 +0000308 case GenDataCollectors:
309 EmitClangDataCollectors(Records, OS);
310 break;
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000311 case GenTestPragmaAttributeSupportedAttributes:
312 EmitTestPragmaAttributeSupportedAttributes(Records, OS);
313 break;
Peter Collingbournebee583f2011-10-06 13:03:08 +0000314 }
Sean Silvaf85f39d2012-10-03 21:29:30 +0000315
316 return false;
317}
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000318}
Peter Collingbournebee583f2011-10-06 13:03:08 +0000319
320int main(int argc, char **argv) {
Richard Smithdfed58a2016-06-09 00:53:41 +0000321 sys::PrintStackTraceOnErrorSignal(argv[0]);
Peter Collingbournebee583f2011-10-06 13:03:08 +0000322 PrettyStackTraceProgram X(argc, argv);
323 cl::ParseCommandLineOptions(argc, argv);
324
Craig Topperd3dfa14a2016-01-04 04:51:46 +0000325 llvm_shutdown_obj Y;
326
Sean Silvaf85f39d2012-10-03 21:29:30 +0000327 return TableGenMain(argv[0], &ClangTableGenMain);
Peter Collingbournebee583f2011-10-06 13:03:08 +0000328}
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000329
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000330#ifdef __has_feature
331#if __has_feature(address_sanitizer)
332#include <sanitizer/lsan_interface.h>
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000333// Disable LeakSanitizer for this binary as it has too many leaks that are not
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000334// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
335int __lsan_is_turned_off() { return 1; }
336#endif // __has_feature(address_sanitizer)
337#endif // defined(__has_feature)