brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · 0dd5d95 Raw
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