PPCMCTargetDesc.cpp revision 966aeb5788c242cfaca35c56c0ddc0ff778d4376
1c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//===-- PPCMCTargetDesc.cpp - PowerPC Target Descriptions -------*- C++ -*-===// 2c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 3c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// The LLVM Compiler Infrastructure 4c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 5c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// This file is distributed under the University of Illinois Open Source 6c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// License. See LICENSE.TXT for details. 7c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 8c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//===----------------------------------------------------------------------===// 9c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 10c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// This file provides PowerPC specific target descriptions. 11c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 12c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//===----------------------------------------------------------------------===// 13c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 14c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCMCTargetDesc.h" 151abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng#include "PPCMCAsmInfo.h" 162d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng#include "llvm/MC/MachineLocation.h" 17c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "llvm/MC/MCInstrInfo.h" 18c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "llvm/MC/MCRegisterInfo.h" 19966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng#include "llvm/MC/MCStreamer.h" 20c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "llvm/MC/MCSubtargetInfo.h" 21c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "llvm/Target/TargetRegistry.h" 22c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 23c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_INSTRINFO_MC_DESC 24c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenInstrInfo.inc" 25c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 26c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_SUBTARGETINFO_MC_DESC 27c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenSubtargetInfo.inc" 28c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 29c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_REGINFO_MC_DESC 30c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenRegisterInfo.inc" 31c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 32c60f9b752381baa6c4b80c0739034660f1748c84Evan Chengusing namespace llvm; 33c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 341abf2cb59b8d63415780a03329307c0997b2670cEvan Chengstatic MCInstrInfo *createPPCMCInstrInfo() { 35c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng MCInstrInfo *X = new MCInstrInfo(); 36c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng InitPPCMCInstrInfo(X); 37c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng return X; 38c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng} 39c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 400e6a052331f674dd70e28af41f654a7874405eabEvan Chengstatic MCRegisterInfo *createPPCMCRegisterInfo(StringRef TT) { 410e6a052331f674dd70e28af41f654a7874405eabEvan Cheng Triple TheTriple(TT); 420e6a052331f674dd70e28af41f654a7874405eabEvan Cheng bool isPPC64 = (TheTriple.getArch() == Triple::ppc64); 430e6a052331f674dd70e28af41f654a7874405eabEvan Cheng unsigned Flavour = isPPC64 ? 0 : 1; 440e6a052331f674dd70e28af41f654a7874405eabEvan Cheng unsigned RA = isPPC64 ? PPC::LR8 : PPC::LR; 450e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 460e6a052331f674dd70e28af41f654a7874405eabEvan Cheng MCRegisterInfo *X = new MCRegisterInfo(); 470e6a052331f674dd70e28af41f654a7874405eabEvan Cheng InitPPCMCRegisterInfo(X, RA, Flavour, Flavour); 480e6a052331f674dd70e28af41f654a7874405eabEvan Cheng return X; 490e6a052331f674dd70e28af41f654a7874405eabEvan Cheng} 500e6a052331f674dd70e28af41f654a7874405eabEvan Cheng 511abf2cb59b8d63415780a03329307c0997b2670cEvan Chengstatic MCSubtargetInfo *createPPCMCSubtargetInfo(StringRef TT, StringRef CPU, 521abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng StringRef FS) { 53c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng MCSubtargetInfo *X = new MCSubtargetInfo(); 54c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng InitPPCMCSubtargetInfo(X, TT, CPU, FS); 55c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng return X; 56c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng} 57c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 582d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Chengstatic MCAsmInfo *createPPCMCAsmInfo(const Target &T, StringRef TT) { 591abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng Triple TheTriple(TT); 601abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng bool isPPC64 = TheTriple.getArch() == Triple::ppc64; 612d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng 622d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MCAsmInfo *MAI; 631abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng if (TheTriple.isOSDarwin()) 642d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MAI = new PPCMCAsmInfoDarwin(isPPC64); 652d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng else 662d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MAI = new PPCLinuxMCAsmInfo(isPPC64); 672d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng 682d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng // Initial state of the frame pointer is R1. 692d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MachineLocation Dst(MachineLocation::VirtualFP); 702d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MachineLocation Src(PPC::R1, 0); 712d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng MAI->addInitialFrameState(0, Dst, Src); 722d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng 732d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng return MAI; 741abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng} 751abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng 767f8dff65717b1e4090ba4a648f9ec4f037a66c1eEvan Chengstatic MCCodeGenInfo *createPPCMCCodeGenInfo(StringRef TT, Reloc::Model RM, 777f8dff65717b1e4090ba4a648f9ec4f037a66c1eEvan Cheng CodeModel::Model CM) { 78439661395fd2a2a832dba01c65bc88718528313cEvan Cheng MCCodeGenInfo *X = new MCCodeGenInfo(); 79439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 80439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (RM == Reloc::Default) { 81439661395fd2a2a832dba01c65bc88718528313cEvan Cheng Triple T(TT); 82439661395fd2a2a832dba01c65bc88718528313cEvan Cheng if (T.isOSDarwin()) 83439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RM = Reloc::DynamicNoPIC; 84439661395fd2a2a832dba01c65bc88718528313cEvan Cheng else 85439661395fd2a2a832dba01c65bc88718528313cEvan Cheng RM = Reloc::Static; 86439661395fd2a2a832dba01c65bc88718528313cEvan Cheng } 8734ad6db8b958fdc0d38e122edf753b5326e69b03Evan Cheng X->InitMCCodeGenInfo(RM, CM); 88439661395fd2a2a832dba01c65bc88718528313cEvan Cheng return X; 89439661395fd2a2a832dba01c65bc88718528313cEvan Cheng} 90439661395fd2a2a832dba01c65bc88718528313cEvan Cheng 91966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng// This is duplicated code. Refactor this. 92966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Chengstatic MCStreamer *createMCStreamer(const Target &T, const std::string &TT, 93966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng MCContext &Ctx, TargetAsmBackend &TAB, 94966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng raw_ostream &OS, 95966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng MCCodeEmitter *Emitter, 96966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng bool RelaxAll, 97966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng bool NoExecStack) { 98966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng if (Triple(TT).isOSDarwin()) 99966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng return createMachOStreamer(Ctx, TAB, OS, Emitter, RelaxAll); 100966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng 101966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng return NULL; 102966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng} 103966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng 104e78085a3c03de648a481e9751c3094c517bd7123Evan Chengextern "C" void LLVMInitializePowerPCTargetMC() { 105e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng // Register the MC asm info. 106e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng RegisterMCAsmInfoFn C(ThePPC32Target, createPPCMCAsmInfo); 107e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng RegisterMCAsmInfoFn D(ThePPC64Target, createPPCMCAsmInfo); 108e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng 109e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng // Register the MC codegen info. 110439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetRegistry::RegisterMCCodeGenInfo(ThePPC32Target, createPPCMCCodeGenInfo); 111439661395fd2a2a832dba01c65bc88718528313cEvan Cheng TargetRegistry::RegisterMCCodeGenInfo(ThePPC64Target, createPPCMCCodeGenInfo); 112e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng 113e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng // Register the MC instruction info. 114e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng TargetRegistry::RegisterMCInstrInfo(ThePPC32Target, createPPCMCInstrInfo); 115e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng TargetRegistry::RegisterMCInstrInfo(ThePPC64Target, createPPCMCInstrInfo); 116e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng 117e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng // Register the MC register info. 118e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng TargetRegistry::RegisterMCRegInfo(ThePPC32Target, createPPCMCRegisterInfo); 119e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng TargetRegistry::RegisterMCRegInfo(ThePPC64Target, createPPCMCRegisterInfo); 120e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng 121e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng // Register the MC subtarget info. 122e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng TargetRegistry::RegisterMCSubtargetInfo(ThePPC32Target, 123e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng createPPCMCSubtargetInfo); 124e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng TargetRegistry::RegisterMCSubtargetInfo(ThePPC64Target, 125e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng createPPCMCSubtargetInfo); 126966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng 127966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng // Register the MC Code Emitter 128966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng TargetRegistry::RegisterCodeEmitter(ThePPC32Target, createPPCMCCodeEmitter); 129966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng TargetRegistry::RegisterCodeEmitter(ThePPC64Target, createPPCMCCodeEmitter); 130966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng 131966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng // Register the asm backend. 132966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng TargetRegistry::RegisterAsmBackend(ThePPC32Target, createPPCAsmBackend); 133966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng TargetRegistry::RegisterAsmBackend(ThePPC64Target, createPPCAsmBackend); 134966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng 135966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng // Register the object streamer. 136966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng TargetRegistry::RegisterObjectStreamer(ThePPC32Target, createMCStreamer); 137966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng TargetRegistry::RegisterObjectStreamer(ThePPC64Target, createMCStreamer); 138439661395fd2a2a832dba01c65bc88718528313cEvan Cheng} 139