blob: 737441b40e48942c31c940a85a3622a8dc7343ef [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
Oscar Fuentes47d4aaf2011-07-25 20:13:36 +000017#include "llvm/Support/DataTypes.h"
Evan Cheng13bcc6c2011-07-07 21:06:52 +000018#include <string>
19
Evan Chenge862d592011-06-24 20:42:09 +000020namespace llvm {
Evan Cheng5928e692011-07-25 23:24:55 +000021class MCAsmBackend;
Evan Cheng7e763d82011-07-25 18:43:53 +000022class MCCodeEmitter;
23class MCContext;
24class MCInstrInfo;
Evan Chengb2531002011-07-25 19:33:48 +000025class MCObjectWriter;
Evan Chengd60fa58b2011-07-18 20:57:22 +000026class MCRegisterInfo;
Evan Cheng4d1ca962011-07-08 01:53:10 +000027class MCSubtargetInfo;
Ahmed Bougachaad1084d2013-05-24 00:39:57 +000028class MCRelocationInfo;
Saleem Abdulrasoola8b1f722014-04-27 03:48:12 +000029class MCStreamer;
Evan Chenge862d592011-06-24 20:42:09 +000030class Target;
Eric Christopher1f8ad4f2014-06-10 22:34:28 +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 Sandersa73f1fd2015-06-10 12:11:26 +000055std::string ParseX86Triple(const Triple &TT);
Evan Cheng13bcc6c2011-07-07 21:06:52 +000056
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000057unsigned getDwarfRegFlavour(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.
63MCSubtargetInfo *createX86MCSubtargetInfo(const Triple &TT, StringRef CPU,
64 StringRef FS);
Evan Cheng13bcc6c2011-07-07 21:06:52 +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 Sanders418caf52015-06-10 10:35:34 +000072 const Triple &TT, StringRef CPU);
Bill Wendling58e2d3d2013-09-09 02:37:14 +000073MCAsmBackend *createX86_64AsmBackend(const Target &T, const MCRegisterInfo &MRI,
Daniel Sanders418caf52015-06-10 10:35:34 +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,
Saleem Abdulrasoola8b1f722014-04-27 03:48:12 +000082 bool RelaxAll);
83
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
Rafael Espindoladf7305a2015-04-09 17:10:57 +000096/// Construct X86-64 Mach-O relocation info.
Ahmed Bougachaad1084d2013-05-24 00:39:57 +000097MCRelocationInfo *createX86_64MachORelocationInfo(MCContext &Ctx);
98
Rafael Espindoladf7305a2015-04-09 17:10:57 +000099/// Construct X86-64 ELF relocation info.
Ahmed Bougachaad1084d2013-05-24 00:39:57 +0000100MCRelocationInfo *createX86_64ELFRelocationInfo(MCContext &Ctx);
Evan Chenge862d592011-06-24 20:42:09 +0000101} // End llvm namespace
102
Evan Cheng4d1ca962011-07-08 01:53:10 +0000103
Evan Cheng24753312011-06-24 01:44:41 +0000104// Defines symbolic names for X86 registers. This defines a mapping from
105// register name to register number.
106//
Evan Chengd9997ac2011-06-27 18:32:37 +0000107#define GET_REGINFO_ENUM
108#include "X86GenRegisterInfo.inc"
Evan Chengb2681be2011-06-24 23:59:54 +0000109
Evan Cheng1e210d02011-06-28 20:07:07 +0000110// Defines symbolic names for the X86 instructions.
111//
112#define GET_INSTRINFO_ENUM
113#include "X86GenInstrInfo.inc"
114
Evan Chengbc153d42011-07-14 20:59:42 +0000115#define GET_SUBTARGETINFO_ENUM
116#include "X86GenSubtargetInfo.inc"
117
Evan Chengb2681be2011-06-24 23:59:54 +0000118#endif