TableGen.cpp revision 239462
1193323Sed//===- 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//
10193323Sed// This file contains the main function for LLVM's TableGen.
11193323Sed//
12193323Sed//===----------------------------------------------------------------------===//
13193323Sed
14193323Sed#include "TableGenBackends.h" // Declares all backends.
15193323Sed
16193323Sed#include "SetTheory.h"
17193323Sed#include "llvm/Support/CommandLine.h"
18198090Srdivacky#include "llvm/Support/PrettyStackTrace.h"
19193323Sed#include "llvm/Support/Signals.h"
20193323Sed#include "llvm/TableGen/Error.h"
21198090Srdivacky#include "llvm/TableGen/Main.h"
22193323Sed#include "llvm/TableGen/Record.h"
23193323Sed#include "llvm/TableGen/TableGenAction.h"
24193323Sed
25193323Sedusing namespace llvm;
26193323Sed
27198090Srdivackyenum ActionType {
28193323Sed  PrintRecords,
29193323Sed  GenEmitter,
30193323Sed  GenRegisterInfo,
31193323Sed  GenInstrInfo,
32193323Sed  GenAsmWriter,
33193323Sed  GenAsmMatcher,
34193323Sed  GenDisassembler,
35193323Sed  GenPseudoLowering,
36193323Sed  GenCallingConv,
37193323Sed  GenDAGISel,
38193323Sed  GenDFAPacketizer,
39193323Sed  GenFastISel,
40193323Sed  GenSubtarget,
41193323Sed  GenIntrinsic,
42193323Sed  GenTgtIntrinsic,
43193323Sed  GenEDInfo,
44193323Sed  PrintEnums,
45193323Sed  PrintSets
46193323Sed};
47193323Sed
48193323Sednamespace {
49193323Sed  cl::opt<ActionType>
50193323Sed  Action(cl::desc("Action to perform:"),
51193323Sed         cl::values(clEnumValN(PrintRecords, "print-records",
52193323Sed                               "Print all records to stdout (default)"),
53193323Sed                    clEnumValN(GenEmitter, "gen-emitter",
54193323Sed                               "Generate machine code emitter"),
55193323Sed                    clEnumValN(GenRegisterInfo, "gen-register-info",
56193323Sed                               "Generate registers and register classes info"),
57193323Sed                    clEnumValN(GenInstrInfo, "gen-instr-info",
58193323Sed                               "Generate instruction descriptions"),
59193323Sed                    clEnumValN(GenCallingConv, "gen-callingconv",
60193323Sed                               "Generate calling convention descriptions"),
61193323Sed                    clEnumValN(GenAsmWriter, "gen-asm-writer",
62193323Sed                               "Generate assembly writer"),
63193323Sed                    clEnumValN(GenDisassembler, "gen-disassembler",
64193323Sed                               "Generate disassembler"),
65193323Sed                    clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
66193323Sed                               "Generate pseudo instruction lowering"),
67193323Sed                    clEnumValN(GenAsmMatcher, "gen-asm-matcher",
68193323Sed                               "Generate assembly instruction matcher"),
69193323Sed                    clEnumValN(GenDAGISel, "gen-dag-isel",
70193323Sed                               "Generate a DAG instruction selector"),
71193323Sed                    clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
72193323Sed                               "Generate DFA Packetizer for VLIW targets"),
73193323Sed                    clEnumValN(GenFastISel, "gen-fast-isel",
74193323Sed                               "Generate a \"fast\" instruction selector"),
75193323Sed                    clEnumValN(GenSubtarget, "gen-subtarget",
76193323Sed                               "Generate subtarget enumerations"),
77193323Sed                    clEnumValN(GenIntrinsic, "gen-intrinsic",
78193323Sed                               "Generate intrinsic information"),
79193323Sed                    clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
80193323Sed                               "Generate target intrinsic information"),
81193323Sed                    clEnumValN(GenEDInfo, "gen-enhanced-disassembly-info",
82193323Sed                               "Generate enhanced disassembly info"),
83193323Sed                    clEnumValN(PrintEnums, "print-enums",
84193323Sed                               "Print enum values for a class"),
85193323Sed                    clEnumValN(PrintSets, "print-sets",
86193323Sed                               "Print expanded sets for testing DAG exprs"),
87193323Sed                    clEnumValEnd));
88193323Sed
89193323Sed  cl::opt<std::string>
90193323Sed  Class("class", cl::desc("Print Enum list for this class"),
91193323Sed          cl::value_desc("class name"));
92193323Sed
93193323Sed  class LLVMTableGenAction : public TableGenAction {
94193323Sed  public:
95193323Sed    bool operator()(raw_ostream &OS, RecordKeeper &Records) {
96193323Sed      switch (Action) {
97193323Sed      case PrintRecords:
98193323Sed        OS << Records;           // No argument, dump all contents
99193323Sed        break;
100193323Sed      case GenEmitter:
101193323Sed        EmitCodeEmitter(Records, OS);
102193323Sed        break;
103193323Sed      case GenRegisterInfo:
104193323Sed        EmitRegisterInfo(Records, OS);
105193323Sed        break;
106193323Sed      case GenInstrInfo:
107193323Sed        EmitInstrInfo(Records, OS);
108193323Sed        break;
109193323Sed      case GenCallingConv:
110193323Sed        EmitCallingConv(Records, OS);
111193323Sed        break;
112193323Sed      case GenAsmWriter:
113193323Sed        EmitAsmWriter(Records, OS);
114193323Sed        break;
115193323Sed      case GenAsmMatcher:
116193323Sed        EmitAsmMatcher(Records, OS);
117193323Sed        break;
118193323Sed      case GenDisassembler:
119193323Sed        EmitDisassembler(Records, OS);
120193323Sed        break;
121193323Sed      case GenPseudoLowering:
122193323Sed        EmitPseudoLowering(Records, OS);
123193323Sed        break;
124193323Sed      case GenDAGISel:
125193323Sed        EmitDAGISel(Records, OS);
126193323Sed        break;
127198090Srdivacky      case GenDFAPacketizer:
128193323Sed        EmitDFAPacketizer(Records, OS);
129193323Sed        break;
130193323Sed      case GenFastISel:
131193323Sed        EmitFastISel(Records, OS);
132193323Sed        break;
133193323Sed      case GenSubtarget:
134193323Sed        EmitSubtarget(Records, OS);
135193323Sed        break;
136193323Sed      case GenIntrinsic:
137193323Sed        EmitIntrinsics(Records, OS);
138193323Sed        break;
139193323Sed      case GenTgtIntrinsic:
140193323Sed        EmitIntrinsics(Records, OS, true);
141193323Sed        break;
142193323Sed      case GenEDInfo:
143193323Sed        EmitEnhancedDisassemblerInfo(Records, OS);
144193323Sed        break;
145193323Sed      case PrintEnums:
146193323Sed      {
147193323Sed        std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class);
148193323Sed        for (unsigned i = 0, e = Recs.size(); i != e; ++i)
149193323Sed          OS << Recs[i]->getName() << ", ";
150193323Sed        OS << "\n";
151193323Sed        break;
152193323Sed      }
153193323Sed      case PrintSets:
154193323Sed      {
155193323Sed        SetTheory Sets;
156193323Sed        Sets.addFieldExpander("Set", "Elements");
157193323Sed        std::vector<Record*> Recs = Records.getAllDerivedDefinitions("Set");
158193323Sed        for (unsigned i = 0, e = Recs.size(); i != e; ++i) {
159193323Sed          OS << Recs[i]->getName() << " = [";
160193323Sed          const std::vector<Record*> *Elts = Sets.expand(Recs[i]);
161193323Sed          assert(Elts && "Couldn't expand Set instance");
162193323Sed          for (unsigned ei = 0, ee = Elts->size(); ei != ee; ++ei)
163193323Sed            OS << ' ' << (*Elts)[ei]->getName();
164193323Sed          OS << " ]\n";
165193323Sed        }
166193323Sed        break;
167193323Sed      }
168193323Sed      }
169193323Sed
170193323Sed      return false;
171193323Sed    }
172193323Sed  };
173193323Sed}
174193323Sed
175193323Sedint main(int argc, char **argv) {
176193323Sed  sys::PrintStackTraceOnErrorSignal();
177193323Sed  PrettyStackTraceProgram X(argc, argv);
178193323Sed  cl::ParseCommandLineOptions(argc, argv);
179193323Sed
180193323Sed  LLVMTableGenAction Action;
181193323Sed  return TableGenMain(argv[0], Action);
182193323Sed}
183193323Sed