TableGen.cpp revision 51d7777a21b9706d503496c650af06f80d278c1a
193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//===- TableGen.cpp - Top-Level TableGen implementation for Clang ---------===// 293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// 393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// The LLVM Compiler Infrastructure 493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// 593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// This file is distributed under the University of Illinois Open Source 693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// License. See LICENSE.TXT for details. 793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// 893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//===----------------------------------------------------------------------===// 993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// 1093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// This file contains the main function for Clang's TableGen. 1193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org// 1293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org//===----------------------------------------------------------------------===// 1393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 1493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "ClangASTNodesEmitter.h" 1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "ClangAttrEmitter.h" 1693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "ClangDiagnosticsEmitter.h" 1793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "ClangSACheckersEmitter.h" 1893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "NeonEmitter.h" 1993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "OptParserEmitter.h" 2093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 2193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/Support/CommandLine.h" 2293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/Support/PrettyStackTrace.h" 2393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/Support/Signals.h" 2493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/TableGen/Error.h" 2593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/TableGen/Main.h" 2693a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/TableGen/Record.h" 2793a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org#include "llvm/TableGen/TableGenAction.h" 2893a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 2993a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgusing namespace llvm; 3093a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 3193a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.orgenum ActionType { 3293a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org GenClangAttrClasses, 3393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org GenClangAttrImpl, 3493a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org GenClangAttrList, 35 GenClangAttrPCHRead, 36 GenClangAttrPCHWrite, 37 GenClangAttrSpellingList, 38 GenClangAttrLateParsedList, 39 GenClangDiagsDefs, 40 GenClangDiagGroups, 41 GenClangDiagsIndexName, 42 GenClangDeclNodes, 43 GenClangStmtNodes, 44 GenClangSACheckers, 45 GenOptParserDefs, GenOptParserImpl, 46 GenArmNeon, 47 GenArmNeonSema, 48 GenArmNeonTest 49}; 50 51namespace { 52 cl::opt<ActionType> 53 Action(cl::desc("Action to perform:"), 54 cl::values(clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", 55 "Generate option definitions"), 56 clEnumValN(GenOptParserImpl, "gen-opt-parser-impl", 57 "Generate option parser implementation"), 58 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 59 "Generate clang attribute clases"), 60 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 61 "Generate clang attribute implementations"), 62 clEnumValN(GenClangAttrList, "gen-clang-attr-list", 63 "Generate a clang attribute list"), 64 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 65 "Generate clang PCH attribute reader"), 66 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 67 "Generate clang PCH attribute writer"), 68 clEnumValN(GenClangAttrSpellingList, 69 "gen-clang-attr-spelling-list", 70 "Generate a clang attribute spelling list"), 71 clEnumValN(GenClangAttrLateParsedList, 72 "gen-clang-attr-late-parsed-list", 73 "Generate a clang attribute LateParsed list"), 74 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 75 "Generate Clang diagnostics definitions"), 76 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 77 "Generate Clang diagnostic groups"), 78 clEnumValN(GenClangDiagsIndexName, 79 "gen-clang-diags-index-name", 80 "Generate Clang diagnostic name index"), 81 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 82 "Generate Clang AST declaration nodes"), 83 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 84 "Generate Clang AST statement nodes"), 85 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 86 "Generate Clang Static Analyzer checkers"), 87 clEnumValN(GenArmNeon, "gen-arm-neon", 88 "Generate arm_neon.h for clang"), 89 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 90 "Generate ARM NEON sema support for clang"), 91 clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 92 "Generate ARM NEON tests for clang"), 93 clEnumValEnd)); 94 95 cl::opt<std::string> 96 ClangComponent("clang-component", 97 cl::desc("Only use warnings from specified component"), 98 cl::value_desc("component"), cl::Hidden); 99} 100 101class ClangTableGenAction : public TableGenAction { 102public: 103 bool operator()(raw_ostream &OS, RecordKeeper &Records) { 104 switch (Action) { 105 case GenClangAttrClasses: 106 ClangAttrClassEmitter(Records).run(OS); 107 break; 108 case GenClangAttrImpl: 109 ClangAttrImplEmitter(Records).run(OS); 110 break; 111 case GenClangAttrList: 112 ClangAttrListEmitter(Records).run(OS); 113 break; 114 case GenClangAttrPCHRead: 115 ClangAttrPCHReadEmitter(Records).run(OS); 116 break; 117 case GenClangAttrPCHWrite: 118 ClangAttrPCHWriteEmitter(Records).run(OS); 119 break; 120 case GenClangAttrSpellingList: 121 ClangAttrSpellingListEmitter(Records).run(OS); 122 break; 123 case GenClangAttrLateParsedList: 124 ClangAttrLateParsedListEmitter(Records).run(OS); 125 break; 126 case GenClangDiagsDefs: 127 ClangDiagsDefsEmitter(Records, ClangComponent).run(OS); 128 break; 129 case GenClangDiagGroups: 130 ClangDiagGroupsEmitter(Records).run(OS); 131 break; 132 case GenClangDiagsIndexName: 133 ClangDiagsIndexNameEmitter(Records).run(OS); 134 break; 135 case GenClangDeclNodes: 136 ClangASTNodesEmitter(Records, "Decl", "Decl").run(OS); 137 ClangDeclContextEmitter(Records).run(OS); 138 break; 139 case GenClangStmtNodes: 140 ClangASTNodesEmitter(Records, "Stmt", "").run(OS); 141 break; 142 case GenClangSACheckers: 143 ClangSACheckersEmitter(Records).run(OS); 144 break; 145 case GenOptParserDefs: 146 OptParserEmitter(Records, true).run(OS); 147 break; 148 case GenOptParserImpl: 149 OptParserEmitter(Records, false).run(OS); 150 break; 151 case GenArmNeon: 152 NeonEmitter(Records).run(OS); 153 break; 154 case GenArmNeonSema: 155 NeonEmitter(Records).runHeader(OS); 156 break; 157 case GenArmNeonTest: 158 NeonEmitter(Records).runTests(OS); 159 break; 160 default: 161 assert(1 && "Invalid Action"); 162 return true; 163 } 164 165 return false; 166 } 167}; 168 169int main(int argc, char **argv) { 170 sys::PrintStackTraceOnErrorSignal(); 171 PrettyStackTraceProgram X(argc, argv); 172 cl::ParseCommandLineOptions(argc, argv); 173 174 ClangTableGenAction Action; 175 return TableGenMain(argv[0], Action); 176} 177