diff options
| author | gingerBill <bill@gingerbill.org> | 2021-05-24 22:32:38 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-05-24 22:32:38 +0100 |
| commit | 44b6e7c45db3bb3cc6ff30bca08d0b761b975c30 (patch) | |
| tree | eb0d43aafbf491f80de6379f4156b99598b1f0d9 /src/llvm_backend.cpp | |
| parent | 284a2631fd809b520e9dbde36c3ee3d270e6422c (diff) | |
Move the mem zero into a separate procedure for reuse
Diffstat (limited to 'src/llvm_backend.cpp')
| -rw-r--r-- | src/llvm_backend.cpp | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 38500fe1d..b622d1729 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -57,6 +57,9 @@ void lb_loop_end(lbProcedure *p, lbLoopData const &data); LLVMValueRef llvm_zero(lbModule *m) { return LLVMConstInt(lb_type(m, t_int), 0, false); } +LLVMValueRef llvm_zero32(lbModule *m) { + return LLVMConstInt(lb_type(m, t_i32), 0, false); +} LLVMValueRef llvm_one(lbModule *m) { return LLVMConstInt(lb_type(m, t_i32), 1, false); } @@ -3480,6 +3483,28 @@ lbValue lb_build_cond(lbProcedure *p, Ast *cond, lbBlock *true_block, lbBlock *f return v; } +void lb_mem_zero_ptr(lbProcedure *p, LLVMValueRef ptr, Type *type, unsigned alignment) { + LLVMTypeRef llvm_type = lb_type(p->module, type); + + LLVMTypeKind kind = LLVMGetTypeKind(llvm_type); + + switch (kind) { + case LLVMStructTypeKind: + case LLVMArrayTypeKind: + { + // NOTE(bill): Enforce zeroing through memset to make sure padding is zeroed too + LLVMTypeRef type_i8 = LLVMInt8TypeInContext(p->module->ctx); + LLVMTypeRef type_i32 = LLVMInt32TypeInContext(p->module->ctx); + i32 sz = cast(i32)type_size_of(type); + LLVMBuildMemSet(p->builder, ptr, LLVMConstNull(type_i8), LLVMConstInt(type_i32, sz, false), alignment); + } + break; + default: + LLVMBuildStore(p->builder, LLVMConstNull(lb_type(p->module, type)), ptr); + break; + } +} + lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e, bool zero_init, i32 param_index) { GB_ASSERT(p->decl_block != p->curr_block); LLVMPositionBuilderAtEnd(p->builder, p->decl_block->block); @@ -3513,23 +3538,7 @@ lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e, bool zero_init, i32 p } if (zero_init) { - LLVMTypeKind kind = LLVMGetTypeKind(llvm_type); - - switch (kind) { - case LLVMStructTypeKind: - case LLVMArrayTypeKind: - { - // NOTE(bill): Enforce zeroing through memset to make sure padding is zeroed too - LLVMTypeRef type_i8 = LLVMInt8TypeInContext(p->module->ctx); - LLVMTypeRef type_i32 = LLVMInt32TypeInContext(p->module->ctx); - i32 sz = cast(i32)type_size_of(type); - LLVMBuildMemSet(p->builder, ptr, LLVMConstNull(type_i8), LLVMConstInt(type_i32, sz, false), alignment); - } - break; - default: - LLVMBuildStore(p->builder, LLVMConstNull(lb_type(p->module, type)), ptr); - break; - } + lb_mem_zero_ptr(p, ptr, type, alignment); } lbValue val = {}; @@ -5370,7 +5379,6 @@ void lb_build_stmt(lbProcedure *p, Ast *node) { return; } - auto lvals = array_make<lbAddr>(permanent_allocator(), 0, vd->names.count); for_array(i, vd->names) { @@ -5378,7 +5386,7 @@ void lb_build_stmt(lbProcedure *p, Ast *node) { lbAddr lval = {}; if (!is_blank_ident(name)) { Entity *e = entity_of_node(name); - bool zero_init = true; // Zero always and optimize out later + bool zero_init = true; // Always do it lval = lb_add_local(p, e->type, e, zero_init); } array_add(&lvals, lval); |