llir-opt
0.0.1
Low-Level Post-Link Optimiser for OCaml and C
|
7 #include <llvm/CodeGen/Register.h>
8 #include <llvm/CodeGen/TargetRegisterInfo.h>
10 #include "core/type.h"
11 #include "core/calling_conv.h"
12 #include "core/insts.h"
38 llvm::Register
Reg = 0u;
47 ArgPart(llvm::MVT vt, llvm::Register reg)
50 ArgPart(llvm::MVT vt,
unsigned offset,
unsigned size)
53 ArgPart(llvm::MVT vt,
unsigned offset,
unsigned size, llvm::Align align)
64 llvm::SmallVector<ArgPart, 2>
Parts;
73 using arg_iterator = std::vector<ArgLoc>::iterator;
74 using const_arg_iterator = std::vector<ArgLoc>::const_iterator;
83 RetPart(llvm::MVT partVT, llvm::Register reg)
84 :
VT(partVT),
Reg(reg)
94 llvm::SmallVector<RetPart, 2>
Parts;
100 using ret_iterator = std::vector<RetLoc>::iterator;
101 using const_ret_iterator = std::vector<RetLoc>::const_iterator;
118 arg_iterator arg_begin() {
return args_.begin(); }
119 arg_iterator arg_end() {
return args_.end(); }
120 const_arg_iterator arg_begin()
const {
return args_.begin(); }
121 const_arg_iterator arg_end()
const {
return args_.end(); }
124 llvm::iterator_range<arg_iterator>
args()
126 return llvm::make_range(arg_begin(), arg_end());
130 llvm::iterator_range<const_arg_iterator>
args()
const
132 return llvm::make_range(arg_begin(), arg_end());
139 ret_iterator ret_begin() {
return rets_.begin(); }
140 ret_iterator ret_end() {
return rets_.end(); }
141 const_ret_iterator ret_begin()
const {
return rets_.begin(); }
142 const_ret_iterator ret_end()
const {
return rets_.end(); }
145 llvm::iterator_range<ret_iterator>
rets()
147 return llvm::make_range(ret_begin(), ret_end());
151 llvm::iterator_range<const_ret_iterator>
rets()
const
153 return llvm::make_range(ret_begin(), ret_end());
173 llvm_unreachable(
"no args to multiboot");
virtual unsigned GetFrameSize() const =0
Returns the size of the call frame.
CallingConv conv_
Calling convention.
Definition: call_lowering.h:210
virtual void AssignArgMultiboot(unsigned i, FlaggedType type)
Location assignment for multiboot.
Definition: call_lowering.h:171
virtual void AssignRetXen(unsigned i, FlaggedType type)=0
Location assignment for Xen hypercalls.
llvm::iterator_range< arg_iterator > args()
Returns a range over all arguments.
Definition: call_lowering.h:124
void AnalyseFunc(const Func *func)
Analyse a function.
Definition: call_lowering.cpp:64
void AnalyseReturn(const ReturnInst *inst)
Analyse a return instruction.
Definition: call_lowering.cpp:73
virtual void AssignArgC(unsigned i, FlaggedType type)=0
Location assignment for C.
Definition: call_lowering.h:21
Location of a return value.
Definition: call_lowering.h:90
std::vector< ArgLoc > args_
Locations where arguments are assigned.
Definition: call_lowering.h:212
virtual void AssignArgXen(unsigned i, FlaggedType type)=0
Location assignment for Xen hypercalls.
void AnalyseRaise(const RaiseInst *inst)
Analyse a raise instruction.
Definition: call_lowering.cpp:82
Type ArgType
Type of the argument.
Definition: call_lowering.h:62
virtual void AssignRetC(unsigned i, FlaggedType type)=0
Location assignment for C.
virtual void AssignRetOCamlAlloc(unsigned i, FlaggedType type)=0
Location assignment for OCaml to C allocator calls.
virtual void AssignRetOCamlGc(unsigned i, FlaggedType type)=0
Location assignment for OCaml to GC trampolines.
unsigned Offset
Stack index.
Definition: call_lowering.h:41
llvm::Register Reg
Register assigned to.
Definition: call_lowering.h:38
llvm::iterator_range< const_ret_iterator > rets() const
Return an immutable range over all returns.
Definition: call_lowering.h:151
virtual void AssignArgWin64(unsigned i, FlaggedType type)=0
Location assignment for Win64.
void AnalyseCall(const CallSite *call)
Analyse a call.
Definition: call_lowering.cpp:48
unsigned Index
Argument index.
Definition: call_lowering.h:60
llvm::SmallVector< RetPart, 2 > Parts
Parts of the return value.
Definition: call_lowering.h:94
void AssignRet(unsigned i, FlaggedType type)
Assigns a location to a return value based on callig conv.
Definition: call_lowering.cpp:117
Location storing the part of an argument.
Definition: call_lowering.h:24
virtual void AssignRetOCaml(unsigned i, FlaggedType type)=0
Location assignment for Ocaml.
unsigned Index
Index of the return value.
Definition: call_lowering.h:92
virtual void AssignArgOCamlAlloc(unsigned i, FlaggedType type)=0
Location assignment for OCaml to C allocator calls.
llvm::Align Align
Alignment.
Definition: call_lowering.h:45
llvm::SmallVector< ArgPart, 2 > Parts
Parts of the argument.
Definition: call_lowering.h:64
virtual void AssignRetWin64(unsigned i, FlaggedType type)=0
Location assignment for Win64 calls.
void AnalysePad(const LandingPadInst *inst)
Analyse a landing pad instruction.
Definition: call_lowering.cpp:91
unsigned GetNumArgs() const
Returns the number of arguments.
Definition: call_lowering.h:113
llvm::MVT VT
Target value type.
Definition: call_lowering.h:35
unsigned Size
Size on stack.
Definition: call_lowering.h:43
const RetLoc & Return(unsigned idx) const
Returns the type of a return value.
Definition: call_lowering.h:157
Location of an argument.
Definition: call_lowering.h:58
void AssignArg(unsigned i, FlaggedType type)
Assigns a location to an argument based on calling conv.
Definition: call_lowering.cpp:100
llvm::iterator_range< const_arg_iterator > args() const
Return an immutable range over all arguments.
Definition: call_lowering.h:130
Kind K
Location kind.
Definition: call_lowering.h:33
llvm::MVT VT
Original value type.
Definition: call_lowering.h:79
virtual void AssignArgOCamlGc(unsigned i, FlaggedType type)=0
Location assignment for OCaml to GC trampolines.
virtual void AssignArgOCaml(unsigned i, FlaggedType type)=0
Location assignment for Ocaml.
std::vector< RetLoc > rets_
Locations where return values are assigned.
Definition: call_lowering.h:214
llvm::Register Reg
Register assigned to.
Definition: call_lowering.h:81
const ArgLoc & Argument(size_t idx) const
Returns a given argument.
Definition: call_lowering.h:136
llvm::iterator_range< ret_iterator > rets()
Returns a range over all returns.
Definition: call_lowering.h:145
Kind
Location: register or stack.
Definition: call_lowering.h:26
Storage for a return value.
Definition: call_lowering.h:77