1*9880d681SAndroid Build Coastguard Worker //===-- X86MCTargetDesc.h - X86 Target Descriptions -------------*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file provides X86 specific target descriptions. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCTARGETDESC_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCTARGETDESC_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h" 18*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DataTypes.h" 19*9880d681SAndroid Build Coastguard Worker #include <string> 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker namespace llvm { 22*9880d681SAndroid Build Coastguard Worker class MCAsmBackend; 23*9880d681SAndroid Build Coastguard Worker class MCCodeEmitter; 24*9880d681SAndroid Build Coastguard Worker class MCContext; 25*9880d681SAndroid Build Coastguard Worker class MCInstrInfo; 26*9880d681SAndroid Build Coastguard Worker class MCObjectWriter; 27*9880d681SAndroid Build Coastguard Worker class MCRegisterInfo; 28*9880d681SAndroid Build Coastguard Worker class MCSubtargetInfo; 29*9880d681SAndroid Build Coastguard Worker class MCRelocationInfo; 30*9880d681SAndroid Build Coastguard Worker class Target; 31*9880d681SAndroid Build Coastguard Worker class Triple; 32*9880d681SAndroid Build Coastguard Worker class StringRef; 33*9880d681SAndroid Build Coastguard Worker class raw_ostream; 34*9880d681SAndroid Build Coastguard Worker class raw_pwrite_stream; 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker extern Target TheX86_32Target, TheX86_64Target; 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker /// Flavour of dwarf regnumbers 39*9880d681SAndroid Build Coastguard Worker /// 40*9880d681SAndroid Build Coastguard Worker namespace DWARFFlavour { 41*9880d681SAndroid Build Coastguard Worker enum { 42*9880d681SAndroid Build Coastguard Worker X86_64 = 0, X86_32_DarwinEH = 1, X86_32_Generic = 2 43*9880d681SAndroid Build Coastguard Worker }; 44*9880d681SAndroid Build Coastguard Worker } 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker /// Native X86 register numbers 47*9880d681SAndroid Build Coastguard Worker /// 48*9880d681SAndroid Build Coastguard Worker namespace N86 { 49*9880d681SAndroid Build Coastguard Worker enum { 50*9880d681SAndroid Build Coastguard Worker EAX = 0, ECX = 1, EDX = 2, EBX = 3, ESP = 4, EBP = 5, ESI = 6, EDI = 7 51*9880d681SAndroid Build Coastguard Worker }; 52*9880d681SAndroid Build Coastguard Worker } 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker namespace X86_MC { 55*9880d681SAndroid Build Coastguard Worker std::string ParseX86Triple(const Triple &TT); 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker unsigned getDwarfRegFlavour(const Triple &TT, bool isEH); 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker void initLLVMToSEHAndCVRegMapping(MCRegisterInfo *MRI); 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker /// Create a X86 MCSubtargetInfo instance. This is exposed so Asm parser, etc. 62*9880d681SAndroid Build Coastguard Worker /// do not need to go through TargetRegistry. 63*9880d681SAndroid Build Coastguard Worker MCSubtargetInfo *createX86MCSubtargetInfo(const Triple &TT, StringRef CPU, 64*9880d681SAndroid Build Coastguard Worker StringRef FS); 65*9880d681SAndroid Build Coastguard Worker } 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker MCCodeEmitter *createX86MCCodeEmitter(const MCInstrInfo &MCII, 68*9880d681SAndroid Build Coastguard Worker const MCRegisterInfo &MRI, 69*9880d681SAndroid Build Coastguard Worker MCContext &Ctx); 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker MCAsmBackend *createX86_32AsmBackend(const Target &T, const MCRegisterInfo &MRI, 72*9880d681SAndroid Build Coastguard Worker const Triple &TT, StringRef CPU); 73*9880d681SAndroid Build Coastguard Worker MCAsmBackend *createX86_64AsmBackend(const Target &T, const MCRegisterInfo &MRI, 74*9880d681SAndroid Build Coastguard Worker const Triple &TT, StringRef CPU); 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker /// Construct an X86 Windows COFF machine code streamer which will generate 77*9880d681SAndroid Build Coastguard Worker /// PE/COFF format object files. 78*9880d681SAndroid Build Coastguard Worker /// 79*9880d681SAndroid Build Coastguard Worker /// Takes ownership of \p AB and \p CE. 80*9880d681SAndroid Build Coastguard Worker MCStreamer *createX86WinCOFFStreamer(MCContext &C, MCAsmBackend &AB, 81*9880d681SAndroid Build Coastguard Worker raw_pwrite_stream &OS, MCCodeEmitter *CE, 82*9880d681SAndroid Build Coastguard Worker bool RelaxAll, bool IncrementalLinkerCompatible); 83*9880d681SAndroid Build Coastguard Worker 84*9880d681SAndroid Build Coastguard Worker /// Construct an X86 Mach-O object writer. 85*9880d681SAndroid Build Coastguard Worker MCObjectWriter *createX86MachObjectWriter(raw_pwrite_stream &OS, bool Is64Bit, 86*9880d681SAndroid Build Coastguard Worker uint32_t CPUType, 87*9880d681SAndroid Build Coastguard Worker uint32_t CPUSubtype); 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker /// Construct an X86 ELF object writer. 90*9880d681SAndroid Build Coastguard Worker MCObjectWriter *createX86ELFObjectWriter(raw_pwrite_stream &OS, bool IsELF64, 91*9880d681SAndroid Build Coastguard Worker uint8_t OSABI, uint16_t EMachine); 92*9880d681SAndroid Build Coastguard Worker /// Construct an X86 Win COFF object writer. 93*9880d681SAndroid Build Coastguard Worker MCObjectWriter *createX86WinCOFFObjectWriter(raw_pwrite_stream &OS, 94*9880d681SAndroid Build Coastguard Worker bool Is64Bit); 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker /// Returns the sub or super register of a specific X86 register. 97*9880d681SAndroid Build Coastguard Worker /// e.g. getX86SubSuperRegister(X86::EAX, 16) returns X86::AX. 98*9880d681SAndroid Build Coastguard Worker /// Aborts on error. 99*9880d681SAndroid Build Coastguard Worker unsigned getX86SubSuperRegister(unsigned, unsigned, bool High=false); 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker /// Returns the sub or super register of a specific X86 register. 102*9880d681SAndroid Build Coastguard Worker /// Like getX86SubSuperRegister() but returns 0 on error. 103*9880d681SAndroid Build Coastguard Worker unsigned getX86SubSuperRegisterOrZero(unsigned, unsigned, 104*9880d681SAndroid Build Coastguard Worker bool High = false); 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Worker } // End llvm namespace 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Worker // Defines symbolic names for X86 registers. This defines a mapping from 110*9880d681SAndroid Build Coastguard Worker // register name to register number. 111*9880d681SAndroid Build Coastguard Worker // 112*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_ENUM 113*9880d681SAndroid Build Coastguard Worker #include "X86GenRegisterInfo.inc" 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker // Defines symbolic names for the X86 instructions. 116*9880d681SAndroid Build Coastguard Worker // 117*9880d681SAndroid Build Coastguard Worker #define GET_INSTRINFO_ENUM 118*9880d681SAndroid Build Coastguard Worker #include "X86GenInstrInfo.inc" 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_ENUM 121*9880d681SAndroid Build Coastguard Worker #include "X86GenSubtargetInfo.inc" 122*9880d681SAndroid Build Coastguard Worker 123*9880d681SAndroid Build Coastguard Worker #endif 124