X86MCTargetDesc.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  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. /// Create a X86 MCSubtargetInfo instance. This is exposed so Asm parser, etc.
  56. /// do not need to go through TargetRegistry.
  57. MCSubtargetInfo *createX86MCSubtargetInfo(const Triple &TT, StringRef CPU,
  58. StringRef FS);
  59. }
  60. MCCodeEmitter *createX86MCCodeEmitter(const MCInstrInfo &MCII,
  61. const MCRegisterInfo &MRI,
  62. MCContext &Ctx);
  63. MCAsmBackend *createX86_32AsmBackend(const Target &T,
  64. const MCSubtargetInfo &STI,
  65. const MCRegisterInfo &MRI,
  66. const MCTargetOptions &Options);
  67. MCAsmBackend *createX86_64AsmBackend(const Target &T,
  68. const MCSubtargetInfo &STI,
  69. const MCRegisterInfo &MRI,
  70. const MCTargetOptions &Options);
  71. /// Implements X86-only directives for assembly emission.
  72. MCTargetStreamer *createX86AsmTargetStreamer(MCStreamer &S,
  73. formatted_raw_ostream &OS,
  74. MCInstPrinter *InstPrinter,
  75. bool IsVerboseAsm);
  76. /// Implements X86-only directives for object files.
  77. MCTargetStreamer *createX86ObjectTargetStreamer(MCStreamer &S,
  78. const MCSubtargetInfo &STI);
  79. /// Construct an X86 Windows COFF machine code streamer which will generate
  80. /// PE/COFF format object files.
  81. ///
  82. /// Takes ownership of \p AB and \p CE.
  83. MCStreamer *createX86WinCOFFStreamer(MCContext &C,
  84. std::unique_ptr<MCAsmBackend> &&AB,
  85. std::unique_ptr<MCObjectWriter> &&OW,
  86. std::unique_ptr<MCCodeEmitter> &&CE,
  87. bool RelaxAll,
  88. bool IncrementalLinkerCompatible);
  89. /// Construct an X86 Mach-O object writer.
  90. std::unique_ptr<MCObjectTargetWriter>
  91. createX86MachObjectWriter(bool Is64Bit, uint32_t CPUType, uint32_t CPUSubtype);
  92. /// Construct an X86 ELF object writer.
  93. std::unique_ptr<MCObjectTargetWriter>
  94. createX86ELFObjectWriter(bool IsELF64, uint8_t OSABI, uint16_t EMachine);
  95. /// Construct an X86 Win COFF object writer.
  96. std::unique_ptr<MCObjectTargetWriter>
  97. createX86WinCOFFObjectWriter(bool Is64Bit);
  98. /// Returns the sub or super register of a specific X86 register.
  99. /// e.g. getX86SubSuperRegister(X86::EAX, 16) returns X86::AX.
  100. /// Aborts on error.
  101. MCRegister getX86SubSuperRegister(MCRegister, unsigned, bool High=false);
  102. /// Returns the sub or super register of a specific X86 register.
  103. /// Like getX86SubSuperRegister() but returns 0 on error.
  104. MCRegister getX86SubSuperRegisterOrZero(MCRegister, unsigned,
  105. bool High = false);
  106. } // End llvm namespace
  107. // Defines symbolic names for X86 registers. This defines a mapping from
  108. // register name to register number.
  109. //
  110. #define GET_REGINFO_ENUM
  111. #include "X86GenRegisterInfo.inc"
  112. // Defines symbolic names for the X86 instructions.
  113. //
  114. #define GET_INSTRINFO_ENUM
  115. #define GET_INSTRINFO_MC_HELPER_DECLS
  116. #include "X86GenInstrInfo.inc"
  117. #define GET_SUBTARGETINFO_ENUM
  118. #include "X86GenSubtargetInfo.inc"
  119. #endif