blob: a695a3bdbc452211adc3441bfe95da1d3a6db790 [file] [log] [blame]
Craig Topperf3f66502012-03-17 09:39:20 +00001//===-- HexagonMCTargetDesc.cpp - Hexagon Target Descriptions -------------===//
Tony Linthicumb3705e02011-12-15 22:29:08 +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//
Craig Topperbc3168b2012-03-17 09:28:37 +000010// This file provides Hexagon specific target descriptions.
Tony Linthicumb3705e02011-12-15 22:29:08 +000011//
12//===----------------------------------------------------------------------===//
13
Chandler Carruth6bda14b2017-06-06 11:49:48 +000014#include "MCTargetDesc/HexagonMCTargetDesc.h"
Eugene Zelenko401f3812016-12-17 01:29:35 +000015#include "Hexagon.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000016#include "HexagonTargetStreamer.h"
Colin LeMahieuff062612014-11-20 21:56:35 +000017#include "MCTargetDesc/HexagonInstPrinter.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000018#include "MCTargetDesc/HexagonMCAsmInfo.h"
19#include "MCTargetDesc/HexagonMCELFStreamer.h"
Eugene Zelenko50156892016-12-17 01:17:18 +000020#include "MCTargetDesc/HexagonMCInstrInfo.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000021#include "llvm/ADT/StringRef.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000022#include "llvm/BinaryFormat/ELF.h"
Lang Hames02d33052017-10-11 01:57:21 +000023#include "llvm/MC/MCAsmBackend.h"
Colin LeMahieube99a022015-06-17 03:06:16 +000024#include "llvm/MC/MCContext.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000025#include "llvm/MC/MCDwarf.h"
Colin LeMahieu2c769202014-11-06 17:05:51 +000026#include "llvm/MC/MCELFStreamer.h"
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +000027#include "llvm/MC/MCInstrAnalysis.h"
Tony Linthicumb3705e02011-12-15 22:29:08 +000028#include "llvm/MC/MCInstrInfo.h"
29#include "llvm/MC/MCRegisterInfo.h"
Jyotsna Verma7503a622013-02-20 16:13:27 +000030#include "llvm/MC/MCStreamer.h"
Tony Linthicumb3705e02011-12-15 22:29:08 +000031#include "llvm/MC/MCSubtargetInfo.h"
Craig Topperc4965bc2012-02-05 07:21:30 +000032#include "llvm/Support/ErrorHandling.h"
Tony Linthicumb3705e02011-12-15 22:29:08 +000033#include "llvm/Support/TargetRegistry.h"
Chandler Carruth6bda14b2017-06-06 11:49:48 +000034#include "llvm/Support/raw_ostream.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000035#include <cassert>
36#include <cstdint>
37#include <new>
38#include <string>
Tony Linthicumb3705e02011-12-15 22:29:08 +000039
Chandler Carruthd174b722014-04-22 02:03:14 +000040using namespace llvm;
41
Tony Linthicumb3705e02011-12-15 22:29:08 +000042#define GET_INSTRINFO_MC_DESC
43#include "HexagonGenInstrInfo.inc"
44
45#define GET_SUBTARGETINFO_MC_DESC
46#include "HexagonGenSubtargetInfo.inc"
47
48#define GET_REGINFO_MC_DESC
49#include "HexagonGenRegisterInfo.inc"
50
Colin LeMahieu7cd08922015-11-09 04:07:48 +000051cl::opt<bool> llvm::HexagonDisableCompound
52 ("mno-compound",
53 cl::desc("Disable looking for compound instructions for Hexagon"));
54
55cl::opt<bool> llvm::HexagonDisableDuplex
56 ("mno-pairing",
57 cl::desc("Disable looking for duplex instructions for Hexagon"));
58
Krzysztof Parzyszek64d4e2b2016-04-20 21:17:40 +000059static cl::opt<bool> HexagonV4ArchVariant("mv4", cl::Hidden, cl::init(false),
60 cl::desc("Build for Hexagon V4"));
61
62static cl::opt<bool> HexagonV5ArchVariant("mv5", cl::Hidden, cl::init(false),
63 cl::desc("Build for Hexagon V5"));
64
65static cl::opt<bool> HexagonV55ArchVariant("mv55", cl::Hidden, cl::init(false),
66 cl::desc("Build for Hexagon V55"));
67
68static cl::opt<bool> HexagonV60ArchVariant("mv60", cl::Hidden, cl::init(false),
69 cl::desc("Build for Hexagon V60"));
70
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +000071static cl::opt<bool> HexagonV62ArchVariant("mv62", cl::Hidden, cl::init(false),
72 cl::desc("Build for Hexagon V62"));
73
Krzysztof Parzyszek7a0981a2017-03-09 17:05:11 +000074static cl::opt<bool> EnableHVX("mhvx", cl::Hidden, cl::init(false),
75 cl::desc("Enable Hexagon Vector Extension (HVX)"));
76
Krzysztof Parzyszek64d4e2b2016-04-20 21:17:40 +000077static StringRef DefaultArch = "hexagonv60";
78
79static StringRef HexagonGetArchVariant() {
80 if (HexagonV4ArchVariant)
81 return "hexagonv4";
82 if (HexagonV5ArchVariant)
83 return "hexagonv5";
84 if (HexagonV55ArchVariant)
85 return "hexagonv55";
86 if (HexagonV60ArchVariant)
87 return "hexagonv60";
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +000088 if (HexagonV62ArchVariant)
89 return "hexagonv62";
Krzysztof Parzyszek64d4e2b2016-04-20 21:17:40 +000090 return "";
91}
92
Krzysztof Parzyszek75e74ee2016-08-19 14:09:47 +000093StringRef Hexagon_MC::selectHexagonCPU(const Triple &TT, StringRef CPU) {
Krzysztof Parzyszek64d4e2b2016-04-20 21:17:40 +000094 StringRef ArchV = HexagonGetArchVariant();
95 if (!ArchV.empty() && !CPU.empty()) {
96 if (ArchV != CPU)
97 report_fatal_error("conflicting architectures specified.");
98 return CPU;
99 }
100 if (ArchV.empty()) {
101 if (CPU.empty())
102 CPU = DefaultArch;
103 return CPU;
104 }
105 return ArchV;
Krzysztof Parzyszek759a7d02015-12-14 15:03:54 +0000106}
107
Benjamin Kramerefcf06f2017-02-11 11:06:55 +0000108unsigned llvm::HexagonGetLastSlot() { return HexagonItinerariesV4FU::SLOT3; }
Tony Linthicumb3705e02011-12-15 22:29:08 +0000109
Colin LeMahieube99a022015-06-17 03:06:16 +0000110namespace {
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000111
Colin LeMahieud2158752015-06-18 20:43:50 +0000112class HexagonTargetAsmStreamer : public HexagonTargetStreamer {
Colin LeMahieud2158752015-06-18 20:43:50 +0000113public:
114 HexagonTargetAsmStreamer(MCStreamer &S,
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000115 formatted_raw_ostream &OS,
116 bool isVerboseAsm,
117 MCInstPrinter &IP)
Colin LeMahieufa389722015-06-18 21:03:13 +0000118 : HexagonTargetStreamer(S) {}
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000119
Colin LeMahieud2158752015-06-18 20:43:50 +0000120 void prettyPrintAsm(MCInstPrinter &InstPrinter, raw_ostream &OS,
121 const MCInst &Inst, const MCSubtargetInfo &STI) override {
122 assert(HexagonMCInstrInfo::isBundle(Inst));
123 assert(HexagonMCInstrInfo::bundleSize(Inst) <= HEXAGON_PACKET_SIZE);
124 std::string Buffer;
125 {
126 raw_string_ostream TempStream(Buffer);
127 InstPrinter.printInst(&Inst, TempStream, "", STI);
128 }
129 StringRef Contents(Buffer);
130 auto PacketBundle = Contents.rsplit('\n');
131 auto HeadTail = PacketBundle.first.split('\n');
Colin LeMahieub7a5f9f2015-11-10 00:22:00 +0000132 StringRef Separator = "\n";
133 StringRef Indent = "\t\t";
134 OS << "\t{\n";
135 while (!HeadTail.first.empty()) {
136 StringRef InstTxt;
Colin LeMahieud2158752015-06-18 20:43:50 +0000137 auto Duplex = HeadTail.first.split('\v');
Colin LeMahieub7a5f9f2015-11-10 00:22:00 +0000138 if (!Duplex.second.empty()) {
139 OS << Indent << Duplex.first << Separator;
140 InstTxt = Duplex.second;
141 } else if (!HeadTail.first.trim().startswith("immext")) {
142 InstTxt = Duplex.first;
Colin LeMahieud2158752015-06-18 20:43:50 +0000143 }
Colin LeMahieub7a5f9f2015-11-10 00:22:00 +0000144 if (!InstTxt.empty())
145 OS << Indent << InstTxt << Separator;
Colin LeMahieud2158752015-06-18 20:43:50 +0000146 HeadTail = HeadTail.second.split('\n');
Colin LeMahieud2158752015-06-18 20:43:50 +0000147 }
Colin LeMahieub7a5f9f2015-11-10 00:22:00 +0000148 OS << "\t}" << PacketBundle.second;
Colin LeMahieud2158752015-06-18 20:43:50 +0000149 }
150};
Colin LeMahieud2158752015-06-18 20:43:50 +0000151
Colin LeMahieube99a022015-06-17 03:06:16 +0000152class HexagonTargetELFStreamer : public HexagonTargetStreamer {
153public:
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000154 MCELFStreamer &getStreamer() {
155 return static_cast<MCELFStreamer &>(Streamer);
156 }
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000157 HexagonTargetELFStreamer(MCStreamer &S, MCSubtargetInfo const &STI)
158 : HexagonTargetStreamer(S) {
159 MCAssembler &MCA = getStreamer().getAssembler();
160 MCA.setELFHeaderEFlags(Hexagon_MC::GetELFFlags(STI));
161 }
162
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000163
Colin LeMahieube99a022015-06-17 03:06:16 +0000164 void EmitCommonSymbolSorted(MCSymbol *Symbol, uint64_t Size,
165 unsigned ByteAlignment,
166 unsigned AccessSize) override {
167 HexagonMCELFStreamer &HexagonELFStreamer =
168 static_cast<HexagonMCELFStreamer &>(getStreamer());
169 HexagonELFStreamer.HexagonMCEmitCommonSymbol(Symbol, Size, ByteAlignment,
170 AccessSize);
171 }
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000172
Colin LeMahieube99a022015-06-17 03:06:16 +0000173 void EmitLocalCommonSymbolSorted(MCSymbol *Symbol, uint64_t Size,
174 unsigned ByteAlignment,
175 unsigned AccessSize) override {
176 HexagonMCELFStreamer &HexagonELFStreamer =
177 static_cast<HexagonMCELFStreamer &>(getStreamer());
178 HexagonELFStreamer.HexagonMCEmitLocalCommonSymbol(
179 Symbol, Size, ByteAlignment, AccessSize);
180 }
181};
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000182
183} // end anonymous namespace
Colin LeMahieube99a022015-06-17 03:06:16 +0000184
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000185llvm::MCInstrInfo *llvm::createHexagonMCInstrInfo() {
186 MCInstrInfo *X = new MCInstrInfo();
187 InitHexagonMCInstrInfo(X);
188 return X;
189}
190
191static MCRegisterInfo *createHexagonMCRegisterInfo(const Triple &TT) {
192 MCRegisterInfo *X = new MCRegisterInfo();
193 InitHexagonMCRegisterInfo(X, Hexagon::R31);
194 return X;
195}
196
Rafael Espindola227144c2013-05-13 01:16:13 +0000197static MCAsmInfo *createHexagonMCAsmInfo(const MCRegisterInfo &MRI,
Daniel Sanders50f17232015-09-15 16:17:27 +0000198 const Triple &TT) {
Rafael Espindola140a8372013-05-10 18:16:59 +0000199 MCAsmInfo *MAI = new HexagonMCAsmInfo(TT);
Tony Linthicumb3705e02011-12-15 22:29:08 +0000200
201 // VirtualFP = (R30 + #0).
Sid Manning7da3f9a2014-10-03 13:18:11 +0000202 MCCFIInstruction Inst =
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000203 MCCFIInstruction::createDefCfa(nullptr,
204 MRI.getDwarfRegNum(Hexagon::R30, true), 0);
Rafael Espindola227144c2013-05-13 01:16:13 +0000205 MAI->addInitialFrameState(Inst);
Tony Linthicumb3705e02011-12-15 22:29:08 +0000206
207 return MAI;
208}
209
Daniel Sanders50f17232015-09-15 16:17:27 +0000210static MCInstPrinter *createHexagonMCInstPrinter(const Triple &T,
Eric Christopherf8019402015-03-31 00:10:04 +0000211 unsigned SyntaxVariant,
Sid Manning12cd21a2014-10-15 18:27:40 +0000212 const MCAsmInfo &MAI,
213 const MCInstrInfo &MII,
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000214 const MCRegisterInfo &MRI)
215{
Eric Christopherfbe80f52015-04-09 19:20:37 +0000216 if (SyntaxVariant == 0)
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000217 return new HexagonInstPrinter(MAI, MII, MRI);
Eric Christopherfbe80f52015-04-09 19:20:37 +0000218 else
Colin LeMahieube99a022015-06-17 03:06:16 +0000219 return nullptr;
220}
221
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000222static MCTargetStreamer *
223createMCAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS,
224 MCInstPrinter *IP, bool IsVerboseAsm) {
225 return new HexagonTargetAsmStreamer(S, OS, IsVerboseAsm, *IP);
Colin LeMahieud2158752015-06-18 20:43:50 +0000226}
227
Lang Hames02d33052017-10-11 01:57:21 +0000228static MCStreamer *createMCStreamer(Triple const &T, MCContext &Context,
229 std::unique_ptr<MCAsmBackend> &&MAB,
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000230 raw_pwrite_stream &OS,
Lang Hames02d33052017-10-11 01:57:21 +0000231 MCCodeEmitter *Emitter, bool RelaxAll) {
232 return createHexagonELFStreamer(T, Context, std::move(MAB), OS, Emitter);
Colin LeMahieube99a022015-06-17 03:06:16 +0000233}
234
235static MCTargetStreamer *
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000236createHexagonObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
Colin LeMahieube99a022015-06-17 03:06:16 +0000237 return new HexagonTargetELFStreamer(S, STI);
Sid Manning12cd21a2014-10-15 18:27:40 +0000238}
Tony Linthicumb3705e02011-12-15 22:29:08 +0000239
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000240static void LLVM_ATTRIBUTE_UNUSED clearFeature(MCSubtargetInfo* STI, uint64_t F) {
241 uint64_t FB = STI->getFeatureBits().to_ullong();
242 if (FB & (1ULL << F))
243 STI->ToggleFeature(F);
244}
245
246static bool LLVM_ATTRIBUTE_UNUSED checkFeature(MCSubtargetInfo* STI, uint64_t F) {
247 uint64_t FB = STI->getFeatureBits().to_ullong();
248 return (FB & (1ULL << F)) != 0;
249}
250
251StringRef Hexagon_MC::ParseHexagonTriple(const Triple &TT, StringRef CPU) {
252 StringRef CPUName = Hexagon_MC::selectHexagonCPU(TT, CPU);
253 StringRef FS = "";
Krzysztof Parzyszek7a0981a2017-03-09 17:05:11 +0000254 if (EnableHVX) {
255 if (CPUName.equals_lower("hexagonv60") ||
256 CPUName.equals_lower("hexagonv62"))
257 FS = "+hvx";
258 }
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000259 return FS;
260}
261
262static bool isCPUValid(std::string CPU)
263{
264 std::vector<std::string> table
265 {
266 "hexagonv4",
267 "hexagonv5",
268 "hexagonv55",
269 "hexagonv60",
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +0000270 "hexagonv62",
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000271 };
272
273 return std::find(table.begin(), table.end(), CPU) != table.end();
274}
275
276MCSubtargetInfo *Hexagon_MC::createHexagonMCSubtargetInfo(const Triple &TT,
277 StringRef CPU,
278 StringRef FS) {
279 StringRef ArchFS = (FS.size()) ? FS : Hexagon_MC::ParseHexagonTriple(TT, CPU);
280 StringRef CPUName = Hexagon_MC::selectHexagonCPU(TT, CPU);
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +0000281 if (!isCPUValid(CPUName.str())) {
282 errs() << "error: invalid CPU \"" << CPUName.str().c_str()
283 << "\" specified\n";
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000284 return nullptr;
285 }
286
287 MCSubtargetInfo *X = createHexagonMCSubtargetInfoImpl(TT, CPUName, ArchFS);
288 if (X->getFeatureBits()[Hexagon::ExtensionHVXDbl]) {
289 llvm::FeatureBitset Features = X->getFeatureBits();
290 X->setFeatureBits(Features.set(Hexagon::ExtensionHVX));
291 }
292 return X;
293}
294
295unsigned Hexagon_MC::GetELFFlags(const MCSubtargetInfo &STI) {
296 static std::map<StringRef,unsigned> ElfFlags = {
297 {"hexagonv4", ELF::EF_HEXAGON_MACH_V4},
298 {"hexagonv5", ELF::EF_HEXAGON_MACH_V5},
299 {"hexagonv55", ELF::EF_HEXAGON_MACH_V55},
300 {"hexagonv60", ELF::EF_HEXAGON_MACH_V60},
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +0000301 {"hexagonv62", ELF::EF_HEXAGON_MACH_V62},
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000302 };
303
304 auto F = ElfFlags.find(STI.getCPU());
305 assert(F != ElfFlags.end() && "Unrecognized Architecture");
306 return F->second;
307}
308
309namespace {
310class HexagonMCInstrAnalysis : public MCInstrAnalysis {
311public:
312 HexagonMCInstrAnalysis(MCInstrInfo const *Info) : MCInstrAnalysis(Info) {}
313
314 bool isUnconditionalBranch(MCInst const &Inst) const override {
315 //assert(!HexagonMCInstrInfo::isBundle(Inst));
316 return MCInstrAnalysis::isUnconditionalBranch(Inst);
317 }
318
319 bool isConditionalBranch(MCInst const &Inst) const override {
320 //assert(!HexagonMCInstrInfo::isBundle(Inst));
321 return MCInstrAnalysis::isConditionalBranch(Inst);
322 }
323
324 bool evaluateBranch(MCInst const &Inst, uint64_t Addr,
325 uint64_t Size, uint64_t &Target) const override {
326 //assert(!HexagonMCInstrInfo::isBundle(Inst));
327 if(!HexagonMCInstrInfo::isExtendable(*Info, Inst))
328 return false;
329 auto const &Extended(HexagonMCInstrInfo::getExtendableOperand(*Info, Inst));
330 assert(Extended.isExpr());
331 int64_t Value;
332 if(!Extended.getExpr()->evaluateAsAbsolute(Value))
333 return false;
334 Target = Value;
335 return true;
336 }
337};
338}
339
340static MCInstrAnalysis *createHexagonMCInstrAnalysis(const MCInstrInfo *Info) {
341 return new HexagonMCInstrAnalysis(Info);
342}
343
Tony Linthicumb3705e02011-12-15 22:29:08 +0000344// Force static initialization.
345extern "C" void LLVMInitializeHexagonTargetMC() {
346 // Register the MC asm info.
Mehdi Aminif42454b2016-10-09 23:00:34 +0000347 RegisterMCAsmInfoFn X(getTheHexagonTarget(), createHexagonMCAsmInfo);
Tony Linthicumb3705e02011-12-15 22:29:08 +0000348
Tony Linthicumb3705e02011-12-15 22:29:08 +0000349 // Register the MC instruction info.
Mehdi Aminif42454b2016-10-09 23:00:34 +0000350 TargetRegistry::RegisterMCInstrInfo(getTheHexagonTarget(),
Sid Manning7da3f9a2014-10-03 13:18:11 +0000351 createHexagonMCInstrInfo);
Tony Linthicumb3705e02011-12-15 22:29:08 +0000352
353 // Register the MC register info.
Mehdi Aminif42454b2016-10-09 23:00:34 +0000354 TargetRegistry::RegisterMCRegInfo(getTheHexagonTarget(),
Tony Linthicumb3705e02011-12-15 22:29:08 +0000355 createHexagonMCRegisterInfo);
356
357 // Register the MC subtarget info.
Mehdi Aminif42454b2016-10-09 23:00:34 +0000358 TargetRegistry::RegisterMCSubtargetInfo(getTheHexagonTarget(),
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000359 Hexagon_MC::createHexagonMCSubtargetInfo);
Sid Manning7da3f9a2014-10-03 13:18:11 +0000360
361 // Register the MC Code Emitter
Mehdi Aminif42454b2016-10-09 23:00:34 +0000362 TargetRegistry::RegisterMCCodeEmitter(getTheHexagonTarget(),
Sid Manning7da3f9a2014-10-03 13:18:11 +0000363 createHexagonMCCodeEmitter);
Sid Manning12cd21a2014-10-15 18:27:40 +0000364
Colin LeMahieua6750772015-06-03 17:34:16 +0000365 // Register the asm backend
Mehdi Aminif42454b2016-10-09 23:00:34 +0000366 TargetRegistry::RegisterMCAsmBackend(getTheHexagonTarget(),
Colin LeMahieua6750772015-06-03 17:34:16 +0000367 createHexagonAsmBackend);
368
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000369
370 // Register the MC instruction analyzer.
371 TargetRegistry::RegisterMCInstrAnalysis(getTheHexagonTarget(),
372 createHexagonMCInstrAnalysis);
373
Colin LeMahieube99a022015-06-17 03:06:16 +0000374 // Register the obj streamer
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000375 TargetRegistry::RegisterELFStreamer(getTheHexagonTarget(),
376 createMCStreamer);
377
378 // Register the obj target streamer
379 TargetRegistry::RegisterObjectTargetStreamer(getTheHexagonTarget(),
380 createHexagonObjectTargetStreamer);
Colin LeMahieube99a022015-06-17 03:06:16 +0000381
Colin LeMahieud2158752015-06-18 20:43:50 +0000382 // Register the asm streamer
Mehdi Aminif42454b2016-10-09 23:00:34 +0000383 TargetRegistry::RegisterAsmTargetStreamer(getTheHexagonTarget(),
Colin LeMahieud2158752015-06-18 20:43:50 +0000384 createMCAsmTargetStreamer);
385
Sid Manning12cd21a2014-10-15 18:27:40 +0000386 // Register the MC Inst Printer
Mehdi Aminif42454b2016-10-09 23:00:34 +0000387 TargetRegistry::RegisterMCInstPrinter(getTheHexagonTarget(),
Sid Manning12cd21a2014-10-15 18:27:40 +0000388 createHexagonMCInstPrinter);
Tony Linthicumb3705e02011-12-15 22:29:08 +0000389}