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 <cstdlib>
8#include <iterator>
9#include <list>
10#include <memory>
11#include <optional>
12#include <string>
13#include <unordered_set>
14#include <utility>
15
17#include "mini-llvm/ir/Type.h"
19#include "mini-llvm/ir/Value.h"
23
24namespace mini_llvm::ir {
25
26class Instruction;
27
28class MINI_LLVM_EXPORT BasicBlock final : public Value {
29 using InstructionList = std::list<std::shared_ptr<Instruction>>;
30
31public:
36
38 return iterator(insts_.begin());
39 }
40
42 return const_iterator(insts_.begin());
43 }
44
46 return iterator(insts_.end());
47 }
48
50 return const_iterator(insts_.end());
51 }
52
54 return reverse_iterator(insts_.rbegin());
55 }
56
58 return const_reverse_iterator(insts_.rbegin());
59 }
60
62 return reverse_iterator(insts_.rend());
63 }
64
66 return const_reverse_iterator(insts_.rend());
67 }
68
70 return *begin();
71 }
72
73 const Instruction &front() const {
74 return *begin();
75 }
76
78 return *std::prev(end());
79 }
80
81 const Instruction &back() const {
82 return *std::prev(end());
83 }
84
85 bool empty() const {
86 return insts_.empty();
87 }
88
89 size_t size() const {
90 return insts_.size();
91 }
92
93 Instruction &add(const_iterator pos, std::shared_ptr<Instruction> I);
94
95 Instruction &prepend(std::shared_ptr<Instruction> I) {
96 return add(begin(), std::move(I));
97 }
98
99 Instruction &append(std::shared_ptr<Instruction> I) {
100 return add(end(), std::move(I));
101 }
102
103 template <typename T>
104 requires std::derived_from<T, Instruction>
105 T &add(const_iterator pos, std::shared_ptr<T> I) {
106 return static_cast<T &>(add(pos, cast<Instruction>(std::move(I))));
107 }
108
109 template <typename T>
110 requires std::derived_from<T, Instruction>
111 T &prepend(std::shared_ptr<T> I) {
112 return static_cast<T &>(prepend(cast<Instruction>(std::move(I))));
113 }
114
115 template <typename T>
116 requires std::derived_from<T, Instruction>
117 T &append(std::shared_ptr<T> I) {
118 return static_cast<T &>(append(cast<Instruction>(std::move(I))));
119 }
120
122
123 void removeFirst() {
124 remove(begin());
125 }
126
127 void removeLast() {
128 remove(std::prev(end()));
129 }
130
131 void clear();
132
133 Function *parent() const {
134 return parent_;
135 }
136
138 return *parentIterator_;
139 }
140
141 bool isWellFormed() const override;
142
143 std::unique_ptr<Type> type() const override {
144 return std::make_unique<BasicBlockType>();
145 }
146
147 std::string format() const override;
148
149 std::string formatAsOperand() const override {
150 return "%" + formatName();
151 }
152
153 std::string formatAsLabel() const {
154 return formatName() + ":";
155 }
156
157 std::unique_ptr<Value> clone() const override {
158 abort();
159 }
160
161private:
162 InstructionList insts_;
163 mutable Function *parent_ = nullptr;
164 mutable std::optional<Function::iterator> parentIterator_ = std::nullopt;
165
166 friend class Function;
167};
168
171MINI_LLVM_EXPORT std::unordered_set<BasicBlock *> predecessors(const BasicBlock &B);
172MINI_LLVM_EXPORT std::unordered_set<BasicBlock *> successors(const BasicBlock &B);
174
175} // namespace mini_llvm::ir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition IndirectIterator.h:16
Definition BasicBlock.h:28
reverse_iterator rend()
Definition BasicBlock.h:61
std::string formatAsLabel() const
Definition BasicBlock.h:153
void removeFirst()
Definition BasicBlock.h:123
Instruction & front()
Definition BasicBlock.h:69
T & prepend(std::shared_ptr< T > I)
Definition BasicBlock.h:111
std::string formatAsOperand() const override
Definition BasicBlock.h:149
iterator begin()
Definition BasicBlock.h:37
void removeLast()
Definition BasicBlock.h:127
Instruction & back()
Definition BasicBlock.h:77
std::unique_ptr< Value > clone() const override
Definition BasicBlock.h:157
const Instruction & front() const
Definition BasicBlock.h:73
Instruction & append(std::shared_ptr< Instruction > I)
Definition BasicBlock.h:99
IndirectIterator< InstructionList::iterator, Instruction > iterator
Definition BasicBlock.h:32
const_reverse_iterator rbegin() const
Definition BasicBlock.h:57
Function * parent() const
Definition BasicBlock.h:133
Instruction & add(const_iterator pos, std::shared_ptr< Instruction > I)
std::string format() const override
size_t size() const
Definition BasicBlock.h:89
IndirectIterator< InstructionList::const_reverse_iterator, const Instruction > const_reverse_iterator
Definition BasicBlock.h:35
Instruction & prepend(std::shared_ptr< Instruction > I)
Definition BasicBlock.h:95
iterator end()
Definition BasicBlock.h:45
T & add(const_iterator pos, std::shared_ptr< T > I)
Definition BasicBlock.h:105
IndirectIterator< InstructionList::reverse_iterator, Instruction > reverse_iterator
Definition BasicBlock.h:34
const Instruction & back() const
Definition BasicBlock.h:81
reverse_iterator rbegin()
Definition BasicBlock.h:53
std::unique_ptr< Type > type() const override
Definition BasicBlock.h:143
friend class Function
Definition BasicBlock.h:166
bool isWellFormed() const override
const_iterator end() const
Definition BasicBlock.h:49
IndirectIterator< InstructionList::const_iterator, const Instruction > const_iterator
Definition BasicBlock.h:33
void remove(const_iterator pos)
const_reverse_iterator rend() const
Definition BasicBlock.h:65
T & append(std::shared_ptr< T > I)
Definition BasicBlock.h:117
const_iterator begin() const
Definition BasicBlock.h:41
Function::iterator parentIterator() const
Definition BasicBlock.h:137
bool empty() const
Definition BasicBlock.h:85
Definition Function.h:34
IndirectIterator< BasicBlockList::iterator, BasicBlock > iterator
Definition Function.h:46
Definition Instruction.h:22
std::string formatName() const
Definition Argument.h:13
MINI_LLVM_EXPORT void removeFromParent(const BasicBlock &B)
MINI_LLVM_EXPORT bool hasNPredecessorsOrMore(const BasicBlock &B, size_t n)
MINI_LLVM_EXPORT bool hasNPredecessors(const BasicBlock &B, size_t n)
MINI_LLVM_EXPORT std::unordered_set< BasicBlock * > successors(const BasicBlock &B)
MINI_LLVM_EXPORT std::unordered_set< BasicBlock * > predecessors(const BasicBlock &B)
std::unique_ptr< To > cast(std::unique_ptr< From > from) noexcept
Definition Memory.h:10