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