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