1226633Sdim//===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed//
10226633Sdim// This file contains the main function for LLVM's TableGen.
11193323Sed//
12193323Sed//===----------------------------------------------------------------------===//
13193323Sed
14239462Sdim#include "TableGenBackends.h" // Declares all backends.
15223017Sdim#include "SetTheory.h"
16198090Srdivacky#include "llvm/Support/CommandLine.h"
17198090Srdivacky#include "llvm/Support/PrettyStackTrace.h"
18218893Sdim#include "llvm/Support/Signals.h"
19226633Sdim#include "llvm/TableGen/Error.h"
20226633Sdim#include "llvm/TableGen/Main.h"
21226633Sdim#include "llvm/TableGen/Record.h"
22226633Sdim
23193323Sedusing namespace llvm;
24193323Sed
25193323Sedenum ActionType {
26193323Sed  PrintRecords,
27193323Sed  GenEmitter,
28224145Sdim  GenRegisterInfo,
29224145Sdim  GenInstrInfo,
30224145Sdim  GenAsmWriter,
31224145Sdim  GenAsmMatcher,
32199989Srdivacky  GenDisassembler,
33224145Sdim  GenPseudoLowering,
34193323Sed  GenCallingConv,
35193323Sed  GenDAGISel,
36234353Sdim  GenDFAPacketizer,
37193323Sed  GenFastISel,
38193323Sed  GenSubtarget,
39193323Sed  GenIntrinsic,
40193323Sed  GenTgtIntrinsic,
41223017Sdim  PrintEnums,
42249423Sdim  PrintSets,
43249423Sdim  GenOptParserDefs,
44249423Sdim  GenCTags
45193323Sed};
46193323Sed
47193323Sednamespace {
48193323Sed  cl::opt<ActionType>
49193323Sed  Action(cl::desc("Action to perform:"),
50193323Sed         cl::values(clEnumValN(PrintRecords, "print-records",
51193323Sed                               "Print all records to stdout (default)"),
52193323Sed                    clEnumValN(GenEmitter, "gen-emitter",
53193323Sed                               "Generate machine code emitter"),
54224145Sdim                    clEnumValN(GenRegisterInfo, "gen-register-info",
55224145Sdim                               "Generate registers and register classes info"),
56224145Sdim                    clEnumValN(GenInstrInfo, "gen-instr-info",
57193323Sed                               "Generate instruction descriptions"),
58193323Sed                    clEnumValN(GenCallingConv, "gen-callingconv",
59193323Sed                               "Generate calling convention descriptions"),
60193323Sed                    clEnumValN(GenAsmWriter, "gen-asm-writer",
61193323Sed                               "Generate assembly writer"),
62199989Srdivacky                    clEnumValN(GenDisassembler, "gen-disassembler",
63199989Srdivacky                               "Generate disassembler"),
64224145Sdim                    clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
65224145Sdim                               "Generate pseudo instruction lowering"),
66198090Srdivacky                    clEnumValN(GenAsmMatcher, "gen-asm-matcher",
67198090Srdivacky                               "Generate assembly instruction matcher"),
68193323Sed                    clEnumValN(GenDAGISel, "gen-dag-isel",
69193323Sed                               "Generate a DAG instruction selector"),
70234353Sdim                    clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
71234353Sdim                               "Generate DFA Packetizer for VLIW targets"),
72193323Sed                    clEnumValN(GenFastISel, "gen-fast-isel",
73193323Sed                               "Generate a \"fast\" instruction selector"),
74193323Sed                    clEnumValN(GenSubtarget, "gen-subtarget",
75193323Sed                               "Generate subtarget enumerations"),
76193323Sed                    clEnumValN(GenIntrinsic, "gen-intrinsic",
77193323Sed                               "Generate intrinsic information"),
78193323Sed                    clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
79193323Sed                               "Generate target intrinsic information"),
80193323Sed                    clEnumValN(PrintEnums, "print-enums",
81193323Sed                               "Print enum values for a class"),
82223017Sdim                    clEnumValN(PrintSets, "print-sets",
83223017Sdim                               "Print expanded sets for testing DAG exprs"),
84249423Sdim                    clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
85249423Sdim                               "Generate option definitions"),
86249423Sdim                    clEnumValN(GenCTags, "gen-ctags",
87249423Sdim                               "Generate ctags-compatible index"),
88193323Sed                    clEnumValEnd));
89193323Sed
90193323Sed  cl::opt<std::string>
91193323Sed  Class("class", cl::desc("Print Enum list for this class"),
92234353Sdim          cl::value_desc("class name"));
93239462Sdim
94243830Sdimbool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
95243830Sdim  switch (Action) {
96243830Sdim  case PrintRecords:
97243830Sdim    OS << Records;           // No argument, dump all contents
98243830Sdim    break;
99243830Sdim  case GenEmitter:
100243830Sdim    EmitCodeEmitter(Records, OS);
101243830Sdim    break;
102243830Sdim  case GenRegisterInfo:
103243830Sdim    EmitRegisterInfo(Records, OS);
104243830Sdim    break;
105243830Sdim  case GenInstrInfo:
106243830Sdim    EmitInstrInfo(Records, OS);
107243830Sdim    break;
108243830Sdim  case GenCallingConv:
109243830Sdim    EmitCallingConv(Records, OS);
110243830Sdim    break;
111243830Sdim  case GenAsmWriter:
112243830Sdim    EmitAsmWriter(Records, OS);
113243830Sdim    break;
114243830Sdim  case GenAsmMatcher:
115243830Sdim    EmitAsmMatcher(Records, OS);
116243830Sdim    break;
117243830Sdim  case GenDisassembler:
118243830Sdim    EmitDisassembler(Records, OS);
119243830Sdim    break;
120243830Sdim  case GenPseudoLowering:
121243830Sdim    EmitPseudoLowering(Records, OS);
122243830Sdim    break;
123243830Sdim  case GenDAGISel:
124243830Sdim    EmitDAGISel(Records, OS);
125243830Sdim    break;
126243830Sdim  case GenDFAPacketizer:
127243830Sdim    EmitDFAPacketizer(Records, OS);
128243830Sdim    break;
129243830Sdim  case GenFastISel:
130243830Sdim    EmitFastISel(Records, OS);
131243830Sdim    break;
132243830Sdim  case GenSubtarget:
133243830Sdim    EmitSubtarget(Records, OS);
134243830Sdim    break;
135243830Sdim  case GenIntrinsic:
136243830Sdim    EmitIntrinsics(Records, OS);
137243830Sdim    break;
138243830Sdim  case GenTgtIntrinsic:
139243830Sdim    EmitIntrinsics(Records, OS, true);
140243830Sdim    break;
141249423Sdim  case GenOptParserDefs:
142249423Sdim    EmitOptParser(Records, OS);
143243830Sdim    break;
144243830Sdim  case PrintEnums:
145243830Sdim  {
146243830Sdim    std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class);
147243830Sdim    for (unsigned i = 0, e = Recs.size(); i != e; ++i)
148243830Sdim      OS << Recs[i]->getName() << ", ";
149243830Sdim    OS << "\n";
150243830Sdim    break;
151243830Sdim  }
152243830Sdim  case PrintSets:
153243830Sdim  {
154243830Sdim    SetTheory Sets;
155243830Sdim    Sets.addFieldExpander("Set", "Elements");
156243830Sdim    std::vector<Record*> Recs = Records.getAllDerivedDefinitions("Set");
157243830Sdim    for (unsigned i = 0, e = Recs.size(); i != e; ++i) {
158243830Sdim      OS << Recs[i]->getName() << " = [";
159243830Sdim      const std::vector<Record*> *Elts = Sets.expand(Recs[i]);
160243830Sdim      assert(Elts && "Couldn't expand Set instance");
161243830Sdim      for (unsigned ei = 0, ee = Elts->size(); ei != ee; ++ei)
162243830Sdim        OS << ' ' << (*Elts)[ei]->getName();
163243830Sdim      OS << " ]\n";
164243830Sdim    }
165243830Sdim    break;
166243830Sdim  }
167249423Sdim  case GenCTags:
168249423Sdim    EmitCTags(Records, OS);
169249423Sdim    break;
170243830Sdim  }
171239462Sdim
172243830Sdim  return false;
173234353Sdim}
174243830Sdim}
175208599Srdivacky
176226633Sdimint main(int argc, char **argv) {
177226633Sdim  sys::PrintStackTraceOnErrorSignal();
178226633Sdim  PrettyStackTraceProgram X(argc, argv);
179226633Sdim  cl::ParseCommandLineOptions(argc, argv);
180226633Sdim
181243830Sdim  return TableGenMain(argv[0], &LLVMTableGenMain);
182193323Sed}
183