mini-llvm 0.1.0
Loading...
Searching...
No Matches
BasicBlock.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2
3#pragma once
4
5#include <concepts>
6#include <cstddef>
7#include <format>
8#include <iterator>
9#include <list>
10#include <memory>
11#include <ranges>
12#include <string>
13#include <unordered_set>
14#include <utility>
15
21
22namespace mini_llvm::mir {
23
25 using InstructionList = std::list<std::unique_ptr<Instruction>>;
26
27public:
32
33 BasicBlock() = default;
34 BasicBlock(const BasicBlock &) = delete;
35 BasicBlock(BasicBlock &&) = delete;
36 BasicBlock &operator=(const BasicBlock &) = delete;
38
39 const std::string &name() const & {
40 return name_;
41 }
42
43 std::string &&name() && {
44 return std::move(name_);
45 }
46
47 void setName(std::string name) {
48 name_ = std::move(name);
49 }
50
52 return iterator(insts_.begin());
53 }
54
56 return const_iterator(insts_.begin());
57 }
58
60 return iterator(insts_.end());
61 }
62
64 return const_iterator(insts_.end());
65 }
66
68 return reverse_iterator(insts_.rbegin());
69 }
70
72 return const_reverse_iterator(insts_.rbegin());
73 }
74
76 return reverse_iterator(insts_.rend());
77 }
78
80 return const_reverse_iterator(insts_.rend());
81 }
82
84 return *begin();
85 }
86
87 const Instruction &front() const {
88 return *begin();
89 }
90
92 return *std::prev(end());
93 }
94
95 const Instruction &back() const {
96 return *std::prev(end());
97 }
98
99 bool empty() const {
100 return insts_.empty();
101 }
102
103 size_t size() const {
104 return insts_.size();
105 }
106
107 Instruction &add(const_iterator pos, std::unique_ptr<Instruction> I);
108
109 Instruction &prepend(std::unique_ptr<Instruction> I) {
110 return add(begin(), std::move(I));
111 }
112
113 Instruction &append(std::unique_ptr<Instruction> I) {
114 return add(end(), std::move(I));
115 }
116
117 template <typename T>
118 requires std::derived_from<T, Instruction>
119 T &add(const_iterator pos, std::unique_ptr<T> I) {
120 return static_cast<T &>(add(pos, cast<Instruction>(std::move(I))));
121 }
122
123 template <typename T>
124 requires std::derived_from<T, Instruction>
125 T &prepend(std::unique_ptr<T> I) {
126 return static_cast<T &>(prepend(cast<Instruction>(std::move(I))));
127 }
128
129 template <typename T>
130 requires std::derived_from<T, Instruction>
131 T &append(std::unique_ptr<T> I) {
132 return static_cast<T &>(append(cast<Instruction>(std::move(I))));
133 }
134
135 std::unique_ptr<Instruction> remove(const_iterator pos);
136
137 std::unique_ptr<Instruction> removeFirst() {
138 return remove(begin());
139 }
140
141 std::unique_ptr<Instruction> removeLast() {
142 return remove(std::prev(end()));
143 }
144
145 void replace(const_iterator pos, std::unique_ptr<Instruction> I);
146
147 void clear();
148
149 template <typename I>
150 requires std::input_iterator<I>
151 void assign(I first, I last) {
152 clear();
153 for (; first != last; ++first) {
154 append(std::move(*first));
155 }
156 }
157
158 template <typename R>
159 requires std::ranges::range<R>
160 void assign_range(R &&range) {
161 assign(range.begin(), range.end());
162 }
163
164 std::string format() const;
165 std::string formatAsOperand() const;
166
167private:
168 std::string name_;
169 InstructionList insts_;
170};
171
172std::unordered_set<BasicBlock *> successors(const BasicBlock &B);
173std::unordered_set<Register *> use(const BasicBlock &B);
174std::unordered_set<Register *> def(const BasicBlock &B);
175
176} // namespace mini_llvm::mir
177
178template <>
179struct std::formatter<mini_llvm::mir::BasicBlock> {
180 constexpr auto parse(std::format_parse_context &ctx) {
181 if (*ctx.begin() == 'o') {
182 asOperand_ = true;
183 return std::next(ctx.begin());
184 }
185 return ctx.begin();
186 }
187
188 template <typename FormatContext>
189 auto format(const mini_llvm::mir::BasicBlock &B, FormatContext &ctx) const {
190 if (asOperand_) {
191 return std::format_to(ctx.out(), "{}", B.formatAsOperand());
192 }
193 return std::format_to(ctx.out(), "{}", B.format());
194 }
195
196private:
197 bool asOperand_ = false;
198};
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition IndirectIterator.h:16
Definition BasicBlock.h:24
IndirectIterator< InstructionList::iterator, Instruction > iterator
Definition BasicBlock.h:28
iterator begin()
Definition BasicBlock.h:51
reverse_iterator rend()
Definition BasicBlock.h:75
void assign(I first, I last)
Definition BasicBlock.h:151
iterator end()
Definition BasicBlock.h:59
IndirectIterator< InstructionList::reverse_iterator, Instruction > reverse_iterator
Definition BasicBlock.h:30
BasicBlock(const BasicBlock &)=delete
const_iterator begin() const
Definition BasicBlock.h:55
std::unique_ptr< Instruction > remove(const_iterator pos)
const std::string & name() const &
Definition BasicBlock.h:39
const Instruction & back() const
Definition BasicBlock.h:95
T & append(std::unique_ptr< T > I)
Definition BasicBlock.h:131
T & add(const_iterator pos, std::unique_ptr< T > I)
Definition BasicBlock.h:119
std::unique_ptr< Instruction > removeLast()
Definition BasicBlock.h:141
IndirectIterator< InstructionList::const_iterator, const Instruction > const_iterator
Definition BasicBlock.h:29
BasicBlock & operator=(const BasicBlock &)=delete
std::string format() const
BasicBlock(BasicBlock &&)=delete
IndirectIterator< InstructionList::const_reverse_iterator, const Instruction > const_reverse_iterator
Definition BasicBlock.h:31
Instruction & add(const_iterator pos, std::unique_ptr< Instruction > I)
std::string formatAsOperand() const
reverse_iterator rbegin()
Definition BasicBlock.h:67
Instruction & prepend(std::unique_ptr< Instruction > I)
Definition BasicBlock.h:109
void assign_range(R &&range)
Definition BasicBlock.h:160
void setName(std::string name)
Definition BasicBlock.h:47
Instruction & append(std::unique_ptr< Instruction > I)
Definition BasicBlock.h:113
const Instruction & front() const
Definition BasicBlock.h:87
const_reverse_iterator rend() const
Definition BasicBlock.h:79
std::string && name() &&
Definition BasicBlock.h:43
size_t size() const
Definition BasicBlock.h:103
BasicBlock & operator=(BasicBlock &&)=delete
const_iterator end() const
Definition BasicBlock.h:63
bool empty() const
Definition BasicBlock.h:99
std::unique_ptr< Instruction > removeFirst()
Definition BasicBlock.h:137
void replace(const_iterator pos, std::unique_ptr< Instruction > I)
Instruction & front()
Definition BasicBlock.h:83
Instruction & back()
Definition BasicBlock.h:91
T & prepend(std::unique_ptr< T > I)
Definition BasicBlock.h:125
const_reverse_iterator rbegin() const
Definition BasicBlock.h:71
Definition Instruction.h:21
Definition BasicBlock.h:22
std::unordered_set< BasicBlock * > successors(const BasicBlock &B)
std::unordered_set< Register * > def(const BasicBlock &B)
std::unordered_set< Register * > use(const BasicBlock &B)
Definition GraphColoringAllocator.h:13
std::unique_ptr< To > cast(std::unique_ptr< From > from) noexcept
Definition Memory.h:10
constexpr auto parse(std::format_parse_context &ctx)
Definition BasicBlock.h:180
auto format(const mini_llvm::mir::BasicBlock &B, FormatContext &ctx) const
Definition BasicBlock.h:189