blob: df9874c78d07b55041c4152a150e6136453d7cb4 [file] [log] [blame]
Evan Cheng928ce722011-07-06 22:02:34 +00001//===-- ARMMCTargetDesc.h - ARM Target Descriptions -------------*- C++ -*-===//
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 ARM specific target descriptions.
11//
12//===----------------------------------------------------------------------===//
13
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCTARGETDESC_H
15#define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMMCTARGETDESC_H
Evan Cheng928ce722011-07-06 22:02:34 +000016
NAKAMURA Takumi287bc6b2011-07-23 01:16:22 +000017#include "llvm/Support/DataTypes.h"
Lang Hames232cdb42017-10-10 16:59:01 +000018#include <memory>
Evan Cheng2bd65362011-07-07 00:08:19 +000019#include <string>
20
Evan Cheng928ce722011-07-06 22:02:34 +000021namespace llvm {
Rafael Espindolaa17151a2013-10-08 13:08:17 +000022class formatted_raw_ostream;
Evan Cheng5928e692011-07-25 23:24:55 +000023class MCAsmBackend;
Evan Chengad5f4852011-07-23 00:00:19 +000024class MCCodeEmitter;
25class MCContext;
26class MCInstrInfo;
Rafael Espindolaa17151a2013-10-08 13:08:17 +000027class MCInstPrinter;
Evan Chengad5f4852011-07-23 00:00:19 +000028class MCObjectWriter;
Jim Grosbachc3b04272012-05-15 17:35:52 +000029class MCRegisterInfo;
Evan Cheng4d1ca962011-07-08 01:53:10 +000030class MCSubtargetInfo;
Rafael Espindolaa17151a2013-10-08 13:08:17 +000031class MCStreamer;
Joel Jones373d7d32016-07-25 17:18:28 +000032class MCTargetOptions;
Ahmed Bougachaad1084d2013-05-24 00:39:57 +000033class MCRelocationInfo;
Peter Collingbourne20c72592015-02-19 00:45:02 +000034class MCTargetStreamer;
Evan Cheng2bd65362011-07-07 00:08:19 +000035class StringRef;
Evan Chengad5f4852011-07-23 00:00:19 +000036class Target;
Daniel Sanders50f17232015-09-15 16:17:27 +000037class Triple;
Evan Chengad5f4852011-07-23 00:00:19 +000038class raw_ostream;
Rafael Espindola5560a4c2015-04-14 22:14:34 +000039class raw_pwrite_stream;
Evan Cheng928ce722011-07-06 22:02:34 +000040
Mehdi Aminif42454b2016-10-09 23:00:34 +000041Target &getTheARMLETarget();
42Target &getTheThumbLETarget();
43Target &getTheARMBETarget();
44Target &getTheThumbBETarget();
Evan Cheng2bd65362011-07-07 00:08:19 +000045
46namespace ARM_MC {
Daniel Sanders50f17232015-09-15 16:17:27 +000047std::string ParseARMTriple(const Triple &TT, StringRef CPU);
Evan Cheng4d1ca962011-07-08 01:53:10 +000048
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000049/// Create a ARM MCSubtargetInfo instance. This is exposed so Asm parser, etc.
50/// do not need to go through TargetRegistry.
Daniel Sanders50f17232015-09-15 16:17:27 +000051MCSubtargetInfo *createARMMCSubtargetInfo(const Triple &TT, StringRef CPU,
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000052 StringRef FS);
Evan Cheng2bd65362011-07-07 00:08:19 +000053}
54
Peter Collingbourne20c72592015-02-19 00:45:02 +000055MCTargetStreamer *createARMNullTargetStreamer(MCStreamer &S);
Rafael Espindola73870dd2015-03-16 21:43:42 +000056MCTargetStreamer *createARMTargetAsmStreamer(MCStreamer &S,
57 formatted_raw_ostream &OS,
58 MCInstPrinter *InstPrint,
59 bool isVerboseAsm);
Rafael Espindolacd584a82015-03-19 01:50:16 +000060MCTargetStreamer *createARMObjectTargetStreamer(MCStreamer &S,
61 const MCSubtargetInfo &STI);
Peter Collingbourne20c72592015-02-19 00:45:02 +000062
Christian Pirkerdc9ff752014-04-01 15:19:30 +000063MCCodeEmitter *createARMLEMCCodeEmitter(const MCInstrInfo &MCII,
Christian Pirker2a111602014-03-28 14:35:30 +000064 const MCRegisterInfo &MRI,
Christian Pirker2a111602014-03-28 14:35:30 +000065 MCContext &Ctx);
66
Christian Pirkerdc9ff752014-04-01 15:19:30 +000067MCCodeEmitter *createARMBEMCCodeEmitter(const MCInstrInfo &MCII,
Christian Pirker2a111602014-03-28 14:35:30 +000068 const MCRegisterInfo &MRI,
Christian Pirker2a111602014-03-28 14:35:30 +000069 MCContext &Ctx);
Evan Chengad5f4852011-07-23 00:00:19 +000070
Alex Bradbury46db78b2018-01-03 13:46:21 +000071MCAsmBackend *createARMAsmBackend(const Target &T, const MCSubtargetInfo &STI,
72 const MCRegisterInfo &MRI,
Joel Jones373d7d32016-07-25 17:18:28 +000073 const MCTargetOptions &Options,
Christian Pirker2a111602014-03-28 14:35:30 +000074 bool IsLittleEndian);
75
Alex Bradburyb22f7512018-01-03 08:53:05 +000076MCAsmBackend *createARMLEAsmBackend(const Target &T, const MCSubtargetInfo &STI,
77 const MCRegisterInfo &MRI,
Joel Jones373d7d32016-07-25 17:18:28 +000078 const MCTargetOptions &Options);
Evan Chengad5f4852011-07-23 00:00:19 +000079
Alex Bradburyb22f7512018-01-03 08:53:05 +000080MCAsmBackend *createARMBEAsmBackend(const Target &T, const MCSubtargetInfo &STI,
81 const MCRegisterInfo &MRI,
Joel Jones373d7d32016-07-25 17:18:28 +000082 const MCTargetOptions &Options);
Christian Pirker2a111602014-03-28 14:35:30 +000083
Daniel Sanders418caf52015-06-10 10:35:34 +000084MCAsmBackend *createThumbLEAsmBackend(const Target &T,
Alex Bradburyb22f7512018-01-03 08:53:05 +000085 const MCSubtargetInfo &STI,
Daniel Sanders418caf52015-06-10 10:35:34 +000086 const MCRegisterInfo &MRI,
Joel Jones373d7d32016-07-25 17:18:28 +000087 const MCTargetOptions &Options);
Christian Pirker2a111602014-03-28 14:35:30 +000088
Daniel Sanders418caf52015-06-10 10:35:34 +000089MCAsmBackend *createThumbBEAsmBackend(const Target &T,
Alex Bradburyb22f7512018-01-03 08:53:05 +000090 const MCSubtargetInfo &STI,
Daniel Sanders418caf52015-06-10 10:35:34 +000091 const MCRegisterInfo &MRI,
Joel Jones373d7d32016-07-25 17:18:28 +000092 const MCTargetOptions &Options);
Christian Pirker2a111602014-03-28 14:35:30 +000093
Rafael Espindolacd584a82015-03-19 01:50:16 +000094// Construct a PE/COFF machine code streamer which will generate a PE/COFF
95// object file.
Lang Hames02d33052017-10-11 01:57:21 +000096MCStreamer *createARMWinCOFFStreamer(MCContext &Context,
97 std::unique_ptr<MCAsmBackend> &&MAB,
Rafael Espindola5560a4c2015-04-14 22:14:34 +000098 raw_pwrite_stream &OS,
Lang Hames2241ffa2017-10-11 23:34:47 +000099 std::unique_ptr<MCCodeEmitter> &&Emitter,
100 bool RelaxAll,
David Majnemer03e2cc32015-12-21 22:09:27 +0000101 bool IncrementalLinkerCompatible);
Saleem Abdulrasool84b952b2014-04-27 03:48:22 +0000102
Rafael Espindoladf7305a2015-04-09 17:10:57 +0000103/// Construct an ELF Mach-O object writer.
Lang Hames60fbc7c2017-10-10 16:28:07 +0000104std::unique_ptr<MCObjectWriter> createARMELFObjectWriter(raw_pwrite_stream &OS,
105 uint8_t OSABI,
106 bool IsLittleEndian);
Rafael Espindolaa0124052011-12-22 00:37:50 +0000107
Rafael Espindoladf7305a2015-04-09 17:10:57 +0000108/// Construct an ARM Mach-O object writer.
Lang Hames60fbc7c2017-10-10 16:28:07 +0000109std::unique_ptr<MCObjectWriter> createARMMachObjectWriter(raw_pwrite_stream &OS,
110 bool Is64Bit,
111 uint32_t CPUType,
112 uint32_t CPUSubtype);
Evan Chengad5f4852011-07-23 00:00:19 +0000113
Rafael Espindoladf7305a2015-04-09 17:10:57 +0000114/// Construct an ARM PE/COFF object writer.
Lang Hames60fbc7c2017-10-10 16:28:07 +0000115std::unique_ptr<MCObjectWriter>
116createARMWinCOFFObjectWriter(raw_pwrite_stream &OS, bool Is64Bit);
Ahmed Bougachaad1084d2013-05-24 00:39:57 +0000117
Rafael Espindoladf7305a2015-04-09 17:10:57 +0000118/// Construct ARM Mach-O relocation info.
Ahmed Bougachaad1084d2013-05-24 00:39:57 +0000119MCRelocationInfo *createARMMachORelocationInfo(MCContext &Ctx);
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000120} // End llvm namespace
Evan Cheng928ce722011-07-06 22:02:34 +0000121
122// Defines symbolic names for ARM registers. This defines a mapping from
123// register name to register number.
124//
125#define GET_REGINFO_ENUM
126#include "ARMGenRegisterInfo.inc"
127
128// Defines symbolic names for the ARM instructions.
129//
130#define GET_INSTRINFO_ENUM
131#include "ARMGenInstrInfo.inc"
132
Evan Chengbc153d42011-07-14 20:59:42 +0000133#define GET_SUBTARGETINFO_ENUM
134#include "ARMGenSubtargetInfo.inc"
135
Evan Cheng928ce722011-07-06 22:02:34 +0000136#endif