TableGen.cpp 6.8 KB

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