aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_general.cpp
diff options
context:
space:
mode:
authorHenry Dooley <henry.dooley@gmail.com>2021-12-25 16:27:52 -0600
committerHenry Dooley <henry.dooley@gmail.com>2021-12-25 16:28:09 -0600
commit516065d7c22c19aa953edf1d4ab1537f07742dec (patch)
treea4a61a81fc17b6973bcfc5dd9925d02078721df1 /src/llvm_backend_general.cpp
parent6f370fdbf2811a82b09a8fe9afcd805cdf3477eb (diff)
factor out alloca generation into a helper
Diffstat (limited to 'src/llvm_backend_general.cpp')
-rw-r--r--src/llvm_backend_general.cpp18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index 17eeb0bea..9f77cef65 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -216,6 +216,14 @@ LLVMValueRef llvm_one(lbModule *m) {
return LLVMConstInt(lb_type(m, t_i32), 1, false);
}
+LLVMValueRef llvm_alloca(lbProcedure *p, LLVMTypeRef llvm_type, isize alignment) {
+ LLVMValueRef val = LLVMBuildAlloca(p->builder, llvm_type, "");
+ LLVMSetAlignment(val, alignment);
+ LLVMPositionBuilderAtEnd(p->builder, p->curr_block->block);
+
+ return val;
+}
+
lbValue lb_zero(lbModule *m, Type *t) {
lbValue v = {};
v.value = LLVMConstInt(lb_type(m, t), 0, false);
@@ -2267,11 +2275,10 @@ general_end:;
GB_ASSERT(p->decl_block != p->curr_block);
LLVMPositionBuilderAtEnd(p->builder, p->decl_block->block);
- LLVMValueRef ptr = LLVMBuildAlloca(p->builder, dst_type, "");
- LLVMPositionBuilderAtEnd(p->builder, p->curr_block->block);
i64 max_align = gb_max(lb_alignof(src_type), lb_alignof(dst_type));
max_align = gb_max(max_align, 4);
- LLVMSetAlignment(ptr, cast(unsigned)max_align);
+
+ LLVMValueRef ptr = llvm_alloca(p, dst_type, max_align);
LLVMValueRef nptr = LLVMBuildPointerCast(p->builder, ptr, LLVMPointerType(src_type, 0), "");
LLVMBuildStore(p->builder, val, nptr);
@@ -2642,16 +2649,13 @@ lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e, bool zero_init, i32 p
}
LLVMTypeRef llvm_type = lb_type(p->module, type);
- LLVMValueRef ptr = LLVMBuildAlloca(p->builder, llvm_type, name);
unsigned alignment = cast(unsigned)gb_max(type_align_of(type), lb_alignof(llvm_type));
if (is_type_matrix(type)) {
alignment *= 2; // NOTE(bill): Just in case
}
- LLVMSetAlignment(ptr, alignment);
-
- LLVMPositionBuilderAtEnd(p->builder, p->curr_block->block);
+ LLVMValueRef ptr = llvm_alloca(p, llvm_type, alignment);
if (!zero_init && !force_no_init) {
// If there is any padding of any kind, just zero init regardless of zero_init parameter