119 lines · c
1//==-- AArch64TargetMachine.h - Define TargetMachine for AArch64 -*- 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 AArch64 specific subclass of TargetMachine.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64TARGETMACHINE_H14#define LLVM_LIB_TARGET_AARCH64_AARCH64TARGETMACHINE_H15 16#include "AArch64InstrInfo.h"17#include "AArch64Subtarget.h"18#include "llvm/CodeGen/CodeGenTargetMachineImpl.h"19#include "llvm/IR/DataLayout.h"20#include <optional>21 22namespace llvm {23 24class AArch64TargetMachine : public CodeGenTargetMachineImpl {25protected:26 std::unique_ptr<TargetLoweringObjectFile> TLOF;27 mutable StringMap<std::unique_ptr<AArch64Subtarget>> SubtargetMap;28 29 /// Reset internal state.30 void reset() override;31 32public:33 AArch64TargetMachine(const Target &T, const Triple &TT, StringRef CPU,34 StringRef FS, const TargetOptions &Options,35 std::optional<Reloc::Model> RM,36 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,37 bool JIT, bool IsLittleEndian);38 39 ~AArch64TargetMachine() override;40 const AArch64Subtarget *getSubtargetImpl(const Function &F) const override;41 // DO NOT IMPLEMENT: There is no such thing as a valid default subtarget,42 // subtargets are per-function entities based on the target-specific43 // attributes of each function.44 const AArch64Subtarget *getSubtargetImpl() const = delete;45 46 // Pass Pipeline Configuration47 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;48 49 void registerPassBuilderCallbacks(PassBuilder &PB) override;50 51 TargetTransformInfo getTargetTransformInfo(const Function &F) const override;52 53 TargetLoweringObjectFile* getObjFileLowering() const override {54 return TLOF.get();55 }56 57 MachineFunctionInfo *58 createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,59 const TargetSubtargetInfo *STI) const override;60 61 yaml::MachineFunctionInfo *createDefaultFuncInfoYAML() const override;62 yaml::MachineFunctionInfo *63 convertFuncInfoToYAML(const MachineFunction &MF) const override;64 bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &,65 PerFunctionMIParsingState &PFS,66 SMDiagnostic &Error,67 SMRange &SourceRange) const override;68 69 /// Returns true if a cast between SrcAS and DestAS is a noop.70 bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const override {71 return getPointerSize(SrcAS) == getPointerSize(DestAS);72 }73 ScheduleDAGInstrs *74 createMachineScheduler(MachineSchedContext *C) const override;75 76 ScheduleDAGInstrs *77 createPostMachineScheduler(MachineSchedContext *C) const override;78 79 size_t clearLinkerOptimizationHints(80 const SmallPtrSetImpl<MachineInstr *> &MIs) const override;81 82 /// Returns true if the new SME ABI lowering should be used.83 bool useNewSMEABILowering() const { return UseNewSMEABILowering; }84 85private:86 bool isLittle;87 bool UseNewSMEABILowering;88};89 90// AArch64 little endian target machine.91//92class AArch64leTargetMachine : public AArch64TargetMachine {93 virtual void anchor();94 95public:96 AArch64leTargetMachine(const Target &T, const Triple &TT, StringRef CPU,97 StringRef FS, const TargetOptions &Options,98 std::optional<Reloc::Model> RM,99 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,100 bool JIT);101};102 103// AArch64 big endian target machine.104//105class AArch64beTargetMachine : public AArch64TargetMachine {106 virtual void anchor();107 108public:109 AArch64beTargetMachine(const Target &T, const Triple &TT, StringRef CPU,110 StringRef FS, const TargetOptions &Options,111 std::optional<Reloc::Model> RM,112 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,113 bool JIT);114};115 116} // end namespace llvm117 118#endif119