1234353Sdim//===-- PPCMCTargetDesc.cpp - PowerPC Target Descriptions -----------------===// 2224133Sdim// 3224133Sdim// The LLVM Compiler Infrastructure 4224133Sdim// 5224133Sdim// This file is distributed under the University of Illinois Open Source 6224133Sdim// License. See LICENSE.TXT for details. 7224133Sdim// 8224133Sdim//===----------------------------------------------------------------------===// 9224133Sdim// 10224133Sdim// This file provides PowerPC specific target descriptions. 11224133Sdim// 12224133Sdim//===----------------------------------------------------------------------===// 13224133Sdim 14224133Sdim#include "PPCMCTargetDesc.h" 15249423Sdim#include "InstPrinter/PPCInstPrinter.h" 16224133Sdim#include "PPCMCAsmInfo.h" 17263508Sdim#include "PPCTargetStreamer.h" 18226633Sdim#include "llvm/MC/MCCodeGenInfo.h" 19224133Sdim#include "llvm/MC/MCInstrInfo.h" 20224133Sdim#include "llvm/MC/MCRegisterInfo.h" 21226633Sdim#include "llvm/MC/MCStreamer.h" 22224133Sdim#include "llvm/MC/MCSubtargetInfo.h" 23263508Sdim#include "llvm/MC/MCSymbol.h" 24249423Sdim#include "llvm/MC/MachineLocation.h" 25234353Sdim#include "llvm/Support/ErrorHandling.h" 26263508Sdim#include "llvm/Support/FormattedStream.h" 27226633Sdim#include "llvm/Support/TargetRegistry.h" 28224133Sdim 29224133Sdim#define GET_INSTRINFO_MC_DESC 30224133Sdim#include "PPCGenInstrInfo.inc" 31224133Sdim 32224133Sdim#define GET_SUBTARGETINFO_MC_DESC 33224133Sdim#include "PPCGenSubtargetInfo.inc" 34224133Sdim 35224133Sdim#define GET_REGINFO_MC_DESC 36224133Sdim#include "PPCGenRegisterInfo.inc" 37224133Sdim 38224133Sdimusing namespace llvm; 39224133Sdim 40263508Sdim// Pin the vtable to this file. 41263508SdimPPCTargetStreamer::~PPCTargetStreamer() {} 42263508Sdim 43224133Sdimstatic MCInstrInfo *createPPCMCInstrInfo() { 44224133Sdim MCInstrInfo *X = new MCInstrInfo(); 45224133Sdim InitPPCMCInstrInfo(X); 46224133Sdim return X; 47224133Sdim} 48224133Sdim 49226633Sdimstatic MCRegisterInfo *createPPCMCRegisterInfo(StringRef TT) { 50226633Sdim Triple TheTriple(TT); 51263508Sdim bool isPPC64 = (TheTriple.getArch() == Triple::ppc64 || 52263508Sdim TheTriple.getArch() == Triple::ppc64le); 53226633Sdim unsigned Flavour = isPPC64 ? 0 : 1; 54226633Sdim unsigned RA = isPPC64 ? PPC::LR8 : PPC::LR; 55226633Sdim 56226633Sdim MCRegisterInfo *X = new MCRegisterInfo(); 57226633Sdim InitPPCMCRegisterInfo(X, RA, Flavour, Flavour); 58226633Sdim return X; 59224133Sdim} 60224133Sdim 61224133Sdimstatic MCSubtargetInfo *createPPCMCSubtargetInfo(StringRef TT, StringRef CPU, 62224133Sdim StringRef FS) { 63224133Sdim MCSubtargetInfo *X = new MCSubtargetInfo(); 64224133Sdim InitPPCMCSubtargetInfo(X, TT, CPU, FS); 65224133Sdim return X; 66224133Sdim} 67224133Sdim 68263508Sdimstatic MCAsmInfo *createPPCMCAsmInfo(const MCRegisterInfo &MRI, StringRef TT) { 69226633Sdim Triple TheTriple(TT); 70263508Sdim bool isPPC64 = (TheTriple.getArch() == Triple::ppc64 || 71263508Sdim TheTriple.getArch() == Triple::ppc64le); 72226633Sdim 73226633Sdim MCAsmInfo *MAI; 74226633Sdim if (TheTriple.isOSDarwin()) 75266715Sdim MAI = new PPCMCAsmInfoDarwin(isPPC64, TheTriple); 76226633Sdim else 77226633Sdim MAI = new PPCLinuxMCAsmInfo(isPPC64); 78226633Sdim 79226633Sdim // Initial state of the frame pointer is R1. 80263508Sdim unsigned Reg = isPPC64 ? PPC::X1 : PPC::R1; 81263508Sdim MCCFIInstruction Inst = 82263508Sdim MCCFIInstruction::createDefCfa(0, MRI.getDwarfRegNum(Reg, true), 0); 83263508Sdim MAI->addInitialFrameState(Inst); 84226633Sdim 85226633Sdim return MAI; 86226633Sdim} 87226633Sdim 88226633Sdimstatic MCCodeGenInfo *createPPCMCCodeGenInfo(StringRef TT, Reloc::Model RM, 89234353Sdim CodeModel::Model CM, 90234353Sdim CodeGenOpt::Level OL) { 91226633Sdim MCCodeGenInfo *X = new MCCodeGenInfo(); 92226633Sdim 93226633Sdim if (RM == Reloc::Default) { 94226633Sdim Triple T(TT); 95226633Sdim if (T.isOSDarwin()) 96226633Sdim RM = Reloc::DynamicNoPIC; 97226633Sdim else 98226633Sdim RM = Reloc::Static; 99226633Sdim } 100249423Sdim if (CM == CodeModel::Default) { 101249423Sdim Triple T(TT); 102263508Sdim if (!T.isOSDarwin() && 103263508Sdim (T.getArch() == Triple::ppc64 || T.getArch() == Triple::ppc64le)) 104249423Sdim CM = CodeModel::Medium; 105249423Sdim } 106234353Sdim X->InitMCCodeGenInfo(RM, CM, OL); 107226633Sdim return X; 108226633Sdim} 109226633Sdim 110263508Sdimnamespace { 111263508Sdimclass PPCTargetAsmStreamer : public PPCTargetStreamer { 112263508Sdim formatted_raw_ostream &OS; 113263508Sdim 114263508Sdimpublic: 115263508Sdim PPCTargetAsmStreamer(formatted_raw_ostream &OS) : OS(OS) {} 116263508Sdim virtual void emitTCEntry(const MCSymbol &S) { 117263508Sdim OS << "\t.tc "; 118263508Sdim OS << S.getName(); 119263508Sdim OS << "[TC],"; 120263508Sdim OS << S.getName(); 121263508Sdim OS << '\n'; 122263508Sdim } 123263508Sdim}; 124263508Sdim 125263508Sdimclass PPCTargetELFStreamer : public PPCTargetStreamer { 126263508Sdim virtual void emitTCEntry(const MCSymbol &S) { 127263508Sdim // Creates a R_PPC64_TOC relocation 128263508Sdim Streamer->EmitSymbolValue(&S, 8); 129263508Sdim } 130263508Sdim}; 131263508Sdim} 132263508Sdim 133226633Sdim// This is duplicated code. Refactor this. 134226633Sdimstatic MCStreamer *createMCStreamer(const Target &T, StringRef TT, 135226633Sdim MCContext &Ctx, MCAsmBackend &MAB, 136226633Sdim raw_ostream &OS, 137226633Sdim MCCodeEmitter *Emitter, 138226633Sdim bool RelaxAll, 139226633Sdim bool NoExecStack) { 140226633Sdim if (Triple(TT).isOSDarwin()) 141226633Sdim return createMachOStreamer(Ctx, MAB, OS, Emitter, RelaxAll); 142226633Sdim 143263508Sdim PPCTargetStreamer *S = new PPCTargetELFStreamer(); 144263508Sdim return createELFStreamer(Ctx, S, MAB, OS, Emitter, RelaxAll, NoExecStack); 145226633Sdim} 146226633Sdim 147263508Sdimstatic MCStreamer * 148263508SdimcreateMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 149263508Sdim bool isVerboseAsm, bool useLoc, bool useCFI, 150263508Sdim bool useDwarfDirectory, MCInstPrinter *InstPrint, 151263508Sdim MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) { 152263508Sdim PPCTargetStreamer *S = new PPCTargetAsmStreamer(OS); 153263508Sdim 154263508Sdim return llvm::createAsmStreamer(Ctx, S, OS, isVerboseAsm, useLoc, useCFI, 155263508Sdim useDwarfDirectory, InstPrint, CE, TAB, 156263508Sdim ShowInst); 157263508Sdim} 158263508Sdim 159226633Sdimstatic MCInstPrinter *createPPCMCInstPrinter(const Target &T, 160226633Sdim unsigned SyntaxVariant, 161226633Sdim const MCAsmInfo &MAI, 162234353Sdim const MCInstrInfo &MII, 163234353Sdim const MCRegisterInfo &MRI, 164226633Sdim const MCSubtargetInfo &STI) { 165263508Sdim bool isDarwin = Triple(STI.getTargetTriple()).isOSDarwin(); 166263508Sdim return new PPCInstPrinter(MAI, MII, MRI, isDarwin); 167226633Sdim} 168226633Sdim 169226633Sdimextern "C" void LLVMInitializePowerPCTargetMC() { 170226633Sdim // Register the MC asm info. 171226633Sdim RegisterMCAsmInfoFn C(ThePPC32Target, createPPCMCAsmInfo); 172226633Sdim RegisterMCAsmInfoFn D(ThePPC64Target, createPPCMCAsmInfo); 173263508Sdim RegisterMCAsmInfoFn E(ThePPC64LETarget, createPPCMCAsmInfo); 174226633Sdim 175226633Sdim // Register the MC codegen info. 176226633Sdim TargetRegistry::RegisterMCCodeGenInfo(ThePPC32Target, createPPCMCCodeGenInfo); 177226633Sdim TargetRegistry::RegisterMCCodeGenInfo(ThePPC64Target, createPPCMCCodeGenInfo); 178263508Sdim TargetRegistry::RegisterMCCodeGenInfo(ThePPC64LETarget, 179263508Sdim createPPCMCCodeGenInfo); 180226633Sdim 181226633Sdim // Register the MC instruction info. 182226633Sdim TargetRegistry::RegisterMCInstrInfo(ThePPC32Target, createPPCMCInstrInfo); 183226633Sdim TargetRegistry::RegisterMCInstrInfo(ThePPC64Target, createPPCMCInstrInfo); 184263508Sdim TargetRegistry::RegisterMCInstrInfo(ThePPC64LETarget, 185263508Sdim createPPCMCInstrInfo); 186226633Sdim 187226633Sdim // Register the MC register info. 188226633Sdim TargetRegistry::RegisterMCRegInfo(ThePPC32Target, createPPCMCRegisterInfo); 189226633Sdim TargetRegistry::RegisterMCRegInfo(ThePPC64Target, createPPCMCRegisterInfo); 190263508Sdim TargetRegistry::RegisterMCRegInfo(ThePPC64LETarget, createPPCMCRegisterInfo); 191226633Sdim 192226633Sdim // Register the MC subtarget info. 193224133Sdim TargetRegistry::RegisterMCSubtargetInfo(ThePPC32Target, 194224133Sdim createPPCMCSubtargetInfo); 195224133Sdim TargetRegistry::RegisterMCSubtargetInfo(ThePPC64Target, 196224133Sdim createPPCMCSubtargetInfo); 197263508Sdim TargetRegistry::RegisterMCSubtargetInfo(ThePPC64LETarget, 198263508Sdim createPPCMCSubtargetInfo); 199224133Sdim 200226633Sdim // Register the MC Code Emitter 201226633Sdim TargetRegistry::RegisterMCCodeEmitter(ThePPC32Target, createPPCMCCodeEmitter); 202226633Sdim TargetRegistry::RegisterMCCodeEmitter(ThePPC64Target, createPPCMCCodeEmitter); 203263508Sdim TargetRegistry::RegisterMCCodeEmitter(ThePPC64LETarget, 204263508Sdim createPPCMCCodeEmitter); 205224133Sdim 206226633Sdim // Register the asm backend. 207226633Sdim TargetRegistry::RegisterMCAsmBackend(ThePPC32Target, createPPCAsmBackend); 208226633Sdim TargetRegistry::RegisterMCAsmBackend(ThePPC64Target, createPPCAsmBackend); 209263508Sdim TargetRegistry::RegisterMCAsmBackend(ThePPC64LETarget, createPPCAsmBackend); 210226633Sdim 211226633Sdim // Register the object streamer. 212226633Sdim TargetRegistry::RegisterMCObjectStreamer(ThePPC32Target, createMCStreamer); 213226633Sdim TargetRegistry::RegisterMCObjectStreamer(ThePPC64Target, createMCStreamer); 214263508Sdim TargetRegistry::RegisterMCObjectStreamer(ThePPC64LETarget, createMCStreamer); 215224133Sdim 216263508Sdim // Register the asm streamer. 217263508Sdim TargetRegistry::RegisterAsmStreamer(ThePPC32Target, createMCAsmStreamer); 218263508Sdim TargetRegistry::RegisterAsmStreamer(ThePPC64Target, createMCAsmStreamer); 219263508Sdim TargetRegistry::RegisterAsmStreamer(ThePPC64LETarget, createMCAsmStreamer); 220263508Sdim 221226633Sdim // Register the MCInstPrinter. 222226633Sdim TargetRegistry::RegisterMCInstPrinter(ThePPC32Target, createPPCMCInstPrinter); 223226633Sdim TargetRegistry::RegisterMCInstPrinter(ThePPC64Target, createPPCMCInstPrinter); 224263508Sdim TargetRegistry::RegisterMCInstPrinter(ThePPC64LETarget, 225263508Sdim createPPCMCInstPrinter); 226224133Sdim} 227