1//===-- PPCTargetMachine.h - Define TargetMachine for PowerPC ---*- C++ -*-===// 2// 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 declares the PowerPC specific subclass of TargetMachine. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_LIB_TARGET_POWERPC_PPCTARGETMACHINE_H 15#define LLVM_LIB_TARGET_POWERPC_PPCTARGETMACHINE_H 16 17#include "PPCInstrInfo.h" 18#include "PPCSubtarget.h" 19#include "llvm/IR/DataLayout.h" 20#include "llvm/Target/TargetMachine.h" 21 22namespace llvm { 23 24/// PPCTargetMachine - Common code between 32-bit and 64-bit PowerPC targets. 25/// 26class PPCTargetMachine : public LLVMTargetMachine { 27public: 28 enum PPCABI { PPC_ABI_UNKNOWN, PPC_ABI_ELFv1, PPC_ABI_ELFv2 }; 29private: 30 std::unique_ptr<TargetLoweringObjectFile> TLOF; 31 PPCABI TargetABI; 32 PPCSubtarget Subtarget; 33 34 mutable StringMap<std::unique_ptr<PPCSubtarget>> SubtargetMap; 35 36public: 37 PPCTargetMachine(const Target &T, const Triple &TT, StringRef CPU, 38 StringRef FS, const TargetOptions &Options, Reloc::Model RM, 39 CodeModel::Model CM, CodeGenOpt::Level OL); 40 41 ~PPCTargetMachine() override; 42 43 const PPCSubtarget *getSubtargetImpl(const Function &F) const override; 44 45 // Pass Pipeline Configuration 46 TargetPassConfig *createPassConfig(PassManagerBase &PM) override; 47 48 TargetIRAnalysis getTargetIRAnalysis() override; 49 50 TargetLoweringObjectFile *getObjFileLowering() const override { 51 return TLOF.get(); 52 } 53 bool isELFv2ABI() const { return TargetABI == PPC_ABI_ELFv2; } 54 bool isPPC64() const { 55 const Triple &TT = getTargetTriple(); 56 return (TT.getArch() == Triple::ppc64 || TT.getArch() == Triple::ppc64le); 57 }; 58}; 59 60/// PPC32TargetMachine - PowerPC 32-bit target machine. 61/// 62class PPC32TargetMachine : public PPCTargetMachine { 63 virtual void anchor(); 64public: 65 PPC32TargetMachine(const Target &T, const Triple &TT, StringRef CPU, 66 StringRef FS, const TargetOptions &Options, 67 Reloc::Model RM, CodeModel::Model CM, 68 CodeGenOpt::Level OL); 69}; 70 71/// PPC64TargetMachine - PowerPC 64-bit target machine. 72/// 73class PPC64TargetMachine : public PPCTargetMachine { 74 virtual void anchor(); 75public: 76 PPC64TargetMachine(const Target &T, const Triple &TT, StringRef CPU, 77 StringRef FS, const TargetOptions &Options, 78 Reloc::Model RM, CodeModel::Model CM, 79 CodeGenOpt::Level OL); 80}; 81 82} // end namespace llvm 83 84#endif 85