From 27cbd0d93147cbf00f289375ae4e09e94d99610f Mon Sep 17 00:00:00 2001 From: flysand7 Date: Tue, 24 Oct 2023 10:23:38 +1100 Subject: [PATCH 01/24] GLFW binding fixes --- vendor/glfw/bindings/bindings.odin | 2 +- vendor/glfw/bindings/types.odin | 2 +- vendor/glfw/wrapper.odin | 14 +++++++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/vendor/glfw/bindings/bindings.odin b/vendor/glfw/bindings/bindings.odin index 891d06a93..afe5a3081 100644 --- a/vendor/glfw/bindings/bindings.odin +++ b/vendor/glfw/bindings/bindings.odin @@ -39,7 +39,7 @@ when ODIN_OS == .Windows { /*** Functions ***/ @(default_calling_convention="c", link_prefix="glfw") foreign glfw { - Init :: proc() -> c.int --- + Init :: proc() -> bool --- Terminate :: proc() --- InitHint :: proc(hint, value: c.int) --- diff --git a/vendor/glfw/bindings/types.odin b/vendor/glfw/bindings/types.odin index 89640075a..a3bee3fae 100644 --- a/vendor/glfw/bindings/types.odin +++ b/vendor/glfw/bindings/types.odin @@ -41,7 +41,7 @@ WindowMaximizeProc :: #type proc "c" (window: WindowHandle, iconified: c.int WindowContentScaleProc :: #type proc "c" (window: WindowHandle, xscale, yscale: f32) FramebufferSizeProc :: #type proc "c" (window: WindowHandle, width, height: c.int) DropProc :: #type proc "c" (window: WindowHandle, count: c.int, paths: [^]cstring) -MonitorProc :: #type proc "c" (window: WindowHandle) +MonitorProc :: #type proc "c" (window: WindowHandle, event: c.int) KeyProc :: #type proc "c" (window: WindowHandle, key, scancode, action, mods: c.int) MouseButtonProc :: #type proc "c" (window: WindowHandle, button, action, mods: c.int) diff --git a/vendor/glfw/wrapper.odin b/vendor/glfw/wrapper.odin index 2c09731ca..5fa56ddf2 100644 --- a/vendor/glfw/wrapper.odin +++ b/vendor/glfw/wrapper.odin @@ -49,7 +49,19 @@ SetGammaRamp :: glfw.SetGammaRamp CreateWindow :: glfw.CreateWindow DestroyWindow :: glfw.DestroyWindow -WindowHint :: glfw.WindowHint +WindowHint_int :: proc "contextless" (hint: c.int, value: c.int) { + glfw.WindowHint(hint, value) +} + +WindowHint_bool :: proc "contextless" (hint: c.int, value: bool) { + glfw.WindowHint(hint, cast(c.int) value) +} + +WindowHint :: proc { + WindowHint_int, + WindowHint_bool, +} + DefaultWindowHints :: glfw.DefaultWindowHints WindowHintString :: glfw.WindowHintString WindowShouldClose :: glfw.WindowShouldClose From 7e40a5a7113f48a9b54c04e0af6f1ec1b22eddff Mon Sep 17 00:00:00 2001 From: flysand7 Date: Tue, 24 Oct 2023 10:28:11 +1100 Subject: [PATCH 02/24] Change bool to b32 --- vendor/glfw/bindings/bindings.odin | 2 +- vendor/glfw/wrapper.odin | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vendor/glfw/bindings/bindings.odin b/vendor/glfw/bindings/bindings.odin index afe5a3081..ac41bbf52 100644 --- a/vendor/glfw/bindings/bindings.odin +++ b/vendor/glfw/bindings/bindings.odin @@ -39,7 +39,7 @@ when ODIN_OS == .Windows { /*** Functions ***/ @(default_calling_convention="c", link_prefix="glfw") foreign glfw { - Init :: proc() -> bool --- + Init :: proc() -> b32 --- Terminate :: proc() --- InitHint :: proc(hint, value: c.int) --- diff --git a/vendor/glfw/wrapper.odin b/vendor/glfw/wrapper.odin index 5fa56ddf2..db0e8364e 100644 --- a/vendor/glfw/wrapper.odin +++ b/vendor/glfw/wrapper.odin @@ -53,7 +53,7 @@ WindowHint_int :: proc "contextless" (hint: c.int, value: c.int) { glfw.WindowHint(hint, value) } -WindowHint_bool :: proc "contextless" (hint: c.int, value: bool) { +WindowHint_bool :: proc "contextless" (hint: c.int, value: b32) { glfw.WindowHint(hint, cast(c.int) value) } From ba536d67b4e08e1149f78eea46377d727f6d7251 Mon Sep 17 00:00:00 2001 From: jakubtomsu <66876057+jakubtomsu@users.noreply.github.com> Date: Wed, 25 Oct 2023 22:17:38 +0200 Subject: [PATCH 03/24] Change and to or --- src/check_builtin.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index 49095a7a8..77ba6b435 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -5170,7 +5170,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As Operand op = {}; check_expr(c, &op, ce->args[1]); - if (op.mode != Addressing_Constant && !is_type_integer(op.type)) { + if (op.mode != Addressing_Constant || !is_type_integer(op.type)) { error(op.expr, "Expected a constant integer for the index of procedure parameter value"); return false; } @@ -5229,7 +5229,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As Operand op = {}; check_expr(c, &op, ce->args[1]); - if (op.mode != Addressing_Constant && !is_type_integer(op.type)) { + if (op.mode != Addressing_Constant || !is_type_integer(op.type)) { error(op.expr, "Expected a constant integer for the index of procedure parameter value"); return false; } @@ -5307,7 +5307,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As } else { Operand op = {}; check_expr(c, &op, ce->args[1]); - if (op.mode != Addressing_Constant && !is_type_integer(op.type)) { + if (op.mode != Addressing_Constant || !is_type_integer(op.type)) { error(op.expr, "Expected a constant integer for the index of record parameter value"); return false; } From 962d59999639edfe64fb15c5b4587993c4e4a5ec Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 26 Oct 2023 14:30:04 +0200 Subject: [PATCH 04/24] Fix reading from `/sys/` pseudo fx --- core/os/os.odin | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/os/os.odin b/core/os/os.odin index b71ea261e..15864e47e 100644 --- a/core/os/os.odin +++ b/core/os/os.odin @@ -63,8 +63,8 @@ read_at_least :: proc(fd: Handle, buf: []byte, min: int) -> (n: int, err: Errno) if len(buf) < min { return 0, -1 } - for n < min && err == 0 { - nn: int + nn := max(int) + for nn > 0 && n < min && err == 0 { nn, err = read(fd, buf[n:]) n += nn } From 11a2b2a9421ddf3bb397603120db3222d9eef142 Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Fri, 27 Oct 2023 00:05:38 +0200 Subject: [PATCH 05/24] Add system_random and random_bytes for js target --- core/crypto/rand_generic.odin | 4 ++-- core/crypto/rand_js.odin | 20 ++++++++++++++++++++ core/math/rand/system_js.odin | 11 +++++++++++ vendor/wasm/js/runtime.js | 6 ++++++ 4 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 core/crypto/rand_js.odin create mode 100644 core/math/rand/system_js.odin diff --git a/core/crypto/rand_generic.odin b/core/crypto/rand_generic.odin index 52abfe4d7..fde91f85a 100644 --- a/core/crypto/rand_generic.odin +++ b/core/crypto/rand_generic.odin @@ -1,7 +1,7 @@ package crypto -when ODIN_OS != .Linux && ODIN_OS != .OpenBSD && ODIN_OS != .Windows { - _rand_bytes :: proc (dst: []byte) { +when ODIN_OS != .Linux && ODIN_OS != .OpenBSD && ODIN_OS != .Windows && ODIN_OS != .JS { + _rand_bytes :: proc(dst: []byte) { unimplemented("crypto: rand_bytes not supported on this OS") } } diff --git a/core/crypto/rand_js.odin b/core/crypto/rand_js.odin new file mode 100644 index 000000000..99a5bbcbc --- /dev/null +++ b/core/crypto/rand_js.odin @@ -0,0 +1,20 @@ +package crypto + +foreign import "odin_env" +foreign odin_env { + @(link_name = "rand_bytes") + env_rand_bytes :: proc "contextless" (buf: []byte) --- +} + +_MAX_PER_CALL_BYTES :: 65536 + +_rand_bytes :: proc(dst: []byte) { + dst := dst + + for len(dst) > 0 { + to_read := min(len(dst), _MAX_PER_CALL_BYTES) + env_rand_bytes(dst[:to_read]) + + dst = dst[to_read:] + } +} diff --git a/core/math/rand/system_js.odin b/core/math/rand/system_js.odin new file mode 100644 index 000000000..11e1385a2 --- /dev/null +++ b/core/math/rand/system_js.odin @@ -0,0 +1,11 @@ +package rand + +foreign import "odin_env" +foreign odin_env { + rand :: proc "contextless" () -> f64 --- +} + +@(require_results) +_system_random :: proc() -> u64 { + return u64(rand() * 0x1fffffffffffff) +} diff --git a/vendor/wasm/js/runtime.js b/vendor/wasm/js/runtime.js index d5ab383f0..33ce9640e 100644 --- a/vendor/wasm/js/runtime.js +++ b/vendor/wasm/js/runtime.js @@ -1349,6 +1349,12 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement) { ln: Math.log, exp: Math.exp, ldexp: (x, exp) => x * Math.pow(2, exp), + + rand: Math.random, + rand_bytes: (ptr, len) => { + const view = new Uint8Array(wasm_memory.buffer, ptr, len) + crypto.getRandomValues(view) + }, }, "odin_dom": { init_event_raw: (ep) => { From 166803a2a5ae2670d23b069f86f1aa8090f4bb14 Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Fri, 27 Oct 2023 00:18:41 +0200 Subject: [PATCH 06/24] Rename rand to rand_f64 --- core/math/rand/system_js.odin | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/math/rand/system_js.odin b/core/math/rand/system_js.odin index 11e1385a2..14949000e 100644 --- a/core/math/rand/system_js.odin +++ b/core/math/rand/system_js.odin @@ -2,10 +2,11 @@ package rand foreign import "odin_env" foreign odin_env { - rand :: proc "contextless" () -> f64 --- + @(link_name = "rand") + rand_f64 :: proc "contextless" () -> f64 --- } @(require_results) _system_random :: proc() -> u64 { - return u64(rand() * 0x1fffffffffffff) + return u64(rand_f64() * 0x1fffffffffffff) } From 8b2f62000addd72098e277b8b4e691a74c3c40a8 Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Fri, 27 Oct 2023 00:50:29 +0200 Subject: [PATCH 07/24] Use wasmMemoryInterface for rand_bytes --- vendor/wasm/js/runtime.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/wasm/js/runtime.js b/vendor/wasm/js/runtime.js index 33ce9640e..16ef5d3aa 100644 --- a/vendor/wasm/js/runtime.js +++ b/vendor/wasm/js/runtime.js @@ -1352,7 +1352,7 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement) { rand: Math.random, rand_bytes: (ptr, len) => { - const view = new Uint8Array(wasm_memory.buffer, ptr, len) + const view = new Uint8Array(wasmMemoryInterface.memory.buffer, ptr, len) crypto.getRandomValues(view) }, }, From 49da19e013cc26abad75b552f06ee2ba925718c9 Mon Sep 17 00:00:00 2001 From: Damian Tarnawski Date: Fri, 27 Oct 2023 12:06:35 +0200 Subject: [PATCH 08/24] Replace Math.random with crypto.getRandomValues for _system_number --- core/crypto/rand_js.odin | 2 +- core/math/rand/system_js.odin | 8 +++++--- vendor/wasm/js/runtime.js | 1 - 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/crypto/rand_js.odin b/core/crypto/rand_js.odin index 99a5bbcbc..353b1e6b9 100644 --- a/core/crypto/rand_js.odin +++ b/core/crypto/rand_js.odin @@ -6,7 +6,7 @@ foreign odin_env { env_rand_bytes :: proc "contextless" (buf: []byte) --- } -_MAX_PER_CALL_BYTES :: 65536 +_MAX_PER_CALL_BYTES :: 65536 // 64kiB _rand_bytes :: proc(dst: []byte) { dst := dst diff --git a/core/math/rand/system_js.odin b/core/math/rand/system_js.odin index 14949000e..b9b71c4a6 100644 --- a/core/math/rand/system_js.odin +++ b/core/math/rand/system_js.odin @@ -2,11 +2,13 @@ package rand foreign import "odin_env" foreign odin_env { - @(link_name = "rand") - rand_f64 :: proc "contextless" () -> f64 --- + @(link_name = "rand_bytes") + env_rand_bytes :: proc "contextless" (buf: []byte) --- } @(require_results) _system_random :: proc() -> u64 { - return u64(rand_f64() * 0x1fffffffffffff) + buf: [8]u8 + env_rand_bytes(buf[:]) + return transmute(u64)buf } diff --git a/vendor/wasm/js/runtime.js b/vendor/wasm/js/runtime.js index 16ef5d3aa..78fdcca18 100644 --- a/vendor/wasm/js/runtime.js +++ b/vendor/wasm/js/runtime.js @@ -1350,7 +1350,6 @@ function odinSetupDefaultImports(wasmMemoryInterface, consoleElement) { exp: Math.exp, ldexp: (x, exp) => x * Math.pow(2, exp), - rand: Math.random, rand_bytes: (ptr, len) => { const view = new Uint8Array(wasmMemoryInterface.memory.buffer, ptr, len) crypto.getRandomValues(view) From bc0fa1240ba9230d6ac5c99c77a509ce7e5cfb3e Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 27 Oct 2023 13:03:21 +0100 Subject: [PATCH 09/24] Disable using giant packed struct for type info table for the time being --- src/llvm_backend.cpp | 4 +- src/llvm_backend_const.cpp | 3 ++ src/llvm_backend_type.cpp | 95 ++++++++++++++++++++++---------------- 3 files changed, 62 insertions(+), 40 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 00c62f0f1..b2900b125 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -2247,7 +2247,9 @@ gb_internal bool lb_generate_code(lbGenerator *gen) { lb_add_entity(m, lb_global_type_info_data_entity, value); if (LB_USE_GIANT_PACKED_STRUCT) { - lb_make_global_private_const(g); + LLVMSetLinkage(g, LLVMPrivateLinkage); + LLVMSetUnnamedAddress(g, LLVMGlobalUnnamedAddr); + LLVMSetGlobalConstant(g, /*true*/false); } } { // Type info member buffer diff --git a/src/llvm_backend_const.cpp b/src/llvm_backend_const.cpp index a16b2293c..7584df3ee 100644 --- a/src/llvm_backend_const.cpp +++ b/src/llvm_backend_const.cpp @@ -94,6 +94,9 @@ gb_internal LLVMValueRef llvm_const_cast(LLVMValueRef val, LLVMTypeRef dst) { LLVMTypeKind kind = LLVMGetTypeKind(dst); switch (kind) { case LLVMPointerTypeKind: + if (LB_USE_NEW_PASS_SYSTEM) { + return val; + } return LLVMConstPointerCast(val, dst); case LLVMStructTypeKind: // GB_PANIC("%s -> %s", LLVMPrintValueToString(val), LLVMPrintTypeToString(dst)); diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index a78c0eacd..02dad2a3a 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -175,7 +175,8 @@ gb_internal lbValue lb_type_info_member_tags_offset(lbModule *m, isize count, i6 return offset; } -enum {LB_USE_GIANT_PACKED_STRUCT = LB_USE_NEW_PASS_SYSTEM}; +// enum {LB_USE_GIANT_PACKED_STRUCT = LB_USE_NEW_PASS_SYSTEM}; +enum {LB_USE_GIANT_PACKED_STRUCT = 0}; gb_internal LLVMTypeRef lb_setup_type_info_data_internal_type(lbModule *m, isize max_type_info_count) { if (!LB_USE_GIANT_PACKED_STRUCT) { @@ -269,7 +270,7 @@ gb_internal LLVMTypeRef lb_setup_type_info_data_internal_type(lbModule *m, isize return LLVMStructType(element_types, cast(unsigned)max_type_info_count, true); } -gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 global_type_info_data_entity_count) { // NOTE(bill): Setup type_info data +gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 global_type_info_data_entity_count, lbProcedure *p) { // NOTE(bill): Setup type_info data CheckerInfo *info = m->info; // Useful types @@ -286,7 +287,6 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl defer (gb_free(heap_allocator(), entries_handled.data)); entries_handled[0] = true; - LLVMValueRef giant_struct = lb_global_type_info_data_ptr(m).value; LLVMTypeRef giant_struct_type = LLVMGlobalGetValueType(giant_struct); GB_ASSERT(LLVMGetTypeKind(giant_struct_type) == LLVMStructTypeKind); @@ -320,6 +320,30 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl type_info_allocate_values(lb_global_type_info_member_usings); type_info_allocate_values(lb_global_type_info_member_tags); + + i64 const type_info_struct_size = type_size_of(t_type_info); + LLVMTypeRef llvm_u8 = lb_type(m, t_u8); + LLVMTypeRef llvm_int = lb_type(m, t_int); + // LLVMTypeRef llvm_type_info_ptr = lb_type(m, t_type_info_ptr); + + auto const get_type_info_ptr = [&](lbModule *m, Type *type) -> LLVMValueRef { + type = default_type(type); + + isize index = lb_type_info_index(m->info, type); + GB_ASSERT(index >= 0); + + u64 offset = cast(u64)(index * type_info_struct_size); + + LLVMValueRef indices[1] = { + LLVMConstInt(llvm_int, offset, false) + }; + + // LLVMValueRef ptr = LLVMConstInBoundsGEP2(llvm_u8, giant_struct, indices, gb_count_of(indices)); + LLVMValueRef ptr = LLVMConstGEP2(llvm_u8, giant_struct, indices, gb_count_of(indices)); + return ptr; + // return LLVMConstPointerCast(ptr, llvm_type_info_ptr); + }; + for_array(type_info_type_index, info->type_info_types) { Type *t = info->type_info_types[type_info_type_index]; if (t == nullptr || t == t_invalid) { @@ -394,7 +418,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl LLVMValueRef vals[4] = { lb_const_string(m, t->Named.type_name->token.string).value, - lb_type_info(m, t->Named.base).value, + get_type_info_ptr(m, t->Named.base), pkg_name, loc.value }; @@ -541,10 +565,8 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl case Type_Pointer: { tag_type = t_type_info_pointer; - lbValue gep = lb_type_info(m, t->Pointer.elem); - LLVMValueRef vals[1] = { - gep.value, + get_type_info_ptr(m, t->Pointer.elem), }; @@ -553,10 +575,9 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl } case Type_MultiPointer: { tag_type = t_type_info_multi_pointer; - lbValue gep = lb_type_info(m, t->MultiPointer.elem); LLVMValueRef vals[1] = { - gep.value, + get_type_info_ptr(m, t->MultiPointer.elem), }; variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); @@ -564,10 +585,9 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl } case Type_SoaPointer: { tag_type = t_type_info_soa_pointer; - lbValue gep = lb_type_info(m, t->SoaPointer.elem); LLVMValueRef vals[1] = { - gep.value, + get_type_info_ptr(m, t->SoaPointer.elem), }; variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); @@ -578,7 +598,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl i64 ez = type_size_of(t->Array.elem); LLVMValueRef vals[3] = { - lb_type_info(m, t->Array.elem).value, + get_type_info_ptr(m, t->Array.elem), lb_const_int(m, t_int, ez).value, lb_const_int(m, t_int, t->Array.count).value, }; @@ -590,8 +610,8 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl tag_type = t_type_info_enumerated_array; LLVMValueRef vals[7] = { - lb_type_info(m, t->EnumeratedArray.elem).value, - lb_type_info(m, t->EnumeratedArray.index).value, + get_type_info_ptr(m, t->EnumeratedArray.elem), + get_type_info_ptr(m, t->EnumeratedArray.index), lb_const_int(m, t_int, type_size_of(t->EnumeratedArray.elem)).value, lb_const_int(m, t_int, t->EnumeratedArray.count).value, @@ -609,7 +629,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl tag_type = t_type_info_dynamic_array; LLVMValueRef vals[2] = { - lb_type_info(m, t->DynamicArray.elem).value, + get_type_info_ptr(m, t->DynamicArray.elem), lb_const_int(m, t_int, type_size_of(t->DynamicArray.elem)).value, }; @@ -620,7 +640,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl tag_type = t_type_info_slice; LLVMValueRef vals[2] = { - lb_type_info(m, t->Slice.elem).value, + get_type_info_ptr(m, t->Slice.elem), lb_const_int(m, t_int, type_size_of(t->Slice.elem)).value, }; @@ -633,10 +653,10 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl LLVMValueRef params = LLVMConstNull(lb_type(m, t_type_info_ptr)); LLVMValueRef results = LLVMConstNull(lb_type(m, t_type_info_ptr)); if (t->Proc.params != nullptr) { - params = lb_type_info(m, t->Proc.params).value; + params = get_type_info_ptr(m, t->Proc.params); } if (t->Proc.results != nullptr) { - results = lb_type_info(m, t->Proc.results).value; + results = get_type_info_ptr(m, t->Proc.results); } LLVMValueRef vals[4] = { @@ -663,7 +683,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl lbValue index = lb_const_int(m, t_int, i); lbValue type_info = lb_const_ptr_offset(m, memory_types, index); - lb_global_type_info_member_types_values[type_offset+i] = lb_type_info(m, f->type).value; + lb_global_type_info_member_types_values[type_offset+i] = get_type_info_ptr(m, f->type); if (f->token.string.len > 0) { lb_global_type_info_member_names_values[name_offset+i] = lb_const_string(m, f->token.string).value; } @@ -692,7 +712,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl LLVMValueRef vals[3] = {}; - vals[0] = lb_type_info(m, t->Enum.base_type).value; + vals[0] = get_type_info_ptr(m, t->Enum.base_type); if (t->Enum.fields.count > 0) { auto fields = t->Enum.fields; lbValue name_array = lb_generate_global_array(m, t_string, fields.count, @@ -744,9 +764,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl for (isize variant_index = 0; variant_index < variant_count; variant_index++) { Type *vt = t->Union.variants[variant_index]; - lbValue tip = lb_type_info(m, vt); - - lb_global_type_info_member_types_values[variant_offset+variant_index] = lb_type_info(m, vt).value; + lb_global_type_info_member_types_values[variant_offset+variant_index] = get_type_info_ptr(m, vt); } lbValue count = lb_const_int(m, t_int, variant_count); @@ -756,7 +774,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl if (tag_size > 0) { i64 tag_offset = align_formula(t->Union.variant_block_size, tag_size); vals[1] = lb_const_int(m, t_uintptr, tag_offset).value; - vals[2] = lb_type_info(m, union_tag_type(t)).value; + vals[2] = get_type_info_ptr(m, union_tag_type(t)); } else { vals[1] = lb_const_int(m, t_uintptr, 0).value; vals[2] = LLVMConstNull(lb_type(m, t_type_info_ptr)); @@ -805,11 +823,11 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl Type *kind_type = get_struct_field_type(tag_type, 10); lbValue soa_kind = lb_const_value(m, kind_type, exact_value_i64(t->Struct.soa_kind)); - lbValue soa_type = lb_type_info(m, t->Struct.soa_elem); + LLVMValueRef soa_type = get_type_info_ptr(m, t->Struct.soa_elem); lbValue soa_len = lb_const_int(m, t_int, t->Struct.soa_count); vals[10] = soa_kind.value; - vals[11] = soa_type.value; + vals[11] = soa_type; vals[12] = soa_len.value; } } @@ -831,7 +849,6 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl type_set_offsets(t); // NOTE(bill): Just incase the offsets have not been set yet for (isize source_index = 0; source_index < count; source_index++) { Entity *f = t->Struct.fields[source_index]; - lbValue tip = lb_type_info(m, f->type); i64 foffset = 0; if (!t->Struct.is_raw_union) { GB_ASSERT(t->Struct.offsets != nullptr); @@ -841,7 +858,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl GB_ASSERT(f->kind == Entity_Variable && f->flags & EntityFlag_Field); - lb_global_type_info_member_types_values[types_offset+source_index] = lb_type_info(m, f->type).value; + lb_global_type_info_member_types_values[types_offset+source_index] = get_type_info_ptr(m, f->type); lb_global_type_info_member_offsets_values[offsets_offset+source_index] = lb_const_int(m, t_uintptr, foffset).value; lb_global_type_info_member_usings_values[usings_offset+source_index] = lb_const_bool(m, t_bool, (f->flags&EntityFlag_Using) != 0).value; @@ -880,8 +897,8 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl init_map_internal_types(t); LLVMValueRef vals[3] = { - lb_type_info(m, t->Map.key).value, - lb_type_info(m, t->Map.value).value, + get_type_info_ptr(m, t->Map.key), + get_type_info_ptr(m, t->Map.value), lb_gen_map_info_ptr(m, t).value }; @@ -897,13 +914,13 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl LLVMValueRef vals[4] = { - lb_type_info(m, t->BitSet.elem).value, + get_type_info_ptr(m, t->BitSet.elem), LLVMConstNull(lb_type(m, t_type_info_ptr)), lb_const_int(m, t_i64, t->BitSet.lower).value, lb_const_int(m, t_i64, t->BitSet.upper).value, }; if (t->BitSet.underlying != nullptr) { - vals[1] = lb_type_info(m, t->BitSet.underlying).value; + vals[1] = get_type_info_ptr(m, t->BitSet.underlying); } variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); @@ -916,7 +933,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl LLVMValueRef vals[3] = {}; - vals[0] = lb_type_info(m, t->SimdVector.elem).value; + vals[0] = get_type_info_ptr(m, t->SimdVector.elem); vals[1] = lb_const_int(m, t_int, type_size_of(t->SimdVector.elem)).value; vals[2] = lb_const_int(m, t_int, t->SimdVector.count).value; @@ -928,8 +945,8 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl { tag_type = t_type_info_relative_pointer; LLVMValueRef vals[2] = { - lb_type_info(m, t->RelativePointer.pointer_type).value, - lb_type_info(m, t->RelativePointer.base_integer).value, + get_type_info_ptr(m, t->RelativePointer.pointer_type), + get_type_info_ptr(m, t->RelativePointer.base_integer), }; variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); @@ -940,8 +957,8 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl { tag_type = t_type_info_relative_multi_pointer; LLVMValueRef vals[2] = { - lb_type_info(m, t->RelativeMultiPointer.pointer_type).value, - lb_type_info(m, t->RelativeMultiPointer.base_integer).value, + get_type_info_ptr(m, t->RelativeMultiPointer.pointer_type), + get_type_info_ptr(m, t->RelativeMultiPointer.base_integer), }; variant_value = llvm_const_named_struct(m, tag_type, vals, gb_count_of(vals)); @@ -954,7 +971,7 @@ gb_internal void lb_setup_type_info_data_giant_packed_struct(lbModule *m, i64 gl i64 ez = type_size_of(t->Matrix.elem); LLVMValueRef vals[5] = { - lb_type_info(m, t->Matrix.elem).value, + get_type_info_ptr(m, t->Matrix.elem), lb_const_int(m, t_int, ez).value, lb_const_int(m, t_int, matrix_type_stride_in_elems(t)).value, lb_const_int(m, t_int, t->Matrix.row_count).value, @@ -1037,7 +1054,7 @@ gb_internal void lb_setup_type_info_data(lbProcedure *p) { // NOTE(bill): Setup } if (LB_USE_GIANT_PACKED_STRUCT) { - lb_setup_type_info_data_giant_packed_struct(m, global_type_info_data_entity_count); + lb_setup_type_info_data_giant_packed_struct(m, global_type_info_data_entity_count, p); return; } From c8a5bafc6b794c75cd89efca86e51106fac15837 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 27 Oct 2023 14:53:48 +0100 Subject: [PATCH 10/24] Fix static map calls and default to them! --- src/build_settings.cpp | 2 +- src/llvm_backend.cpp | 32 ++++++++++++++++++++++++++------ 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d734073c0..1852013d5 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1389,7 +1389,7 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta bc->optimization_level = gb_clamp(bc->optimization_level, -1, 3); // ENFORCE DYNAMIC MAP CALLS - bc->dynamic_map_calls = true; + // bc->dynamic_map_calls = false; bc->ODIN_VALGRIND_SUPPORT = false; if (build_context.metrics.os != TargetOs_windows) { diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index b2900b125..8f5d8966d 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -692,7 +692,7 @@ gb_internal lbValue lb_map_set_proc_for_type(lbModule *m, Type *type) { } lbValue map_ptr = {LLVMGetParam(p->value, 0), t_rawptr}; - lbValue hash = {LLVMGetParam(p->value, 1), t_uintptr}; + lbValue hash_param = {LLVMGetParam(p->value, 1), t_uintptr}; lbValue key_ptr = {LLVMGetParam(p->value, 2), t_rawptr}; lbValue value_ptr = {LLVMGetParam(p->value, 3), t_rawptr}; lbValue location_ptr = {LLVMGetParam(p->value, 4), t_source_code_location_ptr}; @@ -700,6 +700,12 @@ gb_internal lbValue lb_map_set_proc_for_type(lbModule *m, Type *type) { map_ptr = lb_emit_conv(p, map_ptr, alloc_type_pointer(type)); key_ptr = lb_emit_conv(p, key_ptr, alloc_type_pointer(type->Map.key)); + LLVM_SET_VALUE_NAME(map_ptr.value, "map_ptr"); + LLVM_SET_VALUE_NAME(hash_param.value, "hash_param"); + LLVM_SET_VALUE_NAME(key_ptr.value, "key_ptr"); + LLVM_SET_VALUE_NAME(value_ptr.value, "value_ptr"); + LLVM_SET_VALUE_NAME(location_ptr.value, "location"); + lb_add_proc_attribute_at_index(p, 1+0, "nonnull"); lb_add_proc_attribute_at_index(p, 1+0, "noalias"); @@ -719,6 +725,10 @@ gb_internal lbValue lb_map_set_proc_for_type(lbModule *m, Type *type) { lb_add_proc_attribute_at_index(p, 1+4, "noalias"); lb_add_proc_attribute_at_index(p, 1+4, "readonly"); + lbAddr hash_addr = lb_add_local_generated(p, t_uintptr, false); + lb_addr_store(p, hash_addr, hash_param); + LLVM_SET_VALUE_NAME(hash_addr.addr.value, "hash"); + //// lbValue found_ptr = {}; { @@ -726,17 +736,19 @@ gb_internal lbValue lb_map_set_proc_for_type(lbModule *m, Type *type) { auto args = array_make(temporary_allocator(), 3); args[0] = lb_emit_conv(p, map_ptr, t_rawptr); - args[1] = hash; + args[1] = lb_addr_load(p, hash_addr); args[2] = key_ptr; found_ptr = lb_emit_call(p, map_get_proc, args); } + LLVM_SET_VALUE_NAME(found_ptr.value, "found_ptr"); lbBlock *found_block = lb_create_block(p, "found"); lbBlock *check_grow_block = lb_create_block(p, "check-grow"); lbBlock *grow_fail_block = lb_create_block(p, "grow-fail"); lbBlock *insert_block = lb_create_block(p, "insert"); + lbBlock *check_has_grown_block = lb_create_block(p, "check-has-grown"); lbBlock *rehash_block = lb_create_block(p, "rehash"); lb_emit_if(p, lb_emit_comp_against_nil(p, Token_NotEq, found_ptr), found_block, check_grow_block); @@ -749,6 +761,7 @@ gb_internal lbValue lb_map_set_proc_for_type(lbModule *m, Type *type) { lbValue map_info = lb_gen_map_info_ptr(p->module, type); + LLVM_SET_VALUE_NAME(map_info.value, "map_info"); { auto args = array_make(temporary_allocator(), 3); @@ -758,16 +771,23 @@ gb_internal lbValue lb_map_set_proc_for_type(lbModule *m, Type *type) { lbValue grow_err_and_has_grown = lb_emit_runtime_call(p, "__dynamic_map_check_grow", args); lbValue grow_err = lb_emit_struct_ev(p, grow_err_and_has_grown, 0); lbValue has_grown = lb_emit_struct_ev(p, grow_err_and_has_grown, 1); + LLVM_SET_VALUE_NAME(grow_err.value, "grow_err"); + LLVM_SET_VALUE_NAME(has_grown.value, "has_grown"); - lb_emit_if(p, lb_emit_comp_against_nil(p, Token_NotEq, grow_err), grow_fail_block, insert_block); + lb_emit_if(p, lb_emit_comp_against_nil(p, Token_NotEq, grow_err), grow_fail_block, check_has_grown_block); lb_start_block(p, grow_fail_block); LLVMBuildRet(p->builder, LLVMConstNull(lb_type(m, t_rawptr))); - lb_emit_if(p, has_grown, grow_fail_block, rehash_block); + lb_start_block(p, check_has_grown_block); + + lb_emit_if(p, has_grown, rehash_block, insert_block); lb_start_block(p, rehash_block); lbValue key = lb_emit_load(p, key_ptr); - hash = lb_gen_map_key_hash(p, map_ptr, key, nullptr); + lbValue new_hash = lb_gen_map_key_hash(p, map_ptr, key, nullptr); + LLVM_SET_VALUE_NAME(new_hash.value, "new_hash"); + lb_addr_store(p, hash_addr, new_hash); + lb_emit_jump(p, insert_block); } lb_start_block(p, insert_block); @@ -775,7 +795,7 @@ gb_internal lbValue lb_map_set_proc_for_type(lbModule *m, Type *type) { auto args = array_make(temporary_allocator(), 5); args[0] = lb_emit_conv(p, map_ptr, t_rawptr); args[1] = map_info; - args[2] = hash; + args[2] = lb_addr_load(p, hash_addr); args[3] = lb_emit_conv(p, key_ptr, t_uintptr); args[4] = lb_emit_conv(p, value_ptr, t_uintptr); From 034aead9301305d41756ef3b5b9b60a88c95d825 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 27 Oct 2023 14:55:54 +0100 Subject: [PATCH 11/24] Only make static map get calls inlineable outside of debug builds --- src/llvm_backend.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 8f5d8966d..716c50837 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -506,9 +506,9 @@ gb_internal lbValue lb_map_get_proc_for_type(lbModule *m, Type *type) { LLVMSetLinkage(p->value, LLVMInternalLinkage); lb_add_attribute_to_proc(m, p->value, "nounwind"); - // if (build_context.ODIN_DEBUG) { + if (build_context.ODIN_DEBUG) { lb_add_attribute_to_proc(m, p->value, "noinline"); - // } + } LLVMValueRef x = LLVMGetParam(p->value, 0); LLVMValueRef y = LLVMGetParam(p->value, 1); From 70bd4a5ab6724b6f6a61e749088eba84bfdad71b Mon Sep 17 00:00:00 2001 From: flysand7 Date: Sun, 29 Oct 2023 15:03:48 +1100 Subject: [PATCH 12/24] Only build vendor:darwin on darwin --- vendor/darwin/CoreVideo/CVDisplayLink.odin | 1 + vendor/darwin/Foundation/NSApplication.odin | 1 + vendor/darwin/Foundation/NSArray.odin | 1 + vendor/darwin/Foundation/NSAutoreleasePool.odin | 1 + vendor/darwin/Foundation/NSBlock.odin | 1 + vendor/darwin/Foundation/NSBundle.odin | 1 + vendor/darwin/Foundation/NSColor.odin | 1 + vendor/darwin/Foundation/NSData.odin | 1 + vendor/darwin/Foundation/NSDate.odin | 1 + vendor/darwin/Foundation/NSDictionary.odin | 1 + vendor/darwin/Foundation/NSEnumerator.odin | 1 + vendor/darwin/Foundation/NSError.odin | 1 + vendor/darwin/Foundation/NSEvent.odin | 1 + vendor/darwin/Foundation/NSLock.odin | 1 + vendor/darwin/Foundation/NSMenu.odin | 1 + vendor/darwin/Foundation/NSNotification.odin | 1 + vendor/darwin/Foundation/NSNumber.odin | 1 + vendor/darwin/Foundation/NSObject.odin | 1 + vendor/darwin/Foundation/NSOpenPanel.odin | 1 + vendor/darwin/Foundation/NSPanel.odin | 1 + vendor/darwin/Foundation/NSPasteboard.odin | 1 + vendor/darwin/Foundation/NSRange.odin | 1 + vendor/darwin/Foundation/NSSavePanel.odin | 1 + vendor/darwin/Foundation/NSScreen.odin | 1 + vendor/darwin/Foundation/NSSet.odin | 1 + vendor/darwin/Foundation/NSString.odin | 1 + vendor/darwin/Foundation/NSTypes.odin | 1 + vendor/darwin/Foundation/NSURL.odin | 1 + vendor/darwin/Foundation/NSUndoManager.odin | 1 + vendor/darwin/Foundation/NSUserActivity.odin | 1 + vendor/darwin/Foundation/NSUserDefaults.odin | 1 + vendor/darwin/Foundation/NSWindow.odin | 1 + vendor/darwin/Foundation/objc.odin | 1 + vendor/darwin/Metal/MetalClasses.odin | 1 + vendor/darwin/Metal/MetalEnums.odin | 1 + vendor/darwin/Metal/MetalErrors.odin | 1 + vendor/darwin/Metal/MetalProcedures.odin | 1 + vendor/darwin/Metal/MetalTypes.odin | 1 + vendor/darwin/MetalKit/MetalKit.odin | 1 + vendor/darwin/QuartzCore/QuartzCore.odin | 1 + 40 files changed, 40 insertions(+) diff --git a/vendor/darwin/CoreVideo/CVDisplayLink.odin b/vendor/darwin/CoreVideo/CVDisplayLink.odin index fae988e0a..980a44803 100644 --- a/vendor/darwin/CoreVideo/CVDisplayLink.odin +++ b/vendor/darwin/CoreVideo/CVDisplayLink.odin @@ -1,3 +1,4 @@ +//+build darwin package CoreVideo DisplayLinkRef :: distinct rawptr diff --git a/vendor/darwin/Foundation/NSApplication.odin b/vendor/darwin/Foundation/NSApplication.odin index 3fa0d28b6..7b89d84b0 100644 --- a/vendor/darwin/Foundation/NSApplication.odin +++ b/vendor/darwin/Foundation/NSApplication.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation foreign import "system:Foundation.framework" diff --git a/vendor/darwin/Foundation/NSArray.odin b/vendor/darwin/Foundation/NSArray.odin index 3e6520c0d..ac4aa6181 100644 --- a/vendor/darwin/Foundation/NSArray.odin +++ b/vendor/darwin/Foundation/NSArray.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation import "core:intrinsics" diff --git a/vendor/darwin/Foundation/NSAutoreleasePool.odin b/vendor/darwin/Foundation/NSAutoreleasePool.odin index 8eb3657b6..d3a6f490f 100644 --- a/vendor/darwin/Foundation/NSAutoreleasePool.odin +++ b/vendor/darwin/Foundation/NSAutoreleasePool.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSAutoreleasePool") diff --git a/vendor/darwin/Foundation/NSBlock.odin b/vendor/darwin/Foundation/NSBlock.odin index ecb31bcfb..29bd210de 100644 --- a/vendor/darwin/Foundation/NSBlock.odin +++ b/vendor/darwin/Foundation/NSBlock.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation import "core:intrinsics" diff --git a/vendor/darwin/Foundation/NSBundle.odin b/vendor/darwin/Foundation/NSBundle.odin index 25fc8df32..450a6d951 100644 --- a/vendor/darwin/Foundation/NSBundle.odin +++ b/vendor/darwin/Foundation/NSBundle.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSBundle") diff --git a/vendor/darwin/Foundation/NSColor.odin b/vendor/darwin/Foundation/NSColor.odin index 453b33144..4c0325c1a 100644 --- a/vendor/darwin/Foundation/NSColor.odin +++ b/vendor/darwin/Foundation/NSColor.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSColorSpace") diff --git a/vendor/darwin/Foundation/NSData.odin b/vendor/darwin/Foundation/NSData.odin index 04c1ce25d..069a59b64 100644 --- a/vendor/darwin/Foundation/NSData.odin +++ b/vendor/darwin/Foundation/NSData.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSData") diff --git a/vendor/darwin/Foundation/NSDate.odin b/vendor/darwin/Foundation/NSDate.odin index f8096c698..e4564e06b 100644 --- a/vendor/darwin/Foundation/NSDate.odin +++ b/vendor/darwin/Foundation/NSDate.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSDate") diff --git a/vendor/darwin/Foundation/NSDictionary.odin b/vendor/darwin/Foundation/NSDictionary.odin index 8af58cf62..f84954656 100644 --- a/vendor/darwin/Foundation/NSDictionary.odin +++ b/vendor/darwin/Foundation/NSDictionary.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSDictionary") diff --git a/vendor/darwin/Foundation/NSEnumerator.odin b/vendor/darwin/Foundation/NSEnumerator.odin index 555e58141..717e58e4c 100644 --- a/vendor/darwin/Foundation/NSEnumerator.odin +++ b/vendor/darwin/Foundation/NSEnumerator.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation import "core:c" diff --git a/vendor/darwin/Foundation/NSError.odin b/vendor/darwin/Foundation/NSError.odin index 1657befe2..77b556e91 100644 --- a/vendor/darwin/Foundation/NSError.odin +++ b/vendor/darwin/Foundation/NSError.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation foreign import "system:Foundation.framework" diff --git a/vendor/darwin/Foundation/NSEvent.odin b/vendor/darwin/Foundation/NSEvent.odin index b9f247230..fa66c7fa6 100644 --- a/vendor/darwin/Foundation/NSEvent.odin +++ b/vendor/darwin/Foundation/NSEvent.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSEvent") diff --git a/vendor/darwin/Foundation/NSLock.odin b/vendor/darwin/Foundation/NSLock.odin index 168380669..d9662968d 100644 --- a/vendor/darwin/Foundation/NSLock.odin +++ b/vendor/darwin/Foundation/NSLock.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation Locking :: struct($T: typeid) {using _: Object} diff --git a/vendor/darwin/Foundation/NSMenu.odin b/vendor/darwin/Foundation/NSMenu.odin index 6ed9b9918..5a4f7b1f5 100644 --- a/vendor/darwin/Foundation/NSMenu.odin +++ b/vendor/darwin/Foundation/NSMenu.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation import "core:builtin" diff --git a/vendor/darwin/Foundation/NSNotification.odin b/vendor/darwin/Foundation/NSNotification.odin index f766d0cab..d319395a5 100644 --- a/vendor/darwin/Foundation/NSNotification.odin +++ b/vendor/darwin/Foundation/NSNotification.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSNotification") diff --git a/vendor/darwin/Foundation/NSNumber.odin b/vendor/darwin/Foundation/NSNumber.odin index b3124885f..a2d3c2d16 100644 --- a/vendor/darwin/Foundation/NSNumber.odin +++ b/vendor/darwin/Foundation/NSNumber.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation import "core:c" diff --git a/vendor/darwin/Foundation/NSObject.odin b/vendor/darwin/Foundation/NSObject.odin index fdcf05880..7c529aa09 100644 --- a/vendor/darwin/Foundation/NSObject.odin +++ b/vendor/darwin/Foundation/NSObject.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation import "core:intrinsics" diff --git a/vendor/darwin/Foundation/NSOpenPanel.odin b/vendor/darwin/Foundation/NSOpenPanel.odin index ac5f9674e..6b5dc0b6b 100644 --- a/vendor/darwin/Foundation/NSOpenPanel.odin +++ b/vendor/darwin/Foundation/NSOpenPanel.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSOpenPanel") diff --git a/vendor/darwin/Foundation/NSPanel.odin b/vendor/darwin/Foundation/NSPanel.odin index 4bdf08cdb..b18ebc81e 100644 --- a/vendor/darwin/Foundation/NSPanel.odin +++ b/vendor/darwin/Foundation/NSPanel.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation ModalResponse :: enum UInteger { diff --git a/vendor/darwin/Foundation/NSPasteboard.odin b/vendor/darwin/Foundation/NSPasteboard.odin index 74cf7d172..a1e23d977 100644 --- a/vendor/darwin/Foundation/NSPasteboard.odin +++ b/vendor/darwin/Foundation/NSPasteboard.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSPasteboard") diff --git a/vendor/darwin/Foundation/NSRange.odin b/vendor/darwin/Foundation/NSRange.odin index dcb100e91..b23b170ed 100644 --- a/vendor/darwin/Foundation/NSRange.odin +++ b/vendor/darwin/Foundation/NSRange.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation Range :: struct { diff --git a/vendor/darwin/Foundation/NSSavePanel.odin b/vendor/darwin/Foundation/NSSavePanel.odin index 8e4d7a07b..b749cde53 100644 --- a/vendor/darwin/Foundation/NSSavePanel.odin +++ b/vendor/darwin/Foundation/NSSavePanel.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSSavePanel") diff --git a/vendor/darwin/Foundation/NSScreen.odin b/vendor/darwin/Foundation/NSScreen.odin index a8fe44aa5..70270f680 100644 --- a/vendor/darwin/Foundation/NSScreen.odin +++ b/vendor/darwin/Foundation/NSScreen.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSScreen") diff --git a/vendor/darwin/Foundation/NSSet.odin b/vendor/darwin/Foundation/NSSet.odin index 7fb8db6c2..173c11f04 100644 --- a/vendor/darwin/Foundation/NSSet.odin +++ b/vendor/darwin/Foundation/NSSet.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSSet") diff --git a/vendor/darwin/Foundation/NSString.odin b/vendor/darwin/Foundation/NSString.odin index d3c6c454d..ba8f57129 100644 --- a/vendor/darwin/Foundation/NSString.odin +++ b/vendor/darwin/Foundation/NSString.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation foreign import "system:Foundation.framework" diff --git a/vendor/darwin/Foundation/NSTypes.odin b/vendor/darwin/Foundation/NSTypes.odin index 671832a2d..78c62e6c1 100644 --- a/vendor/darwin/Foundation/NSTypes.odin +++ b/vendor/darwin/Foundation/NSTypes.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation import "core:intrinsics" diff --git a/vendor/darwin/Foundation/NSURL.odin b/vendor/darwin/Foundation/NSURL.odin index 9e9081219..ab8454f56 100644 --- a/vendor/darwin/Foundation/NSURL.odin +++ b/vendor/darwin/Foundation/NSURL.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSURL") diff --git a/vendor/darwin/Foundation/NSUndoManager.odin b/vendor/darwin/Foundation/NSUndoManager.odin index 16411dcb4..4a19ac254 100644 --- a/vendor/darwin/Foundation/NSUndoManager.odin +++ b/vendor/darwin/Foundation/NSUndoManager.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSUndoManager") diff --git a/vendor/darwin/Foundation/NSUserActivity.odin b/vendor/darwin/Foundation/NSUserActivity.odin index 3b2f956ee..2540d0deb 100644 --- a/vendor/darwin/Foundation/NSUserActivity.odin +++ b/vendor/darwin/Foundation/NSUserActivity.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSUserActivity") diff --git a/vendor/darwin/Foundation/NSUserDefaults.odin b/vendor/darwin/Foundation/NSUserDefaults.odin index a8a6d7545..df7bb487a 100644 --- a/vendor/darwin/Foundation/NSUserDefaults.odin +++ b/vendor/darwin/Foundation/NSUserDefaults.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation @(objc_class="NSUserDefaults") diff --git a/vendor/darwin/Foundation/NSWindow.odin b/vendor/darwin/Foundation/NSWindow.odin index 16dd5afc3..48c972d8e 100644 --- a/vendor/darwin/Foundation/NSWindow.odin +++ b/vendor/darwin/Foundation/NSWindow.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation import "core:strings" diff --git a/vendor/darwin/Foundation/objc.odin b/vendor/darwin/Foundation/objc.odin index 6469b1d1d..3c25e6669 100644 --- a/vendor/darwin/Foundation/objc.odin +++ b/vendor/darwin/Foundation/objc.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Foundation foreign import "system:Foundation.framework" diff --git a/vendor/darwin/Metal/MetalClasses.odin b/vendor/darwin/Metal/MetalClasses.odin index 17f22e1d3..c79bba702 100644 --- a/vendor/darwin/Metal/MetalClasses.odin +++ b/vendor/darwin/Metal/MetalClasses.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Metal import NS "vendor:darwin/Foundation" diff --git a/vendor/darwin/Metal/MetalEnums.odin b/vendor/darwin/Metal/MetalEnums.odin index ab4782da4..c5c992006 100644 --- a/vendor/darwin/Metal/MetalEnums.odin +++ b/vendor/darwin/Metal/MetalEnums.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Metal import NS "vendor:darwin/Foundation" diff --git a/vendor/darwin/Metal/MetalErrors.odin b/vendor/darwin/Metal/MetalErrors.odin index 8bc851e33..dd6531a1c 100644 --- a/vendor/darwin/Metal/MetalErrors.odin +++ b/vendor/darwin/Metal/MetalErrors.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Metal import NS "vendor:darwin/Foundation" diff --git a/vendor/darwin/Metal/MetalProcedures.odin b/vendor/darwin/Metal/MetalProcedures.odin index dd90bd3e9..7d64e4028 100644 --- a/vendor/darwin/Metal/MetalProcedures.odin +++ b/vendor/darwin/Metal/MetalProcedures.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Metal import NS "vendor:darwin/Foundation" diff --git a/vendor/darwin/Metal/MetalTypes.odin b/vendor/darwin/Metal/MetalTypes.odin index b14fe2886..9d37a976e 100644 --- a/vendor/darwin/Metal/MetalTypes.odin +++ b/vendor/darwin/Metal/MetalTypes.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_Metal import NS "vendor:darwin/Foundation" diff --git a/vendor/darwin/MetalKit/MetalKit.odin b/vendor/darwin/MetalKit/MetalKit.odin index eb09410d1..218986ddc 100644 --- a/vendor/darwin/MetalKit/MetalKit.odin +++ b/vendor/darwin/MetalKit/MetalKit.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_MetalKit import NS "vendor:darwin/Foundation" diff --git a/vendor/darwin/QuartzCore/QuartzCore.odin b/vendor/darwin/QuartzCore/QuartzCore.odin index 93998d95d..258395343 100644 --- a/vendor/darwin/QuartzCore/QuartzCore.odin +++ b/vendor/darwin/QuartzCore/QuartzCore.odin @@ -1,3 +1,4 @@ +//+build darwin package objc_QuartzCore import NS "vendor:darwin/Foundation" From a3a3156ddd8a0102bea7d718238a18ae8e1a83b2 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Mon, 30 Oct 2023 02:03:24 +1100 Subject: [PATCH 13/24] Fix-up inline asm for i386 syscalls emit --- src/llvm_backend_proc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index ba920c042..f64cbd52a 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -2769,7 +2769,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu { GB_ASSERT(arg_count <= 7); - char asm_string_default[] = "int $0x80"; + char asm_string_default[] = "int $$0x80"; char *asm_string = asm_string_default; gbString constraints = gb_string_make(heap_allocator(), "={eax}"); From 1d9f6346d47957d762887cceca37851f84eabeeb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 29 Oct 2023 17:23:24 +0000 Subject: [PATCH 14/24] Force dynamic map calls on non-windows targets --- src/build_settings.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 1852013d5..ffb276d1e 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1388,8 +1388,10 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta bc->optimization_level = gb_clamp(bc->optimization_level, -1, 3); - // ENFORCE DYNAMIC MAP CALLS - // bc->dynamic_map_calls = false; + if (bc->metrics.os != TargetOs_windows) { + // ENFORCE DYNAMIC MAP CALLS + bc->dynamic_map_calls = true; + } bc->ODIN_VALGRIND_SUPPORT = false; if (build_context.metrics.os != TargetOs_windows) { From ed7c9ec61929cbb7e4a112176c12a0c3fbeeb782 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 29 Oct 2023 20:13:03 +0000 Subject: [PATCH 15/24] Test: use custom passes for -o:speed --- src/llvm_backend.cpp | 123 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 716c50837..d65a28e23 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1494,7 +1494,115 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) { array_add(&passes, "default"); break; case 2: - array_add(&passes, "default"); + // array_add(&passes, "default"); + array_add(&passes, u8R"( + +annotation2metadata, +forceattrs, +inferattrs, + + +function( + lower-expect, + simplifycfg, + sroa, + early-cse<> +), + +called-value-propagation, +globalopt, +function( + mem2reg, + simplifycfg +), +require, +function( + invalidate +), +require, +cgscc( + devirt<4>( + inline, + inline, + function-attrs, + function( + sroa, + early-cse, + speculative-execution, + jump-threading, + simplifycfg, + constraint-elimination, + libcalls-shrinkwrap, + tailcallelim, + simplifycfg, + loop-mssa( + loop-instsimplify, + loop-simplifycfg, + licm, + loop-rotate, + licm, + simple-loop-unswitch + ), + simplifycfg, + sroa, + vector-combine, + mldst-motion, + gvn<>, + bdce, + jump-threading, + adce, + memcpyopt, + dse, + move-auto-init, + simplifycfg + ), + function-attrs, + function( + require + ) + ) +), + + +deadargelim, +globalopt, +globaldce, +elim-avail-extern, +rpo-function-attrs, +recompute-globalsaa, +function( + float2int, + lower-constant-intrinsics, + loop( + loop-rotate, + loop-deletion + ), + loop-distribute, + inject-tli-mappings, + loop-load-elim, + slp-vectorizer, + vector-combine, + transform-warning, + sroa, + alignment-from-assumptions, + loop-sink, + instsimplify, + div-rem-pairs, + tailcallelim, + simplifycfg +), +globaldce, +constmerge, +cg-profile, +rel-lookup-table-converter, + +function( + annotation-remarks +), +verify + + +)"); break; case 3: array_add(&passes, "default"); @@ -1528,6 +1636,19 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) { } passes_str = gb_string_appendc(passes_str, passes[i]); } + for (isize i = 0; i < gb_string_length(passes_str); /**/) { + switch (passes_str[i]) { + case ' ': + case '\n': + case '\t': + gb_memmove(&passes_str[i], &passes_str[i+1], gb_string_length(passes_str)-i); + GB_STRING_HEADER(passes_str)->length -= 1; + continue; + default: + i += 1; + break; + } + } LLVMErrorRef llvm_err = LLVMRunPasses(wd->m->mod, passes_str, wd->target_machine, pb_options); From fc06d7011dd107b074d05efb202c4fb9a08e5a8a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 29 Oct 2023 20:31:53 +0000 Subject: [PATCH 16/24] Use default passes without coro, openmp, and sroa passes --- src/llvm_backend.cpp | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index d65a28e23..ae6f8ddcd 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1500,19 +1500,17 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) { annotation2metadata, forceattrs, inferattrs, - - function( lower-expect, simplifycfg, - sroa, early-cse<> ), - +ipsccp, called-value-propagation, globalopt, function( mem2reg, + instcombine, simplifycfg ), require, @@ -1526,15 +1524,18 @@ cgscc( inline, function-attrs, function( - sroa, early-cse, speculative-execution, jump-threading, + correlated-propagation, simplifycfg, + instcombine, + aggressive-instcombine, constraint-elimination, libcalls-shrinkwrap, tailcallelim, simplifycfg, + reassociate, loop-mssa( loop-instsimplify, loop-simplifycfg, @@ -1544,26 +1545,37 @@ cgscc( simple-loop-unswitch ), simplifycfg, - sroa, + instcombine, + loop( + loop-idiom, + indvars, + loop-deletion, + loop-unroll-full + ), vector-combine, mldst-motion, gvn<>, + sccp, bdce, + instcombine, jump-threading, + correlated-propagation, adce, memcpyopt, dse, move-auto-init, - simplifycfg + loop-mssa( + licm + ), + simplifycfg, + instcombine ), function-attrs, function( require - ) + ), ) ), - - deadargelim, globalopt, globaldce, @@ -1579,11 +1591,19 @@ function( ), loop-distribute, inject-tli-mappings, + loop-vectorize, loop-load-elim, + instcombine, + simplifycfg, slp-vectorizer, vector-combine, + instcombine, + loop-unroll, transform-warning, - sroa, + instcombine, + loop-mssa( + licm + ), alignment-from-assumptions, loop-sink, instsimplify, @@ -1595,7 +1615,6 @@ globaldce, constmerge, cg-profile, rel-lookup-table-converter, - function( annotation-remarks ), From f54a026accb34a22680256cdfdf9e366daff28b2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 29 Oct 2023 20:33:29 +0000 Subject: [PATCH 17/24] Remove trailing comma --- src/llvm_backend.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index ae6f8ddcd..ed16a3aaf 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1573,7 +1573,7 @@ cgscc( function-attrs, function( require - ), + ) ) ), deadargelim, From d589914956fa6afb150e5ddbf52fc697e50df814 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 29 Oct 2023 20:43:02 +0000 Subject: [PATCH 18/24] Ignore `store undef` calls --- src/llvm_backend_general.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp index 0f0df7ca5..fdcf94f29 100644 --- a/src/llvm_backend_general.cpp +++ b/src/llvm_backend_general.cpp @@ -962,8 +962,12 @@ gb_internal bool lb_is_type_proc_recursive(Type *t) { gb_internal void lb_emit_store(lbProcedure *p, lbValue ptr, lbValue value) { GB_ASSERT(value.value != nullptr); - Type *a = type_deref(ptr.type); + if (LLVMIsUndef(value.value)) { + return; + } + + Type *a = type_deref(ptr.type); if (LLVMIsNull(value.value)) { LLVMTypeRef src_t = llvm_addr_type(p->module, ptr); if (is_type_proc(a)) { From 61ad2a1345a3c8a9a8f84491043b5509de460976 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 29 Oct 2023 20:45:19 +0000 Subject: [PATCH 19/24] TEST: Add sroa passes back --- src/llvm_backend.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index ed16a3aaf..a81fbdd37 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1503,6 +1503,7 @@ inferattrs, function( lower-expect, simplifycfg, + sroa, early-cse<> ), ipsccp, @@ -1524,6 +1525,7 @@ cgscc( inline, function-attrs, function( + sroa, early-cse, speculative-execution, jump-threading, @@ -1552,6 +1554,7 @@ cgscc( loop-deletion, loop-unroll-full ), + sroa, vector-combine, mldst-motion, gvn<>, @@ -1600,6 +1603,7 @@ function( instcombine, loop-unroll, transform-warning, + sroa, instcombine, loop-mssa( licm @@ -1620,7 +1624,6 @@ function( ), verify - )"); break; case 3: From 3bd1918c5e2f49ad938aa0a9244e596a4340a4ae Mon Sep 17 00:00:00 2001 From: Jesse Stiller Date: Mon, 30 Oct 2023 11:57:44 +1000 Subject: [PATCH 20/24] Fixed typo "fot" and clarified slashpath.ext --- core/path/slashpath/path.odin | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/path/slashpath/path.odin b/core/path/slashpath/path.odin index 5f5ab2ae9..ada473c34 100644 --- a/core/path/slashpath/path.odin +++ b/core/path/slashpath/path.odin @@ -159,9 +159,9 @@ join :: proc(elems: []string, allocator := context.allocator) -> string { return "" } -// ext returns the file name extension used by "path" -// The extension is the suffix beginning at the file fot in the last slash separated element of "path" -// The path is empty if there is no dot +// ext returns the file name extension used by "path". +// The extension is the suffix beginning at the dot character in the last slash separated element of "path". +// The path is empty if there is no dot character. ext :: proc(path: string, new := false, allocator := context.allocator) -> string { for i := len(path)-1; i >= 0 && !is_separator(path[i]); i -= 1 { if path[i] == '.' { From 1577d60d023b9f989a658bf92fbacf7f4bfc4a90 Mon Sep 17 00:00:00 2001 From: flysand7 Date: Mon, 30 Oct 2023 20:05:58 +1100 Subject: [PATCH 21/24] move darwin-specific packages in all_vendor_darwin.odin --- examples/all/all_vendor.odin | 10 ---------- examples/all/all_vendor_darwin.odin | 12 ++++++++++++ 2 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 examples/all/all_vendor_darwin.odin diff --git a/examples/all/all_vendor.odin b/examples/all/all_vendor.odin index fa1e8d995..6864a7be2 100644 --- a/examples/all/all_vendor.odin +++ b/examples/all/all_vendor.odin @@ -39,11 +39,6 @@ import TTF "vendor:sdl2/ttf" import vk "vendor:vulkan" -import NS "vendor:darwin/Foundation" -import MTL "vendor:darwin/Metal" -import MTK "vendor:darwin/MetalKit" -import CA "vendor:darwin/QuartzCore" - // NOTE(bill): only one can be checked at a time import lua_5_4 "vendor:lua/5.4" @@ -91,11 +86,6 @@ _ :: TTF _ :: vk -_ :: NS -_ :: MTL -_ :: MTK -_ :: CA - _ :: lua_5_4 _ :: nvg diff --git a/examples/all/all_vendor_darwin.odin b/examples/all/all_vendor_darwin.odin new file mode 100644 index 000000000..9aa41396c --- /dev/null +++ b/examples/all/all_vendor_darwin.odin @@ -0,0 +1,12 @@ +//+build darwin +package all + +import NS "vendor:darwin/Foundation" +import MTL "vendor:darwin/Metal" +import MTK "vendor:darwin/MetalKit" +import CA "vendor:darwin/QuartzCore" + +_ :: NS +_ :: MTL +_ :: MTK +_ :: CA From 82cd30a14568814dfa70d383cf43c8d0d0bd6b16 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 30 Oct 2023 13:06:45 +0100 Subject: [PATCH 22/24] Add test for RTTI --- .gitignore | 2 + tests/internal/Makefile | 13 +++-- tests/internal/build.bat | 7 ++- tests/internal/test_rtti.odin | 101 ++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 tests/internal/test_rtti.odin diff --git a/.gitignore b/.gitignore index 3528af624..59b5adb6d 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,8 @@ bld/ ![Cc]ore/[Ll]og/ tests/documentation/verify/ tests/documentation/all.odin-doc +tests/internal/test_map +tests/internal/test_rtti # Visual Studio 2015 cache/options directory .vs/ # Visual Studio Code options directory diff --git a/tests/internal/Makefile b/tests/internal/Makefile index 7328968f0..898ba0517 100644 --- a/tests/internal/Makefile +++ b/tests/internal/Makefile @@ -1,6 +1,9 @@ -ODIN=../../odin - -all: map_test - -map_test: +ODIN=../../odin + +all: rtti_test map_test + +rtti_test: + $(ODIN) run test_rtti.odin -file -vet -strict-style -o:minimal + +map_test: $(ODIN) run test_map.odin -file -vet -strict-style -o:minimal \ No newline at end of file diff --git a/tests/internal/build.bat b/tests/internal/build.bat index 995086523..7e8ae84f2 100644 --- a/tests/internal/build.bat +++ b/tests/internal/build.bat @@ -1,4 +1,5 @@ -@echo off -set PATH_TO_ODIN==..\..\odin -%PATH_TO_ODIN% run test_map.odin -file -vet -strict-style -o:minimal || exit /b +@echo off +set PATH_TO_ODIN==..\..\odin +%PATH_TO_ODIN% run test_rtti.odin -file -vet -strict-style -o:minimal || exit /b +%PATH_TO_ODIN% run test_map.odin -file -vet -strict-style -o:minimal || exit /b rem -define:SEED=42 \ No newline at end of file diff --git a/tests/internal/test_rtti.odin b/tests/internal/test_rtti.odin new file mode 100644 index 000000000..9c88cc1b3 --- /dev/null +++ b/tests/internal/test_rtti.odin @@ -0,0 +1,101 @@ +package test_internal_rtti + +import "core:fmt" +import "core:mem" +import "core:os" +import "core:testing" + + +Buggy_Struct :: struct { + a: int, + b: bool, + c: [3]^string, +} +#assert(size_of(Buggy_Struct) == 40) + +g_buggy: Buggy_Struct = {} + +EXPECTED_REPR := "%!s(Buggy_Struct=Buggy_Struct{a = 0, b = false, c = [0x0, 0x0, 0x0]})" + +@test +rtti_test :: proc(t: ^testing.T) { + l_buggy: Buggy_Struct = {} + + g_b := ([^]u8)(&g_buggy)[:size_of(Buggy_Struct)] + l_b := ([^]u8)(&l_buggy)[:size_of(Buggy_Struct)] + { + checksum := 0 + for v, i in g_b { + checksum += (i+1) * int(v) + } + expect(t, checksum == 0, fmt.tprintf("Expected g_b to be zero-initialized, got %v", g_b)) + } + { + checksum := 0 + for v, i in l_b { + checksum += (i+1) * int(v) + } + expect(t, checksum == 0, fmt.tprintf("Expected l_b to be zero-initialized, got %v", l_b)) + } + + expect(t, size_of(Buggy_Struct) == 40, fmt.tprintf("Expected size_of(Buggy_Struct) == 40, got %v", size_of(Buggy_Struct))) + expect(t, size_of(g_buggy) == 40, fmt.tprintf("Expected size_of(g_buggy) == 40, got %v", size_of(g_buggy))) + expect(t, size_of(l_buggy) == 40, fmt.tprintf("Expected size_of(l_buggy) == 40, got %v", size_of(l_buggy))) + + g_s := fmt.tprintf("%s", g_buggy) + l_s := fmt.tprintf("%s", l_buggy) + expect(t, g_s == EXPECTED_REPR, fmt.tprintf("Expected fmt.tprintf(\"%%s\", g_s)) to return \"%v\", got \"%v\"", EXPECTED_REPR, g_s)) + expect(t, l_s == EXPECTED_REPR, fmt.tprintf("Expected fmt.tprintf(\"%%s\", l_s)) to return \"%v\", got \"%v\"", EXPECTED_REPR, l_s)) +} + +// -------- -------- -------- -------- -------- -------- -------- -------- -------- -------- + +main :: proc() { + t := testing.T{} + + rtti_test(&t) + + fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) + if TEST_fail > 0 { + os.exit(1) + } +} + +mem_track_test :: proc(t: ^testing.T, test: proc(t: ^testing.T)) { + track: mem.Tracking_Allocator + mem.tracking_allocator_init(&track, context.allocator) + context.allocator = mem.tracking_allocator(&track) + + test(t) + + expect(t, len(track.allocation_map) == 0, "Expected no leaks.") + expect(t, len(track.bad_free_array) == 0, "Expected no leaks.") + + for _, leak in track.allocation_map { + fmt.printf("%v leaked %v bytes\n", leak.location, leak.size) + } + for bad_free in track.bad_free_array { + fmt.printf("%v allocation %p was freed badly\n", bad_free.location, bad_free.memory) + } +} + +TEST_count := 0 +TEST_fail := 0 + +when ODIN_TEST { + expect :: testing.expect + log :: testing.log +} else { + expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) { + TEST_count += 1 + if !condition { + TEST_fail += 1 + fmt.printf("[%v] %v\n", loc, message) + return + } + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v] ", loc) + fmt.printf("log: %v\n", v) + } +} \ No newline at end of file From b7af4e7f6b3f8f96ca6d3efa492098293bfa4109 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 30 Oct 2023 12:31:24 +0000 Subject: [PATCH 23/24] Explicitly write out the passes for each level and remove certain passes --- src/llvm_backend.cpp | 287 ++++++++++++++++++++++++++++++++++++--- src/llvm_backend_opt.cpp | 7 +- src/tilde_stmt.cpp | 20 +-- 3 files changed, 282 insertions(+), 32 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index a81fbdd37..513b40a4d 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1491,19 +1491,15 @@ gb_internal WORKER_TASK_PROC(lb_llvm_module_pass_worker_proc) { array_add(&passes, "function(annotation-remarks)"); break; case 1: - array_add(&passes, "default"); - break; - case 2: - // array_add(&passes, "default"); +// default +// Passes removed: coro, openmp, sroa array_add(&passes, u8R"( - annotation2metadata, forceattrs, inferattrs, function( lower-expect, simplifycfg, - sroa, early-cse<> ), ipsccp, @@ -1512,20 +1508,18 @@ globalopt, function( mem2reg, instcombine, - simplifycfg -), -require, -function( - invalidate -), -require, -cgscc( + simplifycfg), + require, + function( + invalidate + ), + require, + cgscc( devirt<4>( inline, inline, function-attrs, function( - sroa, early-cse, speculative-execution, jump-threading, @@ -1534,7 +1528,6 @@ cgscc( instcombine, aggressive-instcombine, constraint-elimination, - libcalls-shrinkwrap, tailcallelim, simplifycfg, reassociate, @@ -1554,7 +1547,6 @@ cgscc( loop-deletion, loop-unroll-full ), - sroa, vector-combine, mldst-motion, gvn<>, @@ -1603,7 +1595,6 @@ function( instcombine, loop-unroll, transform-warning, - sroa, instcombine, loop-mssa( licm @@ -1623,11 +1614,267 @@ function( annotation-remarks ), verify - )"); break; +// default +// Passes removed: coro, openmp, sroa + case 2: + array_add(&passes, u8R"( +annotation2metadata, +forceattrs, +inferattrs, +function( + lower-expect, + simplifycfg, + early-cse<> +), +ipsccp, +called-value-propagation, +globalopt, +function( + mem2reg, + instcombine, + simplifycfg +), +require, +function( + invalidate +), +require, +cgscc( + devirt<4>( + inline, + inline, + function-attrs, + function( + early-cse, + speculative-execution, + jump-threading, + correlated-propagation, + simplifycfg, + instcombine, + aggressive-instcombine, + constraint-elimination, + libcalls-shrinkwrap, + tailcallelim, + simplifycfg, + reassociate, + loop-mssa( + loop-instsimplify, + loop-simplifycfg, + licm, + loop-rotate, + licm, + simple-loop-unswitch + ), + simplifycfg, + instcombine, + loop( + loop-idiom, + indvars, + loop-deletion, + loop-unroll-full + ), + vector-combine, + mldst-motion, + gvn<>, + sccp, + bdce, + instcombine, + jump-threading, + correlated-propagation, + adce, + memcpyopt, + dse, + move-auto-init, + loop-mssa( + licm + ), + simplifycfg, + instcombine + ), + function-attrs, + function( + require + ) + ) +), +deadargelim, +globalopt, +globaldce, +elim-avail-extern, +rpo-function-attrs, +recompute-globalsaa, +function( + float2int, + lower-constant-intrinsics, + loop( + loop-rotate, + loop-deletion + ), + loop-distribute, + inject-tli-mappings, + loop-vectorize, + loop-load-elim, + instcombine, + simplifycfg, + slp-vectorizer, + vector-combine, + instcombine, + loop-unroll, + transform-warning, + instcombine, + loop-mssa( + licm + ), + alignment-from-assumptions, + loop-sink, + instsimplify, + div-rem-pairs, + tailcallelim, + simplifycfg +), +globaldce, +constmerge, +cg-profile, +rel-lookup-table-converter, +function( + annotation-remarks +), +verify +)"); + break; + case 3: - array_add(&passes, "default"); +// default +// Passes removed: coro, openmp, sroa + array_add(&passes, u8R"( +annotation2metadata, +forceattrs, +inferattrs, +function( + lower-expect, + simplifycfg, + early-cse<>, + callsite-splitting +), +ipsccp, +called-value-propagation, +globalopt, +function( + mem2reg, + instcombine, + simplifycfg +), +require, +function( + invalidate +), +require, +cgscc( + devirt<4>( + inline, + inline, + function-attrs, + argpromotion, + function( + early-cse, + speculative-execution, + jump-threading, + correlated-propagation, + simplifycfg, + instcombine, + aggressive-instcombine, + constraint-elimination, + libcalls-shrinkwrap, + tailcallelim, + simplifycfg, + reassociate, + loop-mssa( + loop-instsimplify, + loop-simplifycfg, + licm, + loop-rotate, + licm, + simple-loop-unswitch + ), + simplifycfg, + instcombine, + loop( + loop-idiom, + indvars, + loop-deletion, + loop-unroll-full + ), + vector-combine, + mldst-motion, + gvn<>, + sccp, + bdce, + instcombine, + jump-threading, + correlated-propagation, + adce, + memcpyopt, + dse, + move-auto-init, + loop-mssa( + licm + ), + simplifycfg, + instcombine + ), + function-attrs, + function( + require + ), + ) +), +deadargelim, +globalopt, +globaldce, +elim-avail-extern, +rpo-function-attrs, +recompute-globalsaa, +function( + float2int, + lower-constant-intrinsics, + chr, + loop( + loop-rotate, + loop-deletion + ), + loop-distribute, + inject-tli-mappings, + loop-vectorize, + loop-load-elim, + instcombine, + simplifycfg, + slp-vectorizer, + vector-combine, + instcombine, + loop-unroll, + transform-warning, + instcombine, + loop-mssa( + licm + ), + alignment-from-assumptions, + loop-sink, + instsimplify, + div-rem-pairs, + tailcallelim, + simplifycfg +), +globaldce, +constmerge, +cg-profile, +rel-lookup-table-converter, +function( + annotation-remarks +), +verify +)"); break; } diff --git a/src/llvm_backend_opt.cpp b/src/llvm_backend_opt.cpp index 4424bde7c..2e03b7974 100644 --- a/src/llvm_backend_opt.cpp +++ b/src/llvm_backend_opt.cpp @@ -322,7 +322,11 @@ gb_internal void lb_run_remove_dead_instruction_pass(lbProcedure *p) { // NOTE(bill): Explicit instructions are set here because some instructions could have side effects switch (LLVMGetInstructionOpcode(curr_instr)) { // case LLVMAlloca: - + case LLVMLoad: + if (LLVMGetVolatile(curr_instr)) { + break; + } + /*fallthrough*/ case LLVMFNeg: case LLVMAdd: case LLVMFAdd: @@ -342,7 +346,6 @@ gb_internal void lb_run_remove_dead_instruction_pass(lbProcedure *p) { case LLVMAnd: case LLVMOr: case LLVMXor: - case LLVMLoad: case LLVMGetElementPtr: case LLVMTrunc: case LLVMZExt: diff --git a/src/tilde_stmt.cpp b/src/tilde_stmt.cpp index f45dda0bc..1a7dcce4d 100644 --- a/src/tilde_stmt.cpp +++ b/src/tilde_stmt.cpp @@ -1032,22 +1032,22 @@ gb_internal void cg_build_assignment(cgProcedure *p, Array const &lvals, continue; } - Type *type = cg_addr_type(lval); + Type *type = cg_addr_type(lval); if (!cg_addr_is_empty(lval)) { GB_ASSERT_MSG(are_types_identical(init.type, type), "%s = %s", type_to_string(init.type), type_to_string(type)); } if (init.kind == cgValue_Addr && !cg_addr_is_empty(lval)) { - // NOTE(bill): This is needed for certain constructs such as this: - // a, b = b, a - // NOTE(bill): This is a bodge and not necessarily a good way of doing things whatsoever - TB_CharUnits size = cast(TB_CharUnits)type_size_of(type); - TB_CharUnits align = cast(TB_CharUnits)type_align_of(type); - TB_Node *copy = tb_inst_local(p->func, size, align); - tb_inst_memcpy(p->func, copy, init.node, tb_inst_uint(p->func, TB_TYPE_INT, size), align); - // use the copy instead - init.node = copy; + // NOTE(bill): This is needed for certain constructs such as this: + // a, b = b, a + // NOTE(bill): This is a bodge and not necessarily a good way of doing things whatsoever + TB_CharUnits size = cast(TB_CharUnits)type_size_of(type); + TB_CharUnits align = cast(TB_CharUnits)type_align_of(type); + TB_Node *copy = tb_inst_local(p->func, size, align); + tb_inst_memcpy(p->func, copy, init.node, tb_inst_uint(p->func, TB_TYPE_INT, size), align); + // use the copy instead + init.node = copy; } inits[i] = init; } From f5febb633c92ee1cf7b5d88f0146ffac3e2481b7 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Tue, 31 Oct 2023 13:12:17 +0100 Subject: [PATCH 24/24] Temporarily disable RTTI test on Windows. --- tests/internal/build.bat | 2 +- tests/internal/test_rtti.odin | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/internal/build.bat b/tests/internal/build.bat index 7e8ae84f2..1f40885bb 100644 --- a/tests/internal/build.bat +++ b/tests/internal/build.bat @@ -1,5 +1,5 @@ @echo off set PATH_TO_ODIN==..\..\odin -%PATH_TO_ODIN% run test_rtti.odin -file -vet -strict-style -o:minimal || exit /b +rem %PATH_TO_ODIN% run test_rtti.odin -file -vet -strict-style -o:minimal || exit /b %PATH_TO_ODIN% run test_map.odin -file -vet -strict-style -o:minimal || exit /b rem -define:SEED=42 \ No newline at end of file diff --git a/tests/internal/test_rtti.odin b/tests/internal/test_rtti.odin index 9c88cc1b3..12f64462b 100644 --- a/tests/internal/test_rtti.odin +++ b/tests/internal/test_rtti.odin @@ -53,7 +53,7 @@ rtti_test :: proc(t: ^testing.T) { main :: proc() { t := testing.T{} - rtti_test(&t) + mem_track_test(&t, rtti_test) fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count) if TEST_fail > 0 {