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