1//===-- AVR.h - Top-level interface for AVR representation ------*- 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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the entry points for global functions defined in the LLVM
10// AVR back-end.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_AVR_H
15#define LLVM_AVR_H
16
17#include "llvm/CodeGen/SelectionDAGNodes.h"
18#include "llvm/Target/TargetMachine.h"
19
20namespace llvm {
21
22class AVRTargetMachine;
23class FunctionPass;
24
25FunctionPass *createAVRISelDag(AVRTargetMachine &TM,
26                               CodeGenOpt::Level OptLevel);
27FunctionPass *createAVRExpandPseudoPass();
28FunctionPass *createAVRFrameAnalyzerPass();
29FunctionPass *createAVRRelaxMemPass();
30FunctionPass *createAVRDynAllocaSRPass();
31FunctionPass *createAVRBranchSelectionPass();
32
33void initializeAVRExpandPseudoPass(PassRegistry&);
34void initializeAVRRelaxMemPass(PassRegistry&);
35
36/// Contains the AVR backend.
37namespace AVR {
38
39/// An integer that identifies all of the supported AVR address spaces.
40enum AddressSpace { DataMemory, ProgramMemory };
41
42/// Checks if a given type is a pointer to program memory.
43template <typename T> bool isProgramMemoryAddress(T *V) {
44  return cast<PointerType>(V->getType())->getAddressSpace() == ProgramMemory;
45}
46
47inline bool isProgramMemoryAccess(MemSDNode const *N) {
48  auto V = N->getMemOperand()->getValue();
49
50  return (V != nullptr) ? isProgramMemoryAddress(V) : false;
51}
52
53} // end of namespace AVR
54
55} // end namespace llvm
56
57#endif // LLVM_AVR_H
58