From cac8582de17762319ad8da1e509f9aff9d7a241b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Prokop=20Rand=C3=A1=C4=8Dek?= Date: Sun, 24 Oct 2021 12:52:54 +0200 Subject: [PATCH 1/4] WindowShouldClose should return a bool --- vendor/glfw/wrapper.odin | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/vendor/glfw/wrapper.odin b/vendor/glfw/wrapper.odin index 2eed82efe..853917661 100644 --- a/vendor/glfw/wrapper.odin +++ b/vendor/glfw/wrapper.odin @@ -52,7 +52,9 @@ DestroyWindow :: glfw.DestroyWindow WindowHint :: glfw.WindowHint DefaultWindowHints :: glfw.DefaultWindowHints WindowHintString :: glfw.WindowHintString -WindowShouldClose :: glfw.WindowShouldClose +WindowShouldClose :: proc "c" (window: WindowHandle) -> bool { + return glfw.WindowShouldClose(window) != 0 +} SwapInterval :: glfw.SwapInterval SwapBuffers :: glfw.SwapBuffers @@ -228,4 +230,4 @@ SetErrorCallback :: glfw.SetErrorCallback // Used by vendor:OpenGL gl_set_proc_address :: proc(p: rawptr, name: cstring) { (^rawptr)(p)^ = GetProcAddress(name) -} \ No newline at end of file +} From b77e2f59ed17c2cdadf218603281ef9709192306 Mon Sep 17 00:00:00 2001 From: Prokop Randacek Date: Sun, 24 Oct 2021 13:07:13 +0200 Subject: [PATCH 2/4] The better option --- vendor/glfw/bindings/bindings.odin | 2 +- vendor/glfw/wrapper.odin | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/vendor/glfw/bindings/bindings.odin b/vendor/glfw/bindings/bindings.odin index e65e9b2fc..90d5a0f9e 100644 --- a/vendor/glfw/bindings/bindings.odin +++ b/vendor/glfw/bindings/bindings.odin @@ -46,7 +46,7 @@ foreign glfw { WindowHint :: proc(hint, value: c.int) --- DefaultWindowHints :: proc() --- WindowHintString :: proc(hint: c.int, value: cstring) --- - WindowShouldClose :: proc(window: WindowHandle) -> c.int --- + WindowShouldClose :: proc(window: WindowHandle) -> b32 --- SwapInterval :: proc(interval: c.int) --- SwapBuffers :: proc(window: WindowHandle) --- diff --git a/vendor/glfw/wrapper.odin b/vendor/glfw/wrapper.odin index 853917661..2c09731ca 100644 --- a/vendor/glfw/wrapper.odin +++ b/vendor/glfw/wrapper.odin @@ -52,9 +52,7 @@ DestroyWindow :: glfw.DestroyWindow WindowHint :: glfw.WindowHint DefaultWindowHints :: glfw.DefaultWindowHints WindowHintString :: glfw.WindowHintString -WindowShouldClose :: proc "c" (window: WindowHandle) -> bool { - return glfw.WindowShouldClose(window) != 0 -} +WindowShouldClose :: glfw.WindowShouldClose SwapInterval :: glfw.SwapInterval SwapBuffers :: glfw.SwapBuffers From 72cc92dc5cf9e96b484020e3036487d8548f4f52 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 26 Oct 2021 11:44:25 +0100 Subject: [PATCH 3/4] Add `llvm_get_inline_asm` for future compatibility --- src/llvm_backend_expr.cpp | 6 +----- src/llvm_backend_proc.cpp | 29 ++++++----------------------- src/llvm_backend_utility.cpp | 13 +++++++++++++ 3 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 214da9e10..6737c97bc 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2510,11 +2510,7 @@ lbValue lb_build_expr(lbProcedure *p, Ast *expr) { } LLVMTypeRef func_type = LLVMGetElementType(lb_type(p->module, t)); - LLVMValueRef the_asm = LLVMGetInlineAsm(func_type, - cast(char *)asm_string.text, cast(size_t)asm_string.len, - cast(char *)constraints_string.text, cast(size_t)constraints_string.len, - ia->has_side_effects, ia->is_align_stack, dialect - ); + LLVMValueRef the_asm = llvm_get_inline_asm(func_type, asm_string, constraints_string, ia->has_side_effects, ia->has_side_effects, dialect); GB_ASSERT(the_asm != nullptr); return {the_asm, t}; case_end; diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index e577dc248..a36762afb 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1335,22 +1335,12 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv, if (build_context.metrics.arch == TargetArch_386 || build_context.metrics.arch == TargetArch_amd64) { LLVMTypeRef func_type = LLVMFunctionType(LLVMVoidTypeInContext(p->module->ctx), nullptr, 0, false); - LLVMValueRef the_asm = LLVMGetInlineAsm(func_type, - cast(char *)"pause", 5, - cast(char *)"", 0, - /*HasSideEffects*/true, /*IsAlignStack*/false, - LLVMInlineAsmDialectATT - ); + LLVMValueRef the_asm = llvm_get_inline_asm(func_type, str_lit("pause"), {}); GB_ASSERT(the_asm != nullptr); LLVMBuildCall2(p->builder, func_type, the_asm, nullptr, 0, ""); } else if (build_context.metrics.arch == TargetArch_arm64) { LLVMTypeRef func_type = LLVMFunctionType(LLVMVoidTypeInContext(p->module->ctx), nullptr, 0, false); - LLVMValueRef the_asm = LLVMGetInlineAsm(func_type, - cast(char *)"yield", 5, - cast(char *)"", 0, - /*HasSideEffects*/true, /*IsAlignStack*/false, - LLVMInlineAsmDialectATT - ); + LLVMValueRef the_asm = llvm_get_inline_asm(func_type, str_lit("yield"), {}); GB_ASSERT(the_asm != nullptr); LLVMBuildCall2(p->builder, func_type, the_asm, nullptr, 0, ""); } @@ -1961,10 +1951,8 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv, constraints = gb_string_appendc(constraints, regs[i]); constraints = gb_string_appendc(constraints, "}"); } - size_t asm_string_size = gb_strlen(asm_string); - size_t constraints_size = gb_string_length(constraints); - inline_asm = LLVMGetInlineAsm(func_type, asm_string, asm_string_size, constraints, constraints_size, true, false, LLVMInlineAsmDialectATT); + inline_asm = llvm_get_inline_asm(func_type, make_string_c(asm_string), make_string_c(constraints)); } break; case TargetArch_386: @@ -1995,10 +1983,7 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv, constraints = gb_string_appendc(constraints, ",rm"); } - size_t asm_string_size = gb_strlen(asm_string); - size_t constraints_size = gb_string_length(constraints); - - inline_asm = LLVMGetInlineAsm(func_type, asm_string, asm_string_size, constraints, constraints_size, true, false, LLVMInlineAsmDialectATT); + inline_asm = llvm_get_inline_asm(func_type, make_string_c(asm_string), make_string_c(constraints)); } break; case TargetArch_arm64: @@ -2021,10 +2006,8 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv, constraints = gb_string_appendc(constraints, regs[i]); constraints = gb_string_appendc(constraints, "}"); } - size_t asm_string_size = gb_strlen(asm_string); - size_t constraints_size = gb_string_length(constraints); - - inline_asm = LLVMGetInlineAsm(func_type, asm_string, asm_string_size, constraints, constraints_size, true, false, LLVMInlineAsmDialectATT); + + inline_asm = llvm_get_inline_asm(func_type, make_string_c(asm_string), make_string_c(constraints)); } break; default: diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 0531c62bb..948180f30 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1379,3 +1379,16 @@ lbValue lb_soa_struct_cap(lbProcedure *p, lbValue value) { } return lb_emit_struct_ev(p, value, cast(i32)n); } + +LLVMValueRef llvm_get_inline_asm(LLVMTypeRef func_type, String const &str, String const &clobbers, bool has_side_effects=true, bool is_align_stack=false, LLVMInlineAsmDialect dialect=LLVMInlineAsmDialectATT) { + return LLVMGetInlineAsm(func_type, + cast(char *)str.text, cast(size_t)str.len, + cast(char *)clobbers.text, cast(size_t)clobbers.len, + /*HasSideEffects*/true, /*IsAlignStack*/false, + dialect + #if LLVM_VERSION_MAJOR >= 13 + , /*CanThrow*/false + #endif + ); +} + From d165de0d4db0da4169487dec182492294fdf0936 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 26 Oct 2021 11:46:31 +0100 Subject: [PATCH 4/4] Move thread initialization variables in thread_unix.odin --- core/thread/thread_unix.odin | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/thread/thread_unix.odin b/core/thread/thread_unix.odin index f78d8f66f..cee278c7a 100644 --- a/core/thread/thread_unix.odin +++ b/core/thread/thread_unix.odin @@ -76,6 +76,9 @@ _create :: proc(procedure: Thread_Proc, priority := Thread_Priority.Normal) -> ^ return nil } thread.creation_allocator = context.allocator + + sync.mutex_init(&thread.start_mutex) + sync.condition_init(&thread.start_gate, &thread.start_mutex) // Set thread priority. policy: i32 @@ -96,12 +99,13 @@ _create :: proc(procedure: Thread_Proc, priority := Thread_Priority.Normal) -> ^ if unix.pthread_create(&thread.unix_thread, &attrs, __linux_thread_entry_proc, thread) != 0 { free(thread, thread.creation_allocator) + + sync.condition_destroy(&thread.start_gate) + sync.mutex_destroy(&thread.start_mutex) return nil } thread.procedure = procedure - sync.mutex_init(&thread.start_mutex) - sync.condition_init(&thread.start_gate, &thread.start_mutex) return thread }