mini-llvm 0.1.0
Loading...
Searching...
No Matches
IndirectCall.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 <memory>
8#include <ranges>
9#include <string>
10#include <unordered_set>
11#include <utility>
12#include <vector>
13
16#include "mini-llvm/ir/Type.h"
18#include "mini-llvm/ir/Use.h"
19#include "mini-llvm/ir/Value.h"
23
24namespace mini_llvm::ir {
25
27 using ArgumentList = std::vector<std::unique_ptr<Use<Value>>>;
28
29public:
32
33 IndirectCall(std::unique_ptr<FunctionType> functionType, std::shared_ptr<Value> callee, std::vector<std::shared_ptr<Value>> args = {});
34
35 std::unique_ptr<FunctionType> functionType() const {
36 return cast<FunctionType>(functionType_->clone());
37 }
38
39 void setFunctionType(std::unique_ptr<FunctionType> functionType) {
40 functionType_ = std::move(functionType);
41 }
42
43 template <typename Self>
44 auto &callee(this Self &&self) {
45 return self.callee_;
46 }
47
49 return arg_iterator(args_.begin());
50 }
51
53 return arg_iterator(args_.end());
54 }
55
57 return const_arg_iterator(args_.begin());
58 }
59
61 return const_arg_iterator(args_.end());
62 }
63
64 bool arg_empty() const {
65 return args_.empty();
66 }
67
68 size_t arg_size() const {
69 return args_.size();
70 }
71
72 Use<Value> &arg(size_t i) {
73 return *args_[i];
74 }
75
76 const Use<Value> &arg(size_t i) const {
77 return *args_[i];
78 }
79
80 void addArg(const_arg_iterator pos, std::shared_ptr<Value> arg);
81
82 void appendArg(std::shared_ptr<Value> arg) {
83 addArg(arg_end(), std::move(arg));
84 }
85
87
89 removeArg(std::prev(arg_end()));
90 }
91
92 void clearArgs();
93
94 std::unordered_set<const UseBase *> operands() const override;
95
96 bool isWellFormed() const override;
97
98 std::unique_ptr<Type> type() const override {
99 return functionType_->returnType();
100 }
101
102 void accept(InstructionVisitor &visitor) override {
103 visitor.visitIndirectCall(*this);
104 }
105
106 void accept(InstructionVisitor &visitor) const override {
107 visitor.visitIndirectCall(*this);
108 }
109
110 std::string format() const override;
111 std::unique_ptr<Value> clone() const override;
112
113private:
114 std::unique_ptr<FunctionType> functionType_;
115 Use<Value> callee_;
116 ArgumentList args_;
117};
118
119inline std::unique_ptr<FunctionType> functionType(const IndirectCall &I) {
120 return I.functionType();
121}
122
123inline auto args(IndirectCall &I) {
124 return std::ranges::subrange(I.arg_begin(), I.arg_end());
125}
126
127inline auto args(const IndirectCall &I) {
128 return std::ranges::subrange(I.arg_begin(), I.arg_end());
129}
130
131} // namespace mini_llvm::ir
#define MINI_LLVM_EXPORT
Definition Compiler.h:17
Definition IndirectIterator.h:16
Definition IndirectCall.h:26
std::unique_ptr< Type > type() const override
Definition IndirectCall.h:98
IndirectIterator< ArgumentList::iterator, Use< Value > > arg_iterator
Definition IndirectCall.h:30
std::unique_ptr< Value > clone() const override
void accept(InstructionVisitor &visitor) const override
Definition IndirectCall.h:106
auto & callee(this Self &&self)
Definition IndirectCall.h:44
void removeLastArg()
Definition IndirectCall.h:88
IndirectCall(std::unique_ptr< FunctionType > functionType, std::shared_ptr< Value > callee, std::vector< std::shared_ptr< Value > > args={})
size_t arg_size() const
Definition IndirectCall.h:68
void addArg(const_arg_iterator pos, std::shared_ptr< Value > arg)
const Use< Value > & arg(size_t i) const
Definition IndirectCall.h:76
Use< Value > & arg(size_t i)
Definition IndirectCall.h:72
void appendArg(std::shared_ptr< Value > arg)
Definition IndirectCall.h:82
bool arg_empty() const
Definition IndirectCall.h:64
std::unordered_set< const UseBase * > operands() const override
void accept(InstructionVisitor &visitor) override
Definition IndirectCall.h:102
bool isWellFormed() const override
std::string format() const override
void removeArg(const_arg_iterator pos)
arg_iterator arg_end()
Definition IndirectCall.h:52
const_arg_iterator arg_begin() const
Definition IndirectCall.h:56
const_arg_iterator arg_end() const
Definition IndirectCall.h:60
std::unique_ptr< FunctionType > functionType() const
Definition IndirectCall.h:35
void setFunctionType(std::unique_ptr< FunctionType > functionType)
Definition IndirectCall.h:39
arg_iterator arg_begin()
Definition IndirectCall.h:48
IndirectIterator< ArgumentList::const_iterator, const Use< Value > > const_arg_iterator
Definition IndirectCall.h:31
Definition InstructionVisitor.h:58
virtual void visitIndirectCall(IndirectCall &I)
Definition InstructionVisitor.h:91
Definition Instruction.h:22
Definition Use.h:44
Definition Argument.h:13
std::unique_ptr< FunctionType > functionType(const Call &I)
Definition Call.h:110
auto args(Function &F)
Definition Function.h:262
std::unique_ptr< To > cast(std::unique_ptr< From > from) noexcept
Definition Memory.h:10