mini-llvm
0.1.0
Toggle main menu visibility
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
14
#include "
mini-llvm/ir/Function.h
"
15
#include "
mini-llvm/ir/Instruction.h
"
16
#include "
mini-llvm/ir/InstructionVisitor.h
"
17
#include "
mini-llvm/ir/Type.h
"
18
#include "
mini-llvm/ir/Type/FunctionType.h
"
19
#include "
mini-llvm/ir/Use.h
"
20
#include "
mini-llvm/ir/Value.h
"
21
#include "
mini-llvm/utils/Compiler.h
"
22
#include "
mini-llvm/utils/IndirectIterator.h
"
23
24
namespace
mini_llvm::ir
{
25
26
class
MINI_LLVM_EXPORT
Call
final :
public
Instruction
{
27
using
ArgumentList = std::vector<std::unique_ptr<Use<Value>>>;
28
29
public
:
30
using
arg_iterator
=
IndirectIterator<ArgumentList::iterator, Use<Value>
>;
31
using
const_arg_iterator
=
IndirectIterator<ArgumentList::const_iterator, const Use<Value>
>;
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
40
arg_iterator
arg_begin
() {
41
return
arg_iterator
(args_.begin());
42
}
43
44
arg_iterator
arg_end
() {
45
return
arg_iterator
(args_.end());
46
}
47
48
const_arg_iterator
arg_begin
()
const
{
49
return
const_arg_iterator
(args_.begin());
50
}
51
52
const_arg_iterator
arg_end
()
const
{
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
78
void
removeArg
(
const_arg_iterator
pos);
79
80
void
removeLastArg
() {
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
105
private
:
106
Use<Function>
callee_;
107
ArgumentList args_;
108
};
109
110
inline
std::unique_ptr<FunctionType>
functionType
(
const
Call
&I) {
111
return
I.
callee
()->functionType();
112
}
113
114
inline
auto
args
(
Call
&I) {
115
return
std::ranges::subrange(I.
arg_begin
(), I.
arg_end
());
116
}
117
118
inline
auto
args
(
const
Call
&I) {
119
return
std::ranges::subrange(I.
arg_begin
(), I.
arg_end
());
120
}
121
122
}
// namespace mini_llvm::ir
Compiler.h
MINI_LLVM_EXPORT
#define MINI_LLVM_EXPORT
Definition
Compiler.h:17
FunctionType.h
IndirectIterator.h
Type.h
Use.h
Value.h
mini_llvm::IndirectIterator
Definition
IndirectIterator.h:16
mini_llvm::ir::Call
Definition
Call.h:26
mini_llvm::ir::Call::arg_begin
const_arg_iterator arg_begin() const
Definition
Call.h:48
mini_llvm::ir::Call::arg_end
const_arg_iterator arg_end() const
Definition
Call.h:52
mini_llvm::ir::Call::clone
std::unique_ptr< Value > clone() const override
mini_llvm::ir::Call::removeLastArg
void removeLastArg()
Definition
Call.h:80
mini_llvm::ir::Call::arg_begin
arg_iterator arg_begin()
Definition
Call.h:40
mini_llvm::ir::Call::arg_iterator
IndirectIterator< ArgumentList::iterator, Use< Value > > arg_iterator
Definition
Call.h:30
mini_llvm::ir::Call::arg_size
size_t arg_size() const
Definition
Call.h:60
mini_llvm::ir::Call::type
std::unique_ptr< Type > type() const override
Definition
Call.h:98
mini_llvm::ir::Call::removeArg
void removeArg(const_arg_iterator pos)
mini_llvm::ir::Call::callee
auto & callee(this Self &&self)
Definition
Call.h:36
mini_llvm::ir::Call::addArg
void addArg(const_arg_iterator pos, std::shared_ptr< Value > arg)
mini_llvm::ir::Call::accept
void accept(InstructionVisitor &visitor) const override
Definition
Call.h:92
mini_llvm::ir::Call::arg
const Use< Value > & arg(size_t i) const
Definition
Call.h:68
mini_llvm::ir::Call::format
std::string format() const override
mini_llvm::ir::Call::accept
void accept(InstructionVisitor &visitor) override
Definition
Call.h:88
mini_llvm::ir::Call::const_arg_iterator
IndirectIterator< ArgumentList::const_iterator, const Use< Value > > const_arg_iterator
Definition
Call.h:31
mini_llvm::ir::Call::operands
std::unordered_set< const UseBase * > operands() const override
mini_llvm::ir::Call::Call
Call(std::weak_ptr< Function > callee, std::vector< std::shared_ptr< Value > > args={})
mini_llvm::ir::Call::arg
Use< Value > & arg(size_t i)
Definition
Call.h:64
mini_llvm::ir::Call::isWellFormed
bool isWellFormed() const override
mini_llvm::ir::Call::clearArgs
void clearArgs()
mini_llvm::ir::Call::arg_empty
bool arg_empty() const
Definition
Call.h:56
mini_llvm::ir::Call::arg_end
arg_iterator arg_end()
Definition
Call.h:44
mini_llvm::ir::Call::appendArg
void appendArg(std::shared_ptr< Value > arg)
Definition
Call.h:74
mini_llvm::ir::InstructionVisitor
Definition
InstructionVisitor.h:58
mini_llvm::ir::InstructionVisitor::visitCall
virtual void visitCall(Call &I)
Definition
InstructionVisitor.h:76
mini_llvm::ir::Instruction
Definition
Instruction.h:22
mini_llvm::ir::Use
Definition
Use.h:44
Function.h
InstructionVisitor.h
Instruction.h
mini_llvm::ir
Definition
Argument.h:13
mini_llvm::ir::functionType
std::unique_ptr< FunctionType > functionType(const Call &I)
Definition
Call.h:110
mini_llvm::ir::args
auto args(Function &F)
Definition
Function.h:262
include
mini-llvm
ir
Instruction
Call.h
Generated by
1.17.0