131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- X86MCTargetDesc.cpp - X86 Target Descriptions ---------------------===// 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#include "X86MCTargetDesc.h" 154b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng#include "InstPrinter/X86ATTInstPrinter.h" 164b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng#include "InstPrinter/X86IntelInstPrinter.h" 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "X86MCAsmInfo.h" 18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Triple.h" 197801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng#include "llvm/MC/MCCodeGenInfo.h" 207801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng#include "llvm/MC/MCInstrAnalysis.h" 2122fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng#include "llvm/MC/MCInstrInfo.h" 22a347f85dbeee37a7f2bb68df1a7d4cdfbb7b576dEvan Cheng#include "llvm/MC/MCRegisterInfo.h" 23a87e40f16f1c3117412e01107807e490d6fb29bcEvan Cheng#include "llvm/MC/MCStreamer.h" 24ce795dc92f693a855dbf1450570e6aeb69774bccEvan Cheng#include "llvm/MC/MCSubtargetInfo.h" 25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MachineLocation.h" 26655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper#include "llvm/Support/ErrorHandling.h" 27d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/Host.h" 283e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h" 2973f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng 30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#if _MSC_VER 31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include <intrin.h> 32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#endif 33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace llvm; 35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 3673f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#define GET_REGINFO_MC_DESC 3773f50d9bc3bd46cc0abeba9bb0d46977ba1aea42Evan Cheng#include "X86GenRegisterInfo.inc" 3822fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng 3922fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng#define GET_INSTRINFO_MC_DESC 4022fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng#include "X86GenInstrInfo.inc" 4122fee2dff4c43b551aefa44a96ca74fcade6bfacEvan Cheng 42ce795dc92f693a855dbf1450570e6aeb69774bccEvan Cheng#define GET_SUBTARGETINFO_MC_DESC 43385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "X86GenSubtargetInfo.inc" 44ce795dc92f693a855dbf1450570e6aeb69774bccEvan Cheng 4518fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Chengstd::string X86_MC::ParseX86Triple(StringRef TT) { 4618fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng Triple TheTriple(TT); 471fac6b50ea720d75fc2bf01a288e99f239869e90Nick Lewycky std::string FS; 4818fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng if (TheTriple.getArch() == Triple::x86_64) 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FS = "+64bit-mode,-32bit-mode,-16bit-mode"; 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else if (TheTriple.getEnvironment() != Triple::CODE16) 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FS = "-64bit-mode,+32bit-mode,-16bit-mode"; 521fac6b50ea720d75fc2bf01a288e99f239869e90Nick Lewycky else 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines FS = "-64bit-mode,-32bit-mode,+16bit-mode"; 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 551fac6b50ea720d75fc2bf01a288e99f239869e90Nick Lewycky return FS; 5618fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng} 5718fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng 58c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hinesunsigned X86_MC::getDwarfRegFlavour(Triple TT, bool isEH) { 59c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (TT.getArch() == Triple::x86_64) 600e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return DWARFFlavour::X86_64; 610e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 62c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (TT.isOSDarwin()) 630e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return isEH ? DWARFFlavour::X86_32_DarwinEH : DWARFFlavour::X86_32_Generic; 64c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines if (TT.isOSCygMing()) 650e6a052331f674dd70e28af41f654a7874405eabEvan Cheng // Unsupported by now, just quick fallback 660e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return DWARFFlavour::X86_32_Generic; 670e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return DWARFFlavour::X86_32_Generic; 680e6a052331f674dd70e28af41f654a7874405eabEvan Cheng} 690e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 700e6a052331f674dd70e28af41f654a7874405eabEvan Chengvoid X86_MC::InitLLVM2SEHRegisterMapping(MCRegisterInfo *MRI) { 710e6a052331f674dd70e28af41f654a7874405eabEvan Cheng // FIXME: TableGen these. 720e6a052331f674dd70e28af41f654a7874405eabEvan Cheng for (unsigned Reg = X86::NoRegister+1; Reg < X86::NUM_TARGET_REGS; ++Reg) { 737abf67a092c0a75d6d1631766d6a8ef14e38d526Michael Liao unsigned SEH = MRI->getEncodingValue(Reg); 740e6a052331f674dd70e28af41f654a7874405eabEvan Cheng MRI->mapLLVMRegToSEHReg(Reg, SEH); 750e6a052331f674dd70e28af41f654a7874405eabEvan Cheng } 760e6a052331f674dd70e28af41f654a7874405eabEvan Cheng} 770e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 78ebdeeab812beec0385b445f3d4c41a114e0d972fEvan ChengMCSubtargetInfo *X86_MC::createX86MCSubtargetInfo(StringRef TT, StringRef CPU, 79ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng StringRef FS) { 8018fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng std::string ArchFS = X86_MC::ParseX86Triple(TT); 8118fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng if (!FS.empty()) { 8218fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng if (!ArchFS.empty()) 832c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar ArchFS = (Twine(ArchFS) + "," + FS).str(); 8418fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng else 8518fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng ArchFS = FS; 8618fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng } 8718fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng 8818fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng std::string CPUName = CPU; 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (CPUName.empty()) 90cc0ddc707d5a7b1dd11141881df0bf4210f8aeeeEvan Cheng CPUName = "generic"; 9118fb1d35db9e2160be3a5bd2950f7e0d206bdbb8Evan Cheng 92ce795dc92f693a855dbf1450570e6aeb69774bccEvan Cheng MCSubtargetInfo *X = new MCSubtargetInfo(); 9359ee62d2418df8db499eca1ae17f5900dc2dcbbaEvan Cheng InitX86MCSubtargetInfo(X, TT, CPUName, ArchFS); 94ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng return X; 95ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng} 96ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng 971abf2cb59b8d63415780a03329307c0997b2670cEvan Chengstatic MCInstrInfo *createX86MCInstrInfo() { 981abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng MCInstrInfo *X = new MCInstrInfo(); 991abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng InitX86MCInstrInfo(X); 100ce795dc92f693a855dbf1450570e6aeb69774bccEvan Cheng return X; 101ce795dc92f693a855dbf1450570e6aeb69774bccEvan Cheng} 102ce795dc92f693a855dbf1450570e6aeb69774bccEvan Cheng 1030e6a052331f674dd70e28af41f654a7874405eabEvan Chengstatic MCRegisterInfo *createX86MCRegisterInfo(StringRef TT) { 1040e6a052331f674dd70e28af41f654a7874405eabEvan Cheng Triple TheTriple(TT); 1050e6a052331f674dd70e28af41f654a7874405eabEvan Cheng unsigned RA = (TheTriple.getArch() == Triple::x86_64) 1060e6a052331f674dd70e28af41f654a7874405eabEvan Cheng ? X86::RIP // Should have dwarf #16. 1070e6a052331f674dd70e28af41f654a7874405eabEvan Cheng : X86::EIP; // Should have dwarf #8. 1080e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 1091abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng MCRegisterInfo *X = new MCRegisterInfo(); 1100e6a052331f674dd70e28af41f654a7874405eabEvan Cheng InitX86MCRegisterInfo(X, RA, 111c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines X86_MC::getDwarfRegFlavour(TheTriple, false), 112c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines X86_MC::getDwarfRegFlavour(TheTriple, true), 113fbf3b4a07690751f72302757058ab0298dfb832eJim Grosbach RA); 1140e6a052331f674dd70e28af41f654a7874405eabEvan Cheng X86_MC::InitLLVM2SEHRegisterMapping(X); 1151abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng return X; 1161abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng} 1171abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng 1184a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindolastatic MCAsmInfo *createX86MCAsmInfo(const MCRegisterInfo &MRI, StringRef TT) { 1191abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng Triple TheTriple(TT); 1202d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng bool is64Bit = TheTriple.getArch() == Triple::x86_64; 1211abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng 1222d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MCAsmInfo *MAI; 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (TheTriple.isOSBinFormatMachO()) { 1242d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng if (is64Bit) 1252d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MAI = new X86_64MCAsmInfoDarwin(TheTriple); 1261abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng else 1272d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MAI = new X86MCAsmInfoDarwin(TheTriple); 12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else if (TheTriple.isOSBinFormatELF()) { 1297bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor // Force the use of an ELF container. 1307bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor MAI = new X86ELFMCAsmInfo(TheTriple); 13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } else if (TheTriple.isWindowsMSVCEnvironment()) { 132116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer MAI = new X86MCAsmInfoMicrosoft(TheTriple); 13337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } else if (TheTriple.isOSCygMing() || 13437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines TheTriple.isWindowsItaniumEnvironment()) { 135116bc795da4b10773235a89cc251d31651b3851dMichael J. Spencer MAI = new X86MCAsmInfoGNUCOFF(TheTriple); 1362d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng } else { 1377bbd6e366b39157445cc921024a987e61ea68c00Andrew Kaylor // The default is ELF. 1382d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MAI = new X86ELFMCAsmInfo(TheTriple); 1391abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng } 1401abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng 1412d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng // Initialize initial frame state. 1422d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng // Calculate amount of bytes used for return address storing 1432d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng int stackGrowth = is64Bit ? -8 : -4; 1441abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng 1452d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng // Initial state of the frame pointer is esp+stackGrowth. 1464a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola unsigned StackPtr = is64Bit ? X86::RSP : X86::ESP; 1474a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola MCCFIInstruction Inst = MCCFIInstruction::createDefCfa( 148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines nullptr, MRI.getDwarfRegNum(StackPtr, true), -stackGrowth); 1494a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola MAI->addInitialFrameState(Inst); 1502d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng 1512d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng // Add return address to move list 1524a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola unsigned InstPtr = is64Bit ? X86::RIP : X86::EIP; 1534a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola MCCFIInstruction Inst2 = MCCFIInstruction::createOffset( 154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines nullptr, MRI.getDwarfRegNum(InstPtr, true), stackGrowth); 1554a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola MAI->addInitialFrameState(Inst2); 1562d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng 1572d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng return MAI; 1581abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng} 1591abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng 1607f8dff65717b1e4090ba4a648f9ec4f037a66c1eEvan Chengstatic MCCodeGenInfo *createX86MCCodeGenInfo(StringRef TT, Reloc::Model RM, 161b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeModel::Model CM, 162b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng CodeGenOpt::Level OL) { 163439661395fd2a2a832dba01c65bc88718528313cEvan Cheng MCCodeGenInfo *X = new MCCodeGenInfo(); 164439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 165439661395fd2a2a832dba01c65bc88718528313cEvan Cheng Triple T(TT); 166439661395fd2a2a832dba01c65bc88718528313cEvan Cheng bool is64Bit = T.getArch() == Triple::x86_64; 167439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 168439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (RM == Reloc::Default) { 169439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // Darwin defaults to PIC in 64 bit mode and dynamic-no-pic in 32 bit mode. 170439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // Win64 requires rip-rel addressing, thus we force it to PIC. Otherwise we 171439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // use static relocation model by default. 172439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (T.isOSDarwin()) { 173439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (is64Bit) 174439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RM = Reloc::PIC_; 175439661395fd2a2a832dba01c65bc88718528313cEvan Cheng else 176439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RM = Reloc::DynamicNoPIC; 177439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } else if (T.isOSWindows() && is64Bit) 178439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RM = Reloc::PIC_; 179439661395fd2a2a832dba01c65bc88718528313cEvan Cheng else 180439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RM = Reloc::Static; 181439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 182439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 183439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // ELF and X86-64 don't have a distinct DynamicNoPIC model. DynamicNoPIC 184439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // is defined as a model for code which may be used in static or dynamic 185439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // executables but not necessarily a shared library. On X86-32 we just 186439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // compile in -static mode, in x86-64 we use PIC. 187439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (RM == Reloc::DynamicNoPIC) { 188439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (is64Bit) 189439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RM = Reloc::PIC_; 190439661395fd2a2a832dba01c65bc88718528313cEvan Cheng else if (!T.isOSDarwin()) 191439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RM = Reloc::Static; 192439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 193439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 194439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // If we are on Darwin, disallow static relocation model in X86-64 mode, since 195439661395fd2a2a832dba01c65bc88718528313cEvan Cheng // the Mach-O file format doesn't support it. 196439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (RM == Reloc::Static && T.isOSDarwin() && is64Bit) 197439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RM = Reloc::PIC_; 198439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 19934ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng // For static codegen, if we're not already set, use Small codegen. 20034ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng if (CM == CodeModel::Default) 20134ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng CM = CodeModel::Small; 20234ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng else if (CM == CodeModel::JITDefault) 20334ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng // 64-bit JIT places everything in the same buffer except external funcs. 20434ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng CM = is64Bit ? CodeModel::Large : CodeModel::Small; 20534ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng 206b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng X->InitMCCodeGenInfo(RM, CM, OL); 207439661395fd2a2a832dba01c65bc88718528313cEvan Cheng return X; 208439661395fd2a2a832dba01c65bc88718528313cEvan Cheng} 209439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 2102c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarstatic MCInstPrinter *createX86MCInstPrinter(const Triple &T, 2114b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng unsigned SyntaxVariant, 212b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy const MCAsmInfo &MAI, 21317463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper const MCInstrInfo &MII, 2142c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar const MCRegisterInfo &MRI) { 2154b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng if (SyntaxVariant == 0) 2162c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar return new X86ATTInstPrinter(MAI, MII, MRI); 2174b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng if (SyntaxVariant == 1) 21817463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper return new X86IntelInstPrinter(MAI, MII, MRI); 219dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 2204b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng} 2214b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng 222de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombetstatic MCRelocationInfo *createX86MCRelocationInfo(StringRef TT, 223de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet MCContext &Ctx) { 2242c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha Triple TheTriple(TT); 22536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (TheTriple.isOSBinFormatMachO() && TheTriple.getArch() == Triple::x86_64) 2262c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha return createX86_64MachORelocationInfo(Ctx); 2272c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha else if (TheTriple.isOSBinFormatELF()) 2282c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha return createX86_64ELFRelocationInfo(Ctx); 2292c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha // Default to the stock relocation info. 230de7cbbfcce5c068f0699bdcb6dac093c0c91ba6fQuentin Colombet return llvm::createMCRelocationInfo(TT, Ctx); 2312c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha} 2322c94d0faa0e1c268893d5e04dc77e8a35889db00Ahmed Bougacha 2337801136b95d1fbe515b9655b73ada39b05a33559Evan Chengstatic MCInstrAnalysis *createX86MCInstrAnalysis(const MCInstrInfo *Info) { 2347801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng return new MCInstrAnalysis(Info); 2357801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng} 2367801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng 237e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng// Force static initialization. 238e78085a3c03de648a481e9751c3094c517bd7123Evan Chengextern "C" void LLVMInitializeX86TargetMC() { 2394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar for (Target *T : {&TheX86_32Target, &TheX86_64Target}) { 2404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC asm info. 2414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar RegisterMCAsmInfoFn X(*T, createX86MCAsmInfo); 2424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2434c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC codegen info. 2444c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar RegisterMCCodeGenInfoFn Y(*T, createX86MCCodeGenInfo); 2454c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC instruction info. 2474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCInstrInfo(*T, createX86MCInstrInfo); 2484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC register info. 2504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCRegInfo(*T, createX86MCRegisterInfo); 2514c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC subtarget info. 2534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCSubtargetInfo(*T, 2544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar X86_MC::createX86MCSubtargetInfo); 2554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC instruction analyzer. 2574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCInstrAnalysis(*T, createX86MCInstrAnalysis); 2584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the code emitter. 2604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCCodeEmitter(*T, createX86MCCodeEmitter); 2614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the object streamer. 2634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterCOFFStreamer(*T, createX86WinCOFFStreamer); 2644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MCInstPrinter. 2664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCInstPrinter(*T, createX86MCInstPrinter); 2674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 2684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // Register the MC relocation info. 2694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar TargetRegistry::RegisterMCRelocationInfo(*T, createX86MCRelocationInfo); 2704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 271a87e40f16f1c3117412e01107807e490d6fb29bcEvan Cheng 272a87e40f16f1c3117412e01107807e490d6fb29bcEvan Cheng // Register the asm backend. 27378c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng TargetRegistry::RegisterMCAsmBackend(TheX86_32Target, 27478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng createX86_32AsmBackend); 27578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng TargetRegistry::RegisterMCAsmBackend(TheX86_64Target, 27678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng createX86_64AsmBackend); 277439661395fd2a2a832dba01c65bc88718528313cEvan Cheng} 278