91 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8//9// This file declares the PowerPC specific subclass of TargetMachine.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_POWERPC_PPCTARGETMACHINE_H14#define LLVM_LIB_TARGET_POWERPC_PPCTARGETMACHINE_H15 16#include "PPCInstrInfo.h"17#include "PPCSubtarget.h"18#include "llvm/CodeGen/CodeGenTargetMachineImpl.h"19#include "llvm/IR/DataLayout.h"20#include <optional>21 22namespace llvm {23 24/// Common code between 32-bit and 64-bit PowerPC targets.25///26class PPCTargetMachine final : public CodeGenTargetMachineImpl {27public:28 enum PPCABI { PPC_ABI_UNKNOWN, PPC_ABI_ELFv1, PPC_ABI_ELFv2 };29 enum Endian { NOT_DETECTED, LITTLE, BIG };30 31private: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 39public: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-specific51 // attributes of each function.52 const PPCSubtarget *getSubtargetImpl() const = delete;53 54 // Pass Pipeline Configuration55 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;56 57 TargetTransformInfo getTargetTransformInfo(const Function &F) const override;58 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 ScheduleDAGInstrs *67 createMachineScheduler(MachineSchedContext *C) const override;68 ScheduleDAGInstrs *69 createPostMachineScheduler(MachineSchedContext *C) const override;70 71 bool isELFv2ABI() const { return TargetABI == PPC_ABI_ELFv2; }72 bool hasGlibcHWCAPAccess() const { return HasGlibcHWCAPAccess; }73 void setGlibcHWCAPAccess(bool Val = true) const { HasGlibcHWCAPAccess = Val; }74 bool isPPC64() const {75 const Triple &TT = getTargetTriple();76 return (TT.getArch() == Triple::ppc64 || TT.getArch() == Triple::ppc64le);77 };78 79 bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override {80 // Addrspacecasts are always noops.81 return true;82 }83 84 bool isLittleEndian() const;85 86 int unqualifiedInlineAsmVariant() const override { return 1; }87};88} // end namespace llvm89 90#endif91