1204076Spjd//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===// 2204076Spjd// 3204076Spjd// The LLVM Compiler Infrastructure 4204076Spjd// 5204076Spjd// This file is distributed under the University of Illinois Open Source 6204076Spjd// License. See LICENSE.TXT for details. 7204076Spjd// 8204076Spjd//===----------------------------------------------------------------------===// 9204076Spjd// 10204076Spjd// This file contains the main function for Clang's TableGen. 11204076Spjd// 12204076Spjd//===----------------------------------------------------------------------===// 13204076Spjd 14204076Spjd#include "TableGenBackends.h" // Declares all backends. 15204076Spjd#include "llvm/Support/CommandLine.h" 16204076Spjd#include "llvm/Support/ManagedStatic.h" 17204076Spjd#include "llvm/Support/PrettyStackTrace.h" 18204076Spjd#include "llvm/Support/Signals.h" 19204076Spjd#include "llvm/TableGen/Error.h" 20204076Spjd#include "llvm/TableGen/Main.h" 21204076Spjd#include "llvm/TableGen/Record.h" 22204076Spjd 23204076Spjdusing namespace llvm; 24204076Spjdusing namespace clang; 25204076Spjd 26204076Spjdenum ActionType { 27204076Spjd GenClangAttrClasses, 28204076Spjd GenClangAttrParserStringSwitches, 29204076Spjd GenClangAttrImpl, 30204076Spjd GenClangAttrList, 31204076Spjd GenClangAttrPCHRead, 32204076Spjd GenClangAttrPCHWrite, 33204076Spjd GenClangAttrHasAttributeImpl, 34204076Spjd GenClangAttrSpellingListIndex, 35204076Spjd GenClangAttrASTVisitor, 36204076Spjd GenClangAttrTemplateInstantiate, 37204076Spjd GenClangAttrParsedAttrList, 38204076Spjd GenClangAttrParsedAttrImpl, 39225787Spjd GenClangAttrParsedAttrKinds, 40225787Spjd GenClangAttrDump, 41204076Spjd GenClangDiagsDefs, 42204076Spjd GenClangDiagGroups, 43225787Spjd GenClangDiagsIndexName, 44225787Spjd GenClangCommentNodes, 45225787Spjd GenClangDeclNodes, 46225787Spjd GenClangStmtNodes, 47225787Spjd GenClangSACheckers, 48204076Spjd GenClangCommentHTMLTags, 49204076Spjd GenClangCommentHTMLTagsProperties, 50204076Spjd GenClangCommentHTMLNamedCharacterReferences, 51204076Spjd GenClangCommentCommandInfo, 52204076Spjd GenClangCommentCommandList, 53204076Spjd GenArmNeon, 54204076Spjd GenArmNeonSema, 55204076Spjd GenArmNeonTest, 56204076Spjd GenAttrDocs 57204076Spjd}; 58204076Spjd 59204076Spjdnamespace { 60204076Spjdcl::opt<ActionType> Action( 61204076Spjd cl::desc("Action to perform:"), 62204076Spjd cl::values( 63204076Spjd clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 64204076Spjd "Generate clang attribute clases"), 65225787Spjd clEnumValN(GenClangAttrParserStringSwitches, 66204076Spjd "gen-clang-attr-parser-string-switches", 67204076Spjd "Generate all parser-related attribute string switches"), 68204076Spjd clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 69204076Spjd "Generate clang attribute implementations"), 70204076Spjd clEnumValN(GenClangAttrList, "gen-clang-attr-list", 71204076Spjd "Generate a clang attribute list"), 72204076Spjd clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 73204076Spjd "Generate clang PCH attribute reader"), 74204076Spjd clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 75204076Spjd "Generate clang PCH attribute writer"), 76204076Spjd clEnumValN(GenClangAttrHasAttributeImpl, 77204076Spjd "gen-clang-attr-has-attribute-impl", 78204076Spjd "Generate a clang attribute spelling list"), 79204076Spjd clEnumValN(GenClangAttrSpellingListIndex, 80204076Spjd "gen-clang-attr-spelling-index", 81204076Spjd "Generate a clang attribute spelling index"), 82204076Spjd clEnumValN(GenClangAttrASTVisitor, 83204076Spjd "gen-clang-attr-ast-visitor", 84225787Spjd "Generate a recursive AST visitor for clang attributes"), 85204076Spjd clEnumValN(GenClangAttrTemplateInstantiate, 86204076Spjd "gen-clang-attr-template-instantiate", 87204076Spjd "Generate a clang template instantiate code"), 88204076Spjd clEnumValN(GenClangAttrParsedAttrList, 89204076Spjd "gen-clang-attr-parsed-attr-list", 90204076Spjd "Generate a clang parsed attribute list"), 91204076Spjd clEnumValN(GenClangAttrParsedAttrImpl, 92204076Spjd "gen-clang-attr-parsed-attr-impl", 93204076Spjd "Generate the clang parsed attribute helpers"), 94204076Spjd clEnumValN(GenClangAttrParsedAttrKinds, 95204076Spjd "gen-clang-attr-parsed-attr-kinds", 96204076Spjd "Generate a clang parsed attribute kinds"), 97204076Spjd clEnumValN(GenClangAttrDump, "gen-clang-attr-dump", 98204076Spjd "Generate clang attribute dumper"), 99204076Spjd clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 100225787Spjd "Generate Clang diagnostics definitions"), 101204076Spjd clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 102204076Spjd "Generate Clang diagnostic groups"), 103204076Spjd clEnumValN(GenClangDiagsIndexName, "gen-clang-diags-index-name", 104204076Spjd "Generate Clang diagnostic name index"), 105204076Spjd clEnumValN(GenClangCommentNodes, "gen-clang-comment-nodes", 106204076Spjd "Generate Clang AST comment nodes"), 107204076Spjd clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 108204076Spjd "Generate Clang AST declaration nodes"), 109204076Spjd clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 110204076Spjd "Generate Clang AST statement nodes"), 111204076Spjd clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 112204076Spjd "Generate Clang Static Analyzer checkers"), 113204076Spjd clEnumValN(GenClangCommentHTMLTags, "gen-clang-comment-html-tags", 114204076Spjd "Generate efficient matchers for HTML tag " 115204076Spjd "names that are used in documentation comments"), 116225787Spjd clEnumValN(GenClangCommentHTMLTagsProperties, 117204076Spjd "gen-clang-comment-html-tags-properties", 118204076Spjd "Generate efficient matchers for HTML tag " 119204076Spjd "properties"), 120204076Spjd clEnumValN(GenClangCommentHTMLNamedCharacterReferences, 121204076Spjd "gen-clang-comment-html-named-character-references", 122225787Spjd "Generate function to translate named character " 123204076Spjd "references to UTF-8 sequences"), 124204076Spjd clEnumValN(GenClangCommentCommandInfo, "gen-clang-comment-command-info", 125204076Spjd "Generate command properties for commands that " 126204076Spjd "are used in documentation comments"), 127204076Spjd clEnumValN(GenClangCommentCommandList, "gen-clang-comment-command-list", 128204076Spjd "Generate list of commands that are used in " 129204076Spjd "documentation comments"), 130204076Spjd clEnumValN(GenArmNeon, "gen-arm-neon", "Generate arm_neon.h for clang"), 131204076Spjd clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 132225787Spjd "Generate ARM NEON sema support for clang"), 133204076Spjd clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 134204076Spjd "Generate ARM NEON tests for clang"), 135204076Spjd clEnumValN(GenAttrDocs, "gen-attr-docs", 136204076Spjd "Generate attribute documentation"), 137204076Spjd clEnumValEnd)); 138204076Spjd 139204076Spjdcl::opt<std::string> 140204076SpjdClangComponent("clang-component", 141204076Spjd cl::desc("Only use warnings from specified component"), 142204076Spjd cl::value_desc("component"), cl::Hidden); 143204076Spjd 144bool ClangTableGenMain(raw_ostream &OS, RecordKeeper &Records) { 145 switch (Action) { 146 case GenClangAttrClasses: 147 EmitClangAttrClass(Records, OS); 148 break; 149 case GenClangAttrParserStringSwitches: 150 EmitClangAttrParserStringSwitches(Records, OS); 151 break; 152 case GenClangAttrImpl: 153 EmitClangAttrImpl(Records, OS); 154 break; 155 case GenClangAttrList: 156 EmitClangAttrList(Records, OS); 157 break; 158 case GenClangAttrPCHRead: 159 EmitClangAttrPCHRead(Records, OS); 160 break; 161 case GenClangAttrPCHWrite: 162 EmitClangAttrPCHWrite(Records, OS); 163 break; 164 case GenClangAttrHasAttributeImpl: 165 EmitClangAttrHasAttrImpl(Records, OS); 166 break; 167 case GenClangAttrSpellingListIndex: 168 EmitClangAttrSpellingListIndex(Records, OS); 169 break; 170 case GenClangAttrASTVisitor: 171 EmitClangAttrASTVisitor(Records, OS); 172 break; 173 case GenClangAttrTemplateInstantiate: 174 EmitClangAttrTemplateInstantiate(Records, OS); 175 break; 176 case GenClangAttrParsedAttrList: 177 EmitClangAttrParsedAttrList(Records, OS); 178 break; 179 case GenClangAttrParsedAttrImpl: 180 EmitClangAttrParsedAttrImpl(Records, OS); 181 break; 182 case GenClangAttrParsedAttrKinds: 183 EmitClangAttrParsedAttrKinds(Records, OS); 184 break; 185 case GenClangAttrDump: 186 EmitClangAttrDump(Records, OS); 187 break; 188 case GenClangDiagsDefs: 189 EmitClangDiagsDefs(Records, OS, ClangComponent); 190 break; 191 case GenClangDiagGroups: 192 EmitClangDiagGroups(Records, OS); 193 break; 194 case GenClangDiagsIndexName: 195 EmitClangDiagsIndexName(Records, OS); 196 break; 197 case GenClangCommentNodes: 198 EmitClangASTNodes(Records, OS, "Comment", ""); 199 break; 200 case GenClangDeclNodes: 201 EmitClangASTNodes(Records, OS, "Decl", "Decl"); 202 EmitClangDeclContext(Records, OS); 203 break; 204 case GenClangStmtNodes: 205 EmitClangASTNodes(Records, OS, "Stmt", ""); 206 break; 207 case GenClangSACheckers: 208 EmitClangSACheckers(Records, OS); 209 break; 210 case GenClangCommentHTMLTags: 211 EmitClangCommentHTMLTags(Records, OS); 212 break; 213 case GenClangCommentHTMLTagsProperties: 214 EmitClangCommentHTMLTagsProperties(Records, OS); 215 break; 216 case GenClangCommentHTMLNamedCharacterReferences: 217 EmitClangCommentHTMLNamedCharacterReferences(Records, OS); 218 break; 219 case GenClangCommentCommandInfo: 220 EmitClangCommentCommandInfo(Records, OS); 221 break; 222 case GenClangCommentCommandList: 223 EmitClangCommentCommandList(Records, OS); 224 break; 225 case GenArmNeon: 226 EmitNeon(Records, OS); 227 break; 228 case GenArmNeonSema: 229 EmitNeonSema(Records, OS); 230 break; 231 case GenArmNeonTest: 232 EmitNeonTest(Records, OS); 233 break; 234 case GenAttrDocs: 235 EmitClangAttrDocs(Records, OS); 236 break; 237 } 238 239 return false; 240} 241} 242 243int main(int argc, char **argv) { 244 sys::PrintStackTraceOnErrorSignal(); 245 PrettyStackTraceProgram X(argc, argv); 246 cl::ParseCommandLineOptions(argc, argv); 247 248 llvm_shutdown_obj Y; 249 250 return TableGenMain(argv[0], &ClangTableGenMain); 251} 252 253#ifdef __has_feature 254#if __has_feature(address_sanitizer) 255#include <sanitizer/lsan_interface.h> 256// Disable LeakSanitizer for this binary as it has too many leaks that are not 257// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h . 258int __lsan_is_turned_off() { return 1; } 259#endif // __has_feature(address_sanitizer) 260#endif // defined(__has_feature) 261