blob: 3b9c8336bb64d2dd5c60cba2c741ef0eb6e1d9aa [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
John McCallbaf91d02019-10-25 16:28:03 -070013#include "ClangASTEmitters.h"
Rui Ueyama3f762602019-11-26 10:15:47 +090014#include "TableGenBackends.h" // Declares all backends.
Peter Collingbournebee583f2011-10-06 13:03:08 +000015#include "llvm/Support/CommandLine.h"
Rui Ueyama3f762602019-11-26 10:15:47 +090016#include "llvm/Support/InitLLVM.h"
Peter Collingbournebee583f2011-10-06 13:03:08 +000017#include "llvm/Support/PrettyStackTrace.h"
18#include "llvm/Support/Signals.h"
19#include "llvm/TableGen/Error.h"
20#include "llvm/TableGen/Main.h"
21#include "llvm/TableGen/Record.h"
Peter Collingbournebee583f2011-10-06 13:03:08 +000022
23using namespace llvm;
Jakob Stoklund Olesen995e0e12012-06-13 05:12:41 +000024using namespace clang;
Peter Collingbournebee583f2011-10-06 13:03:08 +000025
26enum ActionType {
Simon Tathamb092da82018-08-22 09:20:39 +000027 PrintRecords,
28 DumpJSON,
Peter Collingbournebee583f2011-10-06 13:03:08 +000029 GenClangAttrClasses,
Aaron Ballman35db2b32014-01-29 22:13:45 +000030 GenClangAttrParserStringSwitches,
Alex Lorenz9e7bf162017-04-18 14:33:39 +000031 GenClangAttrSubjectMatchRulesParserStringSwitches,
Peter Collingbournebee583f2011-10-06 13:03:08 +000032 GenClangAttrImpl,
33 GenClangAttrList,
Alex Lorenz9e7bf162017-04-18 14:33:39 +000034 GenClangAttrSubjectMatchRuleList,
Peter Collingbournebee583f2011-10-06 13:03:08 +000035 GenClangAttrPCHRead,
36 GenClangAttrPCHWrite,
Aaron Ballman2fbf9942014-03-31 13:14:44 +000037 GenClangAttrHasAttributeImpl,
Michael Han99315932013-01-24 16:46:58 +000038 GenClangAttrSpellingListIndex,
DeLesley Hutchinsc4a82432013-12-30 17:24:36 +000039 GenClangAttrASTVisitor,
DeLesley Hutchinsceec3062012-01-20 22:37:06 +000040 GenClangAttrTemplateInstantiate,
Michael Han4a045172012-03-07 00:12:16 +000041 GenClangAttrParsedAttrList,
Aaron Ballman8ee40b72013-09-09 23:33:17 +000042 GenClangAttrParsedAttrImpl,
Michael Han4a045172012-03-07 00:12:16 +000043 GenClangAttrParsedAttrKinds,
Stephen Kellydb8fac12019-01-11 19:16:01 +000044 GenClangAttrTextNodeDump,
45 GenClangAttrNodeTraverse,
Peter Collingbournebee583f2011-10-06 13:03:08 +000046 GenClangDiagsDefs,
47 GenClangDiagGroups,
48 GenClangDiagsIndexName,
Dmitri Gribenkoec925312012-07-06 00:28:32 +000049 GenClangCommentNodes,
Peter Collingbournebee583f2011-10-06 13:03:08 +000050 GenClangDeclNodes,
51 GenClangStmtNodes,
John McCalla82d2fe2019-10-01 23:13:03 +000052 GenClangTypeNodes,
Nandor Licker950b70d2019-09-13 09:46:16 +000053 GenClangOpcodes,
Peter Collingbournebee583f2011-10-06 13:03:08 +000054 GenClangSACheckers,
Dmitri Gribenko3ca956f2012-08-31 02:21:44 +000055 GenClangCommentHTMLTags,
56 GenClangCommentHTMLTagsProperties,
Dmitri Gribenko28800da2013-01-30 14:29:28 +000057 GenClangCommentHTMLNamedCharacterReferences,
Dmitri Gribenko7acbf002012-09-10 20:32:42 +000058 GenClangCommentCommandInfo,
Dmitri Gribenko2e72dd42013-02-01 20:23:57 +000059 GenClangCommentCommandList,
Sven van Haastregt79a222f2019-06-03 09:39:11 +000060 GenClangOpenCLBuiltins,
Peter Collingbournebee583f2011-10-06 13:03:08 +000061 GenArmNeon,
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +000062 GenArmFP16,
Peter Collingbournebee583f2011-10-06 13:03:08 +000063 GenArmNeonSema,
Aaron Ballman97dba042014-02-17 15:27:10 +000064 GenArmNeonTest,
Simon Tatham08074cc2019-09-02 15:50:50 +010065 GenArmMveHeader,
66 GenArmMveBuiltinDef,
67 GenArmMveBuiltinSema,
68 GenArmMveBuiltinCG,
69 GenArmMveBuiltinAliases,
Richard Smithb6a3b4b2016-09-12 05:58:29 +000070 GenAttrDocs,
Richard Smith081ad4d2017-01-24 19:39:46 +000071 GenDiagDocs,
Alex Lorenz9e7bf162017-04-18 14:33:39 +000072 GenOptDocs,
Johannes Altmanninger1509da02017-09-06 13:20:51 +000073 GenDataCollectors,
Alex Lorenz9e7bf162017-04-18 14:33:39 +000074 GenTestPragmaAttributeSupportedAttributes
Peter Collingbournebee583f2011-10-06 13:03:08 +000075};
76
77namespace {
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000078cl::opt<ActionType> Action(
79 cl::desc("Action to perform:"),
80 cl::values(
Simon Tathamb092da82018-08-22 09:20:39 +000081 clEnumValN(PrintRecords, "print-records",
82 "Print all records to stdout (default)"),
83 clEnumValN(DumpJSON, "dump-json",
84 "Dump all records as machine-readable JSON"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000085 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",
86 "Generate clang attribute clases"),
Aaron Ballman35db2b32014-01-29 22:13:45 +000087 clEnumValN(GenClangAttrParserStringSwitches,
88 "gen-clang-attr-parser-string-switches",
89 "Generate all parser-related attribute string switches"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +000090 clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches,
91 "gen-clang-attr-subject-match-rules-parser-string-switches",
92 "Generate all parser-related attribute subject match rule"
93 "string switches"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +000094 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",
95 "Generate clang attribute implementations"),
96 clEnumValN(GenClangAttrList, "gen-clang-attr-list",
97 "Generate a clang attribute list"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +000098 clEnumValN(GenClangAttrSubjectMatchRuleList,
99 "gen-clang-attr-subject-match-rule-list",
100 "Generate a clang attribute subject match rule list"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000101 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",
102 "Generate clang PCH attribute reader"),
103 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",
104 "Generate clang PCH attribute writer"),
Aaron Ballman2fbf9942014-03-31 13:14:44 +0000105 clEnumValN(GenClangAttrHasAttributeImpl,
106 "gen-clang-attr-has-attribute-impl",
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000107 "Generate a clang attribute spelling list"),
108 clEnumValN(GenClangAttrSpellingListIndex,
109 "gen-clang-attr-spelling-index",
110 "Generate a clang attribute spelling index"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000111 clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor",
DeLesley Hutchinsc4a82432013-12-30 17:24:36 +0000112 "Generate a recursive AST visitor for clang attributes"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000113 clEnumValN(GenClangAttrTemplateInstantiate,
114 "gen-clang-attr-template-instantiate",
115 "Generate a clang template instantiate code"),
Richard Smith66e71682013-10-24 01:07:54 +0000116 clEnumValN(GenClangAttrParsedAttrList,
117 "gen-clang-attr-parsed-attr-list",
118 "Generate a clang parsed attribute list"),
119 clEnumValN(GenClangAttrParsedAttrImpl,
120 "gen-clang-attr-parsed-attr-impl",
121 "Generate the clang parsed attribute helpers"),
122 clEnumValN(GenClangAttrParsedAttrKinds,
123 "gen-clang-attr-parsed-attr-kinds",
124 "Generate a clang parsed attribute kinds"),
Stephen Kellydb8fac12019-01-11 19:16:01 +0000125 clEnumValN(GenClangAttrTextNodeDump, "gen-clang-attr-text-node-dump",
126 "Generate clang attribute text node dumper"),
127 clEnumValN(GenClangAttrNodeTraverse, "gen-clang-attr-node-traverse",
128 "Generate clang attribute traverser"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000129 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",
130 "Generate Clang diagnostics definitions"),
131 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",
132 "Generate Clang diagnostic groups"),
133 clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",
134 "Generate Clang diagnostic name index"),
135 clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",
136 "Generate Clang AST comment nodes"),
137 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",
138 "Generate Clang AST declaration nodes"),
139 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",
140 "Generate Clang AST statement nodes"),
John McCalla82d2fe2019-10-01 23:13:03 +0000141 clEnumValN(GenClangTypeNodes, "gen-clang-type-nodes",
142 "Generate Clang AST type nodes"),
Nandor Licker950b70d2019-09-13 09:46:16 +0000143 clEnumValN(GenClangOpcodes, "gen-clang-opcodes",
144 "Generate Clang constexpr interpreter opcodes"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000145 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",
146 "Generate Clang Static Analyzer checkers"),
147 clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",
148 "Generate efficient matchers for HTML tag "
149 "names that are used in documentation comments"),
150 clEnumValN(GenClangCommentHTMLTagsProperties,
151 "gen-clang-comment-html-tags-properties",
152 "Generate efficient matchers for HTML tag "
153 "properties"),
154 clEnumValN(GenClangCommentHTMLNamedCharacterReferences,
155 "gen-clang-comment-html-named-character-references",
156 "Generate function to translate named character "
157 "references to UTF-8 sequences"),
158 clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",
159 "Generate command properties for commands that "
160 "are used in documentation comments"),
161 clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",
162 "Generate list of commands that are used in "
163 "documentation comments"),
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000164 clEnumValN(GenClangOpenCLBuiltins, "gen-clang-opencl-builtins",
165 "Generate OpenCL builtin declaration handlers"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000166 clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +0000167 clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"),
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000168 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",
169 "Generate ARM NEON sema support for clang"),
170 clEnumValN(GenArmNeonTest, "gen-arm-neon-test",
171 "Generate ARM NEON tests for clang"),
Simon Tatham08074cc2019-09-02 15:50:50 +0100172 clEnumValN(GenArmMveHeader, "gen-arm-mve-header",
173 "Generate arm_mve.h for clang"),
174 clEnumValN(GenArmMveBuiltinDef, "gen-arm-mve-builtin-def",
175 "Generate ARM MVE builtin definitions for clang"),
176 clEnumValN(GenArmMveBuiltinSema, "gen-arm-mve-builtin-sema",
177 "Generate ARM MVE builtin sema checks for clang"),
178 clEnumValN(GenArmMveBuiltinCG, "gen-arm-mve-builtin-codegen",
179 "Generate ARM MVE builtin code-generator for clang"),
180 clEnumValN(GenArmMveBuiltinAliases, "gen-arm-mve-builtin-aliases",
181 "Generate list of valid ARM MVE builtin aliases for clang"),
Aaron Ballman97dba042014-02-17 15:27:10 +0000182 clEnumValN(GenAttrDocs, "gen-attr-docs",
183 "Generate attribute documentation"),
Richard Smithb6a3b4b2016-09-12 05:58:29 +0000184 clEnumValN(GenDiagDocs, "gen-diag-docs",
Richard Smith081ad4d2017-01-24 19:39:46 +0000185 "Generate diagnostic documentation"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000186 clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"),
Johannes Altmanninger1509da02017-09-06 13:20:51 +0000187 clEnumValN(GenDataCollectors, "gen-clang-data-collectors",
188 "Generate data collectors for AST nodes"),
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000189 clEnumValN(GenTestPragmaAttributeSupportedAttributes,
190 "gen-clang-test-pragma-attribute-supported-attributes",
191 "Generate a list of attributes supported by #pragma clang "
192 "attribute for testing purposes")));
Peter Collingbournebee583f2011-10-06 13:03:08 +0000193
Rafael Espindolad3f8b1f2013-08-16 16:46:27 +0000194cl::opt<std::string>
195ClangComponent("clang-component",
196 cl::desc("Only use warnings from specified component"),
197 cl::value_desc("component"), cl::Hidden);
Peter Collingbournebee583f2011-10-06 13:03:08 +0000198
Sean Silvaf85f39d2012-10-03 21:29:30 +0000199bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
200 switch (Action) {
Simon Tathamb092da82018-08-22 09:20:39 +0000201 case PrintRecords:
202 OS << Records; // No argument, dump all contents
203 break;
204 case DumpJSON:
205 EmitJSON(Records, OS);
206 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000207 case GenClangAttrClasses:
208 EmitClangAttrClass(Records, OS);
209 break;
Aaron Ballman35db2b32014-01-29 22:13:45 +0000210 case GenClangAttrParserStringSwitches:
211 EmitClangAttrParserStringSwitches(Records, OS);
Aaron Ballman4768b312013-11-04 12:55:56 +0000212 break;
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000213 case GenClangAttrSubjectMatchRulesParserStringSwitches:
214 EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS);
215 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000216 case GenClangAttrImpl:
217 EmitClangAttrImpl(Records, OS);
218 break;
219 case GenClangAttrList:
220 EmitClangAttrList(Records, OS);
221 break;
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000222 case GenClangAttrSubjectMatchRuleList:
223 EmitClangAttrSubjectMatchRuleList(Records, OS);
224 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000225 case GenClangAttrPCHRead:
226 EmitClangAttrPCHRead(Records, OS);
227 break;
228 case GenClangAttrPCHWrite:
229 EmitClangAttrPCHWrite(Records, OS);
230 break;
Aaron Ballman2fbf9942014-03-31 13:14:44 +0000231 case GenClangAttrHasAttributeImpl:
232 EmitClangAttrHasAttrImpl(Records, OS);
Sean Silvaf85f39d2012-10-03 21:29:30 +0000233 break;
Michael Han99315932013-01-24 16:46:58 +0000234 case GenClangAttrSpellingListIndex:
235 EmitClangAttrSpellingListIndex(Records, OS);
236 break;
DeLesley Hutchinsc4a82432013-12-30 17:24:36 +0000237 case GenClangAttrASTVisitor:
238 EmitClangAttrASTVisitor(Records, OS);
239 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000240 case GenClangAttrTemplateInstantiate:
241 EmitClangAttrTemplateInstantiate(Records, OS);
242 break;
243 case GenClangAttrParsedAttrList:
244 EmitClangAttrParsedAttrList(Records, OS);
245 break;
Aaron Ballman8ee40b72013-09-09 23:33:17 +0000246 case GenClangAttrParsedAttrImpl:
247 EmitClangAttrParsedAttrImpl(Records, OS);
248 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000249 case GenClangAttrParsedAttrKinds:
250 EmitClangAttrParsedAttrKinds(Records, OS);
251 break;
Stephen Kellydb8fac12019-01-11 19:16:01 +0000252 case GenClangAttrTextNodeDump:
253 EmitClangAttrTextNodeDump(Records, OS);
254 break;
255 case GenClangAttrNodeTraverse:
256 EmitClangAttrNodeTraverse(Records, OS);
Alexander Kornienko5bc364e2013-01-07 17:53:08 +0000257 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000258 case GenClangDiagsDefs:
259 EmitClangDiagsDefs(Records, OS, ClangComponent);
260 break;
261 case GenClangDiagGroups:
262 EmitClangDiagGroups(Records, OS);
263 break;
264 case GenClangDiagsIndexName:
265 EmitClangDiagsIndexName(Records, OS);
266 break;
267 case GenClangCommentNodes:
John McCallbaf91d02019-10-25 16:28:03 -0700268 EmitClangASTNodes(Records, OS, CommentNodeClassName, "");
Sean Silvaf85f39d2012-10-03 21:29:30 +0000269 break;
270 case GenClangDeclNodes:
John McCallbaf91d02019-10-25 16:28:03 -0700271 EmitClangASTNodes(Records, OS, DeclNodeClassName, "Decl");
Sean Silvaf85f39d2012-10-03 21:29:30 +0000272 EmitClangDeclContext(Records, OS);
273 break;
274 case GenClangStmtNodes:
John McCallbaf91d02019-10-25 16:28:03 -0700275 EmitClangASTNodes(Records, OS, StmtNodeClassName, "");
Sean Silvaf85f39d2012-10-03 21:29:30 +0000276 break;
John McCalla82d2fe2019-10-01 23:13:03 +0000277 case GenClangTypeNodes:
278 EmitClangTypeNodes(Records, OS);
279 break;
Nandor Licker950b70d2019-09-13 09:46:16 +0000280 case GenClangOpcodes:
281 EmitClangOpcodes(Records, OS);
282 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000283 case GenClangSACheckers:
284 EmitClangSACheckers(Records, OS);
285 break;
286 case GenClangCommentHTMLTags:
287 EmitClangCommentHTMLTags(Records, OS);
288 break;
289 case GenClangCommentHTMLTagsProperties:
290 EmitClangCommentHTMLTagsProperties(Records, OS);
291 break;
Dmitri Gribenko28800da2013-01-30 14:29:28 +0000292 case GenClangCommentHTMLNamedCharacterReferences:
293 EmitClangCommentHTMLNamedCharacterReferences(Records, OS);
294 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000295 case GenClangCommentCommandInfo:
296 EmitClangCommentCommandInfo(Records, OS);
297 break;
Dmitri Gribenko2e72dd42013-02-01 20:23:57 +0000298 case GenClangCommentCommandList:
299 EmitClangCommentCommandList(Records, OS);
300 break;
Sven van Haastregt79a222f2019-06-03 09:39:11 +0000301 case GenClangOpenCLBuiltins:
302 EmitClangOpenCLBuiltins(Records, OS);
303 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000304 case GenArmNeon:
305 EmitNeon(Records, OS);
306 break;
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +0000307 case GenArmFP16:
308 EmitFP16(Records, OS);
309 break;
Sean Silvaf85f39d2012-10-03 21:29:30 +0000310 case GenArmNeonSema:
311 EmitNeonSema(Records, OS);
312 break;
313 case GenArmNeonTest:
314 EmitNeonTest(Records, OS);
315 break;
Simon Tatham08074cc2019-09-02 15:50:50 +0100316 case GenArmMveHeader:
317 EmitMveHeader(Records, OS);
318 break;
319 case GenArmMveBuiltinDef:
320 EmitMveBuiltinDef(Records, OS);
321 break;
322 case GenArmMveBuiltinSema:
323 EmitMveBuiltinSema(Records, OS);
324 break;
325 case GenArmMveBuiltinCG:
326 EmitMveBuiltinCG(Records, OS);
327 break;
328 case GenArmMveBuiltinAliases:
329 EmitMveBuiltinAliases(Records, OS);
330 break;
Aaron Ballman97dba042014-02-17 15:27:10 +0000331 case GenAttrDocs:
332 EmitClangAttrDocs(Records, OS);
333 break;
Richard Smithb6a3b4b2016-09-12 05:58:29 +0000334 case GenDiagDocs:
335 EmitClangDiagDocs(Records, OS);
336 break;
Richard Smith081ad4d2017-01-24 19:39:46 +0000337 case GenOptDocs:
338 EmitClangOptDocs(Records, OS);
339 break;
Johannes Altmanninger1509da02017-09-06 13:20:51 +0000340 case GenDataCollectors:
341 EmitClangDataCollectors(Records, OS);
342 break;
Alex Lorenz9e7bf162017-04-18 14:33:39 +0000343 case GenTestPragmaAttributeSupportedAttributes:
344 EmitTestPragmaAttributeSupportedAttributes(Records, OS);
345 break;
Peter Collingbournebee583f2011-10-06 13:03:08 +0000346 }
Sean Silvaf85f39d2012-10-03 21:29:30 +0000347
348 return false;
349}
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000350}
Peter Collingbournebee583f2011-10-06 13:03:08 +0000351
352int main(int argc, char **argv) {
Rui Ueyama3f762602019-11-26 10:15:47 +0900353 llvm::InitLLVM X(argc, argv);
Peter Collingbournebee583f2011-10-06 13:03:08 +0000354 cl::ParseCommandLineOptions(argc, argv);
355
Craig Topperd3dfa14a2016-01-04 04:51:46 +0000356 llvm_shutdown_obj Y;
357
Sean Silvaf85f39d2012-10-03 21:29:30 +0000358 return TableGenMain(argv[0], &ClangTableGenMain);
Peter Collingbournebee583f2011-10-06 13:03:08 +0000359}
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000360
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000361#ifdef __has_feature
362#if __has_feature(address_sanitizer)
363#include <sanitizer/lsan_interface.h>
Kostya Serebryanya6afef72014-01-10 08:05:42 +0000364// Disable LeakSanitizer for this binary as it has too many leaks that are not
Kostya Serebryany317e2c42014-01-15 07:59:37 +0000365// 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)