TableGen.cpp revision 226586
1226586Sdim//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===// 2226586Sdim// 3226586Sdim// The LLVM Compiler Infrastructure 4226586Sdim// 5226586Sdim// This file is distributed under the University of Illinois Open Source 6226586Sdim// License. See LICENSE.TXT for details. 7226586Sdim// 8226586Sdim//===----------------------------------------------------------------------===// 9226586Sdim// 10226586Sdim// This file contains the main function for Clang's TableGen. 11226586Sdim// 12226586Sdim//===----------------------------------------------------------------------===// 13226586Sdim 14226586Sdim#include "ClangASTNodesEmitter.h" 15226586Sdim#include "ClangAttrEmitter.h" 16226586Sdim#include "ClangDiagnosticsEmitter.h" 17226586Sdim#include "ClangSACheckersEmitter.h" 18226586Sdim#include "NeonEmitter.h" 19226586Sdim#include "OptParserEmitter.h" 20226586Sdim 21226586Sdim#include "llvm/Support/CommandLine.h" 22226586Sdim#include "llvm/Support/PrettyStackTrace.h" 23226586Sdim#include "llvm/Support/Signals.h" 24226586Sdim#include "llvm/TableGen/Error.h" 25226586Sdim#include "llvm/TableGen/Main.h" 26226586Sdim#include "llvm/TableGen/Record.h" 27226586Sdim#include "llvm/TableGen/TableGenAction.h" 28226586Sdim 29226586Sdimusing namespace llvm; 30226586Sdim 31226586Sdimenum ActionType { 32226586Sdim GenClangAttrClasses, 33226586Sdim GenClangAttrImpl, 34226586Sdim GenClangAttrList, 35226586Sdim GenClangAttrPCHRead, 36226586Sdim GenClangAttrPCHWrite, 37226586Sdim GenClangAttrSpellingList, 38226586Sdim GenClangAttrLateParsedList, 39226586Sdim GenClangDiagsDefs, 40226586Sdim GenClangDiagGroups, 41226586Sdim GenClangDiagsIndexName, 42226586Sdim GenClangDeclNodes, 43226586Sdim GenClangStmtNodes, 44226586Sdim GenClangSACheckers, 45226586Sdim GenOptParserDefs, GenOptParserImpl, 46226586Sdim GenArmNeon, 47226586Sdim GenArmNeonSema, 48226586Sdim GenArmNeonTest 49226586Sdim}; 50226586Sdim 51226586Sdimnamespace { 52226586Sdim cl::opt<ActionType> 53226586Sdim Action(cl::desc("Action to perform:"), 54226586Sdim cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", 55226586Sdim "Generate option definitions"), 56226586Sdim clEnumValN(GenOptParserImpl, "gen-opt-parser-impl", 57226586Sdim "Generate option parser implementation"), 58226586Sdim clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 59226586Sdim "Generate clang attribute clases"), 60226586Sdim clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 61226586Sdim "Generate clang attribute implementations"), 62226586Sdim clEnumValN(GenClangAttrList, "gen-clang-attr-list", 63226586Sdim "Generate a clang attribute list"), 64226586Sdim clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 65226586Sdim "Generate clang PCH attribute reader"), 66226586Sdim clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 67226586Sdim "Generate clang PCH attribute writer"), 68226586Sdim clEnumValN(GenClangAttrSpellingList, 69226586Sdim "gen-clang-attr-spelling-list", 70226586Sdim "Generate a clang attribute spelling list"), 71226586Sdim clEnumValN(GenClangAttrLateParsedList, 72226586Sdim "gen-clang-attr-late-parsed-list", 73226586Sdim "Generate a clang attribute LateParsed list"), 74226586Sdim clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 75226586Sdim "Generate Clang diagnostics definitions"), 76226586Sdim clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 77226586Sdim "Generate Clang diagnostic groups"), 78226586Sdim clEnumValN(GenClangDiagsIndexName, 79226586Sdim "gen-clang-diags-index-name", 80226586Sdim "Generate Clang diagnostic name index"), 81226586Sdim clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 82226586Sdim "Generate Clang AST declaration nodes"), 83226586Sdim clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 84226586Sdim "Generate Clang AST statement nodes"), 85226586Sdim clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 86226586Sdim "Generate Clang Static Analyzer checkers"), 87226586Sdim clEnumValN(GenArmNeon, "gen-arm-neon", 88226586Sdim "Generate arm_neon.h for clang"), 89226586Sdim clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 90226586Sdim "Generate ARM NEON sema support for clang"), 91226586Sdim clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 92226586Sdim "Generate ARM NEON tests for clang"), 93226586Sdim clEnumValEnd)); 94226586Sdim 95226586Sdim cl::opt<std::string> 96226586Sdim ClangComponent("clang-component", 97226586Sdim cl::desc("Only use warnings from specified component"), 98226586Sdim cl::value_desc("component"), cl::Hidden); 99226586Sdim} 100226586Sdim 101226586Sdimclass ClangTableGenAction : public TableGenAction { 102226586Sdimpublic: 103226586Sdim bool operator()(raw_ostream &OS, RecordKeeper &Records) { 104226586Sdim switch (Action) { 105226586Sdim case GenClangAttrClasses: 106226586Sdim ClangAttrClassEmitter(Records).run(OS); 107226586Sdim break; 108226586Sdim case GenClangAttrImpl: 109226586Sdim ClangAttrImplEmitter(Records).run(OS); 110226586Sdim break; 111226586Sdim case GenClangAttrList: 112226586Sdim ClangAttrListEmitter(Records).run(OS); 113226586Sdim break; 114226586Sdim case GenClangAttrPCHRead: 115226586Sdim ClangAttrPCHReadEmitter(Records).run(OS); 116226586Sdim break; 117226586Sdim case GenClangAttrPCHWrite: 118226586Sdim ClangAttrPCHWriteEmitter(Records).run(OS); 119226586Sdim break; 120226586Sdim case GenClangAttrSpellingList: 121226586Sdim ClangAttrSpellingListEmitter(Records).run(OS); 122226586Sdim break; 123226586Sdim case GenClangAttrLateParsedList: 124226586Sdim ClangAttrLateParsedListEmitter(Records).run(OS); 125226586Sdim break; 126226586Sdim case GenClangDiagsDefs: 127226586Sdim ClangDiagsDefsEmitter(Records, ClangComponent).run(OS); 128226586Sdim break; 129226586Sdim case GenClangDiagGroups: 130226586Sdim ClangDiagGroupsEmitter(Records).run(OS); 131226586Sdim break; 132226586Sdim case GenClangDiagsIndexName: 133226586Sdim ClangDiagsIndexNameEmitter(Records).run(OS); 134226586Sdim break; 135226586Sdim case GenClangDeclNodes: 136226586Sdim ClangASTNodesEmitter(Records, "Decl", "Decl").run(OS); 137226586Sdim ClangDeclContextEmitter(Records).run(OS); 138226586Sdim break; 139226586Sdim case GenClangStmtNodes: 140226586Sdim ClangASTNodesEmitter(Records, "Stmt", "").run(OS); 141226586Sdim break; 142226586Sdim case GenClangSACheckers: 143226586Sdim ClangSACheckersEmitter(Records).run(OS); 144226586Sdim break; 145226586Sdim case GenOptParserDefs: 146226586Sdim OptParserEmitter(Records, true).run(OS); 147226586Sdim break; 148226586Sdim case GenOptParserImpl: 149226586Sdim OptParserEmitter(Records, false).run(OS); 150226586Sdim break; 151226586Sdim case GenArmNeon: 152226586Sdim NeonEmitter(Records).run(OS); 153226586Sdim break; 154226586Sdim case GenArmNeonSema: 155226586Sdim NeonEmitter(Records).runHeader(OS); 156226586Sdim break; 157226586Sdim case GenArmNeonTest: 158226586Sdim NeonEmitter(Records).runTests(OS); 159226586Sdim break; 160226586Sdim default: 161226586Sdim assert(1 && "Invalid Action"); 162226586Sdim return true; 163226586Sdim } 164226586Sdim 165226586Sdim return false; 166226586Sdim } 167226586Sdim}; 168226586Sdim 169226586Sdimint main(int argc, char **argv) { 170226586Sdim sys::PrintStackTraceOnErrorSignal(); 171226586Sdim PrettyStackTraceProgram X(argc, argv); 172226586Sdim cl::ParseCommandLineOptions(argc, argv); 173226586Sdim 174226586Sdim ClangTableGenAction Action; 175226586Sdim return TableGenMain(argv[0], Action); 176226586Sdim} 177