17c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne//===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//                     The LLVM Compiler Infrastructure
401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//
53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source
63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details.
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===//
91d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner//
107c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne// This file contains the main function for LLVM's TableGen.
111d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner//
121d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner//===----------------------------------------------------------------------===//
131d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner
146f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen#include "TableGenBackends.h" // Declares all backends.
1581cb8caa3eb482d45e0fd54f8022384256619178Chris Lattner#include "llvm/Support/CommandLine.h"
1681cb8caa3eb482d45e0fd54f8022384256619178Chris Lattner#include "llvm/Support/PrettyStackTrace.h"
171f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/Signals.h"
187c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Error.h"
197c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Main.h"
207c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Record.h"
21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/TableGen/SetTheory.h"
227c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne
232082ebe8b3a5db302748828ab4f79a36d239c1d9Chris Lattnerusing namespace llvm;
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
25bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattnerenum ActionType {
26bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  PrintRecords,
27bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  GenEmitter,
2873f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng  GenRegisterInfo,
2922fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng  GenInstrInfo,
3022fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng  GenAsmWriter,
3122fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng  GenAsmMatcher,
32405887419f3954545be8da2da12000d2aa61ae16Daniel Dunbar  GenDisassembler,
3386f9adb8becf5da6962bd89301e96bccba26f72aJim Grosbach  GenPseudoLowering,
3450d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner  GenCallingConv,
354a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner  GenDAGISel,
36dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta  GenDFAPacketizer,
37b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  GenFastISel,
38f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey  GenSubtarget,
399e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner  GenIntrinsic,
4049de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  GenTgtIntrinsic,
411de99829b6bebe3310682efac8be2a9a95323220Jakob Stoklund Olesen  PrintEnums,
4296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  PrintSets,
43426db657da8753921f21c676b91c527e1b77878cSean Silva  GenOptParserDefs,
44426db657da8753921f21c676b91c527e1b77878cSean Silva  GenCTags
45bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner};
46bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner
47bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattnernamespace {
48bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  cl::opt<ActionType>
49bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  Action(cl::desc("Action to perform:"),
50bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner         cl::values(clEnumValN(PrintRecords, "print-records",
5185df22568d3eebfde900dd30038c29ae01caf5bdChris Lattner                               "Print all records to stdout (default)"),
52bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                    clEnumValN(GenEmitter, "gen-emitter",
53bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                               "Generate machine code emitter"),
54a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng                    clEnumValN(GenRegisterInfo, "gen-register-info",
5573f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng                               "Generate registers and register classes info"),
5622fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng                    clEnumValN(GenInstrInfo, "gen-instr-info",
5715de32d706287e1457ab26b74d731f5367083b99Chris Lattner                               "Generate instruction descriptions"),
5850d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner                    clEnumValN(GenCallingConv, "gen-callingconv",
5950d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner                               "Generate calling convention descriptions"),
602e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner                    clEnumValN(GenAsmWriter, "gen-asm-writer",
612e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner                               "Generate assembly writer"),
62405887419f3954545be8da2da12000d2aa61ae16Daniel Dunbar                    clEnumValN(GenDisassembler, "gen-disassembler",
63405887419f3954545be8da2da12000d2aa61ae16Daniel Dunbar                               "Generate disassembler"),
6486f9adb8becf5da6962bd89301e96bccba26f72aJim Grosbach                    clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
6586f9adb8becf5da6962bd89301e96bccba26f72aJim Grosbach                               "Generate pseudo instruction lowering"),
66d51ffcf303070b0a5aea7f365b85f6f969c384cbDaniel Dunbar                    clEnumValN(GenAsmMatcher, "gen-asm-matcher",
67d51ffcf303070b0a5aea7f365b85f6f969c384cbDaniel Dunbar                               "Generate assembly instruction matcher"),
684a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner                    clEnumValN(GenDAGISel, "gen-dag-isel",
694a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner                               "Generate a DAG instruction selector"),
70dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta                    clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
71dc81e5da271ed394e2029c83458773c4ae2fc5f4Anshuman Dasgupta                               "Generate DFA Packetizer for VLIW targets"),
72b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                    clEnumValN(GenFastISel, "gen-fast-isel",
73b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                               "Generate a \"fast\" instruction selector"),
74f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey                    clEnumValN(GenSubtarget, "gen-subtarget",
75f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey                               "Generate subtarget enumerations"),
769e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner                    clEnumValN(GenIntrinsic, "gen-intrinsic",
779e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner                               "Generate intrinsic information"),
7849de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen                    clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
7949de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen                               "Generate target intrinsic information"),
80bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                    clEnumValN(PrintEnums, "print-enums",
81bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                               "Print enum values for a class"),
821de99829b6bebe3310682efac8be2a9a95323220Jakob Stoklund Olesen                    clEnumValN(PrintSets, "print-sets",
831de99829b6bebe3310682efac8be2a9a95323220Jakob Stoklund Olesen                               "Print expanded sets for testing DAG exprs"),
8496a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                    clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
8596a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer                               "Generate option definitions"),
86426db657da8753921f21c676b91c527e1b77878cSean Silva                    clEnumValN(GenCTags, "gen-ctags",
87426db657da8753921f21c676b91c527e1b77878cSean Silva                               "Generate ctags-compatible index"),
88bd935336d4dd9d9a55feed9d9ef0bd6941060f37Chris Lattner                    clEnumValEnd));
89bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner
90bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  cl::opt<std::string>
9185df22568d3eebfde900dd30038c29ae01caf5bdChris Lattner  Class("class", cl::desc("Print Enum list for this class"),
922d24e2a396a1d211baaeedf32148a3b657240170David Blaikie          cl::value_desc("class name"));
936f36fa981a59461466e12e5056ba209d289b81b1Jakob Stoklund Olesen
949e21138ab7387fbd58509faf6e90f581914716dfSean Silvabool LLVMTableGenMain(raw_ostream &OS, RecordKeeper &Records) {
959e21138ab7387fbd58509faf6e90f581914716dfSean Silva  switch (Action) {
969e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case PrintRecords:
979e21138ab7387fbd58509faf6e90f581914716dfSean Silva    OS << Records;           // No argument, dump all contents
989e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
999e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenEmitter:
1009e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitCodeEmitter(Records, OS);
1019e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1029e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenRegisterInfo:
1039e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitRegisterInfo(Records, OS);
1049e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1059e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenInstrInfo:
1069e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitInstrInfo(Records, OS);
1079e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1089e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenCallingConv:
1099e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitCallingConv(Records, OS);
1109e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1119e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenAsmWriter:
1129e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitAsmWriter(Records, OS);
1139e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1149e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenAsmMatcher:
1159e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitAsmMatcher(Records, OS);
1169e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1179e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenDisassembler:
1189e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitDisassembler(Records, OS);
1199e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1209e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenPseudoLowering:
1219e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitPseudoLowering(Records, OS);
1229e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1239e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenDAGISel:
1249e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitDAGISel(Records, OS);
1259e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1269e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenDFAPacketizer:
1279e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitDFAPacketizer(Records, OS);
1289e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1299e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenFastISel:
1309e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitFastISel(Records, OS);
1319e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1329e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenSubtarget:
1339e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitSubtarget(Records, OS);
1349e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1359e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenIntrinsic:
1369e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitIntrinsics(Records, OS);
1379e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1389e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case GenTgtIntrinsic:
1399e21138ab7387fbd58509faf6e90f581914716dfSean Silva    EmitIntrinsics(Records, OS, true);
1409e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
14196a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer  case GenOptParserDefs:
14296a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    EmitOptParser(Records, OS);
14396a564f2beec8c1930f0640844eec433e03bbce8Michael J. Spencer    break;
1449e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case PrintEnums:
1459e21138ab7387fbd58509faf6e90f581914716dfSean Silva  {
1469e21138ab7387fbd58509faf6e90f581914716dfSean Silva    std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class);
1479e21138ab7387fbd58509faf6e90f581914716dfSean Silva    for (unsigned i = 0, e = Recs.size(); i != e; ++i)
1489e21138ab7387fbd58509faf6e90f581914716dfSean Silva      OS << Recs[i]->getName() << ", ";
1499e21138ab7387fbd58509faf6e90f581914716dfSean Silva    OS << "\n";
1509e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1519e21138ab7387fbd58509faf6e90f581914716dfSean Silva  }
1529e21138ab7387fbd58509faf6e90f581914716dfSean Silva  case PrintSets:
1539e21138ab7387fbd58509faf6e90f581914716dfSean Silva  {
1549e21138ab7387fbd58509faf6e90f581914716dfSean Silva    SetTheory Sets;
1559e21138ab7387fbd58509faf6e90f581914716dfSean Silva    Sets.addFieldExpander("Set", "Elements");
1569e21138ab7387fbd58509faf6e90f581914716dfSean Silva    std::vector<Record*> Recs = Records.getAllDerivedDefinitions("Set");
1579e21138ab7387fbd58509faf6e90f581914716dfSean Silva    for (unsigned i = 0, e = Recs.size(); i != e; ++i) {
1589e21138ab7387fbd58509faf6e90f581914716dfSean Silva      OS << Recs[i]->getName() << " = [";
1599e21138ab7387fbd58509faf6e90f581914716dfSean Silva      const std::vector<Record*> *Elts = Sets.expand(Recs[i]);
1609e21138ab7387fbd58509faf6e90f581914716dfSean Silva      assert(Elts && "Couldn't expand Set instance");
1619e21138ab7387fbd58509faf6e90f581914716dfSean Silva      for (unsigned ei = 0, ee = Elts->size(); ei != ee; ++ei)
1629e21138ab7387fbd58509faf6e90f581914716dfSean Silva        OS << ' ' << (*Elts)[ei]->getName();
1639e21138ab7387fbd58509faf6e90f581914716dfSean Silva      OS << " ]\n";
164d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke    }
1659e21138ab7387fbd58509faf6e90f581914716dfSean Silva    break;
1669e21138ab7387fbd58509faf6e90f581914716dfSean Silva  }
167426db657da8753921f21c676b91c527e1b77878cSean Silva  case GenCTags:
168426db657da8753921f21c676b91c527e1b77878cSean Silva    EmitCTags(Records, OS);
169426db657da8753921f21c676b91c527e1b77878cSean Silva    break;
1709e21138ab7387fbd58509faf6e90f581914716dfSean Silva  }
1719e21138ab7387fbd58509faf6e90f581914716dfSean Silva
1729e21138ab7387fbd58509faf6e90f581914716dfSean Silva  return false;
1739e21138ab7387fbd58509faf6e90f581914716dfSean Silva}
1742d24e2a396a1d211baaeedf32148a3b657240170David Blaikie}
1757c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne
1767c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourneint main(int argc, char **argv) {
1777c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne  sys::PrintStackTraceOnErrorSignal();
1787c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne  PrettyStackTraceProgram X(argc, argv);
1797c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne  cl::ParseCommandLineOptions(argc, argv);
18084e2f959b770c4271f97eb29e36d62ba2f598af3Sean Hunt
1819e21138ab7387fbd58509faf6e90f581914716dfSean Silva  return TableGenMain(argv[0], &LLVMTableGenMain);
182e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
18436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifdef __has_feature
18536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#if __has_feature(address_sanitizer)
18636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <sanitizer/lsan_interface.h>
18736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Disable LeakSanitizer for this binary as it has too many leaks that are not
18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
18936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesint __lsan_is_turned_off() { return 1; }
19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif  // __has_feature(address_sanitizer)
19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif  // defined(__has_feature)
192