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