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