Path: blob/main/contrib/llvm-project/clang/utils/TableGen/TableGen.cpp
35231 views
//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file contains the main function for Clang's TableGen.9//10//===----------------------------------------------------------------------===//1112#include "TableGenBackends.h" // Declares all backends.13#include "ASTTableGen.h"14#include "llvm/Support/CommandLine.h"15#include "llvm/Support/ManagedStatic.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"2122using namespace llvm;23using namespace clang;2425enum ActionType {26PrintRecords,27DumpJSON,28GenClangAttrClasses,29GenClangAttrParserStringSwitches,30GenClangAttrSubjectMatchRulesParserStringSwitches,31GenClangAttrImpl,32GenClangAttrList,33GenClangAttrDocTable,34GenClangAttrSubjectMatchRuleList,35GenClangAttrPCHRead,36GenClangAttrPCHWrite,37GenClangRegularKeywordAttributeInfo,38GenClangAttrHasAttributeImpl,39GenClangAttrSpellingListIndex,40GenClangAttrASTVisitor,41GenClangAttrTemplateInstantiate,42GenClangAttrParsedAttrList,43GenClangAttrParsedAttrImpl,44GenClangAttrParsedAttrKinds,45GenClangAttrTextNodeDump,46GenClangAttrNodeTraverse,47GenClangBasicReader,48GenClangBasicWriter,49GenClangBuiltins,50GenClangDiagsDefs,51GenClangDiagGroups,52GenClangDiagsIndexName,53GenClangCommentNodes,54GenClangDeclNodes,55GenClangStmtNodes,56GenClangTypeNodes,57GenClangTypeReader,58GenClangTypeWriter,59GenClangOpcodes,60GenClangSACheckers,61GenClangSyntaxNodeList,62GenClangSyntaxNodeClasses,63GenClangCommentHTMLTags,64GenClangCommentHTMLTagsProperties,65GenClangCommentHTMLNamedCharacterReferences,66GenClangCommentCommandInfo,67GenClangCommentCommandList,68GenClangOpenCLBuiltins,69GenClangOpenCLBuiltinHeader,70GenClangOpenCLBuiltinTests,71GenArmNeon,72GenArmFP16,73GenArmBF16,74GenArmVectorType,75GenArmNeonSema,76GenArmNeonTest,77GenArmMveHeader,78GenArmMveBuiltinDef,79GenArmMveBuiltinSema,80GenArmMveBuiltinCG,81GenArmMveBuiltinAliases,82GenArmSveHeader,83GenArmSveBuiltins,84GenArmSveBuiltinCG,85GenArmSveTypeFlags,86GenArmSveRangeChecks,87GenArmSveStreamingAttrs,88GenArmSmeHeader,89GenArmSmeBuiltins,90GenArmSmeBuiltinCG,91GenArmSmeRangeChecks,92GenArmSmeStreamingAttrs,93GenArmSmeBuiltinZAState,94GenArmCdeHeader,95GenArmCdeBuiltinDef,96GenArmCdeBuiltinSema,97GenArmCdeBuiltinCG,98GenArmCdeBuiltinAliases,99GenRISCVVectorHeader,100GenRISCVVectorBuiltins,101GenRISCVVectorBuiltinCG,102GenRISCVVectorBuiltinSema,103GenRISCVSiFiveVectorBuiltins,104GenRISCVSiFiveVectorBuiltinCG,105GenRISCVSiFiveVectorBuiltinSema,106GenAttrDocs,107GenDiagDocs,108GenOptDocs,109GenDataCollectors,110GenTestPragmaAttributeSupportedAttributes111};112113namespace {114cl::opt<ActionType> Action(115cl::desc("Action to perform:"),116cl::values(117clEnumValN(PrintRecords, "print-records",118"Print all records to stdout (default)"),119clEnumValN(DumpJSON, "dump-json",120"Dump all records as machine-readable JSON"),121clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes",122"Generate clang attribute clases"),123clEnumValN(GenClangAttrParserStringSwitches,124"gen-clang-attr-parser-string-switches",125"Generate all parser-related attribute string switches"),126clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches,127"gen-clang-attr-subject-match-rules-parser-string-switches",128"Generate all parser-related attribute subject match rule"129"string switches"),130clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl",131"Generate clang attribute implementations"),132clEnumValN(GenClangAttrList, "gen-clang-attr-list",133"Generate a clang attribute list"),134clEnumValN(GenClangAttrDocTable, "gen-clang-attr-doc-table",135"Generate a table of attribute documentation"),136clEnumValN(GenClangAttrSubjectMatchRuleList,137"gen-clang-attr-subject-match-rule-list",138"Generate a clang attribute subject match rule list"),139clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read",140"Generate clang PCH attribute reader"),141clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write",142"Generate clang PCH attribute writer"),143clEnumValN(GenClangRegularKeywordAttributeInfo,144"gen-clang-regular-keyword-attr-info",145"Generate a list of regular keyword attributes with info "146"about their arguments"),147clEnumValN(GenClangAttrHasAttributeImpl,148"gen-clang-attr-has-attribute-impl",149"Generate a clang attribute spelling list"),150clEnumValN(GenClangAttrSpellingListIndex,151"gen-clang-attr-spelling-index",152"Generate a clang attribute spelling index"),153clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor",154"Generate a recursive AST visitor for clang attributes"),155clEnumValN(GenClangAttrTemplateInstantiate,156"gen-clang-attr-template-instantiate",157"Generate a clang template instantiate code"),158clEnumValN(GenClangAttrParsedAttrList,159"gen-clang-attr-parsed-attr-list",160"Generate a clang parsed attribute list"),161clEnumValN(GenClangAttrParsedAttrImpl,162"gen-clang-attr-parsed-attr-impl",163"Generate the clang parsed attribute helpers"),164clEnumValN(GenClangAttrParsedAttrKinds,165"gen-clang-attr-parsed-attr-kinds",166"Generate a clang parsed attribute kinds"),167clEnumValN(GenClangAttrTextNodeDump, "gen-clang-attr-text-node-dump",168"Generate clang attribute text node dumper"),169clEnumValN(GenClangAttrNodeTraverse, "gen-clang-attr-node-traverse",170"Generate clang attribute traverser"),171clEnumValN(GenClangBuiltins, "gen-clang-builtins",172"Generate clang builtins list"),173clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs",174"Generate Clang diagnostics definitions"),175clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups",176"Generate Clang diagnostic groups"),177clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name",178"Generate Clang diagnostic name index"),179clEnumValN(GenClangBasicReader, "gen-clang-basic-reader",180"Generate Clang BasicReader classes"),181clEnumValN(GenClangBasicWriter, "gen-clang-basic-writer",182"Generate Clang BasicWriter classes"),183clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes",184"Generate Clang AST comment nodes"),185clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes",186"Generate Clang AST declaration nodes"),187clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes",188"Generate Clang AST statement nodes"),189clEnumValN(GenClangTypeNodes, "gen-clang-type-nodes",190"Generate Clang AST type nodes"),191clEnumValN(GenClangTypeReader, "gen-clang-type-reader",192"Generate Clang AbstractTypeReader class"),193clEnumValN(GenClangTypeWriter, "gen-clang-type-writer",194"Generate Clang AbstractTypeWriter class"),195clEnumValN(GenClangOpcodes, "gen-clang-opcodes",196"Generate Clang constexpr interpreter opcodes"),197clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers",198"Generate Clang Static Analyzer checkers"),199clEnumValN(GenClangSyntaxNodeList, "gen-clang-syntax-node-list",200"Generate list of Clang Syntax Tree node types"),201clEnumValN(GenClangSyntaxNodeClasses, "gen-clang-syntax-node-classes",202"Generate definitions of Clang Syntax Tree node clasess"),203clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags",204"Generate efficient matchers for HTML tag "205"names that are used in documentation comments"),206clEnumValN(GenClangCommentHTMLTagsProperties,207"gen-clang-comment-html-tags-properties",208"Generate efficient matchers for HTML tag "209"properties"),210clEnumValN(GenClangCommentHTMLNamedCharacterReferences,211"gen-clang-comment-html-named-character-references",212"Generate function to translate named character "213"references to UTF-8 sequences"),214clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info",215"Generate command properties for commands that "216"are used in documentation comments"),217clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list",218"Generate list of commands that are used in "219"documentation comments"),220clEnumValN(GenClangOpenCLBuiltins, "gen-clang-opencl-builtins",221"Generate OpenCL builtin declaration handlers"),222clEnumValN(GenClangOpenCLBuiltinHeader,223"gen-clang-opencl-builtin-header",224"Generate OpenCL builtin header"),225clEnumValN(GenClangOpenCLBuiltinTests, "gen-clang-opencl-builtin-tests",226"Generate OpenCL builtin declaration tests"),227clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"),228clEnumValN(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"),229clEnumValN(GenArmBF16, "gen-arm-bf16", "Generate arm_bf16.h for clang"),230clEnumValN(GenArmVectorType, "gen-arm-vector-type",231"Generate arm_vector_types.h for clang"),232clEnumValN(GenArmNeonSema, "gen-arm-neon-sema",233"Generate ARM NEON sema support for clang"),234clEnumValN(GenArmNeonTest, "gen-arm-neon-test",235"Generate ARM NEON tests for clang"),236clEnumValN(GenArmSveHeader, "gen-arm-sve-header",237"Generate arm_sve.h for clang"),238clEnumValN(GenArmSveBuiltins, "gen-arm-sve-builtins",239"Generate arm_sve_builtins.inc for clang"),240clEnumValN(GenArmSveBuiltinCG, "gen-arm-sve-builtin-codegen",241"Generate arm_sve_builtin_cg_map.inc for clang"),242clEnumValN(GenArmSveTypeFlags, "gen-arm-sve-typeflags",243"Generate arm_sve_typeflags.inc for clang"),244clEnumValN(GenArmSveRangeChecks, "gen-arm-sve-sema-rangechecks",245"Generate arm_sve_sema_rangechecks.inc for clang"),246clEnumValN(GenArmSveStreamingAttrs, "gen-arm-sve-streaming-attrs",247"Generate arm_sve_streaming_attrs.inc for clang"),248clEnumValN(GenArmSmeHeader, "gen-arm-sme-header",249"Generate arm_sme.h for clang"),250clEnumValN(GenArmSmeBuiltins, "gen-arm-sme-builtins",251"Generate arm_sme_builtins.inc for clang"),252clEnumValN(GenArmSmeBuiltinCG, "gen-arm-sme-builtin-codegen",253"Generate arm_sme_builtin_cg_map.inc for clang"),254clEnumValN(GenArmSmeRangeChecks, "gen-arm-sme-sema-rangechecks",255"Generate arm_sme_sema_rangechecks.inc for clang"),256clEnumValN(GenArmSmeStreamingAttrs, "gen-arm-sme-streaming-attrs",257"Generate arm_sme_streaming_attrs.inc for clang"),258clEnumValN(GenArmSmeBuiltinZAState, "gen-arm-sme-builtin-za-state",259"Generate arm_sme_builtins_za_state.inc for clang"),260clEnumValN(GenArmMveHeader, "gen-arm-mve-header",261"Generate arm_mve.h for clang"),262clEnumValN(GenArmMveBuiltinDef, "gen-arm-mve-builtin-def",263"Generate ARM MVE builtin definitions for clang"),264clEnumValN(GenArmMveBuiltinSema, "gen-arm-mve-builtin-sema",265"Generate ARM MVE builtin sema checks for clang"),266clEnumValN(GenArmMveBuiltinCG, "gen-arm-mve-builtin-codegen",267"Generate ARM MVE builtin code-generator for clang"),268clEnumValN(GenArmMveBuiltinAliases, "gen-arm-mve-builtin-aliases",269"Generate list of valid ARM MVE builtin aliases for clang"),270clEnumValN(GenArmCdeHeader, "gen-arm-cde-header",271"Generate arm_cde.h for clang"),272clEnumValN(GenArmCdeBuiltinDef, "gen-arm-cde-builtin-def",273"Generate ARM CDE builtin definitions for clang"),274clEnumValN(GenArmCdeBuiltinSema, "gen-arm-cde-builtin-sema",275"Generate ARM CDE builtin sema checks for clang"),276clEnumValN(GenArmCdeBuiltinCG, "gen-arm-cde-builtin-codegen",277"Generate ARM CDE builtin code-generator for clang"),278clEnumValN(GenArmCdeBuiltinAliases, "gen-arm-cde-builtin-aliases",279"Generate list of valid ARM CDE builtin aliases for clang"),280clEnumValN(GenRISCVVectorHeader, "gen-riscv-vector-header",281"Generate riscv_vector.h for clang"),282clEnumValN(GenRISCVVectorBuiltins, "gen-riscv-vector-builtins",283"Generate riscv_vector_builtins.inc for clang"),284clEnumValN(GenRISCVVectorBuiltinCG, "gen-riscv-vector-builtin-codegen",285"Generate riscv_vector_builtin_cg.inc for clang"),286clEnumValN(GenRISCVVectorBuiltinSema, "gen-riscv-vector-builtin-sema",287"Generate riscv_vector_builtin_sema.inc for clang"),288clEnumValN(GenRISCVSiFiveVectorBuiltins,289"gen-riscv-sifive-vector-builtins",290"Generate riscv_sifive_vector_builtins.inc for clang"),291clEnumValN(GenRISCVSiFiveVectorBuiltinCG,292"gen-riscv-sifive-vector-builtin-codegen",293"Generate riscv_sifive_vector_builtin_cg.inc for clang"),294clEnumValN(GenRISCVSiFiveVectorBuiltinSema,295"gen-riscv-sifive-vector-builtin-sema",296"Generate riscv_sifive_vector_builtin_sema.inc for clang"),297clEnumValN(GenAttrDocs, "gen-attr-docs",298"Generate attribute documentation"),299clEnumValN(GenDiagDocs, "gen-diag-docs",300"Generate diagnostic documentation"),301clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"),302clEnumValN(GenDataCollectors, "gen-clang-data-collectors",303"Generate data collectors for AST nodes"),304clEnumValN(GenTestPragmaAttributeSupportedAttributes,305"gen-clang-test-pragma-attribute-supported-attributes",306"Generate a list of attributes supported by #pragma clang "307"attribute for testing purposes")));308309cl::opt<std::string>310ClangComponent("clang-component",311cl::desc("Only use warnings from specified component"),312cl::value_desc("component"), cl::Hidden);313314bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) {315switch (Action) {316case PrintRecords:317OS << Records; // No argument, dump all contents318break;319case DumpJSON:320EmitJSON(Records, OS);321break;322case GenClangAttrClasses:323EmitClangAttrClass(Records, OS);324break;325case GenClangAttrParserStringSwitches:326EmitClangAttrParserStringSwitches(Records, OS);327break;328case GenClangAttrSubjectMatchRulesParserStringSwitches:329EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS);330break;331case GenClangAttrImpl:332EmitClangAttrImpl(Records, OS);333break;334case GenClangAttrList:335EmitClangAttrList(Records, OS);336break;337case GenClangAttrDocTable:338EmitClangAttrDocTable(Records, OS);339break;340case GenClangAttrSubjectMatchRuleList:341EmitClangAttrSubjectMatchRuleList(Records, OS);342break;343case GenClangAttrPCHRead:344EmitClangAttrPCHRead(Records, OS);345break;346case GenClangAttrPCHWrite:347EmitClangAttrPCHWrite(Records, OS);348break;349case GenClangRegularKeywordAttributeInfo:350EmitClangRegularKeywordAttributeInfo(Records, OS);351break;352case GenClangAttrHasAttributeImpl:353EmitClangAttrHasAttrImpl(Records, OS);354break;355case GenClangAttrSpellingListIndex:356EmitClangAttrSpellingListIndex(Records, OS);357break;358case GenClangAttrASTVisitor:359EmitClangAttrASTVisitor(Records, OS);360break;361case GenClangAttrTemplateInstantiate:362EmitClangAttrTemplateInstantiate(Records, OS);363break;364case GenClangAttrParsedAttrList:365EmitClangAttrParsedAttrList(Records, OS);366break;367case GenClangAttrParsedAttrImpl:368EmitClangAttrParsedAttrImpl(Records, OS);369break;370case GenClangAttrParsedAttrKinds:371EmitClangAttrParsedAttrKinds(Records, OS);372break;373case GenClangAttrTextNodeDump:374EmitClangAttrTextNodeDump(Records, OS);375break;376case GenClangAttrNodeTraverse:377EmitClangAttrNodeTraverse(Records, OS);378break;379case GenClangBuiltins:380EmitClangBuiltins(Records, OS);381break;382case GenClangDiagsDefs:383EmitClangDiagsDefs(Records, OS, ClangComponent);384break;385case GenClangDiagGroups:386EmitClangDiagGroups(Records, OS);387break;388case GenClangDiagsIndexName:389EmitClangDiagsIndexName(Records, OS);390break;391case GenClangCommentNodes:392EmitClangASTNodes(Records, OS, CommentNodeClassName, "");393break;394case GenClangDeclNodes:395EmitClangASTNodes(Records, OS, DeclNodeClassName, "Decl",396DeclContextNodeClassName);397EmitClangDeclContext(Records, OS);398break;399case GenClangStmtNodes:400EmitClangASTNodes(Records, OS, StmtNodeClassName, "");401break;402case GenClangTypeNodes:403EmitClangTypeNodes(Records, OS);404break;405case GenClangTypeReader:406EmitClangTypeReader(Records, OS);407break;408case GenClangTypeWriter:409EmitClangTypeWriter(Records, OS);410break;411case GenClangBasicReader:412EmitClangBasicReader(Records, OS);413break;414case GenClangBasicWriter:415EmitClangBasicWriter(Records, OS);416break;417case GenClangOpcodes:418EmitClangOpcodes(Records, OS);419break;420case GenClangSACheckers:421EmitClangSACheckers(Records, OS);422break;423case GenClangCommentHTMLTags:424EmitClangCommentHTMLTags(Records, OS);425break;426case GenClangCommentHTMLTagsProperties:427EmitClangCommentHTMLTagsProperties(Records, OS);428break;429case GenClangCommentHTMLNamedCharacterReferences:430EmitClangCommentHTMLNamedCharacterReferences(Records, OS);431break;432case GenClangCommentCommandInfo:433EmitClangCommentCommandInfo(Records, OS);434break;435case GenClangCommentCommandList:436EmitClangCommentCommandList(Records, OS);437break;438case GenClangOpenCLBuiltins:439EmitClangOpenCLBuiltins(Records, OS);440break;441case GenClangOpenCLBuiltinHeader:442EmitClangOpenCLBuiltinHeader(Records, OS);443break;444case GenClangOpenCLBuiltinTests:445EmitClangOpenCLBuiltinTests(Records, OS);446break;447case GenClangSyntaxNodeList:448EmitClangSyntaxNodeList(Records, OS);449break;450case GenClangSyntaxNodeClasses:451EmitClangSyntaxNodeClasses(Records, OS);452break;453case GenArmNeon:454EmitNeon(Records, OS);455break;456case GenArmFP16:457EmitFP16(Records, OS);458break;459case GenArmVectorType:460EmitVectorTypes(Records, OS);461break;462case GenArmBF16:463EmitBF16(Records, OS);464break;465case GenArmNeonSema:466EmitNeonSema(Records, OS);467break;468case GenArmNeonTest:469EmitNeonTest(Records, OS);470break;471case GenArmMveHeader:472EmitMveHeader(Records, OS);473break;474case GenArmMveBuiltinDef:475EmitMveBuiltinDef(Records, OS);476break;477case GenArmMveBuiltinSema:478EmitMveBuiltinSema(Records, OS);479break;480case GenArmMveBuiltinCG:481EmitMveBuiltinCG(Records, OS);482break;483case GenArmMveBuiltinAliases:484EmitMveBuiltinAliases(Records, OS);485break;486case GenArmSveHeader:487EmitSveHeader(Records, OS);488break;489case GenArmSveBuiltins:490EmitSveBuiltins(Records, OS);491break;492case GenArmSveBuiltinCG:493EmitSveBuiltinCG(Records, OS);494break;495case GenArmSveTypeFlags:496EmitSveTypeFlags(Records, OS);497break;498case GenArmSveRangeChecks:499EmitSveRangeChecks(Records, OS);500break;501case GenArmSveStreamingAttrs:502EmitSveStreamingAttrs(Records, OS);503break;504case GenArmSmeHeader:505EmitSmeHeader(Records, OS);506break;507case GenArmSmeBuiltins:508EmitSmeBuiltins(Records, OS);509break;510case GenArmSmeBuiltinCG:511EmitSmeBuiltinCG(Records, OS);512break;513case GenArmSmeRangeChecks:514EmitSmeRangeChecks(Records, OS);515break;516case GenArmSmeStreamingAttrs:517EmitSmeStreamingAttrs(Records, OS);518break;519case GenArmSmeBuiltinZAState:520EmitSmeBuiltinZAState(Records, OS);521break;522case GenArmCdeHeader:523EmitCdeHeader(Records, OS);524break;525case GenArmCdeBuiltinDef:526EmitCdeBuiltinDef(Records, OS);527break;528case GenArmCdeBuiltinSema:529EmitCdeBuiltinSema(Records, OS);530break;531case GenArmCdeBuiltinCG:532EmitCdeBuiltinCG(Records, OS);533break;534case GenArmCdeBuiltinAliases:535EmitCdeBuiltinAliases(Records, OS);536break;537case GenRISCVVectorHeader:538EmitRVVHeader(Records, OS);539break;540case GenRISCVVectorBuiltins:541EmitRVVBuiltins(Records, OS);542break;543case GenRISCVVectorBuiltinCG:544EmitRVVBuiltinCG(Records, OS);545break;546case GenRISCVVectorBuiltinSema:547EmitRVVBuiltinSema(Records, OS);548break;549case GenRISCVSiFiveVectorBuiltins:550EmitRVVBuiltins(Records, OS);551break;552case GenRISCVSiFiveVectorBuiltinCG:553EmitRVVBuiltinCG(Records, OS);554break;555case GenRISCVSiFiveVectorBuiltinSema:556EmitRVVBuiltinSema(Records, OS);557break;558case GenAttrDocs:559EmitClangAttrDocs(Records, OS);560break;561case GenDiagDocs:562EmitClangDiagDocs(Records, OS);563break;564case GenOptDocs:565EmitClangOptDocs(Records, OS);566break;567case GenDataCollectors:568EmitClangDataCollectors(Records, OS);569break;570case GenTestPragmaAttributeSupportedAttributes:571EmitTestPragmaAttributeSupportedAttributes(Records, OS);572break;573}574575return false;576}577}578579int main(int argc, char **argv) {580sys::PrintStackTraceOnErrorSignal(argv[0]);581PrettyStackTraceProgram X(argc, argv);582cl::ParseCommandLineOptions(argc, argv);583584llvm_shutdown_obj Y;585586return TableGenMain(argv[0], &ClangTableGenMain);587}588589#ifdef __has_feature590#if __has_feature(address_sanitizer)591#include <sanitizer/lsan_interface.h>592// Disable LeakSanitizer for this binary as it has too many leaks that are not593// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .594int __lsan_is_turned_off() { return 1; }595#endif // __has_feature(address_sanitizer)596#endif // defined(__has_feature)597598599