blob: 30fdca091aa322540d8a24412bbc2ab4faf9a106 [file] [log] [blame]
Evan Cheng3ddfbd32011-07-06 22:01:53 +00001//===-- X86MCTargetDesc.h - X86 Target Descriptions -------------*- C++ -*-===//
Evan Cheng24753312011-06-24 01:44:41 +00002//
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
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCTARGETDESC_H
15#define LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCTARGETDESC_H
Evan Chengb2681be2011-06-24 23:59:54 +000016
Benjamin Kramer391be792016-01-27 19:29:56 +000017#include "llvm/MC/MCStreamer.h"
Oscar Fuentes47d4aaf2011-07-25 20:13:36 +000018#include "llvm/Support/DataTypes.h"
Evan Cheng13bcc6c2011-07-07 21:06:52 +000019#include <string>
20
Evan Chenge862d592011-06-24 20:42:09 +000021namespace llvm {
Evan Cheng5928e692011-07-25 23:24:55 +000022class MCAsmBackend;
Evan Cheng7e763d82011-07-25 18:43:53 +000023class MCCodeEmitter;
24class MCContext;
25class MCInstrInfo;
Evan Chengb2531002011-07-25 19:33:48 +000026class MCObjectWriter;
Evan Chengd60fa58b2011-07-18 20:57:22 +000027class MCRegisterInfo;
Evan Cheng4d1ca962011-07-08 01:53:10 +000028class MCSubtargetInfo;
Ahmed Bougachaad1084d2013-05-24 00:39:57 +000029class MCRelocationInfo;
Evan Chenge862d592011-06-24 20:42:09 +000030class Target;
Daniel Sanders50f17232015-09-15 16:17:27 +000031class Triple;
Evan Cheng13bcc6c2011-07-07 21:06:52 +000032class StringRef;
Evan Chengb2531002011-07-25 19:33:48 +000033class raw_ostream;
Rafael Espindola5560a4c2015-04-14 22:14:34 +000034class raw_pwrite_stream;
Evan Chenge862d592011-06-24 20:42:09 +000035
36extern Target TheX86_32Target, TheX86_64Target;
Evan Cheng13bcc6c2011-07-07 21:06:52 +000037
Rafael Espindoladf7305a2015-04-09 17:10:57 +000038/// Flavour of dwarf regnumbers
Evan Chengd60fa58b2011-07-18 20:57:22 +000039///
40namespace DWARFFlavour {
41 enum {
42 X86_64 = 0, X86_32_DarwinEH = 1, X86_32_Generic = 2
43 };
Michael Liao5bf95782014-12-04 05:20:33 +000044}
45
Rafael Espindoladf7305a2015-04-09 17:10:57 +000046/// Native X86 register numbers
Evan Chengd60fa58b2011-07-18 20:57:22 +000047///
48namespace N86 {
49 enum {
50 EAX = 0, ECX = 1, EDX = 2, EBX = 3, ESP = 4, EBP = 5, ESI = 6, EDI = 7
51 };
52}
53
Evan Cheng13bcc6c2011-07-07 21:06:52 +000054namespace X86_MC {
Daniel Sanders50f17232015-09-15 16:17:27 +000055std::string ParseX86Triple(const Triple &TT);
Evan Cheng13bcc6c2011-07-07 21:06:52 +000056
Daniel Sanders50f17232015-09-15 16:17:27 +000057unsigned getDwarfRegFlavour(const Triple &TT, bool isEH);
Evan Chengd60fa58b2011-07-18 20:57:22 +000058
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000059void InitLLVM2SEHRegisterMapping(MCRegisterInfo *MRI);
Evan Chengd60fa58b2011-07-18 20:57:22 +000060
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000061/// Create a X86 MCSubtargetInfo instance. This is exposed so Asm parser, etc.
62/// do not need to go through TargetRegistry.
Daniel Sanders50f17232015-09-15 16:17:27 +000063MCSubtargetInfo *createX86MCSubtargetInfo(const Triple &TT, StringRef CPU,
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000064 StringRef FS);
Alexander Kornienkof00654e2015-06-23 09:49:53 +000065}
Evan Cheng4d1ca962011-07-08 01:53:10 +000066
Evan Cheng7e763d82011-07-25 18:43:53 +000067MCCodeEmitter *createX86MCCodeEmitter(const MCInstrInfo &MCII,
Jim Grosbachc3b04272012-05-15 17:35:52 +000068 const MCRegisterInfo &MRI,
Evan Cheng7e763d82011-07-25 18:43:53 +000069 MCContext &Ctx);
70
Bill Wendling58e2d3d2013-09-09 02:37:14 +000071MCAsmBackend *createX86_32AsmBackend(const Target &T, const MCRegisterInfo &MRI,
Daniel Sanders50f17232015-09-15 16:17:27 +000072 const Triple &TT, StringRef CPU);
Bill Wendling58e2d3d2013-09-09 02:37:14 +000073MCAsmBackend *createX86_64AsmBackend(const Target &T, const MCRegisterInfo &MRI,
Daniel Sanders50f17232015-09-15 16:17:27 +000074 const Triple &TT, StringRef CPU);
Evan Chengb2531002011-07-25 19:33:48 +000075
Rafael Espindolacd584a82015-03-19 01:50:16 +000076/// Construct an X86 Windows COFF machine code streamer which will generate
77/// PE/COFF format object files.
Saleem Abdulrasoola8b1f722014-04-27 03:48:12 +000078///
79/// Takes ownership of \p AB and \p CE.
80MCStreamer *createX86WinCOFFStreamer(MCContext &C, MCAsmBackend &AB,
Rafael Espindola5560a4c2015-04-14 22:14:34 +000081 raw_pwrite_stream &OS, MCCodeEmitter *CE,
David Majnemer03e2cc32015-12-21 22:09:27 +000082 bool RelaxAll, bool IncrementalLinkerCompatible);
Saleem Abdulrasoola8b1f722014-04-27 03:48:12 +000083
Rafael Espindoladf7305a2015-04-09 17:10:57 +000084/// Construct an X86 Mach-O object writer.
Rafael Espindola5560a4c2015-04-14 22:14:34 +000085MCObjectWriter *createX86MachObjectWriter(raw_pwrite_stream &OS, bool Is64Bit,
Evan Chengb2531002011-07-25 19:33:48 +000086 uint32_t CPUType,
87 uint32_t CPUSubtype);
Evan Cheng7e763d82011-07-25 18:43:53 +000088
Rafael Espindoladf7305a2015-04-09 17:10:57 +000089/// Construct an X86 ELF object writer.
Rafael Espindola5560a4c2015-04-14 22:14:34 +000090MCObjectWriter *createX86ELFObjectWriter(raw_pwrite_stream &OS, bool IsELF64,
Rafael Espindola49286e92015-04-09 18:32:58 +000091 uint8_t OSABI, uint16_t EMachine);
Rafael Espindoladf7305a2015-04-09 17:10:57 +000092/// Construct an X86 Win COFF object writer.
Rafael Espindola5560a4c2015-04-14 22:14:34 +000093MCObjectWriter *createX86WinCOFFObjectWriter(raw_pwrite_stream &OS,
94 bool Is64Bit);
Ahmed Bougachaad1084d2013-05-24 00:39:57 +000095
Craig Topperc0453e82015-12-25 22:10:08 +000096/// Returns the sub or super register of a specific X86 register.
97/// e.g. getX86SubSuperRegister(X86::EAX, 16) returns X86::AX.
98/// Aborts on error.
99unsigned getX86SubSuperRegister(unsigned, unsigned, bool High=false);
100
101/// Returns the sub or super register of a specific X86 register.
102/// Like getX86SubSuperRegister() but returns 0 on error.
103unsigned getX86SubSuperRegisterOrZero(unsigned, unsigned,
104 bool High = false);
105
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000106} // End llvm namespace
Evan Chenge862d592011-06-24 20:42:09 +0000107
Evan Cheng4d1ca962011-07-08 01:53:10 +0000108
Evan Cheng24753312011-06-24 01:44:41 +0000109// Defines symbolic names for X86 registers. This defines a mapping from
110// register name to register number.
111//
Evan Chengd9997ac2011-06-27 18:32:37 +0000112#define GET_REGINFO_ENUM
113#include "X86GenRegisterInfo.inc"
Evan Chengb2681be2011-06-24 23:59:54 +0000114
Evan Cheng1e210d02011-06-28 20:07:07 +0000115// Defines symbolic names for the X86 instructions.
116//
117#define GET_INSTRINFO_ENUM
118#include "X86GenInstrInfo.inc"
119
Evan Chengbc153d42011-07-14 20:59:42 +0000120#define GET_SUBTARGETINFO_ENUM
121#include "X86GenSubtargetInfo.inc"
122
Evan Chengb2681be2011-06-24 23:59:54 +0000123#endif