1*f4a2713aSLionel Sambuc //===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===// 2*f4a2713aSLionel Sambuc // 3*f4a2713aSLionel Sambuc // The LLVM Compiler Infrastructure 4*f4a2713aSLionel Sambuc // 5*f4a2713aSLionel Sambuc // This file is distributed under the University of Illinois Open Source 6*f4a2713aSLionel Sambuc // License. See LICENSE.TXT for details. 7*f4a2713aSLionel Sambuc // 8*f4a2713aSLionel Sambuc //===----------------------------------------------------------------------===// 9*f4a2713aSLionel Sambuc // 10*f4a2713aSLionel Sambuc // This file contains the main function for Clang's TableGen. 11*f4a2713aSLionel Sambuc // 12*f4a2713aSLionel Sambuc //===----------------------------------------------------------------------===// 13*f4a2713aSLionel Sambuc 14*f4a2713aSLionel Sambuc #include "TableGenBackends.h" // Declares all backends. 15*f4a2713aSLionel Sambuc #include "llvm/Support/CommandLine.h" 16*f4a2713aSLionel Sambuc #include "llvm/Support/PrettyStackTrace.h" 17*f4a2713aSLionel Sambuc #include "llvm/Support/Signals.h" 18*f4a2713aSLionel Sambuc #include "llvm/TableGen/Error.h" 19*f4a2713aSLionel Sambuc #include "llvm/TableGen/Main.h" 20*f4a2713aSLionel Sambuc #include "llvm/TableGen/Record.h" 21*f4a2713aSLionel Sambuc 22*f4a2713aSLionel Sambuc using namespace llvm; 23*f4a2713aSLionel Sambuc using namespace clang; 24*f4a2713aSLionel Sambuc 25*f4a2713aSLionel Sambuc enum ActionType { 26*f4a2713aSLionel Sambuc GenClangAttrClasses, 27*f4a2713aSLionel Sambuc GenClangAttrIdentifierArgList, 28*f4a2713aSLionel Sambuc GenClangAttrTypeArgList, 29*f4a2713aSLionel Sambuc GenClangAttrImpl, 30*f4a2713aSLionel Sambuc GenClangAttrList, 31*f4a2713aSLionel Sambuc GenClangAttrPCHRead, 32*f4a2713aSLionel Sambuc GenClangAttrPCHWrite, 33*f4a2713aSLionel Sambuc GenClangAttrSpellingList, 34*f4a2713aSLionel Sambuc GenClangAttrSpellingListIndex, 35*f4a2713aSLionel Sambuc GenClangAttrLateParsedList, 36*f4a2713aSLionel Sambuc GenClangAttrTemplateInstantiate, 37*f4a2713aSLionel Sambuc GenClangAttrParsedAttrList, 38*f4a2713aSLionel Sambuc GenClangAttrParsedAttrImpl, 39*f4a2713aSLionel Sambuc GenClangAttrParsedAttrKinds, 40*f4a2713aSLionel Sambuc GenClangAttrDump, 41*f4a2713aSLionel Sambuc GenClangDiagsDefs, 42*f4a2713aSLionel Sambuc GenClangDiagGroups, 43*f4a2713aSLionel Sambuc GenClangDiagsIndexName, 44*f4a2713aSLionel Sambuc GenClangCommentNodes, 45*f4a2713aSLionel Sambuc GenClangDeclNodes, 46*f4a2713aSLionel Sambuc GenClangStmtNodes, 47*f4a2713aSLionel Sambuc GenClangSACheckers, 48*f4a2713aSLionel Sambuc GenClangCommentHTMLTags, 49*f4a2713aSLionel Sambuc GenClangCommentHTMLTagsProperties, 50*f4a2713aSLionel Sambuc GenClangCommentHTMLNamedCharacterReferences, 51*f4a2713aSLionel Sambuc GenClangCommentCommandInfo, 52*f4a2713aSLionel Sambuc GenClangCommentCommandList, 53*f4a2713aSLionel Sambuc GenArmNeon, 54*f4a2713aSLionel Sambuc GenArmNeonSema, 55*f4a2713aSLionel Sambuc GenArmNeonTest 56*f4a2713aSLionel Sambuc }; 57*f4a2713aSLionel Sambuc 58*f4a2713aSLionel Sambuc namespace { 59*f4a2713aSLionel Sambuc cl::opt<ActionType> Action( 60*f4a2713aSLionel Sambuc cl::desc("Action to perform:"), 61*f4a2713aSLionel Sambuc cl::values( 62*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 63*f4a2713aSLionel Sambuc "Generate clang attribute clases"), 64*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrIdentifierArgList, 65*f4a2713aSLionel Sambuc "gen-clang-attr-identifier-arg-list", 66*f4a2713aSLionel Sambuc "Generate a list of attributes that take an " 67*f4a2713aSLionel Sambuc "identifier as their first argument"), 68*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrTypeArgList, 69*f4a2713aSLionel Sambuc "gen-clang-attr-type-arg-list", 70*f4a2713aSLionel Sambuc "Generate a list of attributes that take a type as their " 71*f4a2713aSLionel Sambuc "first argument"), 72*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 73*f4a2713aSLionel Sambuc "Generate clang attribute implementations"), 74*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrList, "gen-clang-attr-list", 75*f4a2713aSLionel Sambuc "Generate a clang attribute list"), 76*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 77*f4a2713aSLionel Sambuc "Generate clang PCH attribute reader"), 78*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 79*f4a2713aSLionel Sambuc "Generate clang PCH attribute writer"), 80*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrSpellingList, "gen-clang-attr-spelling-list", 81*f4a2713aSLionel Sambuc "Generate a clang attribute spelling list"), 82*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrSpellingListIndex, 83*f4a2713aSLionel Sambuc "gen-clang-attr-spelling-index", 84*f4a2713aSLionel Sambuc "Generate a clang attribute spelling index"), 85*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrLateParsedList, 86*f4a2713aSLionel Sambuc "gen-clang-attr-late-parsed-list", 87*f4a2713aSLionel Sambuc "Generate a clang attribute LateParsed list"), 88*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrTemplateInstantiate, 89*f4a2713aSLionel Sambuc "gen-clang-attr-template-instantiate", 90*f4a2713aSLionel Sambuc "Generate a clang template instantiate code"), 91*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrParsedAttrList, 92*f4a2713aSLionel Sambuc "gen-clang-attr-parsed-attr-list", 93*f4a2713aSLionel Sambuc "Generate a clang parsed attribute list"), 94*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrParsedAttrImpl, 95*f4a2713aSLionel Sambuc "gen-clang-attr-parsed-attr-impl", 96*f4a2713aSLionel Sambuc "Generate the clang parsed attribute helpers"), 97*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrParsedAttrKinds, 98*f4a2713aSLionel Sambuc "gen-clang-attr-parsed-attr-kinds", 99*f4a2713aSLionel Sambuc "Generate a clang parsed attribute kinds"), 100*f4a2713aSLionel Sambuc clEnumValN(GenClangAttrDump, "gen-clang-attr-dump", 101*f4a2713aSLionel Sambuc "Generate clang attribute dumper"), 102*f4a2713aSLionel Sambuc clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 103*f4a2713aSLionel Sambuc "Generate Clang diagnostics definitions"), 104*f4a2713aSLionel Sambuc clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 105*f4a2713aSLionel Sambuc "Generate Clang diagnostic groups"), 106*f4a2713aSLionel Sambuc clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name", 107*f4a2713aSLionel Sambuc "Generate Clang diagnostic name index"), 108*f4a2713aSLionel Sambuc clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes", 109*f4a2713aSLionel Sambuc "Generate Clang AST comment nodes"), 110*f4a2713aSLionel Sambuc clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 111*f4a2713aSLionel Sambuc "Generate Clang AST declaration nodes"), 112*f4a2713aSLionel Sambuc clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 113*f4a2713aSLionel Sambuc "Generate Clang AST statement nodes"), 114*f4a2713aSLionel Sambuc clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 115*f4a2713aSLionel Sambuc "Generate Clang Static Analyzer checkers"), 116*f4a2713aSLionel Sambuc clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags", 117*f4a2713aSLionel Sambuc "Generate efficient matchers for HTML tag " 118*f4a2713aSLionel Sambuc "names that are used in documentation comments"), 119*f4a2713aSLionel Sambuc clEnumValN(GenClangCommentHTMLTagsProperties, 120*f4a2713aSLionel Sambuc "gen-clang-comment-html-tags-properties", 121*f4a2713aSLionel Sambuc "Generate efficient matchers for HTML tag " 122*f4a2713aSLionel Sambuc "properties"), 123*f4a2713aSLionel Sambuc clEnumValN(GenClangCommentHTMLNamedCharacterReferences, 124*f4a2713aSLionel Sambuc "gen-clang-comment-html-named-character-references", 125*f4a2713aSLionel Sambuc "Generate function to translate named character " 126*f4a2713aSLionel Sambuc "references to UTF-8 sequences"), 127*f4a2713aSLionel Sambuc clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info", 128*f4a2713aSLionel Sambuc "Generate command properties for commands that " 129*f4a2713aSLionel Sambuc "are used in documentation comments"), 130*f4a2713aSLionel Sambuc clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list", 131*f4a2713aSLionel Sambuc "Generate list of commands that are used in " 132*f4a2713aSLionel Sambuc "documentation comments"), 133*f4a2713aSLionel Sambuc clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"), 134*f4a2713aSLionel Sambuc clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 135*f4a2713aSLionel Sambuc "Generate ARM NEON sema support for clang"), 136*f4a2713aSLionel Sambuc clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 137*f4a2713aSLionel Sambuc "Generate ARM NEON tests for clang"), 138*f4a2713aSLionel Sambuc clEnumValEnd)); 139*f4a2713aSLionel Sambuc 140*f4a2713aSLionel Sambuc cl::opt<std::string> 141*f4a2713aSLionel Sambuc ClangComponent("clang-component", 142*f4a2713aSLionel Sambuc cl::desc("Only use warnings from specified component"), 143*f4a2713aSLionel Sambuc cl::value_desc("component"), cl::Hidden); 144*f4a2713aSLionel Sambuc 145*f4a2713aSLionel Sambuc bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 146*f4a2713aSLionel Sambuc switch (Action) { 147*f4a2713aSLionel Sambuc case GenClangAttrClasses: 148*f4a2713aSLionel Sambuc EmitClangAttrClass(Records, OS); 149*f4a2713aSLionel Sambuc break; 150*f4a2713aSLionel Sambuc case GenClangAttrIdentifierArgList: 151*f4a2713aSLionel Sambuc EmitClangAttrIdentifierArgList(Records, OS); 152*f4a2713aSLionel Sambuc break; 153*f4a2713aSLionel Sambuc case GenClangAttrTypeArgList: 154*f4a2713aSLionel Sambuc EmitClangAttrTypeArgList(Records, OS); 155*f4a2713aSLionel Sambuc break; 156*f4a2713aSLionel Sambuc case GenClangAttrImpl: 157*f4a2713aSLionel Sambuc EmitClangAttrImpl(Records, OS); 158*f4a2713aSLionel Sambuc break; 159*f4a2713aSLionel Sambuc case GenClangAttrList: 160*f4a2713aSLionel Sambuc EmitClangAttrList(Records, OS); 161*f4a2713aSLionel Sambuc break; 162*f4a2713aSLionel Sambuc case GenClangAttrPCHRead: 163*f4a2713aSLionel Sambuc EmitClangAttrPCHRead(Records, OS); 164*f4a2713aSLionel Sambuc break; 165*f4a2713aSLionel Sambuc case GenClangAttrPCHWrite: 166*f4a2713aSLionel Sambuc EmitClangAttrPCHWrite(Records, OS); 167*f4a2713aSLionel Sambuc break; 168*f4a2713aSLionel Sambuc case GenClangAttrSpellingList: 169*f4a2713aSLionel Sambuc EmitClangAttrSpellingList(Records, OS); 170*f4a2713aSLionel Sambuc break; 171*f4a2713aSLionel Sambuc case GenClangAttrSpellingListIndex: 172*f4a2713aSLionel Sambuc EmitClangAttrSpellingListIndex(Records, OS); 173*f4a2713aSLionel Sambuc break; 174*f4a2713aSLionel Sambuc case GenClangAttrLateParsedList: 175*f4a2713aSLionel Sambuc EmitClangAttrLateParsedList(Records, OS); 176*f4a2713aSLionel Sambuc break; 177*f4a2713aSLionel Sambuc case GenClangAttrTemplateInstantiate: 178*f4a2713aSLionel Sambuc EmitClangAttrTemplateInstantiate(Records, OS); 179*f4a2713aSLionel Sambuc break; 180*f4a2713aSLionel Sambuc case GenClangAttrParsedAttrList: 181*f4a2713aSLionel Sambuc EmitClangAttrParsedAttrList(Records, OS); 182*f4a2713aSLionel Sambuc break; 183*f4a2713aSLionel Sambuc case GenClangAttrParsedAttrImpl: 184*f4a2713aSLionel Sambuc EmitClangAttrParsedAttrImpl(Records, OS); 185*f4a2713aSLionel Sambuc break; 186*f4a2713aSLionel Sambuc case GenClangAttrParsedAttrKinds: 187*f4a2713aSLionel Sambuc EmitClangAttrParsedAttrKinds(Records, OS); 188*f4a2713aSLionel Sambuc break; 189*f4a2713aSLionel Sambuc case GenClangAttrDump: 190*f4a2713aSLionel Sambuc EmitClangAttrDump(Records, OS); 191*f4a2713aSLionel Sambuc break; 192*f4a2713aSLionel Sambuc case GenClangDiagsDefs: 193*f4a2713aSLionel Sambuc EmitClangDiagsDefs(Records, OS, ClangComponent); 194*f4a2713aSLionel Sambuc break; 195*f4a2713aSLionel Sambuc case GenClangDiagGroups: 196*f4a2713aSLionel Sambuc EmitClangDiagGroups(Records, OS); 197*f4a2713aSLionel Sambuc break; 198*f4a2713aSLionel Sambuc case GenClangDiagsIndexName: 199*f4a2713aSLionel Sambuc EmitClangDiagsIndexName(Records, OS); 200*f4a2713aSLionel Sambuc break; 201*f4a2713aSLionel Sambuc case GenClangCommentNodes: 202*f4a2713aSLionel Sambuc EmitClangASTNodes(Records, OS, "Comment", ""); 203*f4a2713aSLionel Sambuc break; 204*f4a2713aSLionel Sambuc case GenClangDeclNodes: 205*f4a2713aSLionel Sambuc EmitClangASTNodes(Records, OS, "Decl", "Decl"); 206*f4a2713aSLionel Sambuc EmitClangDeclContext(Records, OS); 207*f4a2713aSLionel Sambuc break; 208*f4a2713aSLionel Sambuc case GenClangStmtNodes: 209*f4a2713aSLionel Sambuc EmitClangASTNodes(Records, OS, "Stmt", ""); 210*f4a2713aSLionel Sambuc break; 211*f4a2713aSLionel Sambuc case GenClangSACheckers: 212*f4a2713aSLionel Sambuc EmitClangSACheckers(Records, OS); 213*f4a2713aSLionel Sambuc break; 214*f4a2713aSLionel Sambuc case GenClangCommentHTMLTags: 215*f4a2713aSLionel Sambuc EmitClangCommentHTMLTags(Records, OS); 216*f4a2713aSLionel Sambuc break; 217*f4a2713aSLionel Sambuc case GenClangCommentHTMLTagsProperties: 218*f4a2713aSLionel Sambuc EmitClangCommentHTMLTagsProperties(Records, OS); 219*f4a2713aSLionel Sambuc break; 220*f4a2713aSLionel Sambuc case GenClangCommentHTMLNamedCharacterReferences: 221*f4a2713aSLionel Sambuc EmitClangCommentHTMLNamedCharacterReferences(Records, OS); 222*f4a2713aSLionel Sambuc break; 223*f4a2713aSLionel Sambuc case GenClangCommentCommandInfo: 224*f4a2713aSLionel Sambuc EmitClangCommentCommandInfo(Records, OS); 225*f4a2713aSLionel Sambuc break; 226*f4a2713aSLionel Sambuc case GenClangCommentCommandList: 227*f4a2713aSLionel Sambuc EmitClangCommentCommandList(Records, OS); 228*f4a2713aSLionel Sambuc break; 229*f4a2713aSLionel Sambuc case GenArmNeon: 230*f4a2713aSLionel Sambuc EmitNeon(Records, OS); 231*f4a2713aSLionel Sambuc break; 232*f4a2713aSLionel Sambuc case GenArmNeonSema: 233*f4a2713aSLionel Sambuc EmitNeonSema(Records, OS); 234*f4a2713aSLionel Sambuc break; 235*f4a2713aSLionel Sambuc case GenArmNeonTest: 236*f4a2713aSLionel Sambuc EmitNeonTest(Records, OS); 237*f4a2713aSLionel Sambuc break; 238*f4a2713aSLionel Sambuc } 239*f4a2713aSLionel Sambuc 240*f4a2713aSLionel Sambuc return false; 241*f4a2713aSLionel Sambuc } 242*f4a2713aSLionel Sambuc } 243*f4a2713aSLionel Sambuc 244*f4a2713aSLionel Sambuc int main(int argc, char **argv) { 245*f4a2713aSLionel Sambuc sys::PrintStackTraceOnErrorSignal(); 246*f4a2713aSLionel Sambuc PrettyStackTraceProgram X(argc, argv); 247*f4a2713aSLionel Sambuc cl::ParseCommandLineOptions(argc, argv); 248*f4a2713aSLionel Sambuc 249*f4a2713aSLionel Sambuc return TableGenMain(argv[0], &ClangTableGenMain); 250*f4a2713aSLionel Sambuc } 251