1 //===-- PPCTargetMachine.h - Define TargetMachine for PowerPC ---*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file declares the PowerPC specific subclass of TargetMachine. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_LIB_TARGET_POWERPC_PPCTARGETMACHINE_H 14 #define LLVM_LIB_TARGET_POWERPC_PPCTARGETMACHINE_H 15 16 #include "PPCInstrInfo.h" 17 #include "PPCSubtarget.h" 18 #include "llvm/IR/DataLayout.h" 19 #include "llvm/Target/TargetMachine.h" 20 #include <optional> 21 22 namespace llvm { 23 24 /// Common code between 32-bit and 64-bit PowerPC targets. 25 /// 26 class PPCTargetMachine final : public LLVMTargetMachine { 27 public: 28 enum PPCABI { PPC_ABI_UNKNOWN, PPC_ABI_ELFv1, PPC_ABI_ELFv2 }; 29 enum Endian { NOT_DETECTED, LITTLE, BIG }; 30 31 private: 32 std::unique_ptr<TargetLoweringObjectFile> TLOF; 33 PPCABI TargetABI; 34 Endian Endianness = Endian::NOT_DETECTED; 35 mutable bool HasGlibcHWCAPAccess = false; 36 37 mutable StringMap<std::unique_ptr<PPCSubtarget>> SubtargetMap; 38 39 public: 40 PPCTargetMachine(const Target &T, const Triple &TT, StringRef CPU, 41 StringRef FS, const TargetOptions &Options, 42 std::optional<Reloc::Model> RM, 43 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, 44 bool JIT); 45 46 ~PPCTargetMachine() override; 47 48 const PPCSubtarget *getSubtargetImpl(const Function &F) const override; 49 // DO NOT IMPLEMENT: There is no such thing as a valid default subtarget, 50 // subtargets are per-function entities based on the target-specific 51 // attributes of each function. 52 const PPCSubtarget *getSubtargetImpl() const = delete; 53 54 // Pass Pipeline Configuration 55 TargetPassConfig *createPassConfig(PassManagerBase &PM) override; 56 57 TargetTransformInfo getTargetTransformInfo(const Function &F) const override; 58 getObjFileLowering()59 TargetLoweringObjectFile *getObjFileLowering() const override { 60 return TLOF.get(); 61 } 62 63 MachineFunctionInfo * 64 createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, 65 const TargetSubtargetInfo *STI) const override; 66 isELFv2ABI()67 bool isELFv2ABI() const { return TargetABI == PPC_ABI_ELFv2; } hasGlibcHWCAPAccess()68 bool hasGlibcHWCAPAccess() const { return HasGlibcHWCAPAccess; } 69 void setGlibcHWCAPAccess(bool Val = true) const { HasGlibcHWCAPAccess = Val; } isPPC64()70 bool isPPC64() const { 71 const Triple &TT = getTargetTriple(); 72 return (TT.getArch() == Triple::ppc64 || TT.getArch() == Triple::ppc64le); 73 }; 74 isNoopAddrSpaceCast(unsigned SrcAS,unsigned DestAS)75 bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override { 76 // Addrspacecasts are always noops. 77 return true; 78 } 79 80 bool isLittleEndian() const; 81 unqualifiedInlineAsmVariant()82 int unqualifiedInlineAsmVariant() const override { return 1; } 83 }; 84 } // end namespace llvm 85 86 #endif 87