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