From 83ffb68bb7025752639b746597cdcfa463cc7074 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 23 Sep 2022 12:09:46 +0100 Subject: [PATCH 1/4] Fix typo in `map_insert` --- core/runtime/core_builtin.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/runtime/core_builtin.odin b/core/runtime/core_builtin.odin index 574023a1e..b5b003122 100644 --- a/core/runtime/core_builtin.odin +++ b/core/runtime/core_builtin.odin @@ -672,7 +672,7 @@ shrink_dynamic_array :: proc(array: ^$T/[dynamic]$E, new_cap := -1, loc := #call @builtin map_insert :: proc(m: ^$T/map[$K]$V, key: K, value: V, loc := #caller_location) -> (ptr: ^V) { key, value := key, value - h := __get_map_header(T) + h := __get_map_header_table(T) e := __dynamic_map_set(m, h, __get_map_key_hash(&key), &key, &value, loc) return (^V)(uintptr(e) + h.value_offset) From 4d208dc0922b713bc7351bfe2e846e3ac957aff7 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 27 Sep 2022 00:10:05 +0100 Subject: [PATCH 2/4] Override lbArgKind to be indirect for `#by_ptr` parameters --- src/llvm_backend_general.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index f05ae81ca..ed77eb975 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -1507,6 +1507,7 @@ LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *type) { LLVMTypeRef ret = nullptr; LLVMTypeRef *params = gb_alloc_array(permanent_allocator(), LLVMTypeRef, param_count); + bool *params_by_ptr = gb_alloc_array(permanent_allocator(), bool, param_count); if (type->Proc.result_count != 0) { Type *single_ret = reduce_tuple_to_single_type(type->Proc.results); ret = lb_type(m, single_ret); @@ -1532,9 +1533,11 @@ LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *type) { } Type *e_type = reduce_tuple_to_single_type(e->type); + bool param_is_by_ptr = false; LLVMTypeRef param_type = nullptr; if (e->flags & EntityFlag_ByPtr) { param_type = lb_type(m, alloc_type_pointer(e_type)); + param_is_by_ptr = true; } else if (is_type_boolean(e_type) && type_size_of(e_type) <= 1) { param_type = LLVMInt1TypeInContext(m->ctx); @@ -1546,6 +1549,7 @@ LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *type) { } } + params_by_ptr[param_index] = param_is_by_ptr; params[param_index++] = param_type; } } @@ -1571,6 +1575,13 @@ LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *type) { LLVMPrintTypeToString(ft->ret.type), LLVMGetTypeContext(ft->ret.type), ft->ctx, LLVMGetGlobalContext()); } + for_array(j, ft->args) { + if (params_by_ptr[j]) { + // NOTE(bill): The parameter needs to be passed "indirectly", override it + GB_ASSERT(ft->args[j].kind == lbArg_Direct); + ft->args[j].kind = lbArg_Indirect; + } + } map_set(&m->function_type_map, type, ft); LLVMTypeRef new_abi_fn_type = lb_function_type_to_llvm_raw(ft, type->Proc.c_vararg); From 0fe006157e6e6f07722bcf4eb7c51a8db07d008c Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 27 Sep 2022 00:18:19 +0100 Subject: [PATCH 3/4] Remove extra pointer indirection --- src/llvm_backend_general.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index ed77eb975..0dabee076 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -1536,7 +1536,8 @@ LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *type) { bool param_is_by_ptr = false; LLVMTypeRef param_type = nullptr; if (e->flags & EntityFlag_ByPtr) { - param_type = lb_type(m, alloc_type_pointer(e_type)); + // it will become a pointer afterwards by making it indirect + param_type = lb_type(m, e_type); param_is_by_ptr = true; } else if (is_type_boolean(e_type) && type_size_of(e_type) <= 1) { @@ -1578,7 +1579,6 @@ LLVMTypeRef lb_type_internal_for_procedures_raw(lbModule *m, Type *type) { for_array(j, ft->args) { if (params_by_ptr[j]) { // NOTE(bill): The parameter needs to be passed "indirectly", override it - GB_ASSERT(ft->args[j].kind == lbArg_Direct); ft->args[j].kind = lbArg_Indirect; } } From 35e70f4be17f4123ec25108d664864f13b38087e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 27 Sep 2022 22:30:00 +0100 Subject: [PATCH 4/4] Add node data for union when using `intrinsics.type_convert_variants_to_pointers` --- src/check_builtin.cpp | 1 + src/docs_writer.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 09294c93a..a00dd5def 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -4751,6 +4751,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 new_type->Union.variants = variants; // NOTE(bill): Is this even correct? + new_type->Union.node = operand->expr; new_type->Union.scope = bt->Union.scope; operand->type = new_type; diff --git a/src/docs_writer.cpp b/src/docs_writer.cpp index 1b8e1fc34..5246971ff 100644 --- a/src/docs_writer.cpp +++ b/src/docs_writer.cpp @@ -639,7 +639,7 @@ OdinDocTypeIndex odin_doc_type(OdinDocWriter *w, Type *type) { doc_type.polmorphic_params = odin_doc_type(w, type->Union.polymorphic_params); } - if (type->Union.node) { + if (type->Union.node && type->Union.node->kind == Ast_UnionType) { ast_node(ut, UnionType, type->Union.node); if (ut->align) { doc_type.custom_align = odin_doc_expr_string(w, ut->align);