TableGen.cpp revision 276479
1176348Smarcel//===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===//
2176348Smarcel//
3275763Sandrew//                     The LLVM Compiler Infrastructure
4275763Sandrew//
5177152Sobrien// This file is distributed under the University of Illinois Open Source
6177152Sobrien// License. See LICENSE.TXT for details.
7275763Sandrew//
8275763Sandrew//===----------------------------------------------------------------------===//
9275763Sandrew//
10275763Sandrew// This file contains the main function for LLVM's TableGen.
11176348Smarcel//
12//===----------------------------------------------------------------------===//
13
14#include "TableGenBackends.h" // Declares all backends.
15#include "llvm/Support/CommandLine.h"
16#include "llvm/Support/PrettyStackTrace.h"
17#include "llvm/Support/Signals.h"
18#include "llvm/TableGen/Error.h"
19#include "llvm/TableGen/Main.h"
20#include "llvm/TableGen/Record.h"
21#include "llvm/TableGen/SetTheory.h"
22
23using namespace llvm;
24
25enum ActionType {
26  PrintRecords,
27  GenEmitter,
28  GenRegisterInfo,
29  GenInstrInfo,
30  GenAsmWriter,
31  GenAsmMatcher,
32  GenDisassembler,
33  GenPseudoLowering,
34  GenCallingConv,
35  GenDAGISel,
36  GenDFAPacketizer,
37  GenFastISel,
38  GenSubtarget,
39  GenIntrinsic,
40  GenTgtIntrinsic,
41  PrintEnums,
42  PrintSets,
43  GenOptParserDefs,
44  GenCTags
45};
46
47namespace {
48  cl::opt<ActionType>
49  Action(cl::desc("Action to perform:"),
50         cl::values(clEnumValN(PrintRecords, "print-records",
51                               "Print all records to stdout (default)"),
52                    clEnumValN(GenEmitter, "gen-emitter",
53                               "Generate machine code emitter"),
54                    clEnumValN(GenRegisterInfo, "gen-register-info",
55                               "Generate registers and register classes info"),
56                    clEnumValN(GenInstrInfo, "gen-instr-info",
57                               "Generate instruction descriptions"),
58                    clEnumValN(GenCallingConv, "gen-callingconv",
59                               "Generate calling convention descriptions"),
60                    clEnumValN(GenAsmWriter, "gen-asm-writer",
61                               "Generate assembly writer"),
62                    clEnumValN(GenDisassembler, "gen-disassembler",
63                               "Generate disassembler"),
64                    clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
65                               "Generate pseudo instruction lowering"),
66                    clEnumValN(GenAsmMatcher, "gen-asm-matcher",
67                               "Generate assembly instruction matcher"),
68                    clEnumValN(GenDAGISel, "gen-dag-isel",
69                               "Generate a DAG instruction selector"),
70                    clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
71                               "Generate DFA Packetizer for VLIW targets"),
72                    clEnumValN(GenFastISel, "gen-fast-isel",
73                               "Generate a \"fast\" instruction selector"),
74                    clEnumValN(GenSubtarget, "gen-subtarget",
75                               "Generate subtarget enumerations"),
76                    clEnumValN(GenIntrinsic, "gen-intrinsic",
77                               "Generate intrinsic information"),
78                    clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
79                               "Generate target intrinsic information"),
80                    clEnumValN(PrintEnums, "print-enums",
81                               "Print enum values for a class"),
82                    clEnumValN(PrintSets, "print-sets",
83                               "Print expanded sets for testing DAG exprs"),
84                    clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
85                               "Generate option definitions"),
86                    clEnumValN(GenCTags, "gen-ctags",
87                               "Generate ctags-compatible index"),
88                    clEnumValEnd));
89
90  cl::opt<std::string>
91  Class("class", cl::desc("Print Enum list for this class"),
92          cl::value_desc("class name"));
93
94bool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
95  switch (Action) {
96  case PrintRecords:
97    OS << Records;           // No argument, dump all contents
98    break;
99  case GenEmitter:
100    EmitCodeEmitter(Records, OS);
101    break;
102  case GenRegisterInfo:
103    EmitRegisterInfo(Records, OS);
104    break;
105  case GenInstrInfo:
106    EmitInstrInfo(Records, OS);
107    break;
108  case GenCallingConv:
109    EmitCallingConv(Records, OS);
110    break;
111  case GenAsmWriter:
112    EmitAsmWriter(Records, OS);
113    break;
114  case GenAsmMatcher:
115    EmitAsmMatcher(Records, OS);
116    break;
117  case GenDisassembler:
118    EmitDisassembler(Records, OS);
119    break;
120  case GenPseudoLowering:
121    EmitPseudoLowering(Records, OS);
122    break;
123  case GenDAGISel:
124    EmitDAGISel(Records, OS);
125    break;
126  case GenDFAPacketizer:
127    EmitDFAPacketizer(Records, OS);
128    break;
129  case GenFastISel:
130    EmitFastISel(Records, OS);
131    break;
132  case GenSubtarget:
133    EmitSubtarget(Records, OS);
134    break;
135  case GenIntrinsic:
136    EmitIntrinsics(Records, OS);
137    break;
138  case GenTgtIntrinsic:
139    EmitIntrinsics(Records, OS, true);
140    break;
141  case GenOptParserDefs:
142    EmitOptParser(Records, OS);
143    break;
144  case PrintEnums:
145  {
146    std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class);
147    for (unsigned i = 0, e = Recs.size(); i != e; ++i)
148      OS << Recs[i]->getName() << ", ";
149    OS << "\n";
150    break;
151  }
152  case PrintSets:
153  {
154    SetTheory Sets;
155    Sets.addFieldExpander("Set", "Elements");
156    std::vector<Record*> Recs = Records.getAllDerivedDefinitions("Set");
157    for (unsigned i = 0, e = Recs.size(); i != e; ++i) {
158      OS << Recs[i]->getName() << " = [";
159      const std::vector<Record*> *Elts = Sets.expand(Recs[i]);
160      assert(Elts && "Couldn't expand Set instance");
161      for (unsigned ei = 0, ee = Elts->size(); ei != ee; ++ei)
162        OS << ' ' << (*Elts)[ei]->getName();
163      OS << " ]\n";
164    }
165    break;
166  }
167  case GenCTags:
168    EmitCTags(Records, OS);
169    break;
170  }
171
172  return false;
173}
174}
175
176int main(int argc, char **argv) {
177  sys::PrintStackTraceOnErrorSignal();
178  PrettyStackTraceProgram X(argc, argv);
179  cl::ParseCommandLineOptions(argc, argv);
180
181  return TableGenMain(argv[0], &LLVMTableGenMain);
182}
183
184#ifdef __has_feature
185#if __has_feature(address_sanitizer)
186#include <sanitizer/lsan_interface.h>
187// Disable LeakSanitizer for this binary as it has too many leaks that are not
188// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
189int __lsan_is_turned_off() { return 1; }
190#endif  // __has_feature(address_sanitizer)
191#endif  // defined(__has_feature)
192