blob: 953ba9ec17ca41b57527689b8a6672e1903735ab [file] [log] [blame]
Tim Northover3b0846e2014-05-24 12:50:23 +00001//===-- AArch64MCTargetDesc.cpp - AArch64 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 AArch64 specific target descriptions.
11//
12//===----------------------------------------------------------------------===//
13
14#include "AArch64MCTargetDesc.h"
15#include "AArch64ELFStreamer.h"
16#include "AArch64MCAsmInfo.h"
17#include "InstPrinter/AArch64InstPrinter.h"
18#include "llvm/MC/MCCodeGenInfo.h"
19#include "llvm/MC/MCInstrInfo.h"
20#include "llvm/MC/MCRegisterInfo.h"
21#include "llvm/MC/MCStreamer.h"
22#include "llvm/MC/MCSubtargetInfo.h"
23#include "llvm/Support/ErrorHandling.h"
24#include "llvm/Support/TargetRegistry.h"
25
26using namespace llvm;
27
28#define GET_INSTRINFO_MC_DESC
29#include "AArch64GenInstrInfo.inc"
30
31#define GET_SUBTARGETINFO_MC_DESC
32#include "AArch64GenSubtargetInfo.inc"
33
34#define GET_REGINFO_MC_DESC
35#include "AArch64GenRegisterInfo.inc"
36
37static MCInstrInfo *createAArch64MCInstrInfo() {
38 MCInstrInfo *X = new MCInstrInfo();
39 InitAArch64MCInstrInfo(X);
40 return X;
41}
42
Daniel Sanders153010c2015-09-15 14:08:28 +000043static MCSubtargetInfo *createAArch64MCSubtargetInfo(const TargetTuple &TT,
44 StringRef CPU,
45 StringRef FS) {
Tim Northover3b0846e2014-05-24 12:50:23 +000046 if (CPU.empty())
47 CPU = "generic";
48
Duncan P. N. Exon Smith754e21f2015-07-10 22:43:42 +000049 return createAArch64MCSubtargetInfoImpl(TT, CPU, FS);
Tim Northover3b0846e2014-05-24 12:50:23 +000050}
51
Daniel Sanders153010c2015-09-15 14:08:28 +000052static MCRegisterInfo *createAArch64MCRegisterInfo(const TargetTuple &TT) {
Tim Northover3b0846e2014-05-24 12:50:23 +000053 MCRegisterInfo *X = new MCRegisterInfo();
54 InitAArch64MCRegisterInfo(X, AArch64::LR);
55 return X;
56}
57
58static MCAsmInfo *createAArch64MCAsmInfo(const MCRegisterInfo &MRI,
Daniel Sanders153010c2015-09-15 14:08:28 +000059 const TargetTuple &TT) {
Tim Northover3b0846e2014-05-24 12:50:23 +000060 MCAsmInfo *MAI;
Daniel Sanders153010c2015-09-15 14:08:28 +000061 if (TT.isOSBinFormatMachO())
Tim Northover3b0846e2014-05-24 12:50:23 +000062 MAI = new AArch64MCAsmInfoDarwin();
63 else {
Daniel Sanders153010c2015-09-15 14:08:28 +000064 assert(TT.isOSBinFormatELF() && "Only expect Darwin or ELF");
65 MAI = new AArch64MCAsmInfoELF(TT);
Tim Northover3b0846e2014-05-24 12:50:23 +000066 }
67
68 // Initial state of the frame pointer is SP.
69 unsigned Reg = MRI.getDwarfRegNum(AArch64::SP, true);
70 MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 0);
71 MAI->addInitialFrameState(Inst);
72
73 return MAI;
74}
75
Daniel Sanders153010c2015-09-15 14:08:28 +000076static MCCodeGenInfo *createAArch64MCCodeGenInfo(const TargetTuple &TT,
Daniel Sandersf423f562015-07-06 16:56:07 +000077 Reloc::Model RM,
Tim Northover3b0846e2014-05-24 12:50:23 +000078 CodeModel::Model CM,
79 CodeGenOpt::Level OL) {
Daniel Sandersf423f562015-07-06 16:56:07 +000080 assert((TT.isOSBinFormatELF() || TT.isOSBinFormatMachO()) &&
Tim Northover3b0846e2014-05-24 12:50:23 +000081 "Only expect Darwin and ELF targets");
82
83 if (CM == CodeModel::Default)
84 CM = CodeModel::Small;
85 // The default MCJIT memory managers make no guarantees about where they can
86 // find an executable page; JITed code needs to be able to refer to globals
87 // no matter how far away they are.
88 else if (CM == CodeModel::JITDefault)
89 CM = CodeModel::Large;
90 else if (CM != CodeModel::Small && CM != CodeModel::Large)
91 report_fatal_error(
92 "Only small and large code models are allowed on AArch64");
93
94 // AArch64 Darwin is always PIC.
Daniel Sandersf423f562015-07-06 16:56:07 +000095 if (TT.isOSDarwin())
Tim Northover3b0846e2014-05-24 12:50:23 +000096 RM = Reloc::PIC_;
97 // On ELF platforms the default static relocation model has a smart enough
98 // linker to cope with referencing external symbols defined in a shared
99 // library. Hence DynamicNoPIC doesn't need to be promoted to PIC.
100 else if (RM == Reloc::Default || RM == Reloc::DynamicNoPIC)
101 RM = Reloc::Static;
102
103 MCCodeGenInfo *X = new MCCodeGenInfo();
Jim Grosbach4c98cf72015-05-15 19:13:31 +0000104 X->initMCCodeGenInfo(RM, CM, OL);
Tim Northover3b0846e2014-05-24 12:50:23 +0000105 return X;
106}
107
Daniel Sanders153010c2015-09-15 14:08:28 +0000108static MCInstPrinter *createAArch64MCInstPrinter(const TargetTuple &TT,
Eric Christopherf8019402015-03-31 00:10:04 +0000109 unsigned SyntaxVariant,
Tim Northover3b0846e2014-05-24 12:50:23 +0000110 const MCAsmInfo &MAI,
111 const MCInstrInfo &MII,
Eric Christopherf8019402015-03-31 00:10:04 +0000112 const MCRegisterInfo &MRI) {
Tim Northover3b0846e2014-05-24 12:50:23 +0000113 if (SyntaxVariant == 0)
Eric Christopher2226c722015-03-30 21:52:26 +0000114 return new AArch64InstPrinter(MAI, MII, MRI);
Tim Northover3b0846e2014-05-24 12:50:23 +0000115 if (SyntaxVariant == 1)
Eric Christopher2226c722015-03-30 21:52:26 +0000116 return new AArch64AppleInstPrinter(MAI, MII, MRI);
Tim Northover3b0846e2014-05-24 12:50:23 +0000117
118 return nullptr;
119}
120
Daniel Sanders153010c2015-09-15 14:08:28 +0000121static MCStreamer *createELFStreamer(const TargetTuple &TT, MCContext &Ctx,
Rafael Espindola5560a4c2015-04-14 22:14:34 +0000122 MCAsmBackend &TAB, raw_pwrite_stream &OS,
Rafael Espindolacd584a82015-03-19 01:50:16 +0000123 MCCodeEmitter *Emitter, bool RelaxAll) {
Rafael Espindola7b61ddf2014-10-15 16:12:52 +0000124 return createAArch64ELFStreamer(Ctx, TAB, OS, Emitter, RelaxAll);
Tim Northover3b0846e2014-05-24 12:50:23 +0000125}
126
Rafael Espindolacd584a82015-03-19 01:50:16 +0000127static MCStreamer *createMachOStreamer(MCContext &Ctx, MCAsmBackend &TAB,
Rafael Espindola5560a4c2015-04-14 22:14:34 +0000128 raw_pwrite_stream &OS,
129 MCCodeEmitter *Emitter, bool RelaxAll,
Rafael Espindola36a15cb2015-03-20 20:00:01 +0000130 bool DWARFMustBeAtTheEnd) {
Rafael Espindolacd584a82015-03-19 01:50:16 +0000131 return createMachOStreamer(Ctx, TAB, OS, Emitter, RelaxAll,
Rafael Espindola36a15cb2015-03-20 20:00:01 +0000132 DWARFMustBeAtTheEnd,
Rafael Espindolacd584a82015-03-19 01:50:16 +0000133 /*LabelSections*/ true);
134}
135
Tim Northover3b0846e2014-05-24 12:50:23 +0000136// Force static initialization.
137extern "C" void LLVMInitializeAArch64TargetMC() {
Rafael Espindola69244c32015-03-18 23:15:49 +0000138 for (Target *T :
139 {&TheAArch64leTarget, &TheAArch64beTarget, &TheARM64Target}) {
140 // Register the MC asm info.
141 RegisterMCAsmInfoFn X(*T, createAArch64MCAsmInfo);
Tim Northover3b0846e2014-05-24 12:50:23 +0000142
Rafael Espindola69244c32015-03-18 23:15:49 +0000143 // Register the MC codegen info.
144 TargetRegistry::RegisterMCCodeGenInfo(*T, createAArch64MCCodeGenInfo);
Tim Northover3b0846e2014-05-24 12:50:23 +0000145
Rafael Espindola69244c32015-03-18 23:15:49 +0000146 // Register the MC instruction info.
147 TargetRegistry::RegisterMCInstrInfo(*T, createAArch64MCInstrInfo);
Tim Northover3b0846e2014-05-24 12:50:23 +0000148
Rafael Espindola69244c32015-03-18 23:15:49 +0000149 // Register the MC register info.
150 TargetRegistry::RegisterMCRegInfo(*T, createAArch64MCRegisterInfo);
Tim Northover3b0846e2014-05-24 12:50:23 +0000151
Rafael Espindola69244c32015-03-18 23:15:49 +0000152 // Register the MC subtarget info.
153 TargetRegistry::RegisterMCSubtargetInfo(*T, createAArch64MCSubtargetInfo);
154
155 // Register the MC Code Emitter
156 TargetRegistry::RegisterMCCodeEmitter(*T, createAArch64MCCodeEmitter);
157
Rafael Espindolacd584a82015-03-19 01:50:16 +0000158 // Register the obj streamers.
159 TargetRegistry::RegisterELFStreamer(*T, createELFStreamer);
160 TargetRegistry::RegisterMachOStreamer(*T, createMachOStreamer);
161
162 // Register the obj target streamer.
163 TargetRegistry::RegisterObjectTargetStreamer(
164 *T, createAArch64ObjectTargetStreamer);
Rafael Espindola69244c32015-03-18 23:15:49 +0000165
166 // Register the asm streamer.
167 TargetRegistry::RegisterAsmTargetStreamer(*T,
168 createAArch64AsmTargetStreamer);
169 // Register the MCInstPrinter.
170 TargetRegistry::RegisterMCInstPrinter(*T, createAArch64MCInstPrinter);
171 }
Tim Northover3b0846e2014-05-24 12:50:23 +0000172
173 // Register the asm backend.
Rafael Espindola69244c32015-03-18 23:15:49 +0000174 for (Target *T : {&TheAArch64leTarget, &TheARM64Target})
175 TargetRegistry::RegisterMCAsmBackend(*T, createAArch64leAsmBackend);
Tim Northover3b0846e2014-05-24 12:50:23 +0000176 TargetRegistry::RegisterMCAsmBackend(TheAArch64beTarget,
177 createAArch64beAsmBackend);
Tim Northover3b0846e2014-05-24 12:50:23 +0000178}