blob: f73e734b9b0e6e5dc7b3c2eae85a5c62278a49cc [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;
Joel Jones373d7d32016-07-25 17:18:28 +000030class MCTargetOptions;
Evan Chenge862d592011-06-24 20:42:09 +000031class Target;
Daniel Sanders50f17232015-09-15 16:17:27 +000032class Triple;
Evan Cheng13bcc6c2011-07-07 21:06:52 +000033class StringRef;
Evan Chengb2531002011-07-25 19:33:48 +000034class raw_ostream;
Rafael Espindola5560a4c2015-04-14 22:14:34 +000035class raw_pwrite_stream;
Evan Chenge862d592011-06-24 20:42:09 +000036
Mehdi Aminif42454b2016-10-09 23:00:34 +000037Target &getTheX86_32Target();
38Target &getTheX86_64Target();
Evan Cheng13bcc6c2011-07-07 21:06:52 +000039
Rafael Espindoladf7305a2015-04-09 17:10:57 +000040/// Flavour of dwarf regnumbers
Evan Chengd60fa58b2011-07-18 20:57:22 +000041///
42namespace DWARFFlavour {
43 enum {
44 X86_64 = 0, X86_32_DarwinEH = 1, X86_32_Generic = 2
45 };
Michael Liao5bf95782014-12-04 05:20:33 +000046}
47
Rafael Espindoladf7305a2015-04-09 17:10:57 +000048/// Native X86 register numbers
Evan Chengd60fa58b2011-07-18 20:57:22 +000049///
50namespace N86 {
51 enum {
52 EAX = 0, ECX = 1, EDX = 2, EBX = 3, ESP = 4, EBP = 5, ESI = 6, EDI = 7
53 };
54}
55
Evan Cheng13bcc6c2011-07-07 21:06:52 +000056namespace X86_MC {
Daniel Sanders50f17232015-09-15 16:17:27 +000057std::string ParseX86Triple(const Triple &TT);
Evan Cheng13bcc6c2011-07-07 21:06:52 +000058
Daniel Sanders50f17232015-09-15 16:17:27 +000059unsigned getDwarfRegFlavour(const Triple &TT, bool isEH);
Evan Chengd60fa58b2011-07-18 20:57:22 +000060
Reid Klecknerf9c275f2016-02-10 20:55:49 +000061void initLLVMToSEHAndCVRegMapping(MCRegisterInfo *MRI);
Evan Chengd60fa58b2011-07-18 20:57:22 +000062
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000063/// Create a X86 MCSubtargetInfo instance. This is exposed so Asm parser, etc.
64/// do not need to go through TargetRegistry.
Daniel Sanders50f17232015-09-15 16:17:27 +000065MCSubtargetInfo *createX86MCSubtargetInfo(const Triple &TT, StringRef CPU,
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000066 StringRef FS);
Alexander Kornienkof00654e2015-06-23 09:49:53 +000067}
Evan Cheng4d1ca962011-07-08 01:53:10 +000068
Evan Cheng7e763d82011-07-25 18:43:53 +000069MCCodeEmitter *createX86MCCodeEmitter(const MCInstrInfo &MCII,
Jim Grosbachc3b04272012-05-15 17:35:52 +000070 const MCRegisterInfo &MRI,
Evan Cheng7e763d82011-07-25 18:43:53 +000071 MCContext &Ctx);
72
Bill Wendling58e2d3d2013-09-09 02:37:14 +000073MCAsmBackend *createX86_32AsmBackend(const Target &T, const MCRegisterInfo &MRI,
Joel Jones373d7d32016-07-25 17:18:28 +000074 const Triple &TT, StringRef CPU,
75 const MCTargetOptions &Options);
Bill Wendling58e2d3d2013-09-09 02:37:14 +000076MCAsmBackend *createX86_64AsmBackend(const Target &T, const MCRegisterInfo &MRI,
Joel Jones373d7d32016-07-25 17:18:28 +000077 const Triple &TT, StringRef CPU,
78 const MCTargetOptions &Options);
Evan Chengb2531002011-07-25 19:33:48 +000079
Rafael Espindolacd584a82015-03-19 01:50:16 +000080/// Construct an X86 Windows COFF machine code streamer which will generate
81/// PE/COFF format object files.
Saleem Abdulrasoola8b1f722014-04-27 03:48:12 +000082///
83/// Takes ownership of \p AB and \p CE.
84MCStreamer *createX86WinCOFFStreamer(MCContext &C, MCAsmBackend &AB,
Rafael Espindola5560a4c2015-04-14 22:14:34 +000085 raw_pwrite_stream &OS, MCCodeEmitter *CE,
David Majnemer03e2cc32015-12-21 22:09:27 +000086 bool RelaxAll, bool IncrementalLinkerCompatible);
Saleem Abdulrasoola8b1f722014-04-27 03:48:12 +000087
Rafael Espindoladf7305a2015-04-09 17:10:57 +000088/// Construct an X86 Mach-O object writer.
Rafael Espindola5560a4c2015-04-14 22:14:34 +000089MCObjectWriter *createX86MachObjectWriter(raw_pwrite_stream &OS, bool Is64Bit,
Evan Chengb2531002011-07-25 19:33:48 +000090 uint32_t CPUType,
91 uint32_t CPUSubtype);
Evan Cheng7e763d82011-07-25 18:43:53 +000092
Rafael Espindoladf7305a2015-04-09 17:10:57 +000093/// Construct an X86 ELF object writer.
Rafael Espindola5560a4c2015-04-14 22:14:34 +000094MCObjectWriter *createX86ELFObjectWriter(raw_pwrite_stream &OS, bool IsELF64,
Rafael Espindola49286e92015-04-09 18:32:58 +000095 uint8_t OSABI, uint16_t EMachine);
Rafael Espindoladf7305a2015-04-09 17:10:57 +000096/// Construct an X86 Win COFF object writer.
Rafael Espindola5560a4c2015-04-14 22:14:34 +000097MCObjectWriter *createX86WinCOFFObjectWriter(raw_pwrite_stream &OS,
98 bool Is64Bit);
Ahmed Bougachaad1084d2013-05-24 00:39:57 +000099
Craig Topperc0453e82015-12-25 22:10:08 +0000100/// Returns the sub or super register of a specific X86 register.
101/// e.g. getX86SubSuperRegister(X86::EAX, 16) returns X86::AX.
102/// Aborts on error.
103unsigned getX86SubSuperRegister(unsigned, unsigned, bool High=false);
104
105/// Returns the sub or super register of a specific X86 register.
106/// Like getX86SubSuperRegister() but returns 0 on error.
107unsigned getX86SubSuperRegisterOrZero(unsigned, unsigned,
108 bool High = false);
109
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000110} // End llvm namespace
Evan Chenge862d592011-06-24 20:42:09 +0000111
Evan Cheng4d1ca962011-07-08 01:53:10 +0000112
Evan Cheng24753312011-06-24 01:44:41 +0000113// Defines symbolic names for X86 registers. This defines a mapping from
114// register name to register number.
115//
Evan Chengd9997ac2011-06-27 18:32:37 +0000116#define GET_REGINFO_ENUM
117#include "X86GenRegisterInfo.inc"
Evan Chengb2681be2011-06-24 23:59:54 +0000118
Evan Cheng1e210d02011-06-28 20:07:07 +0000119// Defines symbolic names for the X86 instructions.
120//
121#define GET_INSTRINFO_ENUM
122#include "X86GenInstrInfo.inc"
123
Evan Chengbc153d42011-07-14 20:59:42 +0000124#define GET_SUBTARGETINFO_ENUM
125#include "X86GenSubtargetInfo.inc"
126
Evan Chengb2681be2011-06-24 23:59:54 +0000127#endif