X86MCTargetDesc.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. //===-- X86MCTargetDesc.h - X86 Target Descriptions -------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // This file provides X86 specific target descriptions.
  10. //
  11. //===----------------------------------------------------------------------===//
  12. #ifndef LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCTARGETDESC_H
  13. #define LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCTARGETDESC_H
  14. #include <memory>
  15. #include <string>
  16. namespace llvm {
  17. class formatted_raw_ostream;
  18. class MCAsmBackend;
  19. class MCCodeEmitter;
  20. class MCContext;
  21. class MCInst;
  22. class MCInstPrinter;
  23. class MCInstrInfo;
  24. class MCObjectTargetWriter;
  25. class MCObjectWriter;
  26. class MCRegister;
  27. class MCRegisterInfo;
  28. class MCStreamer;
  29. class MCSubtargetInfo;
  30. class MCTargetOptions;
  31. class MCTargetStreamer;
  32. class Target;
  33. class Triple;
  34. class StringRef;
  35. /// Flavour of dwarf regnumbers
  36. ///
  37. namespace DWARFFlavour {
  38. enum {
  39. X86_64 = 0, X86_32_DarwinEH = 1, X86_32_Generic = 2
  40. };
  41. }
  42. /// Native X86 register numbers
  43. ///
  44. namespace N86 {
  45. enum {
  46. EAX = 0, ECX = 1, EDX = 2, EBX = 3, ESP = 4, EBP = 5, ESI = 6, EDI = 7
  47. };
  48. }
  49. namespace X86_MC {
  50. std::string ParseX86Triple(const Triple &TT);
  51. unsigned getDwarfRegFlavour(const Triple &TT, bool isEH);
  52. void initLLVMToSEHAndCVRegMapping(MCRegisterInfo *MRI);
  53. /// Returns true if this instruction has a LOCK prefix.
  54. bool hasLockPrefix(const MCInst &MI);
  55. /// \param Op operand # of the memory operand.
  56. ///
  57. /// \returns true if the specified instruction has a 16-bit memory operand.
  58. bool is16BitMemOperand(const MCInst &MI, unsigned Op,
  59. const MCSubtargetInfo &STI);
  60. /// \param Op operand # of the memory operand.
  61. ///
  62. /// \returns true if the specified instruction has a 32-bit memory operand.
  63. bool is32BitMemOperand(const MCInst &MI, unsigned Op);
  64. /// \param Op operand # of the memory operand.
  65. ///
  66. /// \returns true if the specified instruction has a 64-bit memory operand.
  67. #ifndef NDEBUG
  68. bool is64BitMemOperand(const MCInst &MI, unsigned Op);
  69. #endif
  70. /// Returns true if this instruction needs an Address-Size override prefix.
  71. bool needsAddressSizeOverride(const MCInst &MI, const MCSubtargetInfo &STI,
  72. int MemoryOperand, uint64_t TSFlags);
  73. /// Create a X86 MCSubtargetInfo instance. This is exposed so Asm parser, etc.
  74. /// do not need to go through TargetRegistry.
  75. MCSubtargetInfo *createX86MCSubtargetInfo(const Triple &TT, StringRef CPU,
  76. StringRef FS);
  77. }
  78. MCCodeEmitter *createX86MCCodeEmitter(const MCInstrInfo &MCII,
  79. MCContext &Ctx);
  80. MCAsmBackend *createX86_32AsmBackend(const Target &T,
  81. const MCSubtargetInfo &STI,
  82. const MCRegisterInfo &MRI,
  83. const MCTargetOptions &Options);
  84. MCAsmBackend *createX86_64AsmBackend(const Target &T,
  85. const MCSubtargetInfo &STI,
  86. const MCRegisterInfo &MRI,
  87. const MCTargetOptions &Options);
  88. /// Implements X86-only directives for assembly emission.
  89. MCTargetStreamer *createX86AsmTargetStreamer(MCStreamer &S,
  90. formatted_raw_ostream &OS,
  91. MCInstPrinter *InstPrinter,
  92. bool IsVerboseAsm);
  93. /// Implements X86-only directives for object files.
  94. MCTargetStreamer *createX86ObjectTargetStreamer(MCStreamer &S,
  95. const MCSubtargetInfo &STI);
  96. /// Construct an X86 Windows COFF machine code streamer which will generate
  97. /// PE/COFF format object files.
  98. ///
  99. /// Takes ownership of \p AB and \p CE.
  100. MCStreamer *createX86WinCOFFStreamer(MCContext &C,
  101. std::unique_ptr<MCAsmBackend> &&AB,
  102. std::unique_ptr<MCObjectWriter> &&OW,
  103. std::unique_ptr<MCCodeEmitter> &&CE,
  104. bool RelaxAll,
  105. bool IncrementalLinkerCompatible);
  106. /// Construct an X86 Mach-O object writer.
  107. std::unique_ptr<MCObjectTargetWriter>
  108. createX86MachObjectWriter(bool Is64Bit, uint32_t CPUType, uint32_t CPUSubtype);
  109. /// Construct an X86 ELF object writer.
  110. std::unique_ptr<MCObjectTargetWriter>
  111. createX86ELFObjectWriter(bool IsELF64, uint8_t OSABI, uint16_t EMachine);
  112. /// Construct an X86 Win COFF object writer.
  113. std::unique_ptr<MCObjectTargetWriter>
  114. createX86WinCOFFObjectWriter(bool Is64Bit);
  115. /// Returns the sub or super register of a specific X86 register.
  116. /// e.g. getX86SubSuperRegister(X86::EAX, 16) returns X86::AX.
  117. /// Aborts on error.
  118. MCRegister getX86SubSuperRegister(MCRegister, unsigned, bool High=false);
  119. /// Returns the sub or super register of a specific X86 register.
  120. /// Like getX86SubSuperRegister() but returns 0 on error.
  121. MCRegister getX86SubSuperRegisterOrZero(MCRegister, unsigned,
  122. bool High = false);
  123. } // End llvm namespace
  124. // Defines symbolic names for X86 registers. This defines a mapping from
  125. // register name to register number.
  126. //
  127. #define GET_REGINFO_ENUM
  128. #include "X86GenRegisterInfo.inc"
  129. // Defines symbolic names for the X86 instructions.
  130. //
  131. #define GET_INSTRINFO_ENUM
  132. #define GET_INSTRINFO_MC_HELPER_DECLS
  133. #include "X86GenInstrInfo.inc"
  134. #define GET_SUBTARGETINFO_ENUM
  135. #include "X86GenSubtargetInfo.inc"
  136. #define GET_X86_MNEMONIC_TABLES_H
  137. #include "X86GenMnemonicTables.inc"
  138. #endif