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 <algorithm>
6#include <cassert>
7#include <concepts>
8#include <cstddef>
9#include <iterator>
10#include <list>
11#include <memory>
12#include <optional>
13#include <ranges>
14#include <string>
15#include <typeinfo>
16#include <utility>
17#include <vector>
18
29
30namespace mini_llvm::ir {
31
32class BasicBlock;
33
35 using ArgumentList = std::vector<std::shared_ptr<Argument>>;
36 using AttributeList = std::vector<std::unique_ptr<Attribute>>;
37 using BasicBlockList = std::list<std::shared_ptr<BasicBlock>>;
38
39public:
42
45
50
51 Function(std::unique_ptr<FunctionType> functionType, Linkage linkage);
52
53 std::unique_ptr<FunctionType> functionType() const {
54 return cast<FunctionType>(functionType_->clone());
55 }
56
57 Linkage linkage() const {
58 return linkage_;
59 }
60
62 return arg_iterator(args_.begin());
63 }
64
66 return const_arg_iterator(args_.begin());
67 }
68
70 return arg_iterator(args_.end());
71 }
72
74 return const_arg_iterator(args_.end());
75 }
76
77 bool arg_empty() const {
78 return args_.empty();
79 }
80
81 size_t arg_size() const {
82 return args_.size();
83 }
84
85 Argument &arg(size_t i) {
86 return *args_[i];
87 }
88
89 const Argument &arg(size_t i) const {
90 return *args_[i];
91 }
92
94 return attr_iterator(attrs_.begin());
95 }
96
98 return attr_iterator(attrs_.end());
99 }
100
101 bool attr_empty() const {
102 return attrs_.empty();
103 }
104
105 size_t attr_size() const {
106 return attrs_.size();
107 }
108
109 Attribute &attr(size_t i) {
110 return *attrs_[i];
111 }
112
113 const Attribute &attr(size_t i) const {
114 return *attrs_[i];
115 }
116
117 template <typename T>
118 requires std::derived_from<T, Attribute>
120 auto i = std::ranges::find_if(attrs_, [](const std::unique_ptr<Attribute> &attr) {
121 return dynamic_cast<const T *>(&*attr);
122 });
123 if (i == attrs_.end()) {
124 return std::nullopt;
125 }
126 return **i;
127 }
128
129 template <typename T>
131 auto i = std::ranges::find_if(attrs_, [](const std::unique_ptr<Attribute> &attr) {
132 return dynamic_cast<const T *>(&*attr);
133 });
134 if (i == attrs_.end()) {
135 return std::nullopt;
136 }
137 return **i;
138 }
139
140 template <typename T>
141 requires std::derived_from<T, Attribute>
142 T &addAttr(std::unique_ptr<T> attr) {
143 attrs_.push_back(std::move(attr));
144 return static_cast<T &>(*attrs_.back());
145 }
146
147 template <typename T>
148 requires std::derived_from<T, Attribute>
149 void removeAttr() {
150 std::erase_if(attrs_, [](const std::unique_ptr<Attribute> &attr) {
151 return dynamic_cast<const T *>(&*attr);
152 });
153 }
154
156 return iterator(blocks_.begin());
157 }
158
160 return const_iterator(blocks_.begin());
161 }
162
164 return iterator(blocks_.end());
165 }
166
168 return const_iterator(blocks_.end());
169 }
170
172 return reverse_iterator(blocks_.rbegin());
173 }
174
176 return const_reverse_iterator(blocks_.rbegin());
177 }
178
180 return reverse_iterator(blocks_.rend());
181 }
182
184 return const_reverse_iterator(blocks_.rend());
185 }
186
188 return *begin();
189 }
190
191 const BasicBlock &front() const {
192 return *begin();
193 }
194
196 return *std::prev(end());
197 }
198
199 const BasicBlock &back() const {
200 return *std::prev(end());
201 }
202
203 bool empty() const {
204 return blocks_.empty();
205 }
206
207 size_t size() const {
208 return blocks_.size();
209 }
210
212 return front();
213 }
214
215 const BasicBlock &entry() const {
216 return front();
217 }
218
219 BasicBlock &add(const_iterator pos, std::shared_ptr<BasicBlock> block);
221 BasicBlock &prepend(std::shared_ptr<BasicBlock> block);
223 BasicBlock &append(std::shared_ptr<BasicBlock> block);
225
229
230 void clear();
231
232 bool isDeclaration() const override {
233 return empty();
234 }
235
236 bool isWellFormed() const override;
237
238 void accept(ConstantVisitor &visitor) override {
239 visitor.visitFunction(*this);
240 }
241
242 void accept(ConstantVisitor &visitor) const override {
243 visitor.visitFunction(*this);
244 }
245
246 std::string format() const override;
247
248protected:
249 bool equals([[maybe_unused]] const Constant &other) const override {
250 assert(typeid(*this) != typeid(other));
251 return false;
252 }
253
254private:
255 std::unique_ptr<FunctionType> functionType_;
256 Linkage linkage_;
257 ArgumentList args_;
258 AttributeList attrs_;
259 BasicBlockList blocks_;
260};
261
262inline auto args(Function &F) {
263 return std::ranges::subrange(F.arg_begin(), F.arg_end());
264}
265
266inline auto args(const Function &F) {
267 return std::ranges::subrange(F.arg_begin(), F.arg_end());
268}
269
270inline auto attrs(const Function &F) {
271 return std::ranges::subrange(F.attr_begin(), F.attr_end());
272}
273
274MINI_LLVM_EXPORT std::string toDot(const Function &F);
275
276} // namespace mini_llvm::ir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition IndirectIterator.h:16
Definition OptionalReference.h:13
Definition Argument.h:15
Definition Attribute.h:13
Definition BasicBlock.h:28
Definition ConstantVisitor.h:26
virtual void visitFunction(Function &C)
Definition ConstantVisitor.h:41
Definition Constant.h:13
Definition Function.h:34
bool arg_empty() const
Definition Function.h:77
iterator begin()
Definition Function.h:155
const Attribute & attr(size_t i) const
Definition Function.h:113
reverse_iterator rbegin()
Definition Function.h:171
std::unique_ptr< FunctionType > functionType() const
Definition Function.h:53
bool empty() const
Definition Function.h:203
IndirectIterator< BasicBlockList::iterator, BasicBlock > iterator
Definition Function.h:46
BasicBlock & prepend()
BasicBlock & add(const_iterator pos)
std::string format() const override
IndirectIterator< AttributeList::const_iterator, Attribute > attr_iterator
Definition Function.h:43
bool isDeclaration() const override
Definition Function.h:232
const_arg_iterator arg_end() const
Definition Function.h:73
const_iterator end() const
Definition Function.h:167
BasicBlock & append()
size_t arg_size() const
Definition Function.h:81
arg_iterator arg_begin()
Definition Function.h:61
bool equals(const Constant &other) const override
Definition Function.h:249
const_arg_iterator arg_begin() const
Definition Function.h:65
IndirectIterator< BasicBlockList::const_iterator, const BasicBlock > const_iterator
Definition Function.h:47
iterator end()
Definition Function.h:163
void removeAttr()
Definition Function.h:149
void remove(const_iterator pos)
Attribute & attr(size_t i)
Definition Function.h:109
const BasicBlock & entry() const
Definition Function.h:215
void accept(ConstantVisitor &visitor) override
Definition Function.h:238
bool isWellFormed() const override
const BasicBlock & front() const
Definition Function.h:191
attr_iterator attr_end() const
Definition Function.h:97
const_iterator begin() const
Definition Function.h:159
const BasicBlock & back() const
Definition Function.h:199
Argument & arg(size_t i)
Definition Function.h:85
BasicBlock & append(std::shared_ptr< BasicBlock > block)
arg_iterator arg_end()
Definition Function.h:69
const Argument & arg(size_t i) const
Definition Function.h:89
const_reverse_iterator rend() const
Definition Function.h:183
OptionalReference< const Attribute > attr() const
Definition Function.h:130
OptionalReference< Attribute > attr()
Definition Function.h:119
attr_iterator attr_begin() const
Definition Function.h:93
BasicBlock & prepend(std::shared_ptr< BasicBlock > block)
BasicBlock & add(const_iterator pos, std::shared_ptr< BasicBlock > block)
reverse_iterator rend()
Definition Function.h:179
BasicBlock & back()
Definition Function.h:195
void accept(ConstantVisitor &visitor) const override
Definition Function.h:242
size_t attr_size() const
Definition Function.h:105
BasicBlock & entry()
Definition Function.h:211
IndirectIterator< BasicBlockList::reverse_iterator, BasicBlock > reverse_iterator
Definition Function.h:48
T & addAttr(std::unique_ptr< T > attr)
Definition Function.h:142
IndirectIterator< ArgumentList::const_iterator, const Argument > const_arg_iterator
Definition Function.h:41
BasicBlock & front()
Definition Function.h:187
IndirectIterator< ArgumentList::iterator, Argument > arg_iterator
Definition Function.h:40
IndirectIterator< BasicBlockList::const_reverse_iterator, const BasicBlock > const_reverse_iterator
Definition Function.h:49
Function(std::unique_ptr< FunctionType > functionType, Linkage linkage)
size_t size() const
Definition Function.h:207
IndirectIterator< AttributeList::const_iterator, const Attribute > const_attr_iterator
Definition Function.h:44
Linkage linkage() const
Definition Function.h:57
bool attr_empty() const
Definition Function.h:101
const_reverse_iterator rbegin() const
Definition Function.h:175
Definition GlobalValue.h:17
Definition Argument.h:13
auto args(Function &F)
Definition Function.h:262
auto attrs(const Function &F)
Definition Function.h:270
MINI_LLVM_EXPORT std::string toDot(const Function &F)
Linkage
Definition Linkage.h:7
std::unique_ptr< To > cast(std::unique_ptr< From > from) noexcept
Definition Memory.h:10