70 lines · c
1//===-- AVRTargetMachine.h - Define TargetMachine for AVR -------*- 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 AVR specific subclass of TargetMachine.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_AVR_TARGET_MACHINE_H14#define LLVM_AVR_TARGET_MACHINE_H15 16#include "llvm/CodeGen/CodeGenTargetMachineImpl.h"17#include "llvm/IR/DataLayout.h"18 19#include "AVRFrameLowering.h"20#include "AVRISelLowering.h"21#include "AVRInstrInfo.h"22#include "AVRSelectionDAGInfo.h"23#include "AVRSubtarget.h"24 25#include <optional>26 27namespace llvm {28 29/// A generic AVR implementation.30class AVRTargetMachine : public CodeGenTargetMachineImpl {31public:32 AVRTargetMachine(const Target &T, const Triple &TT, StringRef CPU,33 StringRef FS, const TargetOptions &Options,34 std::optional<Reloc::Model> RM,35 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL,36 bool JIT);37 38 const AVRSubtarget *getSubtargetImpl() const;39 const AVRSubtarget *getSubtargetImpl(const Function &) const override;40 41 TargetLoweringObjectFile *getObjFileLowering() const override {42 return this->TLOF.get();43 }44 45 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;46 47 MachineFunctionInfo *48 createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F,49 const TargetSubtargetInfo *STI) const override;50 51 TargetTransformInfo getTargetTransformInfo(const Function &F) const override;52 53 bool isNoopAddrSpaceCast(unsigned SrcAs, unsigned DestAs) const override {54 // While AVR has different address spaces, they are all represented by55 // 16-bit pointers that can be freely casted between (of course, a pointer56 // must be cast back to its original address space to be dereferenceable).57 // To be safe, also check the pointer size in case we implement __memx58 // pointers.59 return getPointerSize(SrcAs) == getPointerSize(DestAs);60 }61 62private:63 std::unique_ptr<TargetLoweringObjectFile> TLOF;64 AVRSubtarget SubTarget;65};66 67} // end namespace llvm68 69#endif // LLVM_AVR_TARGET_MACHINE_H70