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