blob: 351768fe965198c9cd39e53f24c2346a646a712f [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,
50 GenClangSACheckers,
Dmitri Gribenko3ca956f2012-08-31 02:21:44 +000051 GenClangCommentHTMLTags,
52 GenClangCommentHTMLTagsProperties,
Dmitri Gribenko28800da2013-01-30 14:29:28 +000053 GenClangCommentHTMLNamedCharacterReferences,
Dmitri Gribenko7acbf002012-09-10 20:32:42 +000054 GenClangCommentCommandInfo,
Dmitri Gribenko2e72dd42013-02-01 20:23:57 +000055 GenClangCommentCommandList,
Peter Collingbournebee583f2011-10-06 13:03:08 +000056 GenArmNeon,
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +000057 GenArmFP16,
Peter Collingbournebee583f2011-10-06 13:03:08 +000058 GenArmNeonSema,
Aaron Ballman97dba042014-02-17 15:27:10 +000059 GenArmNeonTest,
Richard Smithb6a3b4b2016-09-12 05:58:29 +000060 GenAttrDocs,
Richard Smith081ad4d2017-01-24 19:39:46 +000061 GenDiagDocs,
Alex Lorenz9e7bf162017-04-18 14:33:39 +000062 GenOptDocs,
Johannes Altmanninger1509da02017-09-06 13:20:51 +000063 GenDataCollectors,
Alex Lorenz9e7bf162017-04-18 14:33:39 +000064 GenTestPragmaAttributeSupportedAttributes
Peter Collingbournebee583f2011-10-06 13:03:08 +000065};
66
67namespace {
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000068cl::opt<ActionType> Action(
69 cl::desc("Action to perform:"),
70 cl::values(
Simon Tathamb092da82018-08-22 09:20:39 +000071 clEnumValN(PrintRecords, "print-records",
72 "Print all records to stdout (default)"),
73 clEnumValN(DumpJSON, "dump-json",
74 "Dump all records as machine-readable JSON"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000075 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
76 "Generate clang attribute clases"),
Aaron Ballman35db2b32014-01-29 22:13:45 +000077 clEnumValN(GenClangAttrParserStringSwitches,
78 "gen-clang-attr-parser-string-switches",
79 "Generate all parser-related attribute string switches"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +000080 clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches,
81 "gen-clang-attr-subject-match-rules-parser-string-switches",
82 "Generate all parser-related attribute subject match rule"
83 "string switches"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000084 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
85 "Generate clang attribute implementations"),
86 clEnumValN(GenClangAttrList, "gen-clang-attr-list",
87 "Generate a clang attribute list"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +000088 clEnumValN(GenClangAttrSubjectMatchRuleList,
89 "gen-clang-attr-subject-match-rule-list",
90 "Generate a clang attribute subject match rule list"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000091 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"),
Aaron Ballman2fbf9942014-03-31 13:14:44 +000095 clEnumValN(GenClangAttrHasAttributeImpl,
96 "gen-clang-attr-has-attribute-impl",
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000097 "Generate a clang attribute spelling list"),
98 clEnumValN(GenClangAttrSpellingListIndex,
99 "gen-clang-attr-spelling-index",
100 "Generate a clang attribute spelling index"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000101 clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor",
DeLesley Hutchinsc4a82432013-12-30 17:24:36 +0000102 "Generate a recursive AST visitor for clang attributes"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000103 clEnumValN(GenClangAttrTemplateInstantiate,
104 "gen-clang-attr-template-instantiate",
105 "Generate a clang template instantiate code"),
Richard Smith66e71682013-10-24 01:07:54 +0000106 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"),
Stephen Kellydb8fac12019-01-11 19:16:01 +0000115 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"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000119 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"),
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +0000151 clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000152 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"),
Aaron Ballman97dba042014-02-17 15:27:10 +0000156 clEnumValN(GenAttrDocs, "gen-attr-docs",
157 "Generate attribute documentation"),
Richard Smithb6a3b4b2016-09-12 05:58:29 +0000158 clEnumValN(GenDiagDocs, "gen-diag-docs",
Richard Smith081ad4d2017-01-24 19:39:46 +0000159 "Generate diagnostic documentation"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000160 clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"),
Johannes Altmanninger1509da02017-09-06 13:20:51 +0000161 clEnumValN(GenDataCollectors, "gen-clang-data-collectors",
162 "Generate data collectors for AST nodes"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000163 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")));
Peter Collingbournebee583f2011-10-06 13:03:08 +0000167
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000168cl::opt<std::string>
169ClangComponent("clang-component",
170 cl::desc("Only use warnings from specified component"),
171 cl::value_desc("component"), cl::Hidden);
Peter Collingbournebee583f2011-10-06 13:03:08 +0000172
Sean Silvaf85f39d2012-10-03 21:29:30 +0000173bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
174 switch (Action) {
Simon Tathamb092da82018-08-22 09:20:39 +0000175 case PrintRecords:
176 OS << Records; // No argument, dump all contents
177 break;
178 case DumpJSON:
179 EmitJSON(Records, OS);
180 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000181 case GenClangAttrClasses:
182 EmitClangAttrClass(Records, OS);
183 break;
Aaron Ballman35db2b32014-01-29 22:13:45 +0000184 case GenClangAttrParserStringSwitches:
185 EmitClangAttrParserStringSwitches(Records, OS);
Aaron Ballman4768b312013-11-04 12:55:56 +0000186 break;
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000187 case GenClangAttrSubjectMatchRulesParserStringSwitches:
188 EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS);
189 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000190 case GenClangAttrImpl:
191 EmitClangAttrImpl(Records, OS);
192 break;
193 case GenClangAttrList:
194 EmitClangAttrList(Records, OS);
195 break;
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000196 case GenClangAttrSubjectMatchRuleList:
197 EmitClangAttrSubjectMatchRuleList(Records, OS);
198 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000199 case GenClangAttrPCHRead:
200 EmitClangAttrPCHRead(Records, OS);
201 break;
202 case GenClangAttrPCHWrite:
203 EmitClangAttrPCHWrite(Records, OS);
204 break;
Aaron Ballman2fbf9942014-03-31 13:14:44 +0000205 case GenClangAttrHasAttributeImpl:
206 EmitClangAttrHasAttrImpl(Records, OS);
Sean Silvaf85f39d2012-10-03 21:29:30 +0000207 break;
Michael Han99315932013-01-24 16:46:58 +0000208 case GenClangAttrSpellingListIndex:
209 EmitClangAttrSpellingListIndex(Records, OS);
210 break;
DeLesley Hutchinsc4a82432013-12-30 17:24:36 +0000211 case GenClangAttrASTVisitor:
212 EmitClangAttrASTVisitor(Records, OS);
213 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000214 case GenClangAttrTemplateInstantiate:
215 EmitClangAttrTemplateInstantiate(Records, OS);
216 break;
217 case GenClangAttrParsedAttrList:
218 EmitClangAttrParsedAttrList(Records, OS);
219 break;
Aaron Ballman8ee40b72013-09-09 23:33:17 +0000220 case GenClangAttrParsedAttrImpl:
221 EmitClangAttrParsedAttrImpl(Records, OS);
222 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000223 case GenClangAttrParsedAttrKinds:
224 EmitClangAttrParsedAttrKinds(Records, OS);
225 break;
Stephen Kellydb8fac12019-01-11 19:16:01 +0000226 case GenClangAttrTextNodeDump:
227 EmitClangAttrTextNodeDump(Records, OS);
228 break;
229 case GenClangAttrNodeTraverse:
230 EmitClangAttrNodeTraverse(Records, OS);
Alexander Kornienko5bc364e2013-01-07 17:53:08 +0000231 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000232 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;
Dmitri Gribenko28800da2013-01-30 14:29:28 +0000260 case GenClangCommentHTMLNamedCharacterReferences:
261 EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
262 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000263 case GenClangCommentCommandInfo:
264 EmitClangCommentCommandInfo(Records, OS);
265 break;
Dmitri Gribenko2e72dd42013-02-01 20:23:57 +0000266 case GenClangCommentCommandList:
267 EmitClangCommentCommandList(Records, OS);
268 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000269 case GenArmNeon:
270 EmitNeon(Records, OS);
271 break;
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +0000272 case GenArmFP16:
273 EmitFP16(Records, OS);
274 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000275 case GenArmNeonSema:
276 EmitNeonSema(Records, OS);
277 break;
278 case GenArmNeonTest:
279 EmitNeonTest(Records, OS);
280 break;
Aaron Ballman97dba042014-02-17 15:27:10 +0000281 case GenAttrDocs:
282 EmitClangAttrDocs(Records, OS);
283 break;
Richard Smithb6a3b4b2016-09-12 05:58:29 +0000284 case GenDiagDocs:
285 EmitClangDiagDocs(Records, OS);
286 break;
Richard Smith081ad4d2017-01-24 19:39:46 +0000287 case GenOptDocs:
288 EmitClangOptDocs(Records, OS);
289 break;
Johannes Altmanninger1509da02017-09-06 13:20:51 +0000290 case GenDataCollectors:
291 EmitClangDataCollectors(Records, OS);
292 break;
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000293 case GenTestPragmaAttributeSupportedAttributes:
294 EmitTestPragmaAttributeSupportedAttributes(Records, OS);
295 break;
Peter Collingbournebee583f2011-10-06 13:03:08 +0000296 }
Sean Silvaf85f39d2012-10-03 21:29:30 +0000297
298 return false;
299}
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000300}
Peter Collingbournebee583f2011-10-06 13:03:08 +0000301
302int main(int argc, char **argv) {
Richard Smithdfed58a2016-06-09 00:53:41 +0000303 sys::PrintStackTraceOnErrorSignal(argv[0]);
Peter Collingbournebee583f2011-10-06 13:03:08 +0000304 PrettyStackTraceProgram X(argc, argv);
305 cl::ParseCommandLineOptions(argc, argv);
306
Craig Topperd3dfa14a2016-01-04 04:51:46 +0000307 llvm_shutdown_obj Y;
308
Sean Silvaf85f39d2012-10-03 21:29:30 +0000309 return TableGenMain(argv[0], &ClangTableGenMain);
Peter Collingbournebee583f2011-10-06 13:03:08 +0000310}
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000311
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000312#ifdef __has_feature
313#if __has_feature(address_sanitizer)
314#include <sanitizer/lsan_interface.h>
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000315// Disable LeakSanitizer for this binary as it has too many leaks that are not
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000316// 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)