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