| //===-- 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 <typename T> bool isProgramMemoryAddress(T *V) { | |
| auto *PT = cast<PointerType>(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 <typename T> AddressSpace getAddressSpace(T *V) { | |
| auto *PT = cast<PointerType>(V->getType()); | |
| assert(PT != nullptr && "unexpected MemSDNode"); | |
| unsigned AS = PT->getAddressSpace(); | |
| if (AS < NumAddrSpaces) | |
| return static_cast<AddressSpace>(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<int>(AS - ProgramMemory); | |
| } | |
| } // end of namespace AVR | |
| } // end namespace llvm | |
| #endif // LLVM_AVR_H |