forked from lcompilers/lpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathllvm_utils.cpp
More file actions
62 lines (50 loc) · 2.18 KB
/
llvm_utils.cpp
File metadata and controls
62 lines (50 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <libasr/assert.h>
#include <libasr/codegen/llvm_utils.h>
namespace LFortran {
namespace LLVM {
llvm::Value* CreateLoad(llvm::IRBuilder<> &builder, llvm::Value *x) {
llvm::Type *t = x->getType();
LFORTRAN_ASSERT(t->isPointerTy());
llvm::Type *t2 = t->getContainedType(0);
return builder.CreateLoad(t2, x);
}
llvm::Value* CreateGEP(llvm::IRBuilder<> &builder, llvm::Value *x, std::vector<llvm::Value *> &idx) {
llvm::Type *t = x->getType();
LFORTRAN_ASSERT(t->isPointerTy());
llvm::Type *t2 = t->getContainedType(0);
return builder.CreateGEP(t2, x, idx);
}
llvm::Value* CreateInBoundsGEP(llvm::IRBuilder<> &builder, llvm::Value *x, std::vector<llvm::Value *> &idx) {
llvm::Type *t = x->getType();
LFORTRAN_ASSERT(t->isPointerTy());
llvm::Type *t2 = t->getContainedType(0);
return builder.CreateInBoundsGEP(t2, x, idx);
}
}
LLVMUtils::LLVMUtils(llvm::LLVMContext& context,
llvm::IRBuilder<>* _builder):
context(context),
builder(std::move(_builder)) {
}
llvm::Value* LLVMUtils::create_gep(llvm::Value* ds, int idx) {
std::vector<llvm::Value*> idx_vec = {
llvm::ConstantInt::get(context, llvm::APInt(32, 0)),
llvm::ConstantInt::get(context, llvm::APInt(32, idx))};
return LLVM::CreateGEP(*builder, ds, idx_vec);
}
llvm::Value* LLVMUtils::create_gep(llvm::Value* ds, llvm::Value* idx) {
std::vector<llvm::Value*> idx_vec = {
llvm::ConstantInt::get(context, llvm::APInt(32, 0)),
idx};
return LLVM::CreateGEP(*builder, ds, idx_vec);
}
llvm::Value* LLVMUtils::create_ptr_gep(llvm::Value* ptr, int idx) {
std::vector<llvm::Value*> idx_vec = {
llvm::ConstantInt::get(context, llvm::APInt(32, idx))};
return LLVM::CreateInBoundsGEP(*builder, ptr, idx_vec);
}
llvm::Value* LLVMUtils::create_ptr_gep(llvm::Value* ptr, llvm::Value* idx) {
std::vector<llvm::Value*> idx_vec = {idx};
return LLVM::CreateInBoundsGEP(*builder, ptr, idx_vec);
}
} // LFortran