From 516065d7c22c19aa953edf1d4ab1537f07742dec Mon Sep 17 00:00:00 2001 From: Henry Dooley Date: Sat, 25 Dec 2021 16:27:52 -0600 Subject: [PATCH 1/5] factor out alloca generation into a helper --- src/llvm_backend.hpp | 2 ++ src/llvm_backend_const.cpp | 6 +++--- src/llvm_backend_general.cpp | 18 +++++++++++------- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index e70b1f84c..5616701f8 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -459,6 +459,8 @@ void lb_set_entity_from_other_modules_linkage_correctly(lbModule *other_module, lbValue lb_expr_untyped_const_to_typed(lbModule *m, Ast *expr, Type *t); bool lb_is_expr_untyped_const(Ast *expr); +LLVMValueRef llvm_alloca(lbProcedure *p, LLVMTypeRef llvm_type, isize alignment); + void lb_mem_zero_ptr(lbProcedure *p, LLVMValueRef ptr, Type *type, unsigned alignment); void lb_emit_init_context(lbProcedure *p, lbAddr addr); diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index 5862a7add..bc14b099b 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -413,9 +413,9 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bool allow_loc LLVMPositionBuilderAtEnd(p->builder, p->decl_block->block); LLVMTypeRef llvm_type = lb_type(m, t); - array_data = LLVMBuildAlloca(p->builder, llvm_type, ""); - LLVMSetAlignment(array_data, 16); // TODO(bill): Make this configurable - LLVMPositionBuilderAtEnd(p->builder, p->curr_block->block); + + array_data = llvm_alloca(p, llvm_type, 16); + LLVMBuildStore(p->builder, backing_array.value, array_data); { 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 From 069c05669f5c7bbe0a2f5c82b1daa334481cd0cb Mon Sep 17 00:00:00 2001 From: Henry Dooley Date: Sat, 25 Dec 2021 16:46:02 -0600 Subject: [PATCH 2/5] cast isize to unsigned int for llvm api, add defaulted name parameter to helper. --- src/llvm_backend.hpp | 2 +- src/llvm_backend_general.cpp | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 5616701f8..9aea75be9 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -459,7 +459,7 @@ void lb_set_entity_from_other_modules_linkage_correctly(lbModule *other_module, lbValue lb_expr_untyped_const_to_typed(lbModule *m, Ast *expr, Type *t); bool lb_is_expr_untyped_const(Ast *expr); -LLVMValueRef llvm_alloca(lbProcedure *p, LLVMTypeRef llvm_type, isize alignment); +LLVMValueRef llvm_alloca(lbProcedure *p, LLVMTypeRef llvm_type, isize alignment, char const* name = ""); void lb_mem_zero_ptr(lbProcedure *p, LLVMValueRef ptr, Type *type, unsigned alignment); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 9f77cef65..46b5fdb88 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -216,9 +216,9 @@ 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); +LLVMValueRef llvm_alloca(lbProcedure *p, LLVMTypeRef llvm_type, isize alignment, char const* name) { + LLVMValueRef val = LLVMBuildAlloca(p->builder, llvm_type, name); + LLVMSetAlignment(val, cast(unsigned int)alignment); LLVMPositionBuilderAtEnd(p->builder, p->curr_block->block); return val; @@ -2655,7 +2655,7 @@ lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e, bool zero_init, i32 p alignment *= 2; // NOTE(bill): Just in case } - LLVMValueRef ptr = llvm_alloca(p, llvm_type, alignment); + LLVMValueRef ptr = llvm_alloca(p, llvm_type, alignment, name); if (!zero_init && !force_no_init) { // If there is any padding of any kind, just zero init regardless of zero_init parameter From 865d88dd56a8b048e861787e048f364a4579da2b Mon Sep 17 00:00:00 2001 From: Henry Dooley Date: Tue, 28 Dec 2021 10:50:34 -0600 Subject: [PATCH 3/5] review feedback --- src/llvm_backend_const.cpp | 2 -- src/llvm_backend_general.cpp | 4 +++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index bc14b099b..2eedbb7c9 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -410,8 +410,6 @@ lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bool allow_loc // NOTE(bill, 2020-06-08): This is a bit of a hack but a "constant" slice needs // its backing data on the stack lbProcedure *p = m->curr_procedure; - LLVMPositionBuilderAtEnd(p->builder, p->decl_block->block); - LLVMTypeRef llvm_type = lb_type(m, t); array_data = llvm_alloca(p, llvm_type, 16); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 46b5fdb88..1f97826f4 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -217,8 +217,11 @@ LLVMValueRef llvm_one(lbModule *m) { } LLVMValueRef llvm_alloca(lbProcedure *p, LLVMTypeRef llvm_type, isize alignment, char const* name) { + LLVMPositionBuilderAtEnd(p->builder, p->decl_block->block); + LLVMValueRef val = LLVMBuildAlloca(p->builder, llvm_type, name); LLVMSetAlignment(val, cast(unsigned int)alignment); + LLVMPositionBuilderAtEnd(p->builder, p->curr_block->block); return val; @@ -2273,7 +2276,6 @@ general_end:; return loaded_val; } else { GB_ASSERT(p->decl_block != p->curr_block); - LLVMPositionBuilderAtEnd(p->builder, p->decl_block->block); i64 max_align = gb_max(lb_alignof(src_type), lb_alignof(dst_type)); max_align = gb_max(max_align, 4); From ee9908b09ea30fafe81c394e2e599ee5dd553b66 Mon Sep 17 00:00:00 2001 From: Ian Lilley Date: Wed, 1 Jun 2022 22:01:00 -0400 Subject: [PATCH 4/5] Reserve more space when exceeding, not meeting, capacity --- core/runtime/dynamic_array_internal.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/runtime/dynamic_array_internal.odin b/core/runtime/dynamic_array_internal.odin index 6f800de7a..38834345c 100644 --- a/core/runtime/dynamic_array_internal.odin +++ b/core/runtime/dynamic_array_internal.odin @@ -65,7 +65,7 @@ __dynamic_array_append :: proc(array_: rawptr, elem_size, elem_align: int, ok := true - if array.cap <= array.len+item_count { + if array.cap < array.len+item_count { cap := 2 * array.cap + max(8, item_count) ok = __dynamic_array_reserve(array, elem_size, elem_align, cap, loc) } @@ -86,7 +86,7 @@ __dynamic_array_append_nothing :: proc(array_: rawptr, elem_size, elem_align: in array := (^Raw_Dynamic_Array)(array_) ok := true - if array.cap <= array.len+1 { + if array.cap < array.len+1 { cap := 2 * array.cap + max(8, 1) ok = __dynamic_array_reserve(array, elem_size, elem_align, cap, loc) } From 5187db525fa5b59df31e9f1b4b761ae60776dc58 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 12 Jun 2022 17:17:59 +0100 Subject: [PATCH 5/5] Minor style change --- src/llvm_backend.hpp | 2 +- src/llvm_backend_general.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend.hpp b/src/llvm_backend.hpp index 1507e287d..f65e1079e 100644 --- a/src/llvm_backend.hpp +++ b/src/llvm_backend.hpp @@ -461,7 +461,7 @@ void lb_set_entity_from_other_modules_linkage_correctly(lbModule *other_module, lbValue lb_expr_untyped_const_to_typed(lbModule *m, Ast *expr, Type *t); bool lb_is_expr_untyped_const(Ast *expr); -LLVMValueRef llvm_alloca(lbProcedure *p, LLVMTypeRef llvm_type, isize alignment, char const* name = ""); +LLVMValueRef llvm_alloca(lbProcedure *p, LLVMTypeRef llvm_type, isize alignment, char const *name = ""); void lb_mem_zero_ptr(lbProcedure *p, LLVMValueRef ptr, Type *type, unsigned alignment); diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 21ca3f23e..e3d30ccff 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -221,7 +221,7 @@ LLVMValueRef llvm_one(lbModule *m) { return LLVMConstInt(lb_type(m, t_i32), 1, false); } -LLVMValueRef llvm_alloca(lbProcedure *p, LLVMTypeRef llvm_type, isize alignment, char const* name) { +LLVMValueRef llvm_alloca(lbProcedure *p, LLVMTypeRef llvm_type, isize alignment, char const *name) { LLVMPositionBuilderAtEnd(p->builder, p->decl_block->block); LLVMValueRef val = LLVMBuildAlloca(p->builder, llvm_type, name);