xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCTargetMachine.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===-- PPCTargetMachine.h - Define TargetMachine for PowerPC ---*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file declares the PowerPC specific subclass of TargetMachine.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #ifndef LLVM_LIB_TARGET_POWERPC_PPCTARGETMACHINE_H
140b57cec5SDimitry Andric #define LLVM_LIB_TARGET_POWERPC_PPCTARGETMACHINE_H
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "PPCInstrInfo.h"
170b57cec5SDimitry Andric #include "PPCSubtarget.h"
180b57cec5SDimitry Andric #include "llvm/IR/DataLayout.h"
190b57cec5SDimitry Andric #include "llvm/Target/TargetMachine.h"
20bdd1243dSDimitry Andric #include <optional>
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric namespace llvm {
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric /// Common code between 32-bit and 64-bit PowerPC targets.
250b57cec5SDimitry Andric ///
260b57cec5SDimitry Andric class PPCTargetMachine final : public LLVMTargetMachine {
270b57cec5SDimitry Andric public:
280b57cec5SDimitry Andric   enum PPCABI { PPC_ABI_UNKNOWN, PPC_ABI_ELFv1, PPC_ABI_ELFv2 };
29fe6060f1SDimitry Andric   enum Endian { NOT_DETECTED, LITTLE, BIG };
30fe6060f1SDimitry Andric 
310b57cec5SDimitry Andric private:
320b57cec5SDimitry Andric   std::unique_ptr<TargetLoweringObjectFile> TLOF;
330b57cec5SDimitry Andric   PPCABI TargetABI;
34fe6060f1SDimitry Andric   Endian Endianness = Endian::NOT_DETECTED;
35*0fca6ea1SDimitry Andric   mutable bool HasGlibcHWCAPAccess = false;
360b57cec5SDimitry Andric 
370b57cec5SDimitry Andric   mutable StringMap<std::unique_ptr<PPCSubtarget>> SubtargetMap;
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric public:
400b57cec5SDimitry Andric   PPCTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
410b57cec5SDimitry Andric                    StringRef FS, const TargetOptions &Options,
42bdd1243dSDimitry Andric                    std::optional<Reloc::Model> RM,
435f757f3fSDimitry Andric                    std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,
44bdd1243dSDimitry Andric                    bool JIT);
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric   ~PPCTargetMachine() override;
470b57cec5SDimitry Andric 
480b57cec5SDimitry Andric   const PPCSubtarget *getSubtargetImpl(const Function &F) const override;
490b57cec5SDimitry Andric   // DO NOT IMPLEMENT: There is no such thing as a valid default subtarget,
500b57cec5SDimitry Andric   // subtargets are per-function entities based on the target-specific
510b57cec5SDimitry Andric   // attributes of each function.
520b57cec5SDimitry Andric   const PPCSubtarget *getSubtargetImpl() const = delete;
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric   // Pass Pipeline Configuration
550b57cec5SDimitry Andric   TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
560b57cec5SDimitry Andric 
5781ad6265SDimitry Andric   TargetTransformInfo getTargetTransformInfo(const Function &F) const override;
580b57cec5SDimitry Andric 
getObjFileLowering()590b57cec5SDimitry Andric   TargetLoweringObjectFile *getObjFileLowering() const override {
600b57cec5SDimitry Andric     return TLOF.get();
610b57cec5SDimitry Andric   }
62bdd1243dSDimitry Andric 
63bdd1243dSDimitry Andric   MachineFunctionInfo *
64bdd1243dSDimitry Andric   createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,
65bdd1243dSDimitry Andric                             const TargetSubtargetInfo *STI) const override;
66bdd1243dSDimitry Andric 
isELFv2ABI()670b57cec5SDimitry Andric   bool isELFv2ABI() const { return TargetABI == PPC_ABI_ELFv2; }
hasGlibcHWCAPAccess()68*0fca6ea1SDimitry Andric   bool hasGlibcHWCAPAccess() const { return HasGlibcHWCAPAccess; }
69*0fca6ea1SDimitry Andric   void setGlibcHWCAPAccess(bool Val = true) const { HasGlibcHWCAPAccess = Val; }
isPPC64()700b57cec5SDimitry Andric   bool isPPC64() const {
710b57cec5SDimitry Andric     const Triple &TT = getTargetTriple();
720b57cec5SDimitry Andric     return (TT.getArch() == Triple::ppc64 || TT.getArch() == Triple::ppc64le);
730b57cec5SDimitry Andric   };
74e8d8bef9SDimitry Andric 
isNoopAddrSpaceCast(unsigned SrcAS,unsigned DestAS)75e8d8bef9SDimitry Andric   bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override {
76e8d8bef9SDimitry Andric     // Addrspacecasts are always noops.
77e8d8bef9SDimitry Andric     return true;
78e8d8bef9SDimitry Andric   }
79fe6060f1SDimitry Andric 
80fe6060f1SDimitry Andric   bool isLittleEndian() const;
81349cc55cSDimitry Andric 
unqualifiedInlineAsmVariant()82349cc55cSDimitry Andric   int unqualifiedInlineAsmVariant() const override { return 1; }
830b57cec5SDimitry Andric };
840b57cec5SDimitry Andric } // end namespace llvm
850b57cec5SDimitry Andric 
860b57cec5SDimitry Andric #endif
87