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