0e7b4e5d0a0bb0f8544050261118342fa3f70bf8
[oota-llvm.git] / lib / Target / X86 / MCTargetDesc / X86MCTargetDesc.cpp
1 //===-- X86MCTargetDesc.cpp - X86 Target Descriptions ---------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file provides X86 specific target descriptions.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "X86MCTargetDesc.h"
15 #include "InstPrinter/X86ATTInstPrinter.h"
16 #include "InstPrinter/X86IntelInstPrinter.h"
17 #include "X86MCAsmInfo.h"
18 #include "llvm/ADT/Triple.h"
19 #include "llvm/MC/MCCodeGenInfo.h"
20 #include "llvm/MC/MCInstrAnalysis.h"
21 #include "llvm/MC/MCInstrInfo.h"
22 #include "llvm/MC/MCRegisterInfo.h"
23 #include "llvm/MC/MCStreamer.h"
24 #include "llvm/MC/MCSubtargetInfo.h"
25 #include "llvm/MC/MachineLocation.h"
26 #include "llvm/Support/ErrorHandling.h"
27 #include "llvm/Support/Host.h"
28 #include "llvm/Support/TargetRegistry.h"
29
30 #if _MSC_VER
31 #include <intrin.h>
32 #endif
33
34 using namespace llvm;
35
36 #define GET_REGINFO_MC_DESC
37 #include "X86GenRegisterInfo.inc"
38
39 #define GET_INSTRINFO_MC_DESC
40 #include "X86GenInstrInfo.inc"
41
42 #define GET_SUBTARGETINFO_MC_DESC
43 #include "X86GenSubtargetInfo.inc"
44
45 std::string X86_MC::ParseX86Triple(StringRef TT) {
46   Triple TheTriple(TT);
47   std::string FS;
48   if (TheTriple.getArch() == Triple::x86_64)
49     FS = "+64bit-mode,-32bit-mode,-16bit-mode";
50   else if (TheTriple.getEnvironment() != Triple::CODE16)
51     FS = "-64bit-mode,+32bit-mode,-16bit-mode";
52   else
53     FS = "-64bit-mode,-32bit-mode,+16bit-mode";
54
55   return FS;
56 }
57
58 /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in the
59 /// specified arguments.  If we can't run cpuid on the host, return true.
60 bool X86_MC::GetCpuIDAndInfo(unsigned value, unsigned *rEAX,
61                              unsigned *rEBX, unsigned *rECX, unsigned *rEDX) {
62 #if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
63   #if defined(__GNUC__)
64     // gcc doesn't know cpuid would clobber ebx/rbx. Preseve it manually.
65     asm ("movq\t%%rbx, %%rsi\n\t"
66          "cpuid\n\t"
67          "xchgq\t%%rbx, %%rsi\n\t"
68          : "=a" (*rEAX),
69            "=S" (*rEBX),
70            "=c" (*rECX),
71            "=d" (*rEDX)
72          :  "a" (value));
73     return false;
74   #elif defined(_MSC_VER)
75     int registers[4];
76     __cpuid(registers, value);
77     *rEAX = registers[0];
78     *rEBX = registers[1];
79     *rECX = registers[2];
80     *rEDX = registers[3];
81     return false;
82   #else
83     return true;
84   #endif
85 #elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
86   #if defined(__GNUC__)
87     asm ("movl\t%%ebx, %%esi\n\t"
88          "cpuid\n\t"
89          "xchgl\t%%ebx, %%esi\n\t"
90          : "=a" (*rEAX),
91            "=S" (*rEBX),
92            "=c" (*rECX),
93            "=d" (*rEDX)
94          :  "a" (value));
95     return false;
96   #elif defined(_MSC_VER)
97     __asm {
98       mov   eax,value
99       cpuid
100       mov   esi,rEAX
101       mov   dword ptr [esi],eax
102       mov   esi,rEBX
103       mov   dword ptr [esi],ebx
104       mov   esi,rECX
105       mov   dword ptr [esi],ecx
106       mov   esi,rEDX
107       mov   dword ptr [esi],edx
108     }
109     return false;
110   #else
111     return true;
112   #endif
113 #else
114   return true;
115 #endif
116 }
117
118 /// GetCpuIDAndInfoEx - Execute the specified cpuid with subleaf and return the
119 /// 4 values in the specified arguments.  If we can't run cpuid on the host,
120 /// return true.
121 bool X86_MC::GetCpuIDAndInfoEx(unsigned value, unsigned subleaf, unsigned *rEAX,
122                                unsigned *rEBX, unsigned *rECX, unsigned *rEDX) {
123 #if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
124   #if defined(__GNUC__)
125     // gcc desn't know cpuid would clobber ebx/rbx. Preseve it manually.
126     asm ("movq\t%%rbx, %%rsi\n\t"
127          "cpuid\n\t"
128          "xchgq\t%%rbx, %%rsi\n\t"
129          : "=a" (*rEAX),
130            "=S" (*rEBX),
131            "=c" (*rECX),
132            "=d" (*rEDX)
133          :  "a" (value),
134             "c" (subleaf));
135     return false;
136   #elif defined(_MSC_VER)
137     int registers[4];
138     __cpuidex(registers, value, subleaf);
139     *rEAX = registers[0];
140     *rEBX = registers[1];
141     *rECX = registers[2];
142     *rEDX = registers[3];
143     return false;
144   #else
145     return true;
146   #endif
147 #elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
148   #if defined(__GNUC__)
149     asm ("movl\t%%ebx, %%esi\n\t"
150          "cpuid\n\t"
151          "xchgl\t%%ebx, %%esi\n\t"
152          : "=a" (*rEAX),
153            "=S" (*rEBX),
154            "=c" (*rECX),
155            "=d" (*rEDX)
156          :  "a" (value),
157             "c" (subleaf));
158     return false;
159   #elif defined(_MSC_VER)
160     __asm {
161       mov   eax,value
162       mov   ecx,subleaf
163       cpuid
164       mov   esi,rEAX
165       mov   dword ptr [esi],eax
166       mov   esi,rEBX
167       mov   dword ptr [esi],ebx
168       mov   esi,rECX
169       mov   dword ptr [esi],ecx
170       mov   esi,rEDX
171       mov   dword ptr [esi],edx
172     }
173     return false;
174   #else
175     return true;
176   #endif
177 #else
178   return true;
179 #endif
180 }
181
182 void X86_MC::DetectFamilyModel(unsigned EAX, unsigned &Family,
183                                unsigned &Model) {
184   Family = (EAX >> 8) & 0xf; // Bits 8 - 11
185   Model  = (EAX >> 4) & 0xf; // Bits 4 - 7
186   if (Family == 6 || Family == 0xf) {
187     if (Family == 0xf)
188       // Examine extended family ID if family ID is F.
189       Family += (EAX >> 20) & 0xff;    // Bits 20 - 27
190     // Examine extended model ID if family ID is 6 or F.
191     Model += ((EAX >> 16) & 0xf) << 4; // Bits 16 - 19
192   }
193 }
194
195 unsigned X86_MC::getDwarfRegFlavour(Triple TT, bool isEH) {
196   if (TT.getArch() == Triple::x86_64)
197     return DWARFFlavour::X86_64;
198
199   if (TT.isOSDarwin())
200     return isEH ? DWARFFlavour::X86_32_DarwinEH : DWARFFlavour::X86_32_Generic;
201   if (TT.isOSCygMing())
202     // Unsupported by now, just quick fallback
203     return DWARFFlavour::X86_32_Generic;
204   return DWARFFlavour::X86_32_Generic;
205 }
206
207 void X86_MC::InitLLVM2SEHRegisterMapping(MCRegisterInfo *MRI) {
208   // FIXME: TableGen these.
209   for (unsigned Reg = X86::NoRegister+1; Reg < X86::NUM_TARGET_REGS; ++Reg) {
210     unsigned SEH = MRI->getEncodingValue(Reg);
211     MRI->mapLLVMRegToSEHReg(Reg, SEH);
212   }
213 }
214
215 MCSubtargetInfo *X86_MC::createX86MCSubtargetInfo(StringRef TT, StringRef CPU,
216                                                   StringRef FS) {
217   std::string ArchFS = X86_MC::ParseX86Triple(TT);
218   if (!FS.empty()) {
219     if (!ArchFS.empty())
220       ArchFS = ArchFS + "," + FS.str();
221     else
222       ArchFS = FS;
223   }
224
225   std::string CPUName = CPU;
226   if (CPUName.empty())
227     CPUName = "generic";
228
229   MCSubtargetInfo *X = new MCSubtargetInfo();
230   InitX86MCSubtargetInfo(X, TT, CPUName, ArchFS);
231   return X;
232 }
233
234 static MCInstrInfo *createX86MCInstrInfo() {
235   MCInstrInfo *X = new MCInstrInfo();
236   InitX86MCInstrInfo(X);
237   return X;
238 }
239
240 static MCRegisterInfo *createX86MCRegisterInfo(StringRef TT) {
241   Triple TheTriple(TT);
242   unsigned RA = (TheTriple.getArch() == Triple::x86_64)
243     ? X86::RIP     // Should have dwarf #16.
244     : X86::EIP;    // Should have dwarf #8.
245
246   MCRegisterInfo *X = new MCRegisterInfo();
247   InitX86MCRegisterInfo(X, RA,
248                         X86_MC::getDwarfRegFlavour(TheTriple, false),
249                         X86_MC::getDwarfRegFlavour(TheTriple, true),
250                         RA);
251   X86_MC::InitLLVM2SEHRegisterMapping(X);
252   return X;
253 }
254
255 static MCAsmInfo *createX86MCAsmInfo(const MCRegisterInfo &MRI, StringRef TT) {
256   Triple TheTriple(TT);
257   bool is64Bit = TheTriple.getArch() == Triple::x86_64;
258
259   MCAsmInfo *MAI;
260   if (TheTriple.isOSBinFormatMachO()) {
261     if (is64Bit)
262       MAI = new X86_64MCAsmInfoDarwin(TheTriple);
263     else
264       MAI = new X86MCAsmInfoDarwin(TheTriple);
265   } else if (TheTriple.isOSBinFormatELF()) {
266     // Force the use of an ELF container.
267     MAI = new X86ELFMCAsmInfo(TheTriple);
268   } else if (TheTriple.isWindowsMSVCEnvironment()) {
269     MAI = new X86MCAsmInfoMicrosoft(TheTriple);
270   } else if (TheTriple.isOSCygMing() ||
271              TheTriple.isWindowsItaniumEnvironment()) {
272     MAI = new X86MCAsmInfoGNUCOFF(TheTriple);
273   } else {
274     // The default is ELF.
275     MAI = new X86ELFMCAsmInfo(TheTriple);
276   }
277
278   // Initialize initial frame state.
279   // Calculate amount of bytes used for return address storing
280   int stackGrowth = is64Bit ? -8 : -4;
281
282   // Initial state of the frame pointer is esp+stackGrowth.
283   unsigned StackPtr = is64Bit ? X86::RSP : X86::ESP;
284   MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(
285       nullptr, MRI.getDwarfRegNum(StackPtr, true), -stackGrowth);
286   MAI->addInitialFrameState(Inst);
287
288   // Add return address to move list
289   unsigned InstPtr = is64Bit ? X86::RIP : X86::EIP;
290   MCCFIInstruction Inst2 = MCCFIInstruction::createOffset(
291       nullptr, MRI.getDwarfRegNum(InstPtr, true), stackGrowth);
292   MAI->addInitialFrameState(Inst2);
293
294   return MAI;
295 }
296
297 static MCCodeGenInfo *createX86MCCodeGenInfo(StringRef TT, Reloc::Model RM,
298                                              CodeModel::Model CM,
299                                              CodeGenOpt::Level OL) {
300   MCCodeGenInfo *X = new MCCodeGenInfo();
301
302   Triple T(TT);
303   bool is64Bit = T.getArch() == Triple::x86_64;
304
305   if (RM == Reloc::Default) {
306     // Darwin defaults to PIC in 64 bit mode and dynamic-no-pic in 32 bit mode.
307     // Win64 requires rip-rel addressing, thus we force it to PIC. Otherwise we
308     // use static relocation model by default.
309     if (T.isOSDarwin()) {
310       if (is64Bit)
311         RM = Reloc::PIC_;
312       else
313         RM = Reloc::DynamicNoPIC;
314     } else if (T.isOSWindows() && is64Bit)
315       RM = Reloc::PIC_;
316     else
317       RM = Reloc::Static;
318   }
319
320   // ELF and X86-64 don't have a distinct DynamicNoPIC model.  DynamicNoPIC
321   // is defined as a model for code which may be used in static or dynamic
322   // executables but not necessarily a shared library. On X86-32 we just
323   // compile in -static mode, in x86-64 we use PIC.
324   if (RM == Reloc::DynamicNoPIC) {
325     if (is64Bit)
326       RM = Reloc::PIC_;
327     else if (!T.isOSDarwin())
328       RM = Reloc::Static;
329   }
330
331   // If we are on Darwin, disallow static relocation model in X86-64 mode, since
332   // the Mach-O file format doesn't support it.
333   if (RM == Reloc::Static && T.isOSDarwin() && is64Bit)
334     RM = Reloc::PIC_;
335
336   // For static codegen, if we're not already set, use Small codegen.
337   if (CM == CodeModel::Default)
338     CM = CodeModel::Small;
339   else if (CM == CodeModel::JITDefault)
340     // 64-bit JIT places everything in the same buffer except external funcs.
341     CM = is64Bit ? CodeModel::Large : CodeModel::Small;
342
343   X->InitMCCodeGenInfo(RM, CM, OL);
344   return X;
345 }
346
347 static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
348                                     MCContext &Ctx, MCAsmBackend &MAB,
349                                     raw_ostream &_OS, MCCodeEmitter *_Emitter,
350                                     const MCSubtargetInfo &STI, bool RelaxAll) {
351   Triple TheTriple(TT);
352
353   switch (TheTriple.getObjectFormat()) {
354   default: llvm_unreachable("unsupported object format");
355   case Triple::MachO:
356     return createMachOStreamer(Ctx, MAB, _OS, _Emitter, RelaxAll);
357   case Triple::COFF:
358     assert(TheTriple.isOSWindows() && "only Windows COFF is supported");
359     return createX86WinCOFFStreamer(Ctx, MAB, _Emitter, _OS, RelaxAll);
360   case Triple::ELF:
361     return createELFStreamer(Ctx, MAB, _OS, _Emitter, RelaxAll);
362   }
363 }
364
365 static MCInstPrinter *createX86MCInstPrinter(const Target &T,
366                                              unsigned SyntaxVariant,
367                                              const MCAsmInfo &MAI,
368                                              const MCInstrInfo &MII,
369                                              const MCRegisterInfo &MRI,
370                                              const MCSubtargetInfo &STI) {
371   if (SyntaxVariant == 0)
372     return new X86ATTInstPrinter(MAI, MII, MRI, STI);
373   if (SyntaxVariant == 1)
374     return new X86IntelInstPrinter(MAI, MII, MRI);
375   return nullptr;
376 }
377
378 static MCRelocationInfo *createX86MCRelocationInfo(StringRef TT,
379                                                    MCContext &Ctx) {
380   Triple TheTriple(TT);
381   if (TheTriple.isOSBinFormatMachO() && TheTriple.getArch() == Triple::x86_64)
382     return createX86_64MachORelocationInfo(Ctx);
383   else if (TheTriple.isOSBinFormatELF())
384     return createX86_64ELFRelocationInfo(Ctx);
385   // Default to the stock relocation info.
386   return llvm::createMCRelocationInfo(TT, Ctx);
387 }
388
389 static MCInstrAnalysis *createX86MCInstrAnalysis(const MCInstrInfo *Info) {
390   return new MCInstrAnalysis(Info);
391 }
392
393 // Force static initialization.
394 extern "C" void LLVMInitializeX86TargetMC() {
395   // Register the MC asm info.
396   RegisterMCAsmInfoFn A(TheX86_32Target, createX86MCAsmInfo);
397   RegisterMCAsmInfoFn B(TheX86_64Target, createX86MCAsmInfo);
398
399   // Register the MC codegen info.
400   RegisterMCCodeGenInfoFn C(TheX86_32Target, createX86MCCodeGenInfo);
401   RegisterMCCodeGenInfoFn D(TheX86_64Target, createX86MCCodeGenInfo);
402
403   // Register the MC instruction info.
404   TargetRegistry::RegisterMCInstrInfo(TheX86_32Target, createX86MCInstrInfo);
405   TargetRegistry::RegisterMCInstrInfo(TheX86_64Target, createX86MCInstrInfo);
406
407   // Register the MC register info.
408   TargetRegistry::RegisterMCRegInfo(TheX86_32Target, createX86MCRegisterInfo);
409   TargetRegistry::RegisterMCRegInfo(TheX86_64Target, createX86MCRegisterInfo);
410
411   // Register the MC subtarget info.
412   TargetRegistry::RegisterMCSubtargetInfo(TheX86_32Target,
413                                           X86_MC::createX86MCSubtargetInfo);
414   TargetRegistry::RegisterMCSubtargetInfo(TheX86_64Target,
415                                           X86_MC::createX86MCSubtargetInfo);
416
417   // Register the MC instruction analyzer.
418   TargetRegistry::RegisterMCInstrAnalysis(TheX86_32Target,
419                                           createX86MCInstrAnalysis);
420   TargetRegistry::RegisterMCInstrAnalysis(TheX86_64Target,
421                                           createX86MCInstrAnalysis);
422
423   // Register the code emitter.
424   TargetRegistry::RegisterMCCodeEmitter(TheX86_32Target,
425                                         createX86MCCodeEmitter);
426   TargetRegistry::RegisterMCCodeEmitter(TheX86_64Target,
427                                         createX86MCCodeEmitter);
428
429   // Register the asm backend.
430   TargetRegistry::RegisterMCAsmBackend(TheX86_32Target,
431                                        createX86_32AsmBackend);
432   TargetRegistry::RegisterMCAsmBackend(TheX86_64Target,
433                                        createX86_64AsmBackend);
434
435   // Register the object streamer.
436   TargetRegistry::RegisterMCObjectStreamer(TheX86_32Target,
437                                            createMCStreamer);
438   TargetRegistry::RegisterMCObjectStreamer(TheX86_64Target,
439                                            createMCStreamer);
440
441   // Register the MCInstPrinter.
442   TargetRegistry::RegisterMCInstPrinter(TheX86_32Target,
443                                         createX86MCInstPrinter);
444   TargetRegistry::RegisterMCInstPrinter(TheX86_64Target,
445                                         createX86MCInstPrinter);
446
447   // Register the MC relocation info.
448   TargetRegistry::RegisterMCRelocationInfo(TheX86_32Target,
449                                            createX86MCRelocationInfo);
450   TargetRegistry::RegisterMCRelocationInfo(TheX86_64Target,
451                                            createX86MCRelocationInfo);
452 }