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