TableGen.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. #define NOMINMAX
  23. #include <windows.h>
  24. #include "llvm/Support/FileSystem.h"
  25. #include "llvm/Support/MSFileSystem.h"
  26. // HLSL Change Ends
  27. using namespace llvm;
  28. enum ActionType {
  29. PrintRecords,
  30. GenEmitter,
  31. GenRegisterInfo,
  32. GenInstrInfo,
  33. GenAsmWriter,
  34. GenAsmMatcher,
  35. GenDisassembler,
  36. GenPseudoLowering,
  37. GenCallingConv,
  38. GenDAGISel,
  39. GenDFAPacketizer,
  40. GenFastISel,
  41. GenSubtarget,
  42. GenIntrinsic,
  43. GenTgtIntrinsic,
  44. PrintEnums,
  45. PrintSets,
  46. GenOptParserDefs,
  47. GenCTags
  48. };
  49. namespace {
  50. cl::opt<ActionType>
  51. Action(cl::desc("Action to perform:"),
  52. cl::values(clEnumValN(PrintRecords, "print-records",
  53. "Print all records to stdout (default)"),
  54. clEnumValN(GenEmitter, "gen-emitter",
  55. "Generate machine code emitter"),
  56. clEnumValN(GenRegisterInfo, "gen-register-info",
  57. "Generate registers and register classes info"),
  58. clEnumValN(GenInstrInfo, "gen-instr-info",
  59. "Generate instruction descriptions"),
  60. clEnumValN(GenCallingConv, "gen-callingconv",
  61. "Generate calling convention descriptions"),
  62. clEnumValN(GenAsmWriter, "gen-asm-writer",
  63. "Generate assembly writer"),
  64. clEnumValN(GenDisassembler, "gen-disassembler",
  65. "Generate disassembler"),
  66. clEnumValN(GenPseudoLowering, "gen-pseudo-lowering",
  67. "Generate pseudo instruction lowering"),
  68. clEnumValN(GenAsmMatcher, "gen-asm-matcher",
  69. "Generate assembly instruction matcher"),
  70. clEnumValN(GenDAGISel, "gen-dag-isel",
  71. "Generate a DAG instruction selector"),
  72. clEnumValN(GenDFAPacketizer, "gen-dfa-packetizer",
  73. "Generate DFA Packetizer for VLIW targets"),
  74. clEnumValN(GenFastISel, "gen-fast-isel",
  75. "Generate a \"fast\" instruction selector"),
  76. clEnumValN(GenSubtarget, "gen-subtarget",
  77. "Generate subtarget enumerations"),
  78. clEnumValN(GenIntrinsic, "gen-intrinsic",
  79. "Generate intrinsic information"),
  80. clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
  81. "Generate target intrinsic information"),
  82. clEnumValN(PrintEnums, "print-enums",
  83. "Print enum values for a class"),
  84. clEnumValN(PrintSets, "print-sets",
  85. "Print expanded sets for testing DAG exprs"),
  86. clEnumValN(GenOptParserDefs, "gen-opt-parser-defs",
  87. "Generate option definitions"),
  88. clEnumValN(GenCTags, "gen-ctags",
  89. "Generate ctags-compatible index"),
  90. clEnumValEnd));
  91. cl::opt<std::string>
  92. Class("class", cl::desc("Print Enum list for this class"),
  93. cl::value_desc("class name"));
  94. bool 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. for (Record *Rec : Records.getAllDerivedDefinitions(Class))
  147. OS << Rec->getName() << ", ";
  148. OS << "\n";
  149. break;
  150. }
  151. case PrintSets:
  152. {
  153. SetTheory Sets;
  154. Sets.addFieldExpander("Set", "Elements");
  155. for (Record *Rec : Records.getAllDerivedDefinitions("Set")) {
  156. OS << Rec->getName() << " = [";
  157. const std::vector<Record*> *Elts = Sets.expand(Rec);
  158. assert(Elts && "Couldn't expand Set instance");
  159. for (Record *Elt : *Elts)
  160. OS << ' ' << Elt->getName();
  161. OS << " ]\n";
  162. }
  163. break;
  164. }
  165. case GenCTags:
  166. EmitCTags(Records, OS);
  167. break;
  168. }
  169. return false;
  170. }
  171. }
  172. int main(int argc, char **argv) {
  173. // HLSL Change Starts
  174. if (std::error_code ec = llvm::sys::fs::SetupPerThreadFileSystem())
  175. return 1;
  176. llvm::sys::fs::AutoCleanupPerThreadFileSystem auto_cleanup_fs;
  177. llvm::sys::fs::MSFileSystem* msfPtr;
  178. HRESULT hr;
  179. if (!SUCCEEDED(hr = CreateMSFileSystemForDisk(&msfPtr)))
  180. return 1;
  181. std::unique_ptr<llvm::sys::fs::MSFileSystem> msf(msfPtr);
  182. llvm::sys::fs::AutoPerThreadSystem pts(msf.get());
  183. // HLSL Change Ends
  184. // sys::PrintStackTraceOnErrorSignal(); // HLSL Change
  185. // PrettyStackTraceProgram X(argc, argv); // HLSL Change
  186. cl::ParseCommandLineOptions(argc, argv);
  187. return TableGenMain(argv[0], &LLVMTableGenMain);
  188. }
  189. #ifdef __has_feature
  190. #if __has_feature(address_sanitizer)
  191. #include <sanitizer/lsan_interface.h>
  192. // Disable LeakSanitizer for this binary as it has too many leaks that are not
  193. // very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
  194. int __lsan_is_turned_off() { return 1; }
  195. #endif // __has_feature(address_sanitizer)
  196. #endif // defined(__has_feature)