blob: bd6596faee5d1399d992c80c06327bc049900663 [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- SparcMCTargetDesc.cpp - Sparc Target Descriptions -----------------===//
Evan Chengbc153d42011-07-14 20:59:42 +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 Sparc specific target descriptions.
11//
12//===----------------------------------------------------------------------===//
13
14#include "SparcMCTargetDesc.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000015#include "InstPrinter/SparcInstPrinter.h"
Evan Cheng1705ab02011-07-14 23:50:31 +000016#include "SparcMCAsmInfo.h"
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +000017#include "SparcTargetStreamer.h"
Evan Chengbc153d42011-07-14 20:59:42 +000018#include "llvm/MC/MCInstrInfo.h"
19#include "llvm/MC/MCRegisterInfo.h"
20#include "llvm/MC/MCSubtargetInfo.h"
Craig Topperc4965bc2012-02-05 07:21:30 +000021#include "llvm/Support/ErrorHandling.h"
Evan Cheng2bb40352011-08-24 18:08:43 +000022#include "llvm/Support/TargetRegistry.h"
Evan Chengbc153d42011-07-14 20:59:42 +000023
Chandler Carruthd174b722014-04-22 02:03:14 +000024using namespace llvm;
25
Evan Chengbc153d42011-07-14 20:59:42 +000026#define GET_INSTRINFO_MC_DESC
27#include "SparcGenInstrInfo.inc"
28
29#define GET_SUBTARGETINFO_MC_DESC
30#include "SparcGenSubtargetInfo.inc"
31
32#define GET_REGINFO_MC_DESC
33#include "SparcGenRegisterInfo.inc"
34
Venkatraman Govindaraju52b64732014-02-01 18:54:16 +000035static MCAsmInfo *createSparcMCAsmInfo(const MCRegisterInfo &MRI,
Daniel Sanders50f17232015-09-15 16:17:27 +000036 const Triple &TT) {
Venkatraman Govindaraju52b64732014-02-01 18:54:16 +000037 MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT);
38 unsigned Reg = MRI.getDwarfRegNum(SP::O6, true);
Craig Topper062a2ba2014-04-25 05:30:21 +000039 MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 0);
Venkatraman Govindaraju52b64732014-02-01 18:54:16 +000040 MAI->addInitialFrameState(Inst);
41 return MAI;
42}
43
44static MCAsmInfo *createSparcV9MCAsmInfo(const MCRegisterInfo &MRI,
Daniel Sanders50f17232015-09-15 16:17:27 +000045 const Triple &TT) {
Venkatraman Govindaraju52b64732014-02-01 18:54:16 +000046 MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT);
47 unsigned Reg = MRI.getDwarfRegNum(SP::O6, true);
Craig Topper062a2ba2014-04-25 05:30:21 +000048 MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 2047);
Venkatraman Govindaraju52b64732014-02-01 18:54:16 +000049 MAI->addInitialFrameState(Inst);
50 return MAI;
51}
52
Evan Cheng1705ab02011-07-14 23:50:31 +000053static MCInstrInfo *createSparcMCInstrInfo() {
Evan Chengbc153d42011-07-14 20:59:42 +000054 MCInstrInfo *X = new MCInstrInfo();
55 InitSparcMCInstrInfo(X);
56 return X;
57}
58
Daniel Sanders50f17232015-09-15 16:17:27 +000059static MCRegisterInfo *createSparcMCRegisterInfo(const Triple &TT) {
Evan Chengd60fa58b2011-07-18 20:57:22 +000060 MCRegisterInfo *X = new MCRegisterInfo();
Venkatraman Govindaraju52b64732014-02-01 18:54:16 +000061 InitSparcMCRegisterInfo(X, SP::O7);
Evan Chengd60fa58b2011-07-18 20:57:22 +000062 return X;
63}
64
Daniel Sandersa73f1fd2015-06-10 12:11:26 +000065static MCSubtargetInfo *
Daniel Sanders50f17232015-09-15 16:17:27 +000066createSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
Venkatraman Govindarajue0c5bff2014-03-01 18:54:52 +000067 if (CPU.empty())
Daniel Sanders50f17232015-09-15 16:17:27 +000068 CPU = (TT.getArch() == Triple::sparcv9) ? "v9" : "v8";
Duncan P. N. Exon Smith754e21f2015-07-10 22:43:42 +000069 return createSparcMCSubtargetInfoImpl(TT, CPU, FS);
Evan Chengbc153d42011-07-14 20:59:42 +000070}
71
Rafael Espindolacd584a82015-03-19 01:50:16 +000072static MCTargetStreamer *
73createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
74 return new SparcTargetELFStreamer(S);
Venkatraman Govindarajub73aeca2014-01-06 01:22:54 +000075}
76
Rafael Espindola73870dd2015-03-16 21:43:42 +000077static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S,
78 formatted_raw_ostream &OS,
79 MCInstPrinter *InstPrint,
80 bool isVerboseAsm) {
81 return new SparcTargetAsmStreamer(S, OS);
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +000082}
83
Daniel Sanders50f17232015-09-15 16:17:27 +000084static MCInstPrinter *createSparcMCInstPrinter(const Triple &T,
Eric Christopherf8019402015-03-31 00:10:04 +000085 unsigned SyntaxVariant,
Eric Christopherc7c55922015-03-30 21:52:21 +000086 const MCAsmInfo &MAI,
87 const MCInstrInfo &MII,
Eric Christopherf8019402015-03-31 00:10:04 +000088 const MCRegisterInfo &MRI) {
Eric Christopherd639cdf2015-03-30 22:09:43 +000089 return new SparcInstPrinter(MAI, MII, MRI);
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +000090}
91
Evan Cheng8c886a42011-07-22 21:58:54 +000092extern "C" void LLVMInitializeSparcTargetMC() {
93 // Register the MC asm info.
Mehdi Aminif42454b2016-10-09 23:00:34 +000094 RegisterMCAsmInfoFn X(getTheSparcTarget(), createSparcMCAsmInfo);
95 RegisterMCAsmInfoFn Y(getTheSparcV9Target(), createSparcV9MCAsmInfo);
96 RegisterMCAsmInfoFn Z(getTheSparcelTarget(), createSparcMCAsmInfo);
Evan Cheng8c886a42011-07-22 21:58:54 +000097
Mehdi Aminif42454b2016-10-09 23:00:34 +000098 for (Target *T :
99 {&getTheSparcTarget(), &getTheSparcV9Target(), &getTheSparcelTarget()}) {
Rafael Espindola69244c32015-03-18 23:15:49 +0000100 // Register the MC instruction info.
101 TargetRegistry::RegisterMCInstrInfo(*T, createSparcMCInstrInfo);
102
103 // Register the MC register info.
104 TargetRegistry::RegisterMCRegInfo(*T, createSparcMCRegisterInfo);
105
106 // Register the MC subtarget info.
107 TargetRegistry::RegisterMCSubtargetInfo(*T, createSparcMCSubtargetInfo);
108
109 // Register the MC Code Emitter.
110 TargetRegistry::RegisterMCCodeEmitter(*T, createSparcMCCodeEmitter);
111
112 // Register the asm backend.
113 TargetRegistry::RegisterMCAsmBackend(*T, createSparcAsmBackend);
114
Rafael Espindolacd584a82015-03-19 01:50:16 +0000115 // Register the object target streamer.
116 TargetRegistry::RegisterObjectTargetStreamer(*T,
117 createObjectTargetStreamer);
Rafael Espindola69244c32015-03-18 23:15:49 +0000118
119 // Register the asm streamer.
120 TargetRegistry::RegisterAsmTargetStreamer(*T, createTargetAsmStreamer);
121
122 // Register the MCInstPrinter
123 TargetRegistry::RegisterMCInstPrinter(*T, createSparcMCInstPrinter);
124 }
Evan Cheng8c886a42011-07-22 21:58:54 +0000125}