mirror of
https://github.com/odin-lang/Odin.git
synced 2026-01-21 12:00:35 +00:00
Merge branch 'master' into windows-llvm-13.0.0
This commit is contained in:
@@ -94,7 +94,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)
|
||||
}
|
||||
@@ -115,7 +115,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)
|
||||
}
|
||||
|
||||
@@ -461,6 +461,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, char const *name = "");
|
||||
|
||||
void lb_mem_zero_ptr(lbProcedure *p, LLVMValueRef ptr, Type *type, unsigned alignment);
|
||||
|
||||
void lb_emit_init_context(lbProcedure *p, lbAddr addr);
|
||||
|
||||
@@ -410,12 +410,10 @@ 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 = 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);
|
||||
|
||||
{
|
||||
|
||||
@@ -221,6 +221,17 @@ 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) {
|
||||
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;
|
||||
}
|
||||
|
||||
lbValue lb_zero(lbModule *m, Type *t) {
|
||||
lbValue v = {};
|
||||
v.value = LLVMConstInt(lb_type(m, t), 0, false);
|
||||
@@ -2300,13 +2311,11 @@ general_end:;
|
||||
return loaded_val;
|
||||
} else {
|
||||
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);
|
||||
@@ -2689,16 +2698,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, name);
|
||||
|
||||
if (!zero_init && !force_no_init) {
|
||||
// If there is any padding of any kind, just zero init regardless of zero_init parameter
|
||||
|
||||
Reference in New Issue
Block a user