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