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