//===-- AVR.h - Top-level interface for AVR representation ------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file contains the entry points for global functions defined in the LLVM // AVR back-end. // //===----------------------------------------------------------------------===// #ifndef LLVM_AVR_H #define LLVM_AVR_H #include "llvm/CodeGen/SelectionDAGNodes.h" #include "llvm/Pass.h" #include "llvm/PassRegistry.h" #include "llvm/Target/TargetMachine.h" namespace llvm { class AVRTargetMachine; class FunctionPass; class PassRegistry; Pass *createAVRShiftExpandPass(); FunctionPass *createAVRISelDag(AVRTargetMachine &TM, CodeGenOpt::Level OptLevel); FunctionPass *createAVRExpandPseudoPass(); FunctionPass *createAVRFrameAnalyzerPass(); FunctionPass *createAVRBranchSelectionPass(); void initializeAVRDAGToDAGISelPass(PassRegistry &); void initializeAVRExpandPseudoPass(PassRegistry &); void initializeAVRShiftExpandPass(PassRegistry &); /// Contains the AVR backend. namespace AVR { /// An integer that identifies all of the supported AVR address spaces. enum AddressSpace { DataMemory, ProgramMemory, ProgramMemory1, ProgramMemory2, ProgramMemory3, ProgramMemory4, ProgramMemory5, NumAddrSpaces, }; /// Checks if a given type is a pointer to program memory. template bool isProgramMemoryAddress(T *V) { auto *PT = cast(V->getType()); assert(PT != nullptr && "unexpected MemSDNode"); return PT->getAddressSpace() == ProgramMemory || PT->getAddressSpace() == ProgramMemory1 || PT->getAddressSpace() == ProgramMemory2 || PT->getAddressSpace() == ProgramMemory3 || PT->getAddressSpace() == ProgramMemory4 || PT->getAddressSpace() == ProgramMemory5; } template AddressSpace getAddressSpace(T *V) { auto *PT = cast(V->getType()); assert(PT != nullptr && "unexpected MemSDNode"); unsigned AS = PT->getAddressSpace(); if (AS < NumAddrSpaces) return static_cast(AS); return NumAddrSpaces; } inline bool isProgramMemoryAccess(MemSDNode const *N) { auto *V = N->getMemOperand()->getValue(); if (V != nullptr && isProgramMemoryAddress(V)) return true; return false; } // Get the index of the program memory bank. // -1: not program memory // 0: ordinary program memory // 1~5: extended program memory inline int getProgramMemoryBank(MemSDNode const *N) { auto *V = N->getMemOperand()->getValue(); if (V == nullptr || !isProgramMemoryAddress(V)) return -1; AddressSpace AS = getAddressSpace(V); assert(ProgramMemory <= AS && AS <= ProgramMemory5); return static_cast(AS - ProgramMemory); } } // end of namespace AVR } // end namespace llvm #endif // LLVM_AVR_H