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 GenArmFP16, 56 GenArmNeonSema, 57 GenArmNeonTest, 58 GenAttrDocs, 59 GenDiagDocs, 60 GenOptDocs, 61 GenDataCollectors, 62 GenTestPragmaAttributeSupportedAttributes 63 }; 64 65 namespace { 66 cl::opt<ActionType> Action( 67 cl::desc("Action to perform:"), 68 cl::values( 69 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 70 "Generate clang attribute clases"), 71 clEnumValN(GenClangAttrParserStringSwitches, 72 "gen-clang-attr-parser-string-switches", 73 "Generate all parser-related attribute string switches"), 74 clEnumValN(GenClangAttrSubjectMatchRulesParserStringSwitches, 75 "gen-clang-attr-subject-match-rules-parser-string-switches", 76 "Generate all parser-related attribute subject match rule" 77 "string switches"), 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(GenClangAttrSubjectMatchRuleList, 83 "gen-clang-attr-subject-match-rule-list", 84 "Generate a clang attribute subject match rule list"), 85 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 86 "Generate clang PCH attribute reader"), 87 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 88 "Generate clang PCH attribute writer"), 89 clEnumValN(GenClangAttrHasAttributeImpl, 90 "gen-clang-attr-has-attribute-impl", 91 "Generate a clang attribute spelling list"), 92 clEnumValN(GenClangAttrSpellingListIndex, 93 "gen-clang-attr-spelling-index", 94 "Generate a clang attribute spelling index"), 95 clEnumValN(GenClangAttrASTVisitor, "gen-clang-attr-ast-visitor", 96 "Generate a recursive AST visitor for clang attributes"), 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(GenArmFP16, "gen-arm-fp16", "Generate arm_fp16.h for clang"), 144 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 145 "Generate ARM NEON sema support for clang"), 146 clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 147 "Generate ARM NEON tests for clang"), 148 clEnumValN(GenAttrDocs, "gen-attr-docs", 149 "Generate attribute documentation"), 150 clEnumValN(GenDiagDocs, "gen-diag-docs", 151 "Generate diagnostic documentation"), 152 clEnumValN(GenOptDocs, "gen-opt-docs", "Generate option documentation"), 153 clEnumValN(GenDataCollectors, "gen-clang-data-collectors", 154 "Generate data collectors for AST nodes"), 155 clEnumValN(GenTestPragmaAttributeSupportedAttributes, 156 "gen-clang-test-pragma-attribute-supported-attributes", 157 "Generate a list of attributes supported by #pragma clang " 158 "attribute for testing purposes"))); 159 160 cl::opt<std::string> 161 ClangComponent("clang-component", 162 cl::desc("Only use warnings from specified component"), 163 cl::value_desc("component"), cl::Hidden); 164 165 bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 166 switch (Action) { 167 case GenClangAttrClasses: 168 EmitClangAttrClass(Records, OS); 169 break; 170 case GenClangAttrParserStringSwitches: 171 EmitClangAttrParserStringSwitches(Records, OS); 172 break; 173 case GenClangAttrSubjectMatchRulesParserStringSwitches: 174 EmitClangAttrSubjectMatchRulesParserStringSwitches(Records, OS); 175 break; 176 case GenClangAttrImpl: 177 EmitClangAttrImpl(Records, OS); 178 break; 179 case GenClangAttrList: 180 EmitClangAttrList(Records, OS); 181 break; 182 case GenClangAttrSubjectMatchRuleList: 183 EmitClangAttrSubjectMatchRuleList(Records, OS); 184 break; 185 case GenClangAttrPCHRead: 186 EmitClangAttrPCHRead(Records, OS); 187 break; 188 case GenClangAttrPCHWrite: 189 EmitClangAttrPCHWrite(Records, OS); 190 break; 191 case GenClangAttrHasAttributeImpl: 192 EmitClangAttrHasAttrImpl(Records, OS); 193 break; 194 case GenClangAttrSpellingListIndex: 195 EmitClangAttrSpellingListIndex(Records, OS); 196 break; 197 case GenClangAttrASTVisitor: 198 EmitClangAttrASTVisitor(Records, OS); 199 break; 200 case GenClangAttrTemplateInstantiate: 201 EmitClangAttrTemplateInstantiate(Records, OS); 202 break; 203 case GenClangAttrParsedAttrList: 204 EmitClangAttrParsedAttrList(Records, OS); 205 break; 206 case GenClangAttrParsedAttrImpl: 207 EmitClangAttrParsedAttrImpl(Records, OS); 208 break; 209 case GenClangAttrParsedAttrKinds: 210 EmitClangAttrParsedAttrKinds(Records, OS); 211 break; 212 case GenClangAttrDump: 213 EmitClangAttrDump(Records, OS); 214 break; 215 case GenClangDiagsDefs: 216 EmitClangDiagsDefs(Records, OS, ClangComponent); 217 break; 218 case GenClangDiagGroups: 219 EmitClangDiagGroups(Records, OS); 220 break; 221 case GenClangDiagsIndexName: 222 EmitClangDiagsIndexName(Records, OS); 223 break; 224 case GenClangCommentNodes: 225 EmitClangASTNodes(Records, OS, "Comment", ""); 226 break; 227 case GenClangDeclNodes: 228 EmitClangASTNodes(Records, OS, "Decl", "Decl"); 229 EmitClangDeclContext(Records, OS); 230 break; 231 case GenClangStmtNodes: 232 EmitClangASTNodes(Records, OS, "Stmt", ""); 233 break; 234 case GenClangSACheckers: 235 EmitClangSACheckers(Records, OS); 236 break; 237 case GenClangCommentHTMLTags: 238 EmitClangCommentHTMLTags(Records, OS); 239 break; 240 case GenClangCommentHTMLTagsProperties: 241 EmitClangCommentHTMLTagsProperties(Records, OS); 242 break; 243 case GenClangCommentHTMLNamedCharacterReferences: 244 EmitClangCommentHTMLNamedCharacterReferences(Records, OS); 245 break; 246 case GenClangCommentCommandInfo: 247 EmitClangCommentCommandInfo(Records, OS); 248 break; 249 case GenClangCommentCommandList: 250 EmitClangCommentCommandList(Records, OS); 251 break; 252 case GenArmNeon: 253 EmitNeon(Records, OS); 254 break; 255 case GenArmFP16: 256 EmitFP16(Records, OS); 257 break; 258 case GenArmNeonSema: 259 EmitNeonSema(Records, OS); 260 break; 261 case GenArmNeonTest: 262 EmitNeonTest(Records, OS); 263 break; 264 case GenAttrDocs: 265 EmitClangAttrDocs(Records, OS); 266 break; 267 case GenDiagDocs: 268 EmitClangDiagDocs(Records, OS); 269 break; 270 case GenOptDocs: 271 EmitClangOptDocs(Records, OS); 272 break; 273 case GenDataCollectors: 274 EmitClangDataCollectors(Records, OS); 275 break; 276 case GenTestPragmaAttributeSupportedAttributes: 277 EmitTestPragmaAttributeSupportedAttributes(Records, OS); 278 break; 279 } 280 281 return false; 282 } 283 } 284 285 int main(int argc, char **argv) { 286 sys::PrintStackTraceOnErrorSignal(argv[0]); 287 PrettyStackTraceProgram X(argc, argv); 288 cl::ParseCommandLineOptions(argc, argv); 289 290 llvm_shutdown_obj Y; 291 292 return TableGenMain(argv[0], &ClangTableGenMain); 293 } 294 295 #ifdef __has_feature 296 #if __has_feature(address_sanitizer) 297 #include <sanitizer/lsan_interface.h> 298 // Disable LeakSanitizer for this binary as it has too many leaks that are not 299 // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h . 300 int __lsan_is_turned_off() { return 1; } 301 #endif // __has_feature(address_sanitizer) 302 #endif // defined(__has_feature) 303