mini-llvm 0.1.0
Loading...
Searching...
No Matches
Function.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <cstddef>
6#include <iterator>
7#include <list>
8#include <memory>
9#include <string>
10#include <utility>
11
18
19namespace mini_llvm::mir {
20
22 using BasicBlockList = std::list<std::unique_ptr<BasicBlock>>;
23
24public:
29
30 explicit Function(std::string name, Linkage linkage) : name_(std::move(name)), linkage_(linkage) {}
31
32 Function(const Function &) = delete;
33 Function(Function &&) = delete;
34 Function &operator=(const Function &&) = delete;
36
37 std::string name() const override {
38 return name_;
39 }
40
41 Linkage linkage() const override {
42 return linkage_;
43 }
44
46 return iterator(blocks_.begin());
47 }
48
50 return const_iterator(blocks_.begin());
51 }
52
54 return iterator(blocks_.end());
55 }
56
58 return const_iterator(blocks_.end());
59 }
60
62 return reverse_iterator(blocks_.rbegin());
63 }
64
66 return const_reverse_iterator(blocks_.rbegin());
67 }
68
70 return reverse_iterator(blocks_.rend());
71 }
72
74 return const_reverse_iterator(blocks_.rend());
75 }
76
78 return *begin();
79 }
80
81 const BasicBlock &front() const {
82 return *begin();
83 }
84
86 return *std::prev(end());
87 }
88
89 const BasicBlock &back() const {
90 return *std::prev(end());
91 }
92
93 bool empty() const {
94 return blocks_.empty();
95 }
96
97 size_t size() const {
98 return blocks_.size();
99 }
100
102 return front();
103 }
104
105 const BasicBlock &entry() const {
106 return front();
107 }
108
109 bool isDeclaration() const {
110 return empty();
111 }
112
113 BasicBlock &add(const_iterator pos, std::unique_ptr<BasicBlock> block);
114
116 return add(pos, std::make_unique<BasicBlock>());
117 }
118
119 BasicBlock &prepend(std::unique_ptr<BasicBlock> block) {
120 return add(begin(), std::move(block));
121 }
122
124 return prepend(std::make_unique<BasicBlock>());
125 }
126
127 BasicBlock &append(std::unique_ptr<BasicBlock> block) {
128 return add(end(), std::move(block));
129 }
130
132 return append(std::make_unique<BasicBlock>());
133 }
134
135 std::unique_ptr<BasicBlock> remove(const_iterator pos);
136
137 std::unique_ptr<BasicBlock> removeFirst() {
138 return remove(begin());
139 }
140
141 std::unique_ptr<BasicBlock> removeLast() {
142 return remove(std::prev(end()));
143 }
144
145 void clear();
146
148 return stackFrame_;
149 }
150
151 const StackFrame &stackFrame() const {
152 return stackFrame_;
153 }
154
155 std::string format() const override;
156
157private:
158 std::string name_;
159 Linkage linkage_;
160 BasicBlockList blocks_;
161 StackFrame stackFrame_;
162};
163
164} // namespace mini_llvm::mir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition IndirectIterator.h:16
Definition BasicBlock.h:24
std::unique_ptr< BasicBlock > remove(const_iterator pos)
reverse_iterator rbegin()
Definition Function.h:61
const StackFrame & stackFrame() const
Definition Function.h:151
BasicBlock & add(const_iterator pos, std::unique_ptr< BasicBlock > block)
const_reverse_iterator rbegin() const
Definition Function.h:65
reverse_iterator rend()
Definition Function.h:69
IndirectIterator< BasicBlockList::const_reverse_iterator, const BasicBlock > const_reverse_iterator
Definition Function.h:28
BasicBlock & append()
Definition Function.h:131
Function & operator=(Function &&)=delete
const_iterator begin() const
Definition Function.h:49
bool empty() const
Definition Function.h:93
BasicBlock & prepend(std::unique_ptr< BasicBlock > block)
Definition Function.h:119
BasicBlock & add(const_iterator pos)
Definition Function.h:115
Function & operator=(const Function &&)=delete
const BasicBlock & entry() const
Definition Function.h:105
IndirectIterator< BasicBlockList::iterator, BasicBlock > iterator
Definition Function.h:25
Function(const Function &)=delete
Function(std::string name, Linkage linkage)
Definition Function.h:30
BasicBlock & entry()
Definition Function.h:101
BasicBlock & front()
Definition Function.h:77
iterator begin()
Definition Function.h:45
const_reverse_iterator rend() const
Definition Function.h:73
BasicBlock & prepend()
Definition Function.h:123
StackFrame & stackFrame()
Definition Function.h:147
const BasicBlock & back() const
Definition Function.h:89
std::string name() const override
Definition Function.h:37
IndirectIterator< BasicBlockList::reverse_iterator, BasicBlock > reverse_iterator
Definition Function.h:27
size_t size() const
Definition Function.h:97
Function(Function &&)=delete
std::string format() const override
iterator end()
Definition Function.h:53
BasicBlock & append(std::unique_ptr< BasicBlock > block)
Definition Function.h:127
bool isDeclaration() const
Definition Function.h:109
BasicBlock & back()
Definition Function.h:85
std::unique_ptr< BasicBlock > removeFirst()
Definition Function.h:137
const BasicBlock & front() const
Definition Function.h:81
IndirectIterator< BasicBlockList::const_iterator, const BasicBlock > const_iterator
Definition Function.h:26
const_iterator end() const
Definition Function.h:57
std::unique_ptr< BasicBlock > removeLast()
Definition Function.h:141
Linkage linkage() const override
Definition Function.h:41
Definition StackFrame.h:17
Definition BasicBlock.h:22
Linkage
Definition Linkage.h:7