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