1226586Sdim//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===// 2226586Sdim// 3226586Sdim// The LLVM Compiler Infrastructure 4226586Sdim// 5226586Sdim// This file is distributed under the University of Illinois Open Source 6226586Sdim// License. See LICENSE.TXT for details. 7226586Sdim// 8226586Sdim//===----------------------------------------------------------------------===// 9226586Sdim// 10226586Sdim// This file contains the main function for Clang's TableGen. 11226586Sdim// 12226586Sdim//===----------------------------------------------------------------------===// 13226586Sdim 14239462Sdim#include "TableGenBackends.h" // Declares all backends. 15226586Sdim#include "llvm/Support/CommandLine.h" 16226586Sdim#include "llvm/Support/PrettyStackTrace.h" 17226586Sdim#include "llvm/Support/Signals.h" 18226586Sdim#include "llvm/TableGen/Error.h" 19226586Sdim#include "llvm/TableGen/Main.h" 20226586Sdim#include "llvm/TableGen/Record.h" 21226586Sdim 22226586Sdimusing namespace llvm; 23239462Sdimusing namespace clang; 24226586Sdim 25226586Sdimenum ActionType { 26226586Sdim GenClangAttrClasses, 27263508Sdim GenClangAttrIdentifierArgList, 28263508Sdim GenClangAttrTypeArgList, 29226586Sdim GenClangAttrImpl, 30226586Sdim GenClangAttrList, 31226586Sdim GenClangAttrPCHRead, 32226586Sdim GenClangAttrPCHWrite, 33226586Sdim GenClangAttrSpellingList, 34249423Sdim GenClangAttrSpellingListIndex, 35226586Sdim GenClangAttrLateParsedList, 36234353Sdim GenClangAttrTemplateInstantiate, 37234353Sdim GenClangAttrParsedAttrList, 38263508Sdim GenClangAttrParsedAttrImpl, 39234353Sdim GenClangAttrParsedAttrKinds, 40249423Sdim GenClangAttrDump, 41226586Sdim GenClangDiagsDefs, 42226586Sdim GenClangDiagGroups, 43226586Sdim GenClangDiagsIndexName, 44239462Sdim GenClangCommentNodes, 45226586Sdim GenClangDeclNodes, 46226586Sdim GenClangStmtNodes, 47226586Sdim GenClangSACheckers, 48243830Sdim GenClangCommentHTMLTags, 49243830Sdim GenClangCommentHTMLTagsProperties, 50249423Sdim GenClangCommentHTMLNamedCharacterReferences, 51243830Sdim GenClangCommentCommandInfo, 52249423Sdim GenClangCommentCommandList, 53226586Sdim GenArmNeon, 54226586Sdim GenArmNeonSema, 55226586Sdim GenArmNeonTest 56226586Sdim}; 57226586Sdim 58226586Sdimnamespace { 59263508Sdimcl::opt<ActionType> Action( 60263508Sdim cl::desc("Action to perform:"), 61263508Sdim cl::values( 62263508Sdim clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 63263508Sdim "Generate clang attribute clases"), 64263508Sdim clEnumValN(GenClangAttrIdentifierArgList, 65263508Sdim "gen-clang-attr-identifier-arg-list", 66263508Sdim "Generate a list of attributes that take an " 67263508Sdim "identifier as their first argument"), 68263508Sdim clEnumValN(GenClangAttrTypeArgList, 69263508Sdim "gen-clang-attr-type-arg-list", 70263508Sdim "Generate a list of attributes that take a type as their " 71263508Sdim "first argument"), 72263508Sdim clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 73263508Sdim "Generate clang attribute implementations"), 74263508Sdim clEnumValN(GenClangAttrList, "gen-clang-attr-list", 75263508Sdim "Generate a clang attribute list"), 76263508Sdim clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 77263508Sdim "Generate clang PCH attribute reader"), 78263508Sdim clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 79263508Sdim "Generate clang PCH attribute writer"), 80263508Sdim clEnumValN(GenClangAttrSpellingList, "gen-clang-attr-spelling-list", 81263508Sdim "Generate a clang attribute spelling list"), 82263508Sdim clEnumValN(GenClangAttrSpellingListIndex, 83263508Sdim "gen-clang-attr-spelling-index", 84263508Sdim "Generate a clang attribute spelling index"), 85263508Sdim clEnumValN(GenClangAttrLateParsedList, 86263508Sdim "gen-clang-attr-late-parsed-list", 87263508Sdim "Generate a clang attribute LateParsed list"), 88263508Sdim clEnumValN(GenClangAttrTemplateInstantiate, 89263508Sdim "gen-clang-attr-template-instantiate", 90263508Sdim "Generate a clang template instantiate code"), 91263508Sdim clEnumValN(GenClangAttrParsedAttrList, 92263508Sdim "gen-clang-attr-parsed-attr-list", 93263508Sdim "Generate a clang parsed attribute list"), 94263508Sdim clEnumValN(GenClangAttrParsedAttrImpl, 95263508Sdim "gen-clang-attr-parsed-attr-impl", 96263508Sdim "Generate the clang parsed attribute helpers"), 97263508Sdim clEnumValN(GenClangAttrParsedAttrKinds, 98263508Sdim "gen-clang-attr-parsed-attr-kinds", 99263508Sdim "Generate a clang parsed attribute kinds"), 100263508Sdim clEnumValN(GenClangAttrDump, "gen-clang-attr-dump", 101263508Sdim "Generate clang attribute dumper"), 102263508Sdim clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 103263508Sdim "Generate Clang diagnostics definitions"), 104263508Sdim clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 105263508Sdim "Generate Clang diagnostic groups"), 106263508Sdim clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name", 107263508Sdim "Generate Clang diagnostic name index"), 108263508Sdim clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes", 109263508Sdim "Generate Clang AST comment nodes"), 110263508Sdim clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 111263508Sdim "Generate Clang AST declaration nodes"), 112263508Sdim clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 113263508Sdim "Generate Clang AST statement nodes"), 114263508Sdim clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 115263508Sdim "Generate Clang Static Analyzer checkers"), 116263508Sdim clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags", 117263508Sdim "Generate efficient matchers for HTML tag " 118263508Sdim "names that are used in documentation comments"), 119263508Sdim clEnumValN(GenClangCommentHTMLTagsProperties, 120263508Sdim "gen-clang-comment-html-tags-properties", 121263508Sdim "Generate efficient matchers for HTML tag " 122263508Sdim "properties"), 123263508Sdim clEnumValN(GenClangCommentHTMLNamedCharacterReferences, 124263508Sdim "gen-clang-comment-html-named-character-references", 125263508Sdim "Generate function to translate named character " 126263508Sdim "references to UTF-8 sequences"), 127263508Sdim clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info", 128263508Sdim "Generate command properties for commands that " 129263508Sdim "are used in documentation comments"), 130263508Sdim clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list", 131263508Sdim "Generate list of commands that are used in " 132263508Sdim "documentation comments"), 133263508Sdim clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"), 134263508Sdim clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 135263508Sdim "Generate ARM NEON sema support for clang"), 136263508Sdim clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 137263508Sdim "Generate ARM NEON tests for clang"), 138263508Sdim clEnumValEnd)); 139226586Sdim 140263508Sdimcl::opt<std::string> 141263508SdimClangComponent("clang-component", 142263508Sdim cl::desc("Only use warnings from specified component"), 143263508Sdim cl::value_desc("component"), cl::Hidden); 144226586Sdim 145243830Sdimbool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 146243830Sdim switch (Action) { 147243830Sdim case GenClangAttrClasses: 148243830Sdim EmitClangAttrClass(Records, OS); 149243830Sdim break; 150263508Sdim case GenClangAttrIdentifierArgList: 151263508Sdim EmitClangAttrIdentifierArgList(Records, OS); 152251662Sdim break; 153263508Sdim case GenClangAttrTypeArgList: 154263508Sdim EmitClangAttrTypeArgList(Records, OS); 155263508Sdim break; 156243830Sdim case GenClangAttrImpl: 157243830Sdim EmitClangAttrImpl(Records, OS); 158243830Sdim break; 159243830Sdim case GenClangAttrList: 160243830Sdim EmitClangAttrList(Records, OS); 161243830Sdim break; 162243830Sdim case GenClangAttrPCHRead: 163243830Sdim EmitClangAttrPCHRead(Records, OS); 164243830Sdim break; 165243830Sdim case GenClangAttrPCHWrite: 166243830Sdim EmitClangAttrPCHWrite(Records, OS); 167243830Sdim break; 168243830Sdim case GenClangAttrSpellingList: 169243830Sdim EmitClangAttrSpellingList(Records, OS); 170243830Sdim break; 171249423Sdim case GenClangAttrSpellingListIndex: 172249423Sdim EmitClangAttrSpellingListIndex(Records, OS); 173249423Sdim break; 174243830Sdim case GenClangAttrLateParsedList: 175243830Sdim EmitClangAttrLateParsedList(Records, OS); 176243830Sdim break; 177243830Sdim case GenClangAttrTemplateInstantiate: 178243830Sdim EmitClangAttrTemplateInstantiate(Records, OS); 179243830Sdim break; 180243830Sdim case GenClangAttrParsedAttrList: 181243830Sdim EmitClangAttrParsedAttrList(Records, OS); 182243830Sdim break; 183263508Sdim case GenClangAttrParsedAttrImpl: 184263508Sdim EmitClangAttrParsedAttrImpl(Records, OS); 185263508Sdim break; 186243830Sdim case GenClangAttrParsedAttrKinds: 187243830Sdim EmitClangAttrParsedAttrKinds(Records, OS); 188243830Sdim break; 189249423Sdim case GenClangAttrDump: 190249423Sdim EmitClangAttrDump(Records, OS); 191249423Sdim break; 192243830Sdim case GenClangDiagsDefs: 193243830Sdim EmitClangDiagsDefs(Records, OS, ClangComponent); 194243830Sdim break; 195243830Sdim case GenClangDiagGroups: 196243830Sdim EmitClangDiagGroups(Records, OS); 197243830Sdim break; 198243830Sdim case GenClangDiagsIndexName: 199243830Sdim EmitClangDiagsIndexName(Records, OS); 200243830Sdim break; 201243830Sdim case GenClangCommentNodes: 202243830Sdim EmitClangASTNodes(Records, OS, "Comment", ""); 203243830Sdim break; 204243830Sdim case GenClangDeclNodes: 205243830Sdim EmitClangASTNodes(Records, OS, "Decl", "Decl"); 206243830Sdim EmitClangDeclContext(Records, OS); 207243830Sdim break; 208243830Sdim case GenClangStmtNodes: 209243830Sdim EmitClangASTNodes(Records, OS, "Stmt", ""); 210243830Sdim break; 211243830Sdim case GenClangSACheckers: 212243830Sdim EmitClangSACheckers(Records, OS); 213243830Sdim break; 214243830Sdim case GenClangCommentHTMLTags: 215243830Sdim EmitClangCommentHTMLTags(Records, OS); 216243830Sdim break; 217243830Sdim case GenClangCommentHTMLTagsProperties: 218243830Sdim EmitClangCommentHTMLTagsProperties(Records, OS); 219243830Sdim break; 220249423Sdim case GenClangCommentHTMLNamedCharacterReferences: 221249423Sdim EmitClangCommentHTMLNamedCharacterReferences(Records, OS); 222249423Sdim break; 223243830Sdim case GenClangCommentCommandInfo: 224243830Sdim EmitClangCommentCommandInfo(Records, OS); 225243830Sdim break; 226249423Sdim case GenClangCommentCommandList: 227249423Sdim EmitClangCommentCommandList(Records, OS); 228249423Sdim break; 229243830Sdim case GenArmNeon: 230243830Sdim EmitNeon(Records, OS); 231243830Sdim break; 232243830Sdim case GenArmNeonSema: 233243830Sdim EmitNeonSema(Records, OS); 234243830Sdim break; 235243830Sdim case GenArmNeonTest: 236243830Sdim EmitNeonTest(Records, OS); 237243830Sdim break; 238243830Sdim } 239226586Sdim 240243830Sdim return false; 241234353Sdim} 242243830Sdim} 243226586Sdim 244226586Sdimint main(int argc, char **argv) { 245226586Sdim sys::PrintStackTraceOnErrorSignal(); 246226586Sdim PrettyStackTraceProgram X(argc, argv); 247226586Sdim cl::ParseCommandLineOptions(argc, argv); 248226586Sdim 249243830Sdim return TableGenMain(argv[0], &ClangTableGenMain); 250226586Sdim} 251