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