1 //===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===// 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 LLVM's TableGen. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "AsmMatcherEmitter.h" 15 #include "AsmWriterEmitter.h" 16 #include "CallingConvEmitter.h" 17 #include "ClangASTNodesEmitter.h" 18 #include "ClangAttrEmitter.h" 19 #include "ClangDiagnosticsEmitter.h" 20 #include "ClangSACheckersEmitter.h" 21 #include "CodeEmitterGen.h" 22 #include "DAGISelEmitter.h" 23 #include "DisassemblerEmitter.h" 24 #include "EDEmitter.h" 25 #include "FastISelEmitter.h" 26 #include "InstrInfoEmitter.h" 27 #include "IntrinsicEmitter.h" 28 #include "NeonEmitter.h" 29 #include "OptParserEmitter.h" 30 #include "PseudoLoweringEmitter.h" 31 #include "RegisterInfoEmitter.h" 32 #include "ARMDecoderEmitter.h" 33 #include "SubtargetEmitter.h" 34 #include "SetTheory.h" 35 36 #include "llvm/Support/CommandLine.h" 37 #include "llvm/Support/PrettyStackTrace.h" 38 #include "llvm/Support/Signals.h" 39 #include "llvm/TableGen/Error.h" 40 #include "llvm/TableGen/Main.h" 41 #include "llvm/TableGen/Record.h" 42 #include "llvm/TableGen/TableGenAction.h" 43 44 using namespace llvm; 45 46 enum ActionType { 47 PrintRecords, 48 GenEmitter, 49 GenRegisterInfo, 50 GenInstrInfo, 51 GenAsmWriter, 52 GenAsmMatcher, 53 GenARMDecoder, 54 GenDisassembler, 55 GenPseudoLowering, 56 GenCallingConv, 57 GenClangAttrClasses, 58 GenClangAttrImpl, 59 GenClangAttrList, 60 GenClangAttrPCHRead, 61 GenClangAttrPCHWrite, 62 GenClangAttrSpellingList, 63 GenClangAttrLateParsedList, 64 GenClangDiagsDefs, 65 GenClangDiagGroups, 66 GenClangDiagsIndexName, 67 GenClangDeclNodes, 68 GenClangStmtNodes, 69 GenClangSACheckers, 70 GenDAGISel, 71 GenFastISel, 72 GenOptParserDefs, GenOptParserImpl, 73 GenSubtarget, 74 GenIntrinsic, 75 GenTgtIntrinsic, 76 GenEDInfo, 77 GenArmNeon, 78 GenArmNeonSema, 79 GenArmNeonTest, 80 PrintEnums, 81 PrintSets 82 }; 83 84 namespace { 85 cl::opt<ActionType> 86 Action(cl::desc("Action to perform:"), 87 cl::values(clEnumValN(PrintRecords, "print-records", 88 "Print all records to stdout (default)"), 89 clEnumValN(GenEmitter, "gen-emitter", 90 "Generate machine code emitter"), 91 clEnumValN(GenRegisterInfo, "gen-register-info", 92 "Generate registers and register classes info"), 93 clEnumValN(GenInstrInfo, "gen-instr-info", 94 "Generate instruction descriptions"), 95 clEnumValN(GenCallingConv, "gen-callingconv", 96 "Generate calling convention descriptions"), 97 clEnumValN(GenAsmWriter, "gen-asm-writer", 98 "Generate assembly writer"), 99 clEnumValN(GenARMDecoder, "gen-arm-decoder", 100 "Generate decoders for ARM/Thumb"), 101 clEnumValN(GenDisassembler, "gen-disassembler", 102 "Generate disassembler"), 103 clEnumValN(GenPseudoLowering, "gen-pseudo-lowering", 104 "Generate pseudo instruction lowering"), 105 clEnumValN(GenAsmMatcher, "gen-asm-matcher", 106 "Generate assembly instruction matcher"), 107 clEnumValN(GenDAGISel, "gen-dag-isel", 108 "Generate a DAG instruction selector"), 109 clEnumValN(GenFastISel, "gen-fast-isel", 110 "Generate a \"fast\" instruction selector"), 111 clEnumValN(GenOptParserDefs, "gen-opt-parser-defs", 112 "Generate option definitions"), 113 clEnumValN(GenOptParserImpl, "gen-opt-parser-impl", 114 "Generate option parser implementation"), 115 clEnumValN(GenSubtarget, "gen-subtarget", 116 "Generate subtarget enumerations"), 117 clEnumValN(GenIntrinsic, "gen-intrinsic", 118 "Generate intrinsic information"), 119 clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic", 120 "Generate target intrinsic information"), 121 clEnumValN(GenClangAttrClasses, "gen-clang-attr-classes", 122 "Generate clang attribute clases"), 123 clEnumValN(GenClangAttrImpl, "gen-clang-attr-impl", 124 "Generate clang attribute implementations"), 125 clEnumValN(GenClangAttrList, "gen-clang-attr-list", 126 "Generate a clang attribute list"), 127 clEnumValN(GenClangAttrPCHRead, "gen-clang-attr-pch-read", 128 "Generate clang PCH attribute reader"), 129 clEnumValN(GenClangAttrPCHWrite, "gen-clang-attr-pch-write", 130 "Generate clang PCH attribute writer"), 131 clEnumValN(GenClangAttrSpellingList, 132 "gen-clang-attr-spelling-list", 133 "Generate a clang attribute spelling list"), 134 clEnumValN(GenClangAttrLateParsedList, 135 "gen-clang-attr-late-parsed-list", 136 "Generate a clang attribute LateParsed list"), 137 clEnumValN(GenClangDiagsDefs, "gen-clang-diags-defs", 138 "Generate Clang diagnostics definitions"), 139 clEnumValN(GenClangDiagGroups, "gen-clang-diag-groups", 140 "Generate Clang diagnostic groups"), 141 clEnumValN(GenClangDiagsIndexName, 142 "gen-clang-diags-index-name", 143 "Generate Clang diagnostic name index"), 144 clEnumValN(GenClangDeclNodes, "gen-clang-decl-nodes", 145 "Generate Clang AST declaration nodes"), 146 clEnumValN(GenClangStmtNodes, "gen-clang-stmt-nodes", 147 "Generate Clang AST statement nodes"), 148 clEnumValN(GenClangSACheckers, "gen-clang-sa-checkers", 149 "Generate Clang Static Analyzer checkers"), 150 clEnumValN(GenEDInfo, "gen-enhanced-disassembly-info", 151 "Generate enhanced disassembly info"), 152 clEnumValN(GenArmNeon, "gen-arm-neon", 153 "Generate arm_neon.h for clang"), 154 clEnumValN(GenArmNeonSema, "gen-arm-neon-sema", 155 "Generate ARM NEON sema support for clang"), 156 clEnumValN(GenArmNeonTest, "gen-arm-neon-test", 157 "Generate ARM NEON tests for clang"), 158 clEnumValN(PrintEnums, "print-enums", 159 "Print enum values for a class"), 160 clEnumValN(PrintSets, "print-sets", 161 "Print expanded sets for testing DAG exprs"), 162 clEnumValEnd)); 163 164 cl::opt<std::string> 165 Class("class", cl::desc("Print Enum list for this class"), 166 cl::value_desc("class name")); 167 168 cl::opt<std::string> 169 ClangComponent("clang-component", 170 cl::desc("Only use warnings from specified component"), 171 cl::value_desc("component"), cl::Hidden); 172 } 173 174 class LLVMTableGenAction : public TableGenAction { 175 public: 176 bool operator()(raw_ostream &OS, RecordKeeper &Records) { 177 switch (Action) { 178 case PrintRecords: 179 OS << Records; // No argument, dump all contents 180 break; 181 case GenEmitter: 182 CodeEmitterGen(Records).run(OS); 183 break; 184 case GenRegisterInfo: 185 RegisterInfoEmitter(Records).run(OS); 186 break; 187 case GenInstrInfo: 188 InstrInfoEmitter(Records).run(OS); 189 break; 190 case GenCallingConv: 191 CallingConvEmitter(Records).run(OS); 192 break; 193 case GenAsmWriter: 194 AsmWriterEmitter(Records).run(OS); 195 break; 196 case GenARMDecoder: 197 ARMDecoderEmitter(Records).run(OS); 198 break; 199 case GenAsmMatcher: 200 AsmMatcherEmitter(Records).run(OS); 201 break; 202 case GenClangAttrClasses: 203 ClangAttrClassEmitter(Records).run(OS); 204 break; 205 case GenClangAttrImpl: 206 ClangAttrImplEmitter(Records).run(OS); 207 break; 208 case GenClangAttrList: 209 ClangAttrListEmitter(Records).run(OS); 210 break; 211 case GenClangAttrPCHRead: 212 ClangAttrPCHReadEmitter(Records).run(OS); 213 break; 214 case GenClangAttrPCHWrite: 215 ClangAttrPCHWriteEmitter(Records).run(OS); 216 break; 217 case GenClangAttrSpellingList: 218 ClangAttrSpellingListEmitter(Records).run(OS); 219 break; 220 case GenClangAttrLateParsedList: 221 ClangAttrLateParsedListEmitter(Records).run(OS); 222 break; 223 case GenClangDiagsDefs: 224 ClangDiagsDefsEmitter(Records, ClangComponent).run(OS); 225 break; 226 case GenClangDiagGroups: 227 ClangDiagGroupsEmitter(Records).run(OS); 228 break; 229 case GenClangDiagsIndexName: 230 ClangDiagsIndexNameEmitter(Records).run(OS); 231 break; 232 case GenClangDeclNodes: 233 ClangASTNodesEmitter(Records, "Decl", "Decl").run(OS); 234 ClangDeclContextEmitter(Records).run(OS); 235 break; 236 case GenClangStmtNodes: 237 ClangASTNodesEmitter(Records, "Stmt", "").run(OS); 238 break; 239 case GenClangSACheckers: 240 ClangSACheckersEmitter(Records).run(OS); 241 break; 242 case GenDisassembler: 243 DisassemblerEmitter(Records).run(OS); 244 break; 245 case GenPseudoLowering: 246 PseudoLoweringEmitter(Records).run(OS); 247 break; 248 case GenOptParserDefs: 249 OptParserEmitter(Records, true).run(OS); 250 break; 251 case GenOptParserImpl: 252 OptParserEmitter(Records, false).run(OS); 253 break; 254 case GenDAGISel: 255 DAGISelEmitter(Records).run(OS); 256 break; 257 case GenFastISel: 258 FastISelEmitter(Records).run(OS); 259 break; 260 case GenSubtarget: 261 SubtargetEmitter(Records).run(OS); 262 break; 263 case GenIntrinsic: 264 IntrinsicEmitter(Records).run(OS); 265 break; 266 case GenTgtIntrinsic: 267 IntrinsicEmitter(Records, true).run(OS); 268 break; 269 case GenEDInfo: 270 EDEmitter(Records).run(OS); 271 break; 272 case GenArmNeon: 273 NeonEmitter(Records).run(OS); 274 break; 275 case GenArmNeonSema: 276 NeonEmitter(Records).runHeader(OS); 277 break; 278 case GenArmNeonTest: 279 NeonEmitter(Records).runTests(OS); 280 break; 281 case PrintEnums: 282 { 283 std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class); 284 for (unsigned i = 0, e = Recs.size(); i != e; ++i) 285 OS << Recs[i]->getName() << ", "; 286 OS << "\n"; 287 break; 288 } 289 case PrintSets: 290 { 291 SetTheory Sets; 292 Sets.addFieldExpander("Set", "Elements"); 293 std::vector<Record*> Recs = Records.getAllDerivedDefinitions("Set"); 294 for (unsigned i = 0, e = Recs.size(); i != e; ++i) { 295 OS << Recs[i]->getName() << " = ["; 296 const std::vector<Record*> *Elts = Sets.expand(Recs[i]); 297 assert(Elts && "Couldn't expand Set instance"); 298 for (unsigned ei = 0, ee = Elts->size(); ei != ee; ++ei) 299 OS << ' ' << (*Elts)[ei]->getName(); 300 OS << " ]\n"; 301 } 302 break; 303 } 304 default: 305 assert(1 && "Invalid Action"); 306 return true; 307 } 308 309 return false; 310 } 311 }; 312 313 int main(int argc, char **argv) { 314 sys::PrintStackTraceOnErrorSignal(); 315 PrettyStackTraceProgram X(argc, argv); 316 cl::ParseCommandLineOptions(argc, argv); 317 318 LLVMTableGenAction Action; 319 return TableGenMain(argv[0], Action); 320 } 321