X86MCTargetDesc.h revision df09270ae897e7fa64a7c162de163c32ee181a03
1ed5e3552147830159a1d48d067dfbb49ac9cccfdEvan Cheng//===-- X86MCTargetDesc.h - X86 Target Descriptions -------------*- C++ -*-===//
2a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//
3a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//                     The LLVM Compiler Infrastructure
4a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//
5a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// This file is distributed under the University of Illinois Open Source
6a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// License. See LICENSE.TXT for details.
7a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//
8a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//===----------------------------------------------------------------------===//
9a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//
10a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// This file provides X86 specific target descriptions.
11a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//
12a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//===----------------------------------------------------------------------===//
13a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng
14ed5e3552147830159a1d48d067dfbb49ac9cccfdEvan Cheng#ifndef X86MCTARGETDESC_H
15ed5e3552147830159a1d48d067dfbb49ac9cccfdEvan Cheng#define X86MCTARGETDESC_H
164219718180f3588653334c74dd9ba0d5994b4937Evan Cheng
177331ac47b9e6a8fa1624e85932ce6a20c3e8fca3Oscar Fuentes#include "llvm/Support/DataTypes.h"
1818fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng#include <string>
1918fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng
20f5fa52ed064098be7130aa4ec1236037907ce3faEvan Chengnamespace llvm {
2178c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Chengclass MCAsmBackend;
228c3fee59038d8fd98db2a01b6a309a8941a16a3fEvan Chengclass MCCodeEmitter;
238c3fee59038d8fd98db2a01b6a309a8941a16a3fEvan Chengclass MCContext;
248c3fee59038d8fd98db2a01b6a309a8941a16a3fEvan Chengclass MCInstrInfo;
25a87e40f16f1c3117412e01107807e490d6fb29bcEvan Chengclass MCObjectWriter;
260e6a052331f674dd70e28af41f654a7874405eabEvan Chengclass MCRegisterInfo;
27ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Chengclass MCSubtargetInfo;
28f5fa52ed064098be7130aa4ec1236037907ce3faEvan Chengclass Target;
2918fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Chengclass StringRef;
30a87e40f16f1c3117412e01107807e490d6fb29bcEvan Chengclass raw_ostream;
31f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng
32f5fa52ed064098be7130aa4ec1236037907ce3faEvan Chengextern Target TheX86_32Target, TheX86_64Target;
3318fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng
340e6a052331f674dd70e28af41f654a7874405eabEvan Cheng/// DWARFFlavour - Flavour of dwarf regnumbers
350e6a052331f674dd70e28af41f654a7874405eabEvan Cheng///
360e6a052331f674dd70e28af41f654a7874405eabEvan Chengnamespace DWARFFlavour {
370e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  enum {
380e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    X86_64 = 0, X86_32_DarwinEH = 1, X86_32_Generic = 2
390e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  };
400e6a052331f674dd70e28af41f654a7874405eabEvan Cheng}
410e6a052331f674dd70e28af41f654a7874405eabEvan Cheng
420e6a052331f674dd70e28af41f654a7874405eabEvan Cheng/// N86 namespace - Native X86 register numbers
430e6a052331f674dd70e28af41f654a7874405eabEvan Cheng///
440e6a052331f674dd70e28af41f654a7874405eabEvan Chengnamespace N86 {
450e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  enum {
460e6a052331f674dd70e28af41f654a7874405eabEvan Cheng    EAX = 0, ECX = 1, EDX = 2, EBX = 3, ESP = 4, EBP = 5, ESI = 6, EDI = 7
470e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  };
480e6a052331f674dd70e28af41f654a7874405eabEvan Cheng}
490e6a052331f674dd70e28af41f654a7874405eabEvan Cheng
5018fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Chengnamespace X86_MC {
5118fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng  std::string ParseX86Triple(StringRef TT);
5218fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng
5318fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng  /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in
5418fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng  /// the specified arguments.  If we can't run cpuid on the host, return true.
5518fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng  bool GetCpuIDAndInfo(unsigned value, unsigned *rEAX,
5618fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng                       unsigned *rEBX, unsigned *rECX, unsigned *rEDX);
574145c49aa0e0e70a51a395bdd4107a464d05e592Craig Topper  /// GetCpuIDAndInfoEx - Execute the specified cpuid with subleaf and return
584145c49aa0e0e70a51a395bdd4107a464d05e592Craig Topper  /// the 4 values in the specified arguments.  If we can't run cpuid on the
594145c49aa0e0e70a51a395bdd4107a464d05e592Craig Topper  /// host, return true.
604145c49aa0e0e70a51a395bdd4107a464d05e592Craig Topper  bool GetCpuIDAndInfoEx(unsigned value, unsigned subleaf, unsigned *rEAX,
614145c49aa0e0e70a51a395bdd4107a464d05e592Craig Topper                       unsigned *rEBX, unsigned *rECX, unsigned *rEDX);
6218fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng
6318fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng  void DetectFamilyModel(unsigned EAX, unsigned &Family, unsigned &Model);
64ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng
650e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  unsigned getDwarfRegFlavour(StringRef TT, bool isEH);
660e6a052331f674dd70e28af41f654a7874405eabEvan Cheng
670e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  unsigned getX86RegNum(unsigned RegNo);
680e6a052331f674dd70e28af41f654a7874405eabEvan Cheng
690e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  void InitLLVM2SEHRegisterMapping(MCRegisterInfo *MRI);
700e6a052331f674dd70e28af41f654a7874405eabEvan Cheng
710e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  /// createX86MCSubtargetInfo - Create a X86 MCSubtargetInfo instance.
72ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng  /// This is exposed so Asm parser, etc. do not need to go through
73ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng  /// TargetRegistry.
74ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng  MCSubtargetInfo *createX86MCSubtargetInfo(StringRef TT, StringRef CPU,
75ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng                                            StringRef FS);
7618fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng}
77ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng
788c3fee59038d8fd98db2a01b6a309a8941a16a3fEvan ChengMCCodeEmitter *createX86MCCodeEmitter(const MCInstrInfo &MCII,
798c3fee59038d8fd98db2a01b6a309a8941a16a3fEvan Cheng                                      const MCSubtargetInfo &STI,
808c3fee59038d8fd98db2a01b6a309a8941a16a3fEvan Cheng                                      MCContext &Ctx);
818c3fee59038d8fd98db2a01b6a309a8941a16a3fEvan Cheng
8278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan ChengMCAsmBackend *createX86_32AsmBackend(const Target &T, StringRef TT);
8378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan ChengMCAsmBackend *createX86_64AsmBackend(const Target &T, StringRef TT);
84a87e40f16f1c3117412e01107807e490d6fb29bcEvan Cheng
85a87e40f16f1c3117412e01107807e490d6fb29bcEvan Cheng/// createX86MachObjectWriter - Construct an X86 Mach-O object writer.
86a87e40f16f1c3117412e01107807e490d6fb29bcEvan ChengMCObjectWriter *createX86MachObjectWriter(raw_ostream &OS,
87a87e40f16f1c3117412e01107807e490d6fb29bcEvan Cheng                                          bool Is64Bit,
88a87e40f16f1c3117412e01107807e490d6fb29bcEvan Cheng                                          uint32_t CPUType,
89a87e40f16f1c3117412e01107807e490d6fb29bcEvan Cheng                                          uint32_t CPUSubtype);
908c3fee59038d8fd98db2a01b6a309a8941a16a3fEvan Cheng
91edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola/// createX86ELFObjectWriter - Construct an X86 ELF object writer.
92edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael EspindolaMCObjectWriter *createX86ELFObjectWriter(raw_ostream &OS,
93edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola                                         bool Is64Bit,
94edae8e1e4d5bd9b59f18ecef04a248be95d8ca46Rafael Espindola                                         uint8_t OSABI);
95df09270ae897e7fa64a7c162de163c32ee181a03Rafael Espindola/// createX86WinCOFFObjectWriter - Construct an X86 Win COFF object writer.
96df09270ae897e7fa64a7c162de163c32ee181a03Rafael EspindolaMCObjectWriter *createX86WinCOFFObjectWriter(raw_ostream &OS, bool Is64Bit);
97f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng} // End llvm namespace
98f5fa52ed064098be7130aa4ec1236037907ce3faEvan Cheng
99ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng
100a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// Defines symbolic names for X86 registers.  This defines a mapping from
101a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng// register name to register number.
102a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng//
10373f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#define GET_REGINFO_ENUM
10473f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#include "X86GenRegisterInfo.inc"
1054219718180f3588653334c74dd9ba0d5994b4937Evan Cheng
10622fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng// Defines symbolic names for the X86 instructions.
10722fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng//
10822fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng#define GET_INSTRINFO_ENUM
10922fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng#include "X86GenInstrInfo.inc"
11022fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng
111c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_SUBTARGETINFO_ENUM
112c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "X86GenSubtargetInfo.inc"
113c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng
1144219718180f3588653334c74dd9ba0d5994b4937Evan Cheng#endif
115