From df23cf47c69877e69b75d109e4da58e782070ac8 Mon Sep 17 00:00:00 2001 From: CiD- Date: Wed, 16 Feb 2022 22:08:39 -0500 Subject: [PATCH 01/56] fix odin test --- src/llvm_backend.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 52c46cadc..c777819c3 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1694,6 +1694,11 @@ void lb_generate_code(lbGenerator *gen) { } } + if (build_context.command_kind == Command_test && !already_has_entry_point) { + TIME_SECTION("LLVM main"); + lb_create_main_procedure(default_module, startup_runtime); + } + for_array(j, gen->modules.entries) { lbModule *m = gen->modules.entries[j].value; for_array(i, m->missing_procedures_to_check) { From bea2f3644325454e7fe0e12313528359d0782843 Mon Sep 17 00:00:00 2001 From: CiD- Date: Thu, 17 Feb 2022 10:48:30 -0500 Subject: [PATCH 02/56] improve entry point check logic --- src/llvm_backend.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index c777819c3..07b8e97b2 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1468,9 +1468,8 @@ void lb_generate_code(lbGenerator *gen) { if ((e->scope->flags&ScopeFlag_Init) && name == "main") { GB_ASSERT(e == info->entry_point); } - if (e->Procedure.is_export || - (e->Procedure.link_name.len > 0) || - ((e->scope->flags&ScopeFlag_File) && e->Procedure.link_name.len > 0)) { + if (build_context.command_kind == Command_test && + (e->Procedure.is_export || e->Procedure.link_name.len > 0)) { String link_name = e->Procedure.link_name; if (e->pkg->kind == Package_Runtime) { if (link_name == "main" || From 1bec9e5331bad9aaecee8ba80bf2cbeb97bb3ef0 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 20 Feb 2022 14:19:52 +0000 Subject: [PATCH 03/56] Add `freestanding_amd64_gnu` --- src/build_settings.cpp | 36 ++++++++++++++++++++++++++++++++---- src/llvm_abi.cpp | 4 +++- src/llvm_backend.cpp | 13 +++++++++++++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 610e4f847..cc76f9e7c 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -8,7 +8,7 @@ // #define DEFAULT_TO_THREADED_CHECKER // #endif -enum TargetOsKind { +enum TargetOsKind : u16 { TargetOs_Invalid, TargetOs_windows, @@ -25,7 +25,7 @@ enum TargetOsKind { TargetOs_COUNT, }; -enum TargetArchKind { +enum TargetArchKind : u16 { TargetArch_Invalid, TargetArch_amd64, @@ -37,7 +37,7 @@ enum TargetArchKind { TargetArch_COUNT, }; -enum TargetEndianKind { +enum TargetEndianKind : u8 { TargetEndian_Invalid, TargetEndian_Little, @@ -46,6 +46,16 @@ enum TargetEndianKind { TargetEndian_COUNT, }; +enum TargetABIKind : u16 { + TargetABI_Default, + + TargetABI_MSVC, + TargetABI_GNU, + + TargetABI_COUNT, +}; + + String target_os_names[TargetOs_COUNT] = { str_lit(""), str_lit("windows"), @@ -75,6 +85,12 @@ String target_endian_names[TargetEndian_COUNT] = { str_lit("big"), }; +String target_abi_names[TargetABI_COUNT] = { + str_lit(""), + str_lit("win64"), + str_lit("sysv"), +}; + TargetEndianKind target_endians[TargetArch_COUNT] = { TargetEndian_Invalid, TargetEndian_Little, @@ -98,6 +114,7 @@ struct TargetMetrics { isize max_align; String target_triplet; String target_data_layout; + TargetABIKind abi; }; @@ -399,6 +416,16 @@ gb_global TargetMetrics target_wasi_wasm32 = { // str_lit(""), // }; +gb_global TargetMetrics target_freestanding_amd64_gnu = { + TargetOs_freestanding, + TargetArch_amd64, + 8, + 16, + str_lit("x86_64-pc-none-gnu"), + str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"), + TargetABI_GNU, +}; + struct NamedTargetMetrics { @@ -420,7 +447,8 @@ gb_global NamedTargetMetrics named_targets[] = { { str_lit("freestanding_wasm32"), &target_freestanding_wasm32 }, { str_lit("wasi_wasm32"), &target_wasi_wasm32 }, { str_lit("js_wasm32"), &target_js_wasm32 }, - // { str_lit("freestanding_wasm64"), &target_freestanding_wasm64 }, + + { str_lit("freestanding_amd64_gnu"), &target_freestanding_amd64_gnu }, }; NamedTargetMetrics *selected_target_metrics; diff --git a/src/llvm_abi.cpp b/src/llvm_abi.cpp index 0244b73d6..770e54ac8 100644 --- a/src/llvm_abi.cpp +++ b/src/llvm_abi.cpp @@ -1194,8 +1194,10 @@ LB_ABI_INFO(lb_get_abi_info) { switch (build_context.metrics.arch) { case TargetArch_amd64: - if (build_context.metrics.os == TargetOs_windows) { + if (build_context.metrics.os == TargetOs_windows || build_context.metrics.abi == TargetABI_MSVC) { return lbAbiAmd64Win64::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention); + } else if (build_context.metrics.abi == TargetABI_GNU) { + return lbAbiAmd64SysV::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention); } else { return lbAbiAmd64SysV::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention); } diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 52c46cadc..934daee28 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -996,6 +996,19 @@ String lb_filepath_obj_for_module(lbModule *m) { case TargetOs_essence: ext = STR_LIT(".o"); break; + + case TargetOs_freestanding: + switch (build_context.metrics.abi) { + default: + case TargetABI_Default: + case TargetABI_GNU: + ext = STR_LIT(".o"); + break; + case TargetABI_MSVC: + ext = STR_LIT(".obj"); + break; + } + break; } } } From 0fa487f468b1f63d5ec97ae8bbb0da01717f32cc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 20 Feb 2022 14:27:44 +0000 Subject: [PATCH 04/56] Add `-foreign-error-procedures` --- core/runtime/error_checks.odin | 20 +++++++++++++++++++- src/build_settings.cpp | 2 ++ src/checker.cpp | 1 + src/main.cpp | 12 ++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/core/runtime/error_checks.odin b/core/runtime/error_checks.odin index 14d55c64c..ad6902e2d 100644 --- a/core/runtime/error_checks.odin +++ b/core/runtime/error_checks.odin @@ -17,6 +17,24 @@ type_assertion_trap :: proc "contextless" () -> ! { } +when ODIN_FOREIGN_ERROR_PROCEDURES { + foreign { + bounds_check_error :: proc "contextless" (file: string, line, column: i32, index, count: int) --- + slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) -> ! --- + multi_pointer_slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) -> ! --- + multi_pointer_slice_expr_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) --- + slice_expr_error_hi :: proc "contextless" (file: string, line, column: i32, hi: int, len: int) --- + slice_expr_error_lo_hi :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) --- + dynamic_array_expr_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) --- + matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) --- + type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) --- + type_assertion_check2 :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) --- + make_slice_error_loc :: proc "contextless" (loc := #caller_location, len: int) --- + make_dynamic_array_error_loc :: proc "contextless" (using loc := #caller_location, len, cap: int) --- + make_map_expr_error_loc :: proc "contextless" (loc := #caller_location, cap: int) --- + } +} else { + bounds_check_error :: proc "contextless" (file: string, line, column: i32, index, count: int) { if 0 <= index && index < count { return @@ -231,7 +249,7 @@ make_map_expr_error_loc :: #force_inline proc "contextless" (loc := #caller_loca handle_error(loc, cap) } - +} diff --git a/src/build_settings.cpp b/src/build_settings.cpp index cc76f9e7c..cd9bdb40c 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -200,6 +200,7 @@ struct BuildContext { bool ODIN_DEBUG; // Odin in debug mode bool ODIN_DISABLE_ASSERT; // Whether the default 'assert' et al is disabled in code or not bool ODIN_DEFAULT_TO_NIL_ALLOCATOR; // Whether the default allocator is a "nil" allocator or not (i.e. it does nothing) + bool ODIN_FOREIGN_ERROR_PROCEDURES; ErrorPosStyle ODIN_ERROR_POS_STYLE; @@ -269,6 +270,7 @@ struct BuildContext { bool copy_file_contents; + u32 cmd_doc_flags; Array extra_packages; diff --git a/src/checker.cpp b/src/checker.cpp index f440b7c9a..fe1d362fa 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -976,6 +976,7 @@ void init_universal(void) { add_global_bool_constant("ODIN_USE_SEPARATE_MODULES", bc->use_separate_modules); add_global_bool_constant("ODIN_TEST", bc->command_kind == Command_test); add_global_bool_constant("ODIN_NO_ENTRY_POINT", bc->no_entry_point); + add_global_bool_constant("ODIN_FOREIGN_ERROR_PROCEDURES", bc->ODIN_FOREIGN_ERROR_PROCEDURES); // Builtin Procedures diff --git a/src/main.cpp b/src/main.cpp index 291b56996..5746ef146 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -632,6 +632,7 @@ enum BuildFlagKind { BuildFlag_InsertSemicolon, BuildFlag_StrictStyle, BuildFlag_StrictStyleInitOnly, + BuildFlag_ForeignErrorProcedures, BuildFlag_Compact, BuildFlag_GlobalDefinitions, @@ -785,10 +786,13 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_InsertSemicolon, str_lit("insert-semicolon"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_StrictStyle, str_lit("strict-style"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_StrictStyleInitOnly, str_lit("strict-style-init-only"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_ForeignErrorProcedures, str_lit("foreign-error-procedures"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_Compact, str_lit("compact"), BuildFlagParam_None, Command_query); add_flag(&build_flags, BuildFlag_GlobalDefinitions, str_lit("global-definitions"), BuildFlagParam_None, Command_query); add_flag(&build_flags, BuildFlag_GoToDefinitions, str_lit("go-to-definitions"), BuildFlagParam_None, Command_query); + add_flag(&build_flags, BuildFlag_Short, str_lit("short"), BuildFlagParam_None, Command_doc); add_flag(&build_flags, BuildFlag_AllPackages, str_lit("all-packages"), BuildFlagParam_None, Command_doc); add_flag(&build_flags, BuildFlag_DocFormat, str_lit("doc-format"), BuildFlagParam_None, Command_doc); @@ -1356,6 +1360,9 @@ bool parse_build_flags(Array args) { case BuildFlag_DefaultToNilAllocator: build_context.ODIN_DEFAULT_TO_NIL_ALLOCATOR = true; break; + case BuildFlag_ForeignErrorProcedures: + build_context.ODIN_FOREIGN_ERROR_PROCEDURES = true; + break; case BuildFlag_InsertSemicolon: { gb_printf_err("-insert-semicolon flag is not required any more\n"); bad_flags = true; @@ -2084,6 +2091,11 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(1, "-verbose-errors"); print_usage_line(2, "Prints verbose error messages showing the code on that line and the location in that line"); print_usage_line(0, ""); + + print_usage_line(1, "-foreign-error-procedures"); + print_usage_line(2, "States that the error procedues used in the runtime are defined in a separate translation unit"); + print_usage_line(0, ""); + } if (run_or_build) { From 3e5c60f74672651044d70303e8b0a8e56ca765f2 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 20 Feb 2022 14:48:12 +0000 Subject: [PATCH 05/56] Add `-reloc-mode:` --- src/build_settings.cpp | 9 +++++++++ src/llvm_backend.cpp | 14 ++++++++++++++ src/main.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index cd9bdb40c..d56a343df 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -189,6 +189,13 @@ enum ErrorPosStyle { ErrorPosStyle_COUNT }; +enum RelocMode { + RelocMode_Default, + RelocMode_Static, + RelocMode_PIC, + RelocMode_DynamicNoPIC, +}; + // This stores the information for the specify architecture of this build struct BuildContext { // Constants @@ -270,6 +277,8 @@ struct BuildContext { bool copy_file_contents; + RelocMode reloc_mode; + u32 cmd_doc_flags; Array extra_packages; diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 934daee28..692b96c51 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1308,6 +1308,20 @@ void lb_generate_code(lbGenerator *gen) { reloc_mode = LLVMRelocPIC; } + switch (build_context.reloc_mode) { + case RelocMode_Default: + break; + case RelocMode_Static: + reloc_mode = LLVMRelocStatic; + break; + case RelocMode_PIC: + reloc_mode = LLVMRelocPIC; + break; + case RelocMode_DynamicNoPIC: + reloc_mode = LLVMRelocDynamicNoPic; + break; + } + for_array(i, gen->modules.entries) { target_machines[i] = LLVMCreateTargetMachine( target, target_triple, llvm_cpu, diff --git a/src/main.cpp b/src/main.cpp index 5746ef146..087f2b442 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -625,6 +625,8 @@ enum BuildFlagKind { BuildFlag_ExtraAssemblerFlags, BuildFlag_Microarch, + BuildFlag_RelocMode, + BuildFlag_TestName, BuildFlag_DisallowDo, @@ -779,6 +781,8 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_ExtraAssemblerFlags, str_lit("extra-assembler-flags"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_Microarch, str_lit("microarch"), BuildFlagParam_String, Command__does_build); + add_flag(&build_flags, BuildFlag_RelocMode, str_lit("reloc-mode"), BuildFlagParam_String, Command__does_build); + add_flag(&build_flags, BuildFlag_TestName, str_lit("test-name"), BuildFlagParam_String, Command_test); add_flag(&build_flags, BuildFlag_DisallowDo, str_lit("disallow-do"), BuildFlagParam_None, Command__does_check); @@ -1339,6 +1343,28 @@ bool parse_build_flags(Array args) { string_to_lower(&build_context.microarch); break; } + case BuildFlag_RelocMode: { + GB_ASSERT(value.kind == ExactValue_String); + String v = value.value_string; + if (v == "default") { + build_context.reloc_mode = RelocMode_Default; + } else if (v == "static") { + build_context.reloc_mode = RelocMode_Static; + } else if (v == "pic") { + build_context.reloc_mode = RelocMode_PIC; + } else if (v == "dynamic-no-pic") { + build_context.reloc_mode = RelocMode_DynamicNoPIC; + } else { + gb_printf_err("-reloc-mode flag expected one of the following\n"); + gb_printf_err("\tdefault\n"); + gb_printf_err("\tstatic\n"); + gb_printf_err("\tpic\n"); + gb_printf_err("\tdynamic-no-pic\n"); + bad_flags = true; + } + + break; + } case BuildFlag_TestName: { GB_ASSERT(value.kind == ExactValue_String); { From 3d209798c9aff4a0ebd135536234022620c9e650 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 23 Feb 2022 11:19:51 +0000 Subject: [PATCH 06/56] Add help docs for `-reloc-mode:` --- src/build_settings.cpp | 2 +- src/llvm_backend.cpp | 2 ++ src/main.cpp | 9 +++++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d56a343df..790f7f1bc 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -189,7 +189,7 @@ enum ErrorPosStyle { ErrorPosStyle_COUNT }; -enum RelocMode { +enum RelocMode : u8 { RelocMode_Default, RelocMode_Static, RelocMode_PIC, diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 692b96c51..ec22c7443 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1261,6 +1261,8 @@ void lb_generate_code(lbGenerator *gen) { LLVMCodeModel code_mode = LLVMCodeModelDefault; if (is_arch_wasm()) { code_mode = LLVMCodeModelJITDefault; + } else if (build_context.metrics.os == TargetOs_freestanding) { + code_mode = LLVMCodeModelKernel; } char const *host_cpu_name = LLVMGetHostCPUName(); diff --git a/src/main.cpp b/src/main.cpp index 087f2b442..cfc7decb1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2087,6 +2087,15 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(3, "-microarch:sandybridge"); print_usage_line(3, "-microarch:native"); print_usage_line(0, ""); + + print_usage_line(1, "-reloc-mode:"); + print_usage_line(2, "Specifies the reloc mode"); + print_usage_line(2, "Options:"); + print_usage_line(3, "default"); + print_usage_line(3, "static"); + print_usage_line(3, "pic"); + print_usage_line(3, "dynamic-no-pic"); + print_usage_line(0, ""); } if (check) { From 493bc653b5762514dac8c8941d6564ccf5bb8528 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 23 Feb 2022 11:23:27 +0000 Subject: [PATCH 07/56] Add `@(no_red_zone)` for procedures --- src/check_decl.cpp | 8 ++++++++ src/checker.cpp | 7 +++++++ src/checker.hpp | 1 + src/entity.cpp | 1 + src/llvm_backend_proc.cpp | 4 ++++ 5 files changed, 21 insertions(+) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 45d741532..6f8caff98 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -826,6 +826,14 @@ void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) { } e->Procedure.optimization_mode = cast(ProcedureOptimizationMode)ac.optimization_mode; + if (ac.no_red_zone) { + if (!is_arch_wasm()) { + e->Procedure.no_red_zone = true; + } else { + error(e->token, "@(no_red_zone) is not supported on this target architecture"); + } + } + if (ac.objc_name.len || ac.objc_is_class_method || ac.objc_type) { if (ac.objc_name.len == 0 && ac.objc_is_class_method) { error(e->token, "@(objc_name) is required with @(objc_is_class_method)"); diff --git a/src/checker.cpp b/src/checker.cpp index fe1d362fa..89e60c258 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3128,6 +3128,13 @@ DECL_ATTRIBUTE_PROC(proc_decl_attribute) { } } return true; + } else if (name == "no_red_zone") { + if (value != nullptr) { + error(elem, "Expected no value for '%.*s'", LIT(name)); + } else { + ac->no_red_zone = true; + } + return true; } return false; } diff --git a/src/checker.hpp b/src/checker.hpp index 552e6aca7..548439774 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -117,6 +117,7 @@ struct AttributeContext { bool test : 1; bool init : 1; bool set_cold : 1; + bool no_red_zone : 1; u32 optimization_mode; // ProcedureOptimizationMode String objc_class; diff --git a/src/entity.cpp b/src/entity.cpp index f5720293f..84ddd5c6b 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -226,6 +226,7 @@ struct Entity { bool is_foreign; bool is_export; bool generated_from_polymorphic; + bool no_red_zone; ProcedureOptimizationMode optimization_mode; } Procedure; struct { diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 7ead77c2c..209f2f67b 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -135,6 +135,10 @@ lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool ignore_body) lb_add_attribute_to_proc(m, p->value, "naked"); } + if (entity->Procedure.no_red_zone) { + lb_add_attribute_to_proc(m, p->value, "noredzone"); + } + switch (p->inlining) { case ProcInlining_inline: lb_add_attribute_to_proc(m, p->value, "alwaysinline"); From 196bd735d4c30964182fdf1f374f767ccb0912fa Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 23 Feb 2022 11:29:36 +0000 Subject: [PATCH 08/56] Replace local `@(no_red_zone)` with global `-disable-red-zone` --- src/build_settings.cpp | 8 ++++++++ src/check_decl.cpp | 8 -------- src/checker.cpp | 7 ------- src/checker.hpp | 1 - src/entity.cpp | 1 - src/llvm_backend_proc.cpp | 2 +- src/main.cpp | 8 ++++++++ 7 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 790f7f1bc..62f43fad3 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -278,6 +278,7 @@ struct BuildContext { bool copy_file_contents; RelocMode reloc_mode; + bool disable_red_zone; u32 cmd_doc_flags; @@ -1002,6 +1003,13 @@ void init_build_context(TargetMetrics *cross_target) { bc->threaded_checker = true; #endif + if (bc->disable_red_zone) { + if (!(bc->metrics.os == TargetOs_freestanding && !is_arch_wasm())) { + gb_printf_err("-disable-red-zone is not support for this target"); + gb_exit(1); + } + } + // NOTE(zangent): The linker flags to set the build architecture are different // across OSs. It doesn't make sense to allocate extra data on the heap diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 6f8caff98..45d741532 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -826,14 +826,6 @@ void check_proc_decl(CheckerContext *ctx, Entity *e, DeclInfo *d) { } e->Procedure.optimization_mode = cast(ProcedureOptimizationMode)ac.optimization_mode; - if (ac.no_red_zone) { - if (!is_arch_wasm()) { - e->Procedure.no_red_zone = true; - } else { - error(e->token, "@(no_red_zone) is not supported on this target architecture"); - } - } - if (ac.objc_name.len || ac.objc_is_class_method || ac.objc_type) { if (ac.objc_name.len == 0 && ac.objc_is_class_method) { error(e->token, "@(objc_name) is required with @(objc_is_class_method)"); diff --git a/src/checker.cpp b/src/checker.cpp index 89e60c258..fe1d362fa 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -3128,13 +3128,6 @@ DECL_ATTRIBUTE_PROC(proc_decl_attribute) { } } return true; - } else if (name == "no_red_zone") { - if (value != nullptr) { - error(elem, "Expected no value for '%.*s'", LIT(name)); - } else { - ac->no_red_zone = true; - } - return true; } return false; } diff --git a/src/checker.hpp b/src/checker.hpp index 548439774..552e6aca7 100644 --- a/src/checker.hpp +++ b/src/checker.hpp @@ -117,7 +117,6 @@ struct AttributeContext { bool test : 1; bool init : 1; bool set_cold : 1; - bool no_red_zone : 1; u32 optimization_mode; // ProcedureOptimizationMode String objc_class; diff --git a/src/entity.cpp b/src/entity.cpp index 84ddd5c6b..f5720293f 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -226,7 +226,6 @@ struct Entity { bool is_foreign; bool is_export; bool generated_from_polymorphic; - bool no_red_zone; ProcedureOptimizationMode optimization_mode; } Procedure; struct { diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index 209f2f67b..053ee2fb2 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -135,7 +135,7 @@ lbProcedure *lb_create_procedure(lbModule *m, Entity *entity, bool ignore_body) lb_add_attribute_to_proc(m, p->value, "naked"); } - if (entity->Procedure.no_red_zone) { + if (!entity->Procedure.is_foreign && build_context.disable_red_zone) { lb_add_attribute_to_proc(m, p->value, "noredzone"); } diff --git a/src/main.cpp b/src/main.cpp index cfc7decb1..1e7b78da4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -626,6 +626,7 @@ enum BuildFlagKind { BuildFlag_Microarch, BuildFlag_RelocMode, + BuildFlag_DisableRedZone, BuildFlag_TestName, @@ -782,6 +783,7 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_Microarch, str_lit("microarch"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_RelocMode, str_lit("reloc-mode"), BuildFlagParam_String, Command__does_build); + add_flag(&build_flags, BuildFlag_DisableRedZone, str_lit("disable-red-zone"), BuildFlagParam_None, Command__does_build); add_flag(&build_flags, BuildFlag_TestName, str_lit("test-name"), BuildFlagParam_String, Command_test); @@ -1365,6 +1367,9 @@ bool parse_build_flags(Array args) { break; } + case BuildFlag_DisableRedZone: + build_context.disable_red_zone = true; + break; case BuildFlag_TestName: { GB_ASSERT(value.kind == ExactValue_String); { @@ -2096,6 +2101,9 @@ void print_show_help(String const arg0, String const &command) { print_usage_line(3, "pic"); print_usage_line(3, "dynamic-no-pic"); print_usage_line(0, ""); + + print_usage_line(1, "-disable-red-zone"); + print_usage_line(2, "Disable red zone on a supported freestanding target"); } if (check) { From 4a04a32e0ab4ad91a7b62c0a94e57312002b85d5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 23 Feb 2022 11:33:28 +0000 Subject: [PATCH 09/56] Change target name to `freestanding_amd64_sysv` --- src/build_settings.cpp | 10 +++++----- src/llvm_abi.cpp | 4 ++-- src/llvm_backend.cpp | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 62f43fad3..d6cdd7006 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -49,8 +49,8 @@ enum TargetEndianKind : u8 { enum TargetABIKind : u16 { TargetABI_Default, - TargetABI_MSVC, - TargetABI_GNU, + TargetABI_Win64, + TargetABI_SysV, TargetABI_COUNT, }; @@ -428,14 +428,14 @@ gb_global TargetMetrics target_wasi_wasm32 = { // str_lit(""), // }; -gb_global TargetMetrics target_freestanding_amd64_gnu = { +gb_global TargetMetrics target_freestanding_amd64_sysv = { TargetOs_freestanding, TargetArch_amd64, 8, 16, str_lit("x86_64-pc-none-gnu"), str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"), - TargetABI_GNU, + TargetABI_SysV, }; @@ -460,7 +460,7 @@ gb_global NamedTargetMetrics named_targets[] = { { str_lit("wasi_wasm32"), &target_wasi_wasm32 }, { str_lit("js_wasm32"), &target_js_wasm32 }, - { str_lit("freestanding_amd64_gnu"), &target_freestanding_amd64_gnu }, + { str_lit("freestanding_amd64_sysv"), &target_freestanding_amd64_sysv }, }; NamedTargetMetrics *selected_target_metrics; diff --git a/src/llvm_abi.cpp b/src/llvm_abi.cpp index 770e54ac8..07d2dd6e3 100644 --- a/src/llvm_abi.cpp +++ b/src/llvm_abi.cpp @@ -1194,9 +1194,9 @@ LB_ABI_INFO(lb_get_abi_info) { switch (build_context.metrics.arch) { case TargetArch_amd64: - if (build_context.metrics.os == TargetOs_windows || build_context.metrics.abi == TargetABI_MSVC) { + if (build_context.metrics.os == TargetOs_windows || build_context.metrics.abi == TargetABI_Win64) { return lbAbiAmd64Win64::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention); - } else if (build_context.metrics.abi == TargetABI_GNU) { + } else if (build_context.metrics.abi == TargetABI_SysV) { return lbAbiAmd64SysV::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention); } else { return lbAbiAmd64SysV::abi_info(c, arg_types, arg_count, return_type, return_is_defined, calling_convention); diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index ec22c7443..6ca256c4b 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1001,10 +1001,10 @@ String lb_filepath_obj_for_module(lbModule *m) { switch (build_context.metrics.abi) { default: case TargetABI_Default: - case TargetABI_GNU: + case TargetABI_SysV: ext = STR_LIT(".o"); break; - case TargetABI_MSVC: + case TargetABI_Win64: ext = STR_LIT(".obj"); break; } From 32988b03632912bbdb788e3dc319592a1dab9bfe Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 25 Feb 2022 12:01:53 +0000 Subject: [PATCH 10/56] Correct internals for `os.read` on windows (read_console) for `os.stdin` (Fix #1556) --- core/os/file_windows.odin | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/os/file_windows.odin b/core/os/file_windows.odin index 8a0f2ed64..5368f51cf 100644 --- a/core/os/file_windows.odin +++ b/core/os/file_windows.odin @@ -108,7 +108,8 @@ read_console :: proc(handle: win32.HANDLE, b: []byte) -> (n: int, err: Errno) { buf8: [4*BUF_SIZE]u8 for n < len(b) && err == 0 { - max_read := u32(min(BUF_SIZE, len(b)/4)) + min_read := max(min(len(b), 4), len(b)/4) + max_read := u32(min(BUF_SIZE, min_read)) single_read_length: u32 ok := win32.ReadConsoleW(handle, &buf16[0], max_read, &single_read_length, nil) @@ -129,7 +130,7 @@ read_console :: proc(handle: win32.HANDLE, b: []byte) -> (n: int, err: Errno) { b[n] = x n += 1 } - if ctrl_z || single_read_length < len(buf16) { + if ctrl_z || single_read_length < max_read { break } } From ab9d1f99fdb776352352d882f49aefc80d0e9d58 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 12:36:21 +0000 Subject: [PATCH 11/56] Change `#c_vararg` checking to only disallow odin calling conventions --- src/check_type.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 64fb67723..c2324ee5a 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2031,10 +2031,14 @@ bool check_procedure_type(CheckerContext *ctx, Type *type, Ast *proc_type_node, if (param_count > 0) { Entity *end = params->Tuple.variables[param_count-1]; if (end->flags&EntityFlag_CVarArg) { - if (cc == ProcCC_StdCall || cc == ProcCC_CDecl) { + switch (cc) { + default: type->Proc.c_vararg = true; - } else { + break; + case ProcCC_Odin: + case ProcCC_Contextless: error(end->token, "Calling convention does not support #c_vararg"); + break; } } } From 37bba4c0a6b98f38a3160c9508bc55a6cb8ea7f1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 12:45:19 +0000 Subject: [PATCH 12/56] Reorganize error check procedures --- core/runtime/error_checks.odin | 339 ++++++++++++++++----------------- 1 file changed, 168 insertions(+), 171 deletions(-) diff --git a/core/runtime/error_checks.odin b/core/runtime/error_checks.odin index ad6902e2d..e4dd96d32 100644 --- a/core/runtime/error_checks.odin +++ b/core/runtime/error_checks.odin @@ -17,6 +17,23 @@ type_assertion_trap :: proc "contextless" () -> ! { } +bounds_check_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, index, count: int) { + bounds_check_error(file_path, line, column, index, count) +} + +slice_expr_error_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, hi: int, len: int) { + slice_expr_error_hi(file_path, line, column, hi, len) +} + +slice_expr_error_lo_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, lo, hi: int, len: int) { + slice_expr_error_lo_hi(file_path, line, column, lo, hi, len) +} + +dynamic_array_expr_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, low, high, max: int) { + dynamic_array_expr_error(file_path, line, column, low, high, max) +} + + when ODIN_FOREIGN_ERROR_PROCEDURES { foreign { bounds_check_error :: proc "contextless" (file: string, line, column: i32, index, count: int) --- @@ -29,182 +46,182 @@ when ODIN_FOREIGN_ERROR_PROCEDURES { matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) --- type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) --- type_assertion_check2 :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) --- - make_slice_error_loc :: proc "contextless" (loc := #caller_location, len: int) --- - make_dynamic_array_error_loc :: proc "contextless" (using loc := #caller_location, len, cap: int) --- - make_map_expr_error_loc :: proc "contextless" (loc := #caller_location, cap: int) --- } } else { - -bounds_check_error :: proc "contextless" (file: string, line, column: i32, index, count: int) { - if 0 <= index && index < count { - return + bounds_check_error :: proc "contextless" (file: string, line, column: i32, index, count: int) { + if 0 <= index && index < count { + return + } + handle_error :: proc "contextless" (file: string, line, column: i32, index, count: int) { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Index ") + print_i64(i64(index)) + print_string(" is out of range 0..<") + print_i64(i64(count)) + print_byte('\n') + bounds_trap() + } + handle_error(file, line, column, index, count) } - handle_error :: proc "contextless" (file: string, line, column: i32, index, count: int) { + + slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) -> ! { print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Index ") - print_i64(i64(index)) - print_string(" is out of range 0..<") - print_i64(i64(count)) - print_byte('\n') - bounds_trap() - } - handle_error(file, line, column, index, count) -} - -slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) -> ! { - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Invalid slice indices ") - print_i64(i64(lo)) - print_string(":") - print_i64(i64(hi)) - print_string(" is out of range 0..<") - print_i64(i64(len)) - print_byte('\n') - bounds_trap() -} - -multi_pointer_slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) -> ! { - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Invalid slice indices ") - print_i64(i64(lo)) - print_string(":") - print_i64(i64(hi)) - print_byte('\n') - bounds_trap() -} - - -multi_pointer_slice_expr_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) { - if lo <= hi { - return - } - multi_pointer_slice_handle_error(file, line, column, lo, hi) -} - -slice_expr_error_hi :: proc "contextless" (file: string, line, column: i32, hi: int, len: int) { - if 0 <= hi && hi <= len { - return - } - slice_handle_error(file, line, column, 0, hi, len) -} - -slice_expr_error_lo_hi :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) { - if 0 <= lo && lo <= len && lo <= hi && hi <= len { - return - } - slice_handle_error(file, line, column, lo, hi, len) -} - -dynamic_array_expr_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) { - if 0 <= low && low <= high && high <= max { - return - } - handle_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) { - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Invalid dynamic array indices ") - print_i64(i64(low)) + print_string(" Invalid slice indices ") + print_i64(i64(lo)) print_string(":") - print_i64(i64(high)) + print_i64(i64(hi)) print_string(" is out of range 0..<") - print_i64(i64(max)) + print_i64(i64(len)) print_byte('\n') bounds_trap() } - handle_error(file, line, column, low, high, max) -} - -matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) { - if 0 <= row_index && row_index < row_count && - 0 <= column_index && column_index < column_count { - return - } - handle_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) { + multi_pointer_slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) -> ! { print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Matrix indices [") - print_i64(i64(row_index)) - print_string(", ") - print_i64(i64(column_index)) - print_string(" is out of range [0..<") - print_i64(i64(row_count)) - print_string(", 0..<") - print_i64(i64(column_count)) - print_string("]") + print_string(" Invalid slice indices ") + print_i64(i64(lo)) + print_string(":") + print_i64(i64(hi)) print_byte('\n') bounds_trap() } - handle_error(file, line, column, row_index, column_index, row_count, column_count) -} -type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) { - if ok { - return - } - handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid) { - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Invalid type assertion from ") - print_typeid(from) - print_string(" to ") - print_typeid(to) - print_byte('\n') - type_assertion_trap() - } - handle_error(file, line, column, from, to) -} - -type_assertion_check2 :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) { - if ok { - return + multi_pointer_slice_expr_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) { + if lo <= hi { + return + } + multi_pointer_slice_handle_error(file, line, column, lo, hi) } - variant_type :: proc "contextless" (id: typeid, data: rawptr) -> typeid { - if id == nil || data == nil { + slice_expr_error_hi :: proc "contextless" (file: string, line, column: i32, hi: int, len: int) { + if 0 <= hi && hi <= len { + return + } + slice_handle_error(file, line, column, 0, hi, len) + } + + slice_expr_error_lo_hi :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) { + if 0 <= lo && lo <= len && lo <= hi && hi <= len { + return + } + slice_handle_error(file, line, column, lo, hi, len) + } + + dynamic_array_expr_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) { + if 0 <= low && low <= high && high <= max { + return + } + handle_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Invalid dynamic array indices ") + print_i64(i64(low)) + print_string(":") + print_i64(i64(high)) + print_string(" is out of range 0..<") + print_i64(i64(max)) + print_byte('\n') + bounds_trap() + } + handle_error(file, line, column, low, high, max) + } + + + matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) { + if 0 <= row_index && row_index < row_count && + 0 <= column_index && column_index < column_count { + return + } + handle_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Matrix indices [") + print_i64(i64(row_index)) + print_string(", ") + print_i64(i64(column_index)) + print_string(" is out of range [0..<") + print_i64(i64(row_count)) + print_string(", 0..<") + print_i64(i64(column_count)) + print_string("]") + print_byte('\n') + bounds_trap() + } + handle_error(file, line, column, row_index, column_index, row_count, column_count) + } + + + type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) { + if ok { + return + } + handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid) { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Invalid type assertion from ") + print_typeid(from) + print_string(" to ") + print_typeid(to) + print_byte('\n') + type_assertion_trap() + } + handle_error(file, line, column, from, to) + } + + type_assertion_check2 :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) { + if ok { + return + } + + variant_type :: proc "contextless" (id: typeid, data: rawptr) -> typeid { + if id == nil || data == nil { + return id + } + ti := type_info_base(type_info_of(id)) + #partial switch v in ti.variant { + case Type_Info_Any: + return (^any)(data).id + case Type_Info_Union: + tag_ptr := uintptr(data) + v.tag_offset + idx := 0 + switch v.tag_type.size { + case 1: idx = int((^u8)(tag_ptr)^) - 1 + case 2: idx = int((^u16)(tag_ptr)^) - 1 + case 4: idx = int((^u32)(tag_ptr)^) - 1 + case 8: idx = int((^u64)(tag_ptr)^) - 1 + case 16: idx = int((^u128)(tag_ptr)^) - 1 + } + if idx < 0 { + return nil + } else if idx < len(v.variants) { + return v.variants[idx].id + } + } return id } - ti := type_info_base(type_info_of(id)) - #partial switch v in ti.variant { - case Type_Info_Any: - return (^any)(data).id - case Type_Info_Union: - tag_ptr := uintptr(data) + v.tag_offset - idx := 0 - switch v.tag_type.size { - case 1: idx = int((^u8)(tag_ptr)^) - 1 - case 2: idx = int((^u16)(tag_ptr)^) - 1 - case 4: idx = int((^u32)(tag_ptr)^) - 1 - case 8: idx = int((^u64)(tag_ptr)^) - 1 - case 16: idx = int((^u128)(tag_ptr)^) - 1 - } - if idx < 0 { - return nil - } else if idx < len(v.variants) { - return v.variants[idx].id + + handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid, from_data: rawptr) { + + actual := variant_type(from, from_data) + + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Invalid type assertion from ") + print_typeid(from) + print_string(" to ") + print_typeid(to) + if actual != from { + print_string(", actual type: ") + print_typeid(actual) } + print_byte('\n') + type_assertion_trap() } - return id + handle_error(file, line, column, from, to, from_data) } - - handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid, from_data: rawptr) { - - actual := variant_type(from, from_data) - - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Invalid type assertion from ") - print_typeid(from) - print_string(" to ") - print_typeid(to) - if actual != from { - print_string(", actual type: ") - print_typeid(actual) - } - print_byte('\n') - type_assertion_trap() - } - handle_error(file, line, column, from, to, from_data) } +// `make` related procedures below + + make_slice_error_loc :: #force_inline proc "contextless" (loc := #caller_location, len: int) { if 0 <= len { return @@ -219,7 +236,7 @@ make_slice_error_loc :: #force_inline proc "contextless" (loc := #caller_locatio handle_error(loc, len) } -make_dynamic_array_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, len, cap: int) { +make_dynamic_array_error_loc :: #force_inline proc "contextless" (loc := #caller_location, len, cap: int) { if 0 <= len && len <= cap { return } @@ -248,23 +265,3 @@ make_map_expr_error_loc :: #force_inline proc "contextless" (loc := #caller_loca } handle_error(loc, cap) } - -} - - - -bounds_check_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, index, count: int) { - bounds_check_error(file_path, line, column, index, count) -} - -slice_expr_error_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, hi: int, len: int) { - slice_expr_error_hi(file_path, line, column, hi, len) -} - -slice_expr_error_lo_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, lo, hi: int, len: int) { - slice_expr_error_lo_hi(file_path, line, column, lo, hi, len) -} - -dynamic_array_expr_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, low, high, max: int) { - dynamic_array_expr_error(file_path, line, column, low, high, max) -} From 01162e08b55406578a2972d74c472de8a14f12b8 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 13:35:29 +0000 Subject: [PATCH 13/56] Add `-disallow-rtti` --- core/runtime/core.odin | 20 +-- core/runtime/error_checks.odin | 277 ++++++++++++++++++--------------- core/runtime/print.odin | 16 +- 3 files changed, 172 insertions(+), 141 deletions(-) diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 8d315a238..83a5418ed 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -508,16 +508,18 @@ __type_info_of :: proc "contextless" (id: typeid) -> ^Type_Info #no_bounds_check return &type_table[n] } -typeid_base :: proc "contextless" (id: typeid) -> typeid { - ti := type_info_of(id) - ti = type_info_base(ti) - return ti.id +when !ODIN_DISALLOW_RTTI { + typeid_base :: proc "contextless" (id: typeid) -> typeid { + ti := type_info_of(id) + ti = type_info_base(ti) + return ti.id + } + typeid_core :: proc "contextless" (id: typeid) -> typeid { + ti := type_info_core(type_info_of(id)) + return ti.id + } + typeid_base_without_enum :: typeid_core } -typeid_core :: proc "contextless" (id: typeid) -> typeid { - ti := type_info_core(type_info_of(id)) - return ti.id -} -typeid_base_without_enum :: typeid_core diff --git a/core/runtime/error_checks.odin b/core/runtime/error_checks.odin index e4dd96d32..0d0b39072 100644 --- a/core/runtime/error_checks.odin +++ b/core/runtime/error_checks.odin @@ -17,143 +17,143 @@ type_assertion_trap :: proc "contextless" () -> ! { } -bounds_check_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, index, count: int) { - bounds_check_error(file_path, line, column, index, count) +bounds_check_error :: proc "contextless" (file: string, line, column: i32, index, count: int) { + if 0 <= index && index < count { + return + } + @(cold) + handle_error :: proc "contextless" (file: string, line, column: i32, index, count: int) { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Index ") + print_i64(i64(index)) + print_string(" is out of range 0..<") + print_i64(i64(count)) + print_byte('\n') + bounds_trap() + } + handle_error(file, line, column, index, count) } -slice_expr_error_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, hi: int, len: int) { - slice_expr_error_hi(file_path, line, column, hi, len) +slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) -> ! { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Invalid slice indices ") + print_i64(i64(lo)) + print_string(":") + print_i64(i64(hi)) + print_string(" is out of range 0..<") + print_i64(i64(len)) + print_byte('\n') + bounds_trap() } -slice_expr_error_lo_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, lo, hi: int, len: int) { - slice_expr_error_lo_hi(file_path, line, column, lo, hi, len) -} - -dynamic_array_expr_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, low, high, max: int) { - dynamic_array_expr_error(file_path, line, column, low, high, max) +multi_pointer_slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) -> ! { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Invalid slice indices ") + print_i64(i64(lo)) + print_string(":") + print_i64(i64(hi)) + print_byte('\n') + bounds_trap() } -when ODIN_FOREIGN_ERROR_PROCEDURES { - foreign { - bounds_check_error :: proc "contextless" (file: string, line, column: i32, index, count: int) --- - slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) -> ! --- - multi_pointer_slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) -> ! --- - multi_pointer_slice_expr_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) --- - slice_expr_error_hi :: proc "contextless" (file: string, line, column: i32, hi: int, len: int) --- - slice_expr_error_lo_hi :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) --- - dynamic_array_expr_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) --- - matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) --- - type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) --- - type_assertion_check2 :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid, from_data: rawptr) --- +multi_pointer_slice_expr_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) { + if lo <= hi { + return + } + multi_pointer_slice_handle_error(file, line, column, lo, hi) +} + +slice_expr_error_hi :: proc "contextless" (file: string, line, column: i32, hi: int, len: int) { + if 0 <= hi && hi <= len { + return + } + slice_handle_error(file, line, column, 0, hi, len) +} + +slice_expr_error_lo_hi :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) { + if 0 <= lo && lo <= len && lo <= hi && hi <= len { + return + } + slice_handle_error(file, line, column, lo, hi, len) +} + +dynamic_array_expr_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) { + if 0 <= low && low <= high && high <= max { + return + } + @(cold) + handle_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Invalid dynamic array indices ") + print_i64(i64(low)) + print_string(":") + print_i64(i64(high)) + print_string(" is out of range 0..<") + print_i64(i64(max)) + print_byte('\n') + bounds_trap() + } + handle_error(file, line, column, low, high, max) +} + + +matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) { + if 0 <= row_index && row_index < row_count && + 0 <= column_index && column_index < column_count { + return + } + @(cold) + handle_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Matrix indices [") + print_i64(i64(row_index)) + print_string(", ") + print_i64(i64(column_index)) + print_string(" is out of range [0..<") + print_i64(i64(row_count)) + print_string(", 0..<") + print_i64(i64(column_count)) + print_string("]") + print_byte('\n') + bounds_trap() + } + handle_error(file, line, column, row_index, column_index, row_count, column_count) +} + + +when ODIN_DISALLOW_RTTI { + type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32) { + if ok { + return + } + @(cold) + handle_error :: proc "contextless" (file: string, line, column: i32) { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Invalid type assertion\n") + type_assertion_trap() + } + handle_error(file, line, column) + } + + type_assertion_check2 :: proc "contextless" (ok: bool, file: string, line, column: i32) { + if ok { + return + } + @(cold) + handle_error :: proc "contextless" (file: string, line, column: i32) { + print_caller_location(Source_Code_Location{file, line, column, ""}) + print_string(" Invalid type assertion\n") + type_assertion_trap() + } + handle_error(file, line, column) } } else { - bounds_check_error :: proc "contextless" (file: string, line, column: i32, index, count: int) { - if 0 <= index && index < count { - return - } - handle_error :: proc "contextless" (file: string, line, column: i32, index, count: int) { - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Index ") - print_i64(i64(index)) - print_string(" is out of range 0..<") - print_i64(i64(count)) - print_byte('\n') - bounds_trap() - } - handle_error(file, line, column, index, count) - } - - slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) -> ! { - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Invalid slice indices ") - print_i64(i64(lo)) - print_string(":") - print_i64(i64(hi)) - print_string(" is out of range 0..<") - print_i64(i64(len)) - print_byte('\n') - bounds_trap() - } - - multi_pointer_slice_handle_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) -> ! { - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Invalid slice indices ") - print_i64(i64(lo)) - print_string(":") - print_i64(i64(hi)) - print_byte('\n') - bounds_trap() - } - - - multi_pointer_slice_expr_error :: proc "contextless" (file: string, line, column: i32, lo, hi: int) { - if lo <= hi { - return - } - multi_pointer_slice_handle_error(file, line, column, lo, hi) - } - - slice_expr_error_hi :: proc "contextless" (file: string, line, column: i32, hi: int, len: int) { - if 0 <= hi && hi <= len { - return - } - slice_handle_error(file, line, column, 0, hi, len) - } - - slice_expr_error_lo_hi :: proc "contextless" (file: string, line, column: i32, lo, hi: int, len: int) { - if 0 <= lo && lo <= len && lo <= hi && hi <= len { - return - } - slice_handle_error(file, line, column, lo, hi, len) - } - - dynamic_array_expr_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) { - if 0 <= low && low <= high && high <= max { - return - } - handle_error :: proc "contextless" (file: string, line, column: i32, low, high, max: int) { - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Invalid dynamic array indices ") - print_i64(i64(low)) - print_string(":") - print_i64(i64(high)) - print_string(" is out of range 0..<") - print_i64(i64(max)) - print_byte('\n') - bounds_trap() - } - handle_error(file, line, column, low, high, max) - } - - - matrix_bounds_check_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) { - if 0 <= row_index && row_index < row_count && - 0 <= column_index && column_index < column_count { - return - } - handle_error :: proc "contextless" (file: string, line, column: i32, row_index, column_index, row_count, column_count: int) { - print_caller_location(Source_Code_Location{file, line, column, ""}) - print_string(" Matrix indices [") - print_i64(i64(row_index)) - print_string(", ") - print_i64(i64(column_index)) - print_string(" is out of range [0..<") - print_i64(i64(row_count)) - print_string(", 0..<") - print_i64(i64(column_count)) - print_string("]") - print_byte('\n') - bounds_trap() - } - handle_error(file, line, column, row_index, column_index, row_count, column_count) - } - - type_assertion_check :: proc "contextless" (ok: bool, file: string, line, column: i32, from, to: typeid) { if ok { return } + @(cold) handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid) { print_caller_location(Source_Code_Location{file, line, column, ""}) print_string(" Invalid type assertion from ") @@ -198,6 +198,7 @@ when ODIN_FOREIGN_ERROR_PROCEDURES { return id } + @(cold) handle_error :: proc "contextless" (file: string, line, column: i32, from, to: typeid, from_data: rawptr) { actual := variant_type(from, from_data) @@ -219,13 +220,11 @@ when ODIN_FOREIGN_ERROR_PROCEDURES { } -// `make` related procedures below - - make_slice_error_loc :: #force_inline proc "contextless" (loc := #caller_location, len: int) { if 0 <= len { return } + @(cold) handle_error :: proc "contextless" (loc: Source_Code_Location, len: int) { print_caller_location(loc) print_string(" Invalid slice length for make: ") @@ -236,10 +235,11 @@ make_slice_error_loc :: #force_inline proc "contextless" (loc := #caller_locatio handle_error(loc, len) } -make_dynamic_array_error_loc :: #force_inline proc "contextless" (loc := #caller_location, len, cap: int) { +make_dynamic_array_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, len, cap: int) { if 0 <= len && len <= cap { return } + @(cold) handle_error :: proc "contextless" (loc: Source_Code_Location, len, cap: int) { print_caller_location(loc) print_string(" Invalid dynamic array parameters for make: ") @@ -256,6 +256,7 @@ make_map_expr_error_loc :: #force_inline proc "contextless" (loc := #caller_loca if 0 <= cap { return } + @(cold) handle_error :: proc "contextless" (loc: Source_Code_Location, cap: int) { print_caller_location(loc) print_string(" Invalid map capacity for make: ") @@ -265,3 +266,23 @@ make_map_expr_error_loc :: #force_inline proc "contextless" (loc := #caller_loca } handle_error(loc, cap) } + + + + + +bounds_check_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, index, count: int) { + bounds_check_error(file_path, line, column, index, count) +} + +slice_expr_error_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, hi: int, len: int) { + slice_expr_error_hi(file_path, line, column, hi, len) +} + +slice_expr_error_lo_hi_loc :: #force_inline proc "contextless" (using loc := #caller_location, lo, hi: int, len: int) { + slice_expr_error_lo_hi(file_path, line, column, lo, hi, len) +} + +dynamic_array_expr_error_loc :: #force_inline proc "contextless" (using loc := #caller_location, low, high, max: int) { + dynamic_array_expr_error(file_path, line, column, low, high, max) +} diff --git a/core/runtime/print.odin b/core/runtime/print.odin index 06740bc75..89c196fc2 100644 --- a/core/runtime/print.odin +++ b/core/runtime/print.odin @@ -160,11 +160,19 @@ print_caller_location :: proc "contextless" (using loc: Source_Code_Location) { } } print_typeid :: proc "contextless" (id: typeid) { - if id == nil { - print_string("nil") + when ODIN_DISALLOW_RTTI { + if id == nil { + print_string("nil") + } else { + print_string("") + } } else { - ti := type_info_of(id) - print_type(ti) + if id == nil { + print_string("nil") + } else { + ti := type_info_of(id) + print_type(ti) + } } } print_type :: proc "contextless" (ti: ^Type_Info) { From fda803b46ae7d9bf3eba33e2ae701c452e72477d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 13:39:27 +0000 Subject: [PATCH 14/56] Commit rest of code for `-disable-rtti` --- src/build_settings.cpp | 3 ++- src/check_builtin.cpp | 18 +++++++++++++----- src/check_decl.cpp | 2 ++ src/check_expr.cpp | 2 ++ src/check_type.cpp | 2 ++ src/checker.cpp | 25 ++++++++++++++++++++++++- src/llvm_backend.cpp | 6 +++++- src/llvm_backend_expr.cpp | 17 ++++++++++++++--- src/llvm_backend_type.cpp | 2 ++ src/llvm_backend_utility.cpp | 30 ++++++++++++++++++++++-------- src/main.cpp | 7 +++++++ 11 files changed, 95 insertions(+), 19 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d6cdd7006..b2d6c4f43 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -277,6 +277,8 @@ struct BuildContext { bool copy_file_contents; + bool disallow_rtti; + RelocMode reloc_mode; bool disable_red_zone; @@ -946,7 +948,6 @@ void init_build_context(TargetMetrics *cross_target) { } } - bc->copy_file_contents = true; TargetMetrics *metrics = nullptr; diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index eb9d7f293..5561da01b 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1241,6 +1241,10 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 if (c->scope->flags&ScopeFlag_Global) { compiler_error("'type_info_of' Cannot be declared within the runtime package due to how the internals of the compiler works"); } + if (build_context.disallow_rtti) { + error(call, "'%.*s' has been disallowed", LIT(builtin_name)); + return false; + } // NOTE(bill): The type information may not be setup yet init_core_type_info(c->checker); @@ -1253,9 +1257,9 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 Type *t = o.type; if (t == nullptr || t == t_invalid || is_type_asm_proc(o.type) || is_type_polymorphic(t)) { if (is_type_polymorphic(t)) { - error(ce->args[0], "Invalid argument for 'type_info_of', unspecialized polymorphic type"); + error(ce->args[0], "Invalid argument for '%.*s', unspecialized polymorphic type", LIT(builtin_name)); } else { - error(ce->args[0], "Invalid argument for 'type_info_of'"); + error(ce->args[0], "Invalid argument for '%.*s'", LIT(builtin_name)); } return false; } @@ -1266,7 +1270,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 if (is_operand_value(o) && is_type_typeid(t)) { add_package_dependency(c, "runtime", "__type_info_of"); } else if (o.mode != Addressing_Type) { - error(expr, "Expected a type or typeid for 'type_info_of'"); + error(expr, "Expected a type or typeid for '%.*s'", LIT(builtin_name)); return false; } @@ -1280,6 +1284,10 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 if (c->scope->flags&ScopeFlag_Global) { compiler_error("'typeid_of' Cannot be declared within the runtime package due to how the internals of the compiler works"); } + if (build_context.disallow_rtti) { + error(call, "'%.*s' has been disallowed", LIT(builtin_name)); + return false; + } // NOTE(bill): The type information may not be setup yet init_core_type_info(c->checker); @@ -1291,7 +1299,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 } Type *t = o.type; if (t == nullptr || t == t_invalid || is_type_asm_proc(o.type) || is_type_polymorphic(operand->type)) { - error(ce->args[0], "Invalid argument for 'typeid_of'"); + error(ce->args[0], "Invalid argument for '%.*s'", LIT(builtin_name)); return false; } t = default_type(t); @@ -1299,7 +1307,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 add_type_info_type(c, t); if (o.mode != Addressing_Type) { - error(expr, "Expected a type for 'typeid_of'"); + error(expr, "Expected a type for '%.*s'", LIT(builtin_name)); return false; } diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 3fdd944f9..b3b1e4474 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -1205,6 +1205,8 @@ void check_global_variable_decl(CheckerContext *ctx, Entity *&e, Ast *type_expr, Operand o = {}; check_expr_with_type_hint(ctx, &o, init_expr, e->type); check_init_variable(ctx, e, &o, str_lit("variable declaration")); + + check_rtti_type_disallowed(e->token, e->type, "A variable declaration is using a type, %s, which has been disallowed"); } void check_proc_group_decl(CheckerContext *ctx, Entity *&pg_entity, DeclInfo *d) { diff --git a/src/check_expr.cpp b/src/check_expr.cpp index e07dc3d60..f1bcb4cd9 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -9352,6 +9352,8 @@ ExprKind check_expr_base(CheckerContext *c, Operand *o, Ast *node, Type *type_hi if (o->type != nullptr && is_type_untyped(o->type)) { add_untyped(c, node, o->mode, o->type, o->value); } + check_rtti_type_disallowed(node, o->type, "An expression is using a type, %s, which has been disallowed"); + add_type_and_value(c->info, node, o->mode, o->type, o->value); return kind; } diff --git a/src/check_type.cpp b/src/check_type.cpp index c2324ee5a..ff2c3d6a6 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -3031,5 +3031,7 @@ Type *check_type_expr(CheckerContext *ctx, Ast *e, Type *named_type) { } set_base_type(named_type, type); + check_rtti_type_disallowed(e, type, "Use of a type, %s, which has been disallowed"); + return type; } diff --git a/src/checker.cpp b/src/checker.cpp index fe1d362fa..e6445d752 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -29,6 +29,23 @@ bool is_operand_undef(Operand o) { return o.mode == Addressing_Value && o.type == t_untyped_undef; } +bool check_rtti_type_disallowed(Token const &token, Type *type, char const *format) { + if (build_context.disallow_rtti && type) { + if (is_type_any(type)) { + gbString t = type_to_string(type); + error(token, format, t); + gb_string_free(t); + return true; + } + } + return false; +} + +bool check_rtti_type_disallowed(Ast *expr, Type *type, char const *format) { + GB_ASSERT(expr != nullptr); + return check_rtti_type_disallowed(ast_token(expr), type, format); +} + void scope_reset(Scope *scope) { if (scope == nullptr) return; @@ -875,7 +892,8 @@ void init_universal(void) { // Types for (isize i = 0; i < gb_count_of(basic_types); i++) { - add_global_type_entity(basic_types[i].Basic.name, &basic_types[i]); + String const &name = basic_types[i].Basic.name; + add_global_type_entity(name, &basic_types[i]); } add_global_type_entity(str_lit("byte"), &basic_types[Basic_u8]); @@ -977,6 +995,7 @@ void init_universal(void) { add_global_bool_constant("ODIN_TEST", bc->command_kind == Command_test); add_global_bool_constant("ODIN_NO_ENTRY_POINT", bc->no_entry_point); add_global_bool_constant("ODIN_FOREIGN_ERROR_PROCEDURES", bc->ODIN_FOREIGN_ERROR_PROCEDURES); + add_global_bool_constant("ODIN_DISALLOW_RTTI", bc->disallow_rtti); // Builtin Procedures @@ -1669,6 +1688,10 @@ void add_implicit_entity(CheckerContext *c, Ast *clause, Entity *e) { void add_type_info_type(CheckerContext *c, Type *t) { void add_type_info_type_internal(CheckerContext *c, Type *t); + if (build_context.disallow_rtti) { + return; + } + mutex_lock(&c->info->type_info_mutex); add_type_info_type_internal(c, t); mutex_unlock(&c->info->type_info_mutex); diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 6ca256c4b..04c3200f8 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1285,7 +1285,11 @@ void lb_generate_code(lbGenerator *gen) { // x86-64-v3: (close to Haswell) AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, XSAVE // x86-64-v4: AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL if (ODIN_LLVM_MINIMUM_VERSION_12) { - llvm_cpu = "x86-64-v2"; + if (build_context.metrics.os == TargetOs_freestanding) { + llvm_cpu = "x86-64"; + } else { + llvm_cpu = "x86-64-v2"; + } } } diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 844deb43c..18b66572d 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2809,16 +2809,25 @@ lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { src_tag = lb_emit_load(p, lb_emit_union_tag_ptr(p, v)); dst_tag = lb_const_union_tag(p->module, src_type, dst_type); } + + + isize arg_count = 6; + if (build_context.disallow_rtti) { + arg_count = 4; + } + lbValue ok = lb_emit_comp(p, Token_CmpEq, src_tag, dst_tag); - auto args = array_make(permanent_allocator(), 6); + auto args = array_make(permanent_allocator(), arg_count); args[0] = ok; args[1] = lb_find_or_add_entity_string(p->module, get_file_path_string(pos.file_id)); args[2] = lb_const_int(p->module, t_i32, pos.line); args[3] = lb_const_int(p->module, t_i32, pos.column); - args[4] = lb_typeid(p->module, src_type); - args[5] = lb_typeid(p->module, dst_type); + if (!build_context.disallow_rtti) { + args[4] = lb_typeid(p->module, src_type); + args[5] = lb_typeid(p->module, dst_type); + } lb_emit_runtime_call(p, "type_assertion_check", args); } @@ -2831,6 +2840,8 @@ lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { } lbValue data_ptr = lb_emit_struct_ev(p, v, 0); if ((p->state_flags & StateFlag_no_type_assert) == 0) { + GB_ASSERT(!build_context.disallow_rtti); + lbValue any_id = lb_emit_struct_ev(p, v, 1); lbValue id = lb_typeid(p->module, type); diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 1d6297164..1aac75f9c 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -14,6 +14,8 @@ isize lb_type_info_index(CheckerInfo *info, Type *type, bool err_on_not_found=tr } lbValue lb_typeid(lbModule *m, Type *type) { + GB_ASSERT(!build_context.disallow_rtti); + type = default_type(type); u64 id = cast(u64)lb_type_info_index(m->info, type); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 98b7e07f0..fb52a9bd6 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -676,17 +676,24 @@ lbValue lb_emit_union_cast(lbProcedure *p, lbValue value, Type *type, TokenPos p // NOTE(bill): Panic on invalid conversion Type *dst_type = tuple->Tuple.variables[0]->type; + isize arg_count = 7; + if (build_context.disallow_rtti) { + arg_count = 4; + } + lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1)); - auto args = array_make(permanent_allocator(), 7); + auto args = array_make(permanent_allocator(), arg_count); args[0] = ok; args[1] = lb_const_string(m, get_file_path_string(pos.file_id)); args[2] = lb_const_int(m, t_i32, pos.line); args[3] = lb_const_int(m, t_i32, pos.column); - args[4] = lb_typeid(m, src_type); - args[5] = lb_typeid(m, dst_type); - args[6] = lb_emit_conv(p, value_, t_rawptr); + if (!build_context.disallow_rtti) { + args[4] = lb_typeid(m, src_type); + args[5] = lb_typeid(m, dst_type); + args[6] = lb_emit_conv(p, value_, t_rawptr); + } lb_emit_runtime_call(p, "type_assertion_check2", args); return lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 0)); @@ -744,16 +751,23 @@ lbAddr lb_emit_any_cast_addr(lbProcedure *p, lbValue value, Type *type, TokenPos if (!is_tuple) { // NOTE(bill): Panic on invalid conversion lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1)); - auto args = array_make(permanent_allocator(), 7); + + isize arg_count = 7; + if (build_context.disallow_rtti) { + arg_count = 4; + } + auto args = array_make(permanent_allocator(), arg_count); args[0] = ok; args[1] = lb_const_string(m, get_file_path_string(pos.file_id)); args[2] = lb_const_int(m, t_i32, pos.line); args[3] = lb_const_int(m, t_i32, pos.column); - args[4] = any_typeid; - args[5] = dst_typeid; - args[6] = lb_emit_struct_ev(p, value, 0);; + if (!build_context.disallow_rtti) { + args[4] = any_typeid; + args[5] = dst_typeid; + args[6] = lb_emit_struct_ev(p, value, 0); + } lb_emit_runtime_call(p, "type_assertion_check2", args); return lb_addr(lb_emit_struct_ep(p, v.addr, 0)); diff --git a/src/main.cpp b/src/main.cpp index 8f4155d39..d2263f5a7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -638,6 +638,7 @@ enum BuildFlagKind { BuildFlag_StrictStyle, BuildFlag_StrictStyleInitOnly, BuildFlag_ForeignErrorProcedures, + BuildFlag_DisallowRTTI, BuildFlag_Compact, BuildFlag_GlobalDefinitions, @@ -796,6 +797,9 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_StrictStyleInitOnly, str_lit("strict-style-init-only"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ForeignErrorProcedures, str_lit("foreign-error-procedures"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_DisallowRTTI, str_lit("disallow-rtti"), BuildFlagParam_None, Command__does_check); + + add_flag(&build_flags, BuildFlag_Compact, str_lit("compact"), BuildFlagParam_None, Command_query); add_flag(&build_flags, BuildFlag_GlobalDefinitions, str_lit("global-definitions"), BuildFlagParam_None, Command_query); add_flag(&build_flags, BuildFlag_GoToDefinitions, str_lit("go-to-definitions"), BuildFlagParam_None, Command_query); @@ -1390,6 +1394,9 @@ bool parse_build_flags(Array args) { case BuildFlag_DisallowDo: build_context.disallow_do = true; break; + case BuildFlag_DisallowRTTI: + build_context.disallow_rtti = true; + break; case BuildFlag_DefaultToNilAllocator: build_context.ODIN_DEFAULT_TO_NIL_ALLOCATOR = true; break; From 278e239973ab1e680bd36f90c069ec798930e54b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 13:39:27 +0000 Subject: [PATCH 15/56] Commit rest of code for `-disallow-rtti` --- src/build_settings.cpp | 3 ++- src/check_builtin.cpp | 18 +++++++++++++----- src/check_decl.cpp | 2 ++ src/check_expr.cpp | 2 ++ src/check_type.cpp | 2 ++ src/checker.cpp | 25 ++++++++++++++++++++++++- src/llvm_backend.cpp | 6 +++++- src/llvm_backend_expr.cpp | 17 ++++++++++++++--- src/llvm_backend_type.cpp | 2 ++ src/llvm_backend_utility.cpp | 30 ++++++++++++++++++++++-------- src/main.cpp | 7 +++++++ 11 files changed, 95 insertions(+), 19 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index d6cdd7006..b2d6c4f43 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -277,6 +277,8 @@ struct BuildContext { bool copy_file_contents; + bool disallow_rtti; + RelocMode reloc_mode; bool disable_red_zone; @@ -946,7 +948,6 @@ void init_build_context(TargetMetrics *cross_target) { } } - bc->copy_file_contents = true; TargetMetrics *metrics = nullptr; diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp index eb9d7f293..5561da01b 100644 --- a/src/check_builtin.cpp +++ b/src/check_builtin.cpp @@ -1241,6 +1241,10 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 if (c->scope->flags&ScopeFlag_Global) { compiler_error("'type_info_of' Cannot be declared within the runtime package due to how the internals of the compiler works"); } + if (build_context.disallow_rtti) { + error(call, "'%.*s' has been disallowed", LIT(builtin_name)); + return false; + } // NOTE(bill): The type information may not be setup yet init_core_type_info(c->checker); @@ -1253,9 +1257,9 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 Type *t = o.type; if (t == nullptr || t == t_invalid || is_type_asm_proc(o.type) || is_type_polymorphic(t)) { if (is_type_polymorphic(t)) { - error(ce->args[0], "Invalid argument for 'type_info_of', unspecialized polymorphic type"); + error(ce->args[0], "Invalid argument for '%.*s', unspecialized polymorphic type", LIT(builtin_name)); } else { - error(ce->args[0], "Invalid argument for 'type_info_of'"); + error(ce->args[0], "Invalid argument for '%.*s'", LIT(builtin_name)); } return false; } @@ -1266,7 +1270,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 if (is_operand_value(o) && is_type_typeid(t)) { add_package_dependency(c, "runtime", "__type_info_of"); } else if (o.mode != Addressing_Type) { - error(expr, "Expected a type or typeid for 'type_info_of'"); + error(expr, "Expected a type or typeid for '%.*s'", LIT(builtin_name)); return false; } @@ -1280,6 +1284,10 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 if (c->scope->flags&ScopeFlag_Global) { compiler_error("'typeid_of' Cannot be declared within the runtime package due to how the internals of the compiler works"); } + if (build_context.disallow_rtti) { + error(call, "'%.*s' has been disallowed", LIT(builtin_name)); + return false; + } // NOTE(bill): The type information may not be setup yet init_core_type_info(c->checker); @@ -1291,7 +1299,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 } Type *t = o.type; if (t == nullptr || t == t_invalid || is_type_asm_proc(o.type) || is_type_polymorphic(operand->type)) { - error(ce->args[0], "Invalid argument for 'typeid_of'"); + error(ce->args[0], "Invalid argument for '%.*s'", LIT(builtin_name)); return false; } t = default_type(t); @@ -1299,7 +1307,7 @@ bool check_builtin_procedure(CheckerContext *c, Operand *operand, Ast *call, i32 add_type_info_type(c, t); if (o.mode != Addressing_Type) { - error(expr, "Expected a type for 'typeid_of'"); + error(expr, "Expected a type for '%.*s'", LIT(builtin_name)); return false; } diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 3fdd944f9..b3b1e4474 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -1205,6 +1205,8 @@ void check_global_variable_decl(CheckerContext *ctx, Entity *&e, Ast *type_expr, Operand o = {}; check_expr_with_type_hint(ctx, &o, init_expr, e->type); check_init_variable(ctx, e, &o, str_lit("variable declaration")); + + check_rtti_type_disallowed(e->token, e->type, "A variable declaration is using a type, %s, which has been disallowed"); } void check_proc_group_decl(CheckerContext *ctx, Entity *&pg_entity, DeclInfo *d) { diff --git a/src/check_expr.cpp b/src/check_expr.cpp index e07dc3d60..f1bcb4cd9 100644 --- a/src/check_expr.cpp +++ b/src/check_expr.cpp @@ -9352,6 +9352,8 @@ ExprKind check_expr_base(CheckerContext *c, Operand *o, Ast *node, Type *type_hi if (o->type != nullptr && is_type_untyped(o->type)) { add_untyped(c, node, o->mode, o->type, o->value); } + check_rtti_type_disallowed(node, o->type, "An expression is using a type, %s, which has been disallowed"); + add_type_and_value(c->info, node, o->mode, o->type, o->value); return kind; } diff --git a/src/check_type.cpp b/src/check_type.cpp index c2324ee5a..ff2c3d6a6 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -3031,5 +3031,7 @@ Type *check_type_expr(CheckerContext *ctx, Ast *e, Type *named_type) { } set_base_type(named_type, type); + check_rtti_type_disallowed(e, type, "Use of a type, %s, which has been disallowed"); + return type; } diff --git a/src/checker.cpp b/src/checker.cpp index fe1d362fa..e6445d752 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -29,6 +29,23 @@ bool is_operand_undef(Operand o) { return o.mode == Addressing_Value && o.type == t_untyped_undef; } +bool check_rtti_type_disallowed(Token const &token, Type *type, char const *format) { + if (build_context.disallow_rtti && type) { + if (is_type_any(type)) { + gbString t = type_to_string(type); + error(token, format, t); + gb_string_free(t); + return true; + } + } + return false; +} + +bool check_rtti_type_disallowed(Ast *expr, Type *type, char const *format) { + GB_ASSERT(expr != nullptr); + return check_rtti_type_disallowed(ast_token(expr), type, format); +} + void scope_reset(Scope *scope) { if (scope == nullptr) return; @@ -875,7 +892,8 @@ void init_universal(void) { // Types for (isize i = 0; i < gb_count_of(basic_types); i++) { - add_global_type_entity(basic_types[i].Basic.name, &basic_types[i]); + String const &name = basic_types[i].Basic.name; + add_global_type_entity(name, &basic_types[i]); } add_global_type_entity(str_lit("byte"), &basic_types[Basic_u8]); @@ -977,6 +995,7 @@ void init_universal(void) { add_global_bool_constant("ODIN_TEST", bc->command_kind == Command_test); add_global_bool_constant("ODIN_NO_ENTRY_POINT", bc->no_entry_point); add_global_bool_constant("ODIN_FOREIGN_ERROR_PROCEDURES", bc->ODIN_FOREIGN_ERROR_PROCEDURES); + add_global_bool_constant("ODIN_DISALLOW_RTTI", bc->disallow_rtti); // Builtin Procedures @@ -1669,6 +1688,10 @@ void add_implicit_entity(CheckerContext *c, Ast *clause, Entity *e) { void add_type_info_type(CheckerContext *c, Type *t) { void add_type_info_type_internal(CheckerContext *c, Type *t); + if (build_context.disallow_rtti) { + return; + } + mutex_lock(&c->info->type_info_mutex); add_type_info_type_internal(c, t); mutex_unlock(&c->info->type_info_mutex); diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 6ca256c4b..04c3200f8 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1285,7 +1285,11 @@ void lb_generate_code(lbGenerator *gen) { // x86-64-v3: (close to Haswell) AVX, AVX2, BMI1, BMI2, F16C, FMA, LZCNT, MOVBE, XSAVE // x86-64-v4: AVX512F, AVX512BW, AVX512CD, AVX512DQ, AVX512VL if (ODIN_LLVM_MINIMUM_VERSION_12) { - llvm_cpu = "x86-64-v2"; + if (build_context.metrics.os == TargetOs_freestanding) { + llvm_cpu = "x86-64"; + } else { + llvm_cpu = "x86-64-v2"; + } } } diff --git a/src/llvm_backend_expr.cpp b/src/llvm_backend_expr.cpp index 844deb43c..18b66572d 100644 --- a/src/llvm_backend_expr.cpp +++ b/src/llvm_backend_expr.cpp @@ -2809,16 +2809,25 @@ lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { src_tag = lb_emit_load(p, lb_emit_union_tag_ptr(p, v)); dst_tag = lb_const_union_tag(p->module, src_type, dst_type); } + + + isize arg_count = 6; + if (build_context.disallow_rtti) { + arg_count = 4; + } + lbValue ok = lb_emit_comp(p, Token_CmpEq, src_tag, dst_tag); - auto args = array_make(permanent_allocator(), 6); + auto args = array_make(permanent_allocator(), arg_count); args[0] = ok; args[1] = lb_find_or_add_entity_string(p->module, get_file_path_string(pos.file_id)); args[2] = lb_const_int(p->module, t_i32, pos.line); args[3] = lb_const_int(p->module, t_i32, pos.column); - args[4] = lb_typeid(p->module, src_type); - args[5] = lb_typeid(p->module, dst_type); + if (!build_context.disallow_rtti) { + args[4] = lb_typeid(p->module, src_type); + args[5] = lb_typeid(p->module, dst_type); + } lb_emit_runtime_call(p, "type_assertion_check", args); } @@ -2831,6 +2840,8 @@ lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) { } lbValue data_ptr = lb_emit_struct_ev(p, v, 0); if ((p->state_flags & StateFlag_no_type_assert) == 0) { + GB_ASSERT(!build_context.disallow_rtti); + lbValue any_id = lb_emit_struct_ev(p, v, 1); lbValue id = lb_typeid(p->module, type); diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 1d6297164..1aac75f9c 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -14,6 +14,8 @@ isize lb_type_info_index(CheckerInfo *info, Type *type, bool err_on_not_found=tr } lbValue lb_typeid(lbModule *m, Type *type) { + GB_ASSERT(!build_context.disallow_rtti); + type = default_type(type); u64 id = cast(u64)lb_type_info_index(m->info, type); diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 98b7e07f0..fb52a9bd6 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -676,17 +676,24 @@ lbValue lb_emit_union_cast(lbProcedure *p, lbValue value, Type *type, TokenPos p // NOTE(bill): Panic on invalid conversion Type *dst_type = tuple->Tuple.variables[0]->type; + isize arg_count = 7; + if (build_context.disallow_rtti) { + arg_count = 4; + } + lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1)); - auto args = array_make(permanent_allocator(), 7); + auto args = array_make(permanent_allocator(), arg_count); args[0] = ok; args[1] = lb_const_string(m, get_file_path_string(pos.file_id)); args[2] = lb_const_int(m, t_i32, pos.line); args[3] = lb_const_int(m, t_i32, pos.column); - args[4] = lb_typeid(m, src_type); - args[5] = lb_typeid(m, dst_type); - args[6] = lb_emit_conv(p, value_, t_rawptr); + if (!build_context.disallow_rtti) { + args[4] = lb_typeid(m, src_type); + args[5] = lb_typeid(m, dst_type); + args[6] = lb_emit_conv(p, value_, t_rawptr); + } lb_emit_runtime_call(p, "type_assertion_check2", args); return lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 0)); @@ -744,16 +751,23 @@ lbAddr lb_emit_any_cast_addr(lbProcedure *p, lbValue value, Type *type, TokenPos if (!is_tuple) { // NOTE(bill): Panic on invalid conversion lbValue ok = lb_emit_load(p, lb_emit_struct_ep(p, v.addr, 1)); - auto args = array_make(permanent_allocator(), 7); + + isize arg_count = 7; + if (build_context.disallow_rtti) { + arg_count = 4; + } + auto args = array_make(permanent_allocator(), arg_count); args[0] = ok; args[1] = lb_const_string(m, get_file_path_string(pos.file_id)); args[2] = lb_const_int(m, t_i32, pos.line); args[3] = lb_const_int(m, t_i32, pos.column); - args[4] = any_typeid; - args[5] = dst_typeid; - args[6] = lb_emit_struct_ev(p, value, 0);; + if (!build_context.disallow_rtti) { + args[4] = any_typeid; + args[5] = dst_typeid; + args[6] = lb_emit_struct_ev(p, value, 0); + } lb_emit_runtime_call(p, "type_assertion_check2", args); return lb_addr(lb_emit_struct_ep(p, v.addr, 0)); diff --git a/src/main.cpp b/src/main.cpp index 8f4155d39..d2263f5a7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -638,6 +638,7 @@ enum BuildFlagKind { BuildFlag_StrictStyle, BuildFlag_StrictStyleInitOnly, BuildFlag_ForeignErrorProcedures, + BuildFlag_DisallowRTTI, BuildFlag_Compact, BuildFlag_GlobalDefinitions, @@ -796,6 +797,9 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_StrictStyleInitOnly, str_lit("strict-style-init-only"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ForeignErrorProcedures, str_lit("foreign-error-procedures"), BuildFlagParam_None, Command__does_check); + add_flag(&build_flags, BuildFlag_DisallowRTTI, str_lit("disallow-rtti"), BuildFlagParam_None, Command__does_check); + + add_flag(&build_flags, BuildFlag_Compact, str_lit("compact"), BuildFlagParam_None, Command_query); add_flag(&build_flags, BuildFlag_GlobalDefinitions, str_lit("global-definitions"), BuildFlagParam_None, Command_query); add_flag(&build_flags, BuildFlag_GoToDefinitions, str_lit("go-to-definitions"), BuildFlagParam_None, Command_query); @@ -1390,6 +1394,9 @@ bool parse_build_flags(Array args) { case BuildFlag_DisallowDo: build_context.disallow_do = true; break; + case BuildFlag_DisallowRTTI: + build_context.disallow_rtti = true; + break; case BuildFlag_DefaultToNilAllocator: build_context.ODIN_DEFAULT_TO_NIL_ALLOCATOR = true; break; From 882116e35819937206e14dbf02d1c9ad42037d93 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 14:00:44 +0000 Subject: [PATCH 16/56] Only allow `-disallow-rtti` on freestanding targets --- src/build_settings.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index b2d6c4f43..7beee8664 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1077,6 +1077,11 @@ void init_build_context(TargetMetrics *cross_target) { bc->optimization_level = gb_clamp(bc->optimization_level, 0, 3); + if (bc->disallow_rtti && bc->metrics.os != TargetOs_freestanding) { + gb_printf_err("-disallow-rtti is only allowed on freestanding targets\n"); + gb_exit(1); + } + #undef LINK_FLAG_X64 #undef LINK_FLAG_386 } From 2d89faa17cf88b76e183e35f4d50722271c76d20 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 14:35:38 +0000 Subject: [PATCH 17/56] Add extra checks for -disallow-rtti --- src/llvm_backend.cpp | 9 +++++++-- src/llvm_backend_type.cpp | 8 ++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 04c3200f8..40c06c23a 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -624,6 +624,9 @@ struct lbGlobalVariable { }; lbProcedure *lb_create_startup_type_info(lbModule *m) { + if (build_context.disallow_rtti) { + return nullptr; + } LLVMPassManagerRef default_function_pass_manager = LLVMCreateFunctionPassManagerForModule(m->mod); lb_populate_function_pass_manager(m, default_function_pass_manager, false, build_context.optimization_level); LLVMFinalizeFunctionPassManager(default_function_pass_manager); @@ -711,7 +714,9 @@ lbProcedure *lb_create_startup_runtime(lbModule *main_module, lbProcedure *start lb_begin_procedure_body(p); - LLVMBuildCall2(p->builder, LLVMGetElementType(lb_type(main_module, startup_type_info->type)), startup_type_info->value, nullptr, 0, ""); + if (startup_type_info) { + LLVMBuildCall2(p->builder, LLVMGetElementType(lb_type(main_module, startup_type_info->type)), startup_type_info->value, nullptr, 0, ""); + } if (objc_names) { LLVMBuildCall2(p->builder, LLVMGetElementType(lb_type(main_module, objc_names->type)), objc_names->value, nullptr, 0, ""); @@ -1394,7 +1399,7 @@ void lb_generate_code(lbGenerator *gen) { TIME_SECTION("LLVM Global Variables"); - { + if (!build_context.disallow_rtti) { lbModule *m = default_module; { // Add type info data diff --git a/src/llvm_backend_type.cpp b/src/llvm_backend_type.cpp index 1aac75f9c..e245a8b40 100644 --- a/src/llvm_backend_type.cpp +++ b/src/llvm_backend_type.cpp @@ -90,6 +90,8 @@ lbValue lb_typeid(lbModule *m, Type *type) { } lbValue lb_type_info(lbModule *m, Type *type) { + GB_ASSERT(!build_context.disallow_rtti); + type = default_type(type); isize index = lb_type_info_index(m->info, type); @@ -108,6 +110,8 @@ lbValue lb_type_info(lbModule *m, Type *type) { } lbValue lb_get_type_info_ptr(lbModule *m, Type *type) { + GB_ASSERT(!build_context.disallow_rtti); + i32 index = cast(i32)lb_type_info_index(m->info, type); GB_ASSERT(index >= 0); // gb_printf_err("%d %s\n", index, type_to_string(type)); @@ -157,6 +161,10 @@ lbValue lb_type_info_member_tags_offset(lbProcedure *p, isize count) { void lb_setup_type_info_data(lbProcedure *p) { // NOTE(bill): Setup type_info data + if (build_context.disallow_rtti) { + return; + } + lbModule *m = p->module; CheckerInfo *info = m->info; From 09e4fff5b18a314876c5f5d79f01cdd90aed7362 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 15:08:50 +0000 Subject: [PATCH 18/56] `-target-features:` This just passes a string directly to the LLVM features string --- src/build_settings.cpp | 1 + src/llvm_backend.cpp | 4 ++++ src/main.cpp | 10 +++++++++- src/string.cpp | 8 -------- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 7beee8664..e94fade4e 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -232,6 +232,7 @@ struct BuildContext { String extra_linker_flags; String extra_assembler_flags; String microarch; + String target_features; BuildModeKind build_mode; bool generate_docs; i32 optimization_level; diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 40c06c23a..ed3ae7dfc 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -1298,6 +1298,10 @@ void lb_generate_code(lbGenerator *gen) { } } + if (build_context.target_features.len != 0) { + llvm_features = alloc_cstring(permanent_allocator(), build_context.target_features); + } + // GB_ASSERT_MSG(LLVMTargetHasAsmBackend(target)); LLVMCodeGenOptLevel code_gen_level = LLVMCodeGenLevelNone; diff --git a/src/main.cpp b/src/main.cpp index d2263f5a7..5a77e09d8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -626,6 +626,7 @@ enum BuildFlagKind { BuildFlag_ExtraLinkerFlags, BuildFlag_ExtraAssemblerFlags, BuildFlag_Microarch, + BuildFlag_TargetFeatures, BuildFlag_RelocMode, BuildFlag_DisableRedZone, @@ -783,7 +784,8 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("ignore-unknown-attributes"), BuildFlagParam_None, Command__does_check); add_flag(&build_flags, BuildFlag_ExtraLinkerFlags, str_lit("extra-linker-flags"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_ExtraAssemblerFlags, str_lit("extra-assembler-flags"), BuildFlagParam_String, Command__does_build); - add_flag(&build_flags, BuildFlag_Microarch, str_lit("microarch"), BuildFlagParam_String, Command__does_build); + add_flag(&build_flags, BuildFlag_Microarch, str_lit("microarch"), BuildFlagParam_String, Command__does_build); + add_flag(&build_flags, BuildFlag_TargetFeatures, str_lit("target-features"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_RelocMode, str_lit("reloc-mode"), BuildFlagParam_String, Command__does_build); add_flag(&build_flags, BuildFlag_DisableRedZone, str_lit("disable-red-zone"), BuildFlagParam_None, Command__does_build); @@ -1351,6 +1353,12 @@ bool parse_build_flags(Array args) { string_to_lower(&build_context.microarch); break; } + case BuildFlag_TargetFeatures: { + GB_ASSERT(value.kind == ExactValue_String); + build_context.target_features = value.value_string; + string_to_lower(&build_context.target_features); + break; + } case BuildFlag_RelocMode: { GB_ASSERT(value.kind == ExactValue_String); String v = value.value_string; diff --git a/src/string.cpp b/src/string.cpp index bcaf23b9b..d3dbc6904 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -10,10 +10,6 @@ struct String { u8 * text; isize len; - // u8 &operator[](isize i) { - // GB_ASSERT_MSG(0 <= i && i < len, "[%td]", i); - // return text[i]; - // } u8 const &operator[](isize i) const { GB_ASSERT_MSG(0 <= i && i < len, "[%td]", i); return text[i]; @@ -33,10 +29,6 @@ struct String { struct String16 { wchar_t *text; isize len; - wchar_t &operator[](isize i) { - GB_ASSERT_MSG(0 <= i && i < len, "[%td]", i); - return text[i]; - } wchar_t const &operator[](isize i) const { GB_ASSERT_MSG(0 <= i && i < len, "[%td]", i); return text[i]; From 15d783e920abd0cabb918eed4a982efe577bfe54 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 15:13:41 +0000 Subject: [PATCH 19/56] Enforce `-no-entry-point` on freestanding targets --- src/build_settings.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/build_settings.cpp b/src/build_settings.cpp index e94fade4e..c94f914dc 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1006,12 +1006,20 @@ void init_build_context(TargetMetrics *cross_target) { #endif if (bc->disable_red_zone) { - if (!(bc->metrics.os == TargetOs_freestanding && !is_arch_wasm())) { + if (!!is_arch_wasm() && bc->metrics.os == TargetOs_freestanding) { gb_printf_err("-disable-red-zone is not support for this target"); gb_exit(1); } } + if (bc->metrics.os == TargetOs_freestanding) { + bc->no_entry_point = true; + } else { + if (bc->disallow_rtti) { + gb_printf_err("-disallow-rtti is only allowed on freestanding targets\n"); + gb_exit(1); + } + } // NOTE(zangent): The linker flags to set the build architecture are different // across OSs. It doesn't make sense to allocate extra data on the heap @@ -1063,14 +1071,14 @@ void init_build_context(TargetMetrics *cross_target) { if (bc->metrics.arch == TargetArch_wasm64) { link_flags = gb_string_appendc(link_flags, "-mwas64 "); } - if (bc->metrics.os == TargetOs_freestanding) { + if (bc->no_entry_point) { link_flags = gb_string_appendc(link_flags, "--no-entry "); } bc->link_flags = make_string_c(link_flags); // Disallow on wasm - build_context.use_separate_modules = false; + bc->use_separate_modules = false; } else { gb_printf_err("Compiler Error: Unsupported architecture\n"); gb_exit(1); @@ -1078,10 +1086,7 @@ void init_build_context(TargetMetrics *cross_target) { bc->optimization_level = gb_clamp(bc->optimization_level, 0, 3); - if (bc->disallow_rtti && bc->metrics.os != TargetOs_freestanding) { - gb_printf_err("-disallow-rtti is only allowed on freestanding targets\n"); - gb_exit(1); - } + #undef LINK_FLAG_X64 #undef LINK_FLAG_386 From 4f3b5d8dcb3be98d7b11efd49f3aec758e51bd2a Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 15:29:08 +0000 Subject: [PATCH 20/56] Clean up `generate_minimum_dependency_set` code --- src/checker.cpp | 75 +++++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/src/checker.cpp b/src/checker.cpp index e6445d752..660691276 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2204,21 +2204,25 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { ptr_set_init(&c->info.minimum_dependency_set, heap_allocator(), min_dep_set_cap); ptr_set_init(&c->info.minimum_dependency_type_info_set, heap_allocator()); - String required_runtime_entities[] = { +#define FORCE_ADD_RUNTIME_ENTITIES(condition, ...) do { \ + if (condition) { \ + String entities[] = {__VA_ARGS__}; \ + for (isize i = 0; i < gb_count_of(entities); i++) { \ + force_add_dependency_entity(c, c->info.runtime_package->scope, entities[i]); \ + } \ + } \ +} while (0) + + // required runtime entities + FORCE_ADD_RUNTIME_ENTITIES(true, // Odin types - str_lit("Type_Info"), str_lit("Source_Code_Location"), str_lit("Context"), str_lit("Allocator"), str_lit("Logger"), - // Global variables - str_lit("args__"), - str_lit("type_table"), - // Odin internal procedures str_lit("__init_context"), - str_lit("__type_info_of"), str_lit("cstring_to_string"), str_lit("_cleanup_runtime"), @@ -2251,35 +2255,36 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { // WASM Specific str_lit("__ashlti3"), str_lit("__multi3"), - }; - for (isize i = 0; i < gb_count_of(required_runtime_entities); i++) { - force_add_dependency_entity(c, c->info.runtime_package->scope, required_runtime_entities[i]); - } + ); - if (build_context.no_crt) { - String required_no_crt_entities[] = { - // NOTE(bill): Only if these exist - str_lit("_tls_index"), - str_lit("_fltused"), - }; - for (isize i = 0; i < gb_count_of(required_no_crt_entities); i++) { - force_add_dependency_entity(c, c->info.runtime_package->scope, required_no_crt_entities[i]); - } - } + FORCE_ADD_RUNTIME_ENTITIES(!build_context.disallow_rtti, + // Odin types + str_lit("Type_Info"), - if (!build_context.no_bounds_check) { - String bounds_check_entities[] = { - // Bounds checking related procedures - str_lit("bounds_check_error"), - str_lit("matrix_bounds_check_error"), - str_lit("slice_expr_error_hi"), - str_lit("slice_expr_error_lo_hi"), - str_lit("multi_pointer_slice_expr_error"), - }; - for (isize i = 0; i < gb_count_of(bounds_check_entities); i++) { - force_add_dependency_entity(c, c->info.runtime_package->scope, bounds_check_entities[i]); - } - } + // Global variables + str_lit("type_table"), + str_lit("__type_info_of"), + ); + + FORCE_ADD_RUNTIME_ENTITIES(!build_context.no_entry_point, + // Global variables + str_lit("args__"), + ); + + FORCE_ADD_RUNTIME_ENTITIES(build_context.no_crt, + // NOTE(bill): Only if these exist + str_lit("_tls_index"), + str_lit("_fltused"), + ); + + FORCE_ADD_RUNTIME_ENTITIES(!build_context.no_bounds_check, + // Bounds checking related procedures + str_lit("bounds_check_error"), + str_lit("matrix_bounds_check_error"), + str_lit("slice_expr_error_hi"), + str_lit("slice_expr_error_lo_hi"), + str_lit("multi_pointer_slice_expr_error"), + ); for_array(i, c->info.definitions) { Entity *e = c->info.definitions[i]; @@ -2401,6 +2406,8 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { start->flags |= EntityFlag_Used; add_dependency_to_set(c, start); } + +#undef FORCE_ADD_RUNTIME_ENTITIES } bool is_entity_a_dependency(Entity *e) { From fc4eb4152cd9e95ee1e020d60f89a2e245e8febe Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 15:35:10 +0000 Subject: [PATCH 21/56] Correct calling convention for `_startup_runtime` --- core/runtime/core.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/runtime/core.odin b/core/runtime/core.odin index 83a5418ed..3f6b03107 100644 --- a/core/runtime/core.odin +++ b/core/runtime/core.odin @@ -451,7 +451,7 @@ Odin_Endian_Type :: type_of(ODIN_ENDIAN) // This is probably only useful for freestanding targets foreign { @(link_name="__$startup_runtime") - _startup_runtime :: proc() --- + _startup_runtime :: proc "odin" () --- } @(link_name="__$cleanup_runtime") From 0ae012ba08c1981952dc508ab2b6244331926ba1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 15:37:15 +0000 Subject: [PATCH 22/56] Correct comment --- src/check_type.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index ff2c3d6a6..ecb2c26ea 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2174,7 +2174,7 @@ void init_map_entry_type(Type *type) { /* struct { - hash: runtime.Map_Hash, + hash: uintptr, next: int, key: Key, value: Value, From 410b85b5c7f768543e03c9fc6f47f8c2efcd602b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 28 Feb 2022 15:40:00 +0000 Subject: [PATCH 23/56] Disallow `@(thread_local)` on wasm targets --- src/check_decl.cpp | 4 ++++ src/check_stmt.cpp | 5 ++++- src/checker.cpp | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index b3b1e4474..12b0e43cb 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -1130,6 +1130,10 @@ void check_global_variable_decl(CheckerContext *ctx, Entity *&e, Ast *type_expr, } ac.link_name = handle_link_name(ctx, e->token, ac.link_name, ac.link_prefix); + if (is_arch_wasm() && e->Variable.thread_local_model.len != 0) { + error(e->token, "@(thread_local) is not supported for this target platform"); + } + String context_name = str_lit("variable declaration"); if (type_expr != nullptr) { diff --git a/src/check_stmt.cpp b/src/check_stmt.cpp index 7cae1893f..f2c830c1b 100644 --- a/src/check_stmt.cpp +++ b/src/check_stmt.cpp @@ -2152,7 +2152,6 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) { e->state = EntityState_Resolved; } ac.link_name = handle_link_name(ctx, e->token, ac.link_name, ac.link_prefix); - e->Variable.thread_local_model = ac.thread_local_model; if (ac.link_name.len > 0) { e->Variable.link_name = ac.link_name; @@ -2182,6 +2181,10 @@ void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags) { } e->Variable.thread_local_model = ac.thread_local_model; } + + if (is_arch_wasm() && e->Variable.thread_local_model.len != 0) { + error(e->token, "@(thread_local) is not supported for this target platform"); + } if (ac.is_static && ac.thread_local_model != "") { diff --git a/src/checker.cpp b/src/checker.cpp index 660691276..b1abdcb8a 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2271,7 +2271,7 @@ void generate_minimum_dependency_set(Checker *c, Entity *start) { str_lit("args__"), ); - FORCE_ADD_RUNTIME_ENTITIES(build_context.no_crt, + FORCE_ADD_RUNTIME_ENTITIES((build_context.no_crt && !is_arch_wasm()), // NOTE(bill): Only if these exist str_lit("_tls_index"), str_lit("_fltused"), From b94a7a87fabba83ecb7774f6a2d8a23c0075955a Mon Sep 17 00:00:00 2001 From: gitlost Date: Tue, 8 Mar 2022 18:06:25 +0000 Subject: [PATCH 24/56] Fix issue #1574 "fract in linalg/glm is broken" by fixing trunc_f16/32/64 in "math.odin" (~ typos on expressions) Fix classify_f16 Inf test (would fail for subnormal 0h0001) by changing multiplier 0.5 -> 0.25 Add some useful consts to "math.odin" (INF_F16 etc) Add comment to "demo.odin" mentioning that -0.0 must be used to specify negative zero --- core/math/math.odin | 31 +- examples/demo/demo.odin | 1 + tests/common/common.odin | 41 +++ tests/core/Makefile | 11 +- .../linalg/glsl/test_linalg_glsl_math.odin | 85 +++++ tests/core/math/test_core_math.odin | 310 ++++++++++++++++++ 6 files changed, 472 insertions(+), 7 deletions(-) create mode 100644 tests/common/common.odin create mode 100644 tests/core/math/linalg/glsl/test_linalg_glsl_math.odin create mode 100644 tests/core/math/test_core_math.odin diff --git a/core/math/math.odin b/core/math/math.odin index b81598da9..afbda051d 100644 --- a/core/math/math.odin +++ b/core/math/math.odin @@ -396,7 +396,7 @@ trunc_f16 :: proc "contextless" (x: f16) -> f16 { e := (x >> shift) & mask - bias if e < shift { - x &= ~(1 << (shift-e)) - 1 + x &~= 1 << (shift-e) - 1 } return transmute(f16)x } @@ -428,7 +428,7 @@ trunc_f32 :: proc "contextless" (x: f32) -> f32 { e := (x >> shift) & mask - bias if e < shift { - x &= ~(1 << (shift-e)) - 1 + x &~= 1 << (shift-e) - 1 } return transmute(f32)x } @@ -460,7 +460,7 @@ trunc_f64 :: proc "contextless" (x: f64) -> f64 { e := (x >> shift) & mask - bias if e < shift { - x &= ~(1 << (shift-e)) - 1 + x &~= 1 << (shift-e) - 1 } return transmute(f64)x } @@ -473,6 +473,7 @@ trunc_f64 :: proc "contextless" (x: f64) -> f64 { } trunc_f64le :: proc "contextless" (x: f64le) -> f64le { return #force_inline f64le(trunc_f64(f64(x))) } trunc_f64be :: proc "contextless" (x: f64be) -> f64be { return #force_inline f64be(trunc_f64(f64(x))) } +// Removes the fractional part of the value, i.e. rounds towards zero. trunc :: proc{ trunc_f16, trunc_f16le, trunc_f16be, trunc_f32, trunc_f32le, trunc_f32be, @@ -958,7 +959,7 @@ classify_f16 :: proc "contextless" (x: f16) -> Float_Class { return .Neg_Zero } return .Zero - case x*0.5 == x: + case x*0.25 == x: if x < 0 { return .Neg_Inf } @@ -1027,6 +1028,8 @@ classify_f64 :: proc "contextless" (x: f64) -> Float_Class { } classify_f64le :: proc "contextless" (x: f64le) -> Float_Class { return #force_inline classify_f64(f64(x)) } classify_f64be :: proc "contextless" (x: f64be) -> Float_Class { return #force_inline classify_f64(f64(x)) } +// Returns the `Float_Class` of the value, i.e. whether normal, subnormal, zero, negative zero, NaN, infinity or +// negative infinity. classify :: proc{ classify_f16, classify_f16le, classify_f16be, classify_f32, classify_f32le, classify_f32be, @@ -1715,4 +1718,22 @@ F32_BIAS :: 0x7f F64_MASK :: 0x7ff F64_SHIFT :: 64 - 12 -F64_BIAS :: 0x3ff \ No newline at end of file +F64_BIAS :: 0x3ff + +INF_F16 :f16: 0h7C00 +NEG_INF_F16 :f16: 0hFC00 + +SNAN_F16 :f16: 0h7C01 +QNAN_F16 :f16: 0h7E01 + +INF_F32 :f32: 0h7F80_0000 +NEG_INF_F32 :f32: 0hFF80_0000 + +SNAN_F32 :f32: 0hFF80_0001 +QNAN_F32 :f32: 0hFFC0_0001 + +INF_F64 :f64: 0h7FF0_0000_0000_0000 +NEG_INF_F64 :f64: 0hFFF0_0000_0000_0000 + +SNAN_F64 :f64: 0h7FF0_0000_0000_0001 +QNAN_F64 :f64: 0h7FF8_0000_0000_0001 \ No newline at end of file diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index 044860ff7..4d4490446 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -94,6 +94,7 @@ the_basics :: proc() { z: f64 // `z` is typed of type `f64` (64-bit floating point number) z = 1 // `1` is an untyped integer literal which can be implicitly converted to `f64` // No need for any suffixes or decimal places like in other languages + // (with the exception of negative zero, which must be given as `-0.0`) // CONSTANTS JUST WORK!!! diff --git a/tests/common/common.odin b/tests/common/common.odin new file mode 100644 index 000000000..2f5272b03 --- /dev/null +++ b/tests/common/common.odin @@ -0,0 +1,41 @@ +// Boilerplate for tests +package common + +import "core:testing" +import "core:fmt" +import "core:os" + +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] FAIL %s\n", loc, message) + return + } + fmt.printf("[%v] PASS\n", loc) + } + log :: proc(t: ^testing.T, v: any, loc := #caller_location) { + fmt.printf("[%v]", loc) + fmt.printf(" log: %v\n", v) + } +} + +report :: proc(t: ^testing.T) { + if TEST_fail > 0 { + if TEST_fail > 1 { + fmt.printf("%v/%v tests successful, %v tests failed.\n", TEST_count - TEST_fail, TEST_count, TEST_fail) + } else { + fmt.printf("%v/%v tests successful, %v test failed.\n", TEST_count - TEST_fail, TEST_count, TEST_fail) + } + os.exit(1) + } else { + fmt.printf("%v/%v tests successful.\n", TEST_count, TEST_count) + } +} diff --git a/tests/core/Makefile b/tests/core/Makefile index 1c2cee6bd..c003e4bc8 100644 --- a/tests/core/Makefile +++ b/tests/core/Makefile @@ -1,7 +1,8 @@ ODIN=../../odin PYTHON=$(shell which python3) -all: download_test_assets image_test compress_test strings_test hash_test crypto_test noise_test +all: download_test_assets image_test compress_test strings_test hash_test crypto_test noise_test \ + math_test linalg_glsl_math_test download_test_assets: $(PYTHON) download_assets.py @@ -22,4 +23,10 @@ crypto_test: $(ODIN) run crypto -out=crypto_hash -o:speed -no-bounds-check noise_test: - $(ODIN) run math/noise -out=test_noise \ No newline at end of file + $(ODIN) run math/noise -out=test_noise + +math_test: + $(ODIN) run math/test_core_math.odin -collection:tests=.. + +linalg_glsl_math_test: + $(ODIN) run math/linalg/glsl/test_linalg_glsl_math.odin -collection:tests=.. \ No newline at end of file diff --git a/tests/core/math/linalg/glsl/test_linalg_glsl_math.odin b/tests/core/math/linalg/glsl/test_linalg_glsl_math.odin new file mode 100644 index 000000000..e0b4f5145 --- /dev/null +++ b/tests/core/math/linalg/glsl/test_linalg_glsl_math.odin @@ -0,0 +1,85 @@ +// Tests "linalg_glsl_math.odin" in "core:math/linalg/glsl". +// Must be run with `-collection:tests=` flag, e.g. +// ./odin run tests/core/math/linalg/glsl/test_linalg_glsl_math.odin -collection:tests=./tests +package test_core_math_linalg_glsl_math + +import glsl "core:math/linalg/glsl" + +import "core:fmt" +import "core:math" +import "core:testing" +import tc "tests:common" + +main :: proc() { + + t := testing.T{} + + test_fract_f32(&t) + test_fract_f64(&t) + + tc.report(&t) +} + +@test +test_fract_f32 :: proc(t: ^testing.T) { + + using math + + r: f32 + + Datum :: struct { + i: int, + v: f32, + e: f32, + } + @static data := []Datum{ + { 0, 10.5, 0.5 }, // Issue #1574 fract in linalg/glm is broken + { 1, -10.5, -0.5 }, + { 2, F32_MIN, F32_MIN }, // 0x1p-126 + { 3, -F32_MIN, -F32_MIN }, + { 4, 0.0, 0.0 }, + { 5, -0.0, -0.0 }, + { 6, 1, 0.0 }, + { 7, -1, -0.0 }, + { 8, 0h3F80_0001, 0h3400_0000 }, // 0x1.000002p+0, 0x1p-23 + { 9, -0h3F80_0001, -0h3400_0000 }, + } + + for d, i in data { + assert(i == d.i) + r = glsl.fract(d.v) + tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(%v (%h)) -> %v (%h) != %v", i, #procedure, d.v, d.v, r, r, d.e)) + } +} + +@test +test_fract_f64 :: proc(t: ^testing.T) { + + using math + + r: f64 + + Datum :: struct { + i: int, + v: f64, + e: f64, + } + @static data := []Datum{ + { 0, 10.5, 0.5 }, // Issue #1574 fract in linalg/glm is broken + { 1, -10.5, -0.5 }, + { 2, F64_MIN, F64_MIN }, // 0x1p-1022 + { 3, -F64_MIN, -F64_MIN }, + { 4, 0.0, 0.0 }, + { 5, -0.0, -0.0 }, + { 6, 1, 0.0 }, + { 7, -1, -0.0 }, + { 8, 0h3FF0_0000_0000_0001, 0h3CB0_0000_0000_0000 }, // 0x1.0000000000001p+0, 0x1p-52 + { 9, -0h3FF0_0000_0000_0001, -0h3CB0_0000_0000_0000 }, + } + + for d, i in data { + assert(i == d.i) + r = glsl.fract(d.v) + tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(%v (%h)) -> %v (%h) != %v", i, #procedure, d.v, d.v, r, r, d.e)) + } +} diff --git a/tests/core/math/test_core_math.odin b/tests/core/math/test_core_math.odin new file mode 100644 index 000000000..57da27002 --- /dev/null +++ b/tests/core/math/test_core_math.odin @@ -0,0 +1,310 @@ +// Tests "math.odin" in "core:math". +// Must be run with `-collection:tests=` flag, e.g. +// ./odin run tests/core/math/test_core_math.odin -collection:tests=./tests +package test_core_math + +import "core:fmt" +import "core:math" +import "core:testing" +import tc "tests:common" + +main :: proc() { + t := testing.T{} + + test_classify_f16(&t) + test_classify_f32(&t) + test_classify_f64(&t) + + test_trunc_f16(&t) + test_trunc_f32(&t) + test_trunc_f64(&t) + + tc.report(&t) +} + +@test +test_classify_f16 :: proc(t: ^testing.T) { + + using math + using Float_Class + + r: Float_Class + + Datum :: struct { + i: int, + v: f16, + e: math.Float_Class, + } + @static data := []Datum{ + { 0, 1.2, Normal }, + { 1, 0h0001, Subnormal }, + { 2, 0.0, Zero }, + { 3, -0.0, Neg_Zero }, + { 4, SNAN_F16, NaN }, + { 5, QNAN_F16, NaN }, + { 6, INF_F16, Inf }, + { 7, NEG_INF_F16, Neg_Inf }, + } + + for d, i in data { + assert(i == d.i) + r = classify_f16(d.v) + tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(%h) -> %v != %v", i, #procedure, d.v, r, d.e)) + } + + /* Check all subnormals (exponent 0, 10-bit significand non-zero) */ + for i :u16 = 1; i < 0x400; i += 1 { + v :f16 = transmute(f16)i + r = classify_f16(v) + e :Float_Class: Subnormal + tc.expect(t, r == e, fmt.tprintf("i:%d %s(%h) -> %v != %v", i, #procedure, v, r, e)) + } +} + +@test +test_classify_f32 :: proc(t: ^testing.T) { + + using math + using Float_Class + + r: Float_Class + + Datum :: struct { + i: int, + v: f32, + e: math.Float_Class, + } + @static data := []Datum{ + { 0, 1.2, Normal }, + { 1, 0h0000_0001, Subnormal }, + { 2, 0.0, Zero }, + { 3, -0.0, Neg_Zero }, + { 4, SNAN_F32, NaN }, + { 5, QNAN_F32, NaN }, + { 6, INF_F32, Inf }, + { 7, NEG_INF_F32, Neg_Inf }, + } + + for d, i in data { + assert(i == d.i) + r = classify_f32(d.v) + tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(%h) -> %v != %v", i, #procedure, d.v, r, d.e)) + } +} + +@test +test_classify_f64 :: proc(t: ^testing.T) { + + using math + using Float_Class + + r: Float_Class + + Datum :: struct { + i: int, + v: f64, + e: math.Float_Class, + } + @static data := []Datum{ + { 0, 1.2, Normal }, + { 1, 0h0000_0000_0000_0001, Subnormal }, + { 2, 0.0, Zero }, + { 3, -0.0, Neg_Zero }, + { 4, SNAN_F64, NaN }, + { 5, QNAN_F64, NaN }, + { 6, INF_F64, Inf }, + { 7, NEG_INF_F64, Neg_Inf }, + } + + for d, i in data { + assert(i == d.i) + r = classify_f64(d.v) + tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(%h) -> %v != %v", i, #procedure, d.v, r, d.e)) + } +} + +@test +test_trunc_f16 :: proc(t: ^testing.T) { + + using math + + r, v: f16 + + Datum :: struct { + i: int, + v: f16, + e: f16, + } + @static data := []Datum{ + { 0, 10.5, 10 }, // Issue #1574 fract in linalg/glm is broken + { 1, -10.5, -10 }, + + { 2, F16_MAX, F16_MAX }, + { 3, -F16_MAX, -F16_MAX }, + { 4, F16_MIN, 0.0 }, + { 5, -F16_MIN, -0.0 }, + { 6, 0.0, 0.0 }, + { 7, -0.0, -0.0 }, + { 8, 1, 1 }, + { 9, -1, -1 }, + { 10, INF_F16, INF_F16 }, + { 11, NEG_INF_F16, NEG_INF_F16 }, + + /* From https://en.wikipedia.org/wiki/Half-precision_floating-point_format */ + { 12, 0h3C01, 1 }, // 0x1.004p+0 (smallest > 1) + { 13, -0h3C01, -1 }, + { 14, 0h3BFF, 0.0 }, // 0x1.ffcp-1 (largest < 1) + { 15, -0h3BFF, -0.0 }, + { 16, 0h0001, 0.0 }, // 0x0.004p-14 (smallest subnormal) + { 17, -0h0001, -0.0 }, + { 18, 0h03FF, 0.0 }, // 0x0.ffcp-14 (largest subnormal) + { 19, -0h03FF, -0.0 }, + + { 20, 0hC809, -8 }, // -0x1.024p+3 + { 21, 0h4458, 4 }, // 0x1.16p+2 + } + + for d, i in data { + assert(i == d.i) + r = trunc_f16(d.v) + tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(%h) -> %h != %h", i, #procedure, d.v, r, d.e)) + } + + v = SNAN_F16 + r = trunc_f16(v) + tc.expect(t, is_nan_f16(r), fmt.tprintf("%s(%f) -> %f != NaN", #procedure, v, r)) + + v = QNAN_F16 + r = trunc_f16(v) + tc.expect(t, is_nan_f16(r), fmt.tprintf("%s(%f) -> %f != NaN", #procedure, v, r)) +} + +@test +test_trunc_f32 :: proc(t: ^testing.T) { + + using math + + r, v: f32 + + Datum :: struct { + i: int, + v: f32, + e: f32, + } + @static data := []Datum{ + { 0, 10.5, 10 }, // Issue #1574 fract in linalg/glm is broken + { 1, -10.5, -10 }, + + { 2, F32_MAX, F32_MAX }, + { 3, -F32_MAX, -F32_MAX }, + { 4, F32_MIN, 0.0 }, + { 5, -F32_MIN, -0.0 }, + { 6, 0.0, 0.0 }, + { 7, -0.0, -0.0 }, + { 8, 1, 1 }, + { 9, -1, -1 }, + { 10, INF_F32, INF_F32 }, + { 11, NEG_INF_F32, NEG_INF_F32 }, + + /* From https://en.wikipedia.org/wiki/Single-precision_floating-point_format */ + { 12, 0h3F80_0001, 1 }, // 0x1.000002p+0 (smallest > 1) + { 13, -0h3F80_0001, -1 }, + { 14, 0h3F7F_FFFF, 0.0 }, // 0x1.fffffep-1 (largest < 1) + { 15, -0h3F7F_FFFF, -0.0 }, + { 16, 0h0000_0001, 0.0 }, // 0x0.000002p-126 (smallest subnormal) + { 17, -0h0000_0001, -0.0 }, + { 18, 0h007F_FFFF, 0.0 }, // 0x0.fffffep-126 (largest subnormal) + { 19, -0h007F_FFFF, -0.0 }, + + /* From libc-test src/math/sanity/truncf.h */ + { 20, 0hC101_11D0, -8 }, // -0x1.0223ap+3 + { 21, 0h408B_0C34, 4 }, // 0x1.161868p+2 + { 22, 0hC106_1A5A, -8 }, // -0x1.0c34b4p+3 + { 23, 0hC0D1_0378, -6 }, // -0x1.a206fp+2 + { 24, 0h4114_45DE, 9 }, // 0x1.288bbcp+3 + { 25, 0h3F29_77E8, 0.0 }, // 0x1.52efdp-1 + { 26, 0hBED0_2E64, -0.0 }, // -0x1.a05cc8p-2 + { 27, 0h3F0F_CF7D, 0.0 }, // 0x1.1f9efap-1 + { 28, 0h3F46_2ED8, 0.0 }, // 0x1.8c5dbp-1 + { 29, 0hBF2D_C375, -0.0 }, // -0x1.5b86eap-1 + } + + for d, i in data { + assert(i == d.i) + r = trunc_f32(d.v) + tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(%h) -> %h != %h", i, #procedure, d.v, r, d.e)) + } + + v = SNAN_F32 + r = trunc_f32(v) + tc.expect(t, is_nan_f32(r), fmt.tprintf("%s(%f) -> %f != NaN", #procedure, v, r)) + + v = QNAN_F32 + r = trunc_f32(v) + tc.expect(t, is_nan_f32(r), fmt.tprintf("%s(%f) -> %f != NaN", #procedure, v, r)) +} + +@test +test_trunc_f64 :: proc(t: ^testing.T) { + + using math + + r, v: f64 + + Datum :: struct { + i: int, + v: f64, + e: f64, + } + data := []Datum{ + { 0, 10.5, 10 }, // Issue #1574 fract in linalg/glm is broken + { 1, -10.5, -10 }, + + { 2, F64_MAX, F64_MAX }, + { 3, -F64_MAX, -F64_MAX }, + { 4, F64_MIN, 0.0 }, + { 5, -F64_MIN, -0.0 }, + { 6, 0.0, 0.0 }, + { 7, -0.0, -0.0 }, + { 8, 1, 1 }, + { 9, -1, -1 }, + { 10, INF_F64, INF_F64 }, + { 11, NEG_INF_F64, NEG_INF_F64 }, + + /* From https://en.wikipedia.org/wiki/Double-precision_floating-point_format */ + { 12, 0h3FF0_0000_0000_0001, 1 }, // 0x1.0000000000001p+0 (smallest > 1) + { 13, -0h3FF0_0000_0000_0001, -1 }, + { 14, 0h3FEF_FFFF_FFFF_FFFF, 0.0 }, // 0x1.fffffffffffffp-1 (largest < 1) + { 15, -0h3FEF_FFFF_FFFF_FFFF, -0.0 }, + { 16, 0h0000_0000_0000_0001, 0.0 }, // 0x0.0000000000001p-1022 (smallest subnormal) + { 17, -0h0000_0000_0000_0001, -0.0 }, + { 18, 0h000F_FFFF_FFFF_FFFF, 0.0 }, // 0x0.fffffffffffffp-1022 (largest subnormal) + { 19, -0h000F_FFFF_FFFF_FFFF, -0.0 }, + + /* From libc-test src/math/sanity/trunc.h */ + { 20, 0hC020_2239_F3C6_A8F1, -8 }, // -0x1.02239f3c6a8f1p+3 + { 21, 0h4011_6186_8E18_BC67, 4 }, // 0x1.161868e18bc67p+2 + { 22, 0hC020_C34B_3E01_E6E7, -8 }, // -0x1.0c34b3e01e6e7p+3 + { 23, 0hC01A_206F_0A19_DCC4, -6 }, // -0x1.a206f0a19dcc4p+2 + { 24, 0h4022_88BB_B0D6_A1E6, 9 }, // 0x1.288bbb0d6a1e6p+3 + { 25, 0h3FE5_2EFD_0CD8_0497, 0.0 }, // 0x1.52efd0cd80497p-1 + { 26, 0hBFDA_05CC_7544_81D1, -0.0 }, // -0x1.a05cc754481d1p-2 + { 27, 0h3FE1_F9EF_9347_45CB, 0.0 }, // 0x1.1f9ef934745cbp-1 + { 28, 0h3FE8_C5DB_097F_7442, 0.0 }, // 0x1.8c5db097f7442p-1 + { 29, 0hBFE5_B86E_A811_8A0E, -0.0 }, // -0x1.5b86ea8118a0ep-1 + } + + for d, i in data { + assert(i == d.i) + r = trunc_f64(d.v) + tc.expect(t, r == d.e, fmt.tprintf("i:%d %s(%h) -> %h != %h", i, #procedure, d.v, r, d.e)) + } + + v = SNAN_F64 + r = trunc_f64(v) + tc.expect(t, is_nan_f64(r), fmt.tprintf("%s(%f) -> %f != NaN", #procedure, v, r)) + + v = QNAN_F64 + r = trunc_f64(v) + tc.expect(t, is_nan_f64(r), fmt.tprintf("%s(%f) -> %f != NaN", #procedure, v, r)) +} From 0278ac85a04309c8777663afe733e984a44bbcc8 Mon Sep 17 00:00:00 2001 From: Al Hoang <3811822-hoanga@users.noreply.gitlab.com> Date: Tue, 8 Mar 2022 23:48:25 -0600 Subject: [PATCH 25/56] update to build for FreeBSD --- Makefile | 6 ++++++ core/os/os_freebsd.odin | 4 ++-- core/os/stat_unix.odin | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index ceff3c207..b8bf26a88 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,12 @@ ifeq ($(OS), OpenBSD) CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) LDFLAGS:=$(LDFLAGS) $(shell $(LLVM_CONFIG) --libs core native --system-libs) endif +ifeq ($(OS), FreeBSD) + LLVM_CONFIG=/usr/local/bin/llvm-config11 + + CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) + LDFLAGS:=$(LDFLAGS) $(shell $(LLVM_CONFIG) --libs core native --system-libs) +endif all: debug demo diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index e31eb31bb..4f31b1492 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -232,10 +232,10 @@ foreign libc { @(link_name="close") _unix_close :: proc(fd: Handle) -> c.int --- @(link_name="read") _unix_read :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t --- @(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t --- - @(link_name="lseek64") _unix_seek :: proc(fd: Handle, offset: i64, whence: c.int) -> i64 --- + @(link_name="lseek") _unix_seek :: proc(fd: Handle, offset: i64, whence: c.int) -> i64 --- @(link_name="gettid") _unix_gettid :: proc() -> u64 --- @(link_name="getpagesize") _unix_getpagesize :: proc() -> c.int --- - @(link_name="stat64") _unix_stat :: proc(path: cstring, stat: ^OS_Stat) -> c.int --- + @(link_name="stat") _unix_stat :: proc(path: cstring, stat: ^OS_Stat) -> c.int --- @(link_name="fstat") _unix_fstat :: proc(fd: Handle, stat: ^OS_Stat) -> c.int --- @(link_name="access") _unix_access :: proc(path: cstring, mask: c.int) -> c.int --- diff --git a/core/os/stat_unix.odin b/core/os/stat_unix.odin index 2aa9fc283..c82466b08 100644 --- a/core/os/stat_unix.odin +++ b/core/os/stat_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, freebsd, openbsd +//+build linux, darwin, openbsd package os import "core:time" From 5eebdebec89aa4a6041cf1eb4b72a74bbd669db4 Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 05:09:39 -0800 Subject: [PATCH 26/56] Make llvm-config build more general for linux --- Makefile | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index ceff3c207..e77acea93 100644 --- a/Makefile +++ b/Makefile @@ -30,25 +30,29 @@ ifeq ($(OS), Darwin) ifeq ($(shell $(LLVM_CONFIG) --version | grep -E $(LLVM_VERSION_PATTERN)),) ifeq ($(ARCH), arm64) $(error "Requirement: llvm-config must be base version 13 for arm64") - else + else $(error "Requirement: llvm-config must be base version greater than 11 for amd64/x86") - endif - endif + endif + endif LDFLAGS:=$(LDFLAGS) -liconv -ldl CFLAGS:=$(CFLAGS) $(shell $(LLVM_CONFIG) --cxxflags --ldflags) LDFLAGS:=$(LDFLAGS) -lLLVM-C endif ifeq ($(OS), Linux) - LLVM_CONFIG=llvm-config-11 - ifneq ($(shell which llvm-config-11 2>/dev/null),) - LLVM_CONFIG=llvm-config-11 - else ifneq ($(shell which llvm-config-11-64 2>/dev/null),) - LLVM_CONFIG=llvm-config-11-64 - else - ifeq ($(shell $(LLVM_CONFIG) --version | grep '^11\.'),) - $(error "Requirement: llvm-config must be version 11") - endif + LLVM_CONFIG=llvm-config + + LLVM_VERSIONS = "13.%.%" "12.0.1" "11.1.0" + + LLVM_VERSION_PATTERN_SEPERATOR = )|( + LLVM_VERSION_PATTERNS_ESCAPED_DOT = $(subst .,\.,$(LLVM_VERSIONS)) + LLVM_VERSION_PATTERNS_REPLACE_PERCENT = $(subst %,.*,$(LLVM_VERSION_PATTERNS_ESCAPED_DOT)) + LLVM_VERSION_PATTERN_REMOVE_ELEMENTS = $(subst " ",$(LLVM_VERSION_PATTERN_SEPERATOR),$(LLVM_VERSION_PATTERNS_REPLACE_PERCENT)) + LLMV_VERSION_PATTERN_REMOVE_SINGLE_STR = $(subst ",,$(LLVM_VERSION_PATTERN_REMOVE_ELEMENTS)) + LLVM_VERSION_PATTERN = "^(($(LLMV_VERSION_PATTERN_REMOVE_SINGLE_STR)))" + + ifeq ($(shell $(LLVM_CONFIG) --version | grep -E $(LLVM_VERSION_PATTERN)),) + $(error "Requirement: llvm-config must be base version greater than 11") endif LDFLAGS:=$(LDFLAGS) -ldl From 3092fb2ff3ab776290eefb8df27def79cc1fbe77 Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 06:01:40 -0800 Subject: [PATCH 27/56] Add initial cut of build script --- build_odin.sh | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100755 build_odin.sh diff --git a/build_odin.sh b/build_odin.sh new file mode 100755 index 000000000..5b3767a1a --- /dev/null +++ b/build_odin.sh @@ -0,0 +1,118 @@ +#!/bin/bash +set -eu + +GIT_SHA=$(git rev-parse --short HEAD) +DISABLED_WARNINGS="-Wno-switch -Wno-macro-redefined -Wno-unused-value" +LDFLAGS="-pthread -lm -lstdc++" +CFLAGS="-std=c++14 -DGIT_SHA=\"$GIT_SHA\"" +CFLAGS="$CFLAGS -DODIN_VERSION_RAW=\"dev-$(date +"%Y-%m")\"" +CC=clang +OS=$(uname) + +panic() { + printf "%s\n" "$1" + exit 1 +} + +config_darwin() { + ARCH=$(uname -m) + LLVM_CONFIG=llvm-config + + # allow for arm only llvm's with version 13 + if [ ARCH == arm64 ]; then + LLVM_VERSIONS="13.%.%" + else + # allow for x86 / amd64 all llvm versions begining from 11 + LLVM_VERSIONS="13.%.%" "12.0.1" "11.1.0" + fi + + if [ $($LLVM_CONFIG --version | grep -E $(LLVM_VERSION_PATTERN)) == 0 ]; then + if [ ARCH == arm64 ]; then + panic "Requirement: llvm-config must be base version 13 for arm64" + else + panic "Requirement: llvm-config must be base version greater than 11 for amd64/x86" + fi + fi + + LDFLAGS="$LDFLAGS -liconv -ldl" + CFLAGS="$CFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" + LDFLAGS="$LDFLAGS -lLLVM-C" +} + +config_openbsd() { + LLVM_CONFIG=/usr/local/bin/llvm-config + + LDFLAGS="$LDFLAGS -liconv" + CFLAGS="$CFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" + LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" +} + +config_linux() { + LLVM_CONFIG=llvm-config + + LDFLAGS="$LDFLAGS -ldl" + CFLAGS="$CFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" + LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" +} + +build_odin() { + set -x + $CC src/main.cpp src/libtommath.cpp $DISABLED_WARNINGS $CFLAGS $EXTRAFLAGS $LDFLAGS -o odin + set +x +} + +run_demo() { + ./odin run examples/demo/demo.odin +} + +case $OS in +Linux) + config_linux + ;; +Darwin) + config_darwin + ;; +OpenBSD) + config_openbsd + ;; +esac + +if [[ $# -eq 0 ]]; then + EXTRAFLAGS="-g" + + build_odin + run_demo + + exit 0 +fi + +if [[ $# -eq 1 ]]; then + case $1 in + report) + EXTRAFLAGS="-g" + build_odin + ./odin report + exit 0 + ;; + debug) + EXTRAFLAGS="-g" + ;; + release) + EXTRAFLAGS="-O3" + ;; + release_native) + EXTRAFLAGS="-O3 -march=native" + ;; + nightly) + EXTRAFLAGS="-DNIGHTLY -O3" + ;; + *) + panic "Unsupported build option!" + ;; + esac + + build_odin + run_demo + + exit 0 +fi From d1477bcfa74fbc04813ceff4e603c1c982fd4d33 Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 06:07:19 -0800 Subject: [PATCH 28/56] Fix wonky copied space issues --- build_odin.sh | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/build_odin.sh b/build_odin.sh index 5b3767a1a..e836cb0ac 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -16,43 +16,43 @@ panic() { config_darwin() { ARCH=$(uname -m) - LLVM_CONFIG=llvm-config + LLVM_CONFIG=llvm-config - # allow for arm only llvm's with version 13 + # allow for arm only llvm's with version 13 if [ ARCH == arm64 ]; then - LLVM_VERSIONS="13.%.%" + LLVM_VERSIONS="13.%.%" else - # allow for x86 / amd64 all llvm versions begining from 11 - LLVM_VERSIONS="13.%.%" "12.0.1" "11.1.0" + # allow for x86 / amd64 all llvm versions begining from 11 + LLVM_VERSIONS="13.%.%" "12.0.1" "11.1.0" fi if [ $($LLVM_CONFIG --version | grep -E $(LLVM_VERSION_PATTERN)) == 0 ]; then if [ ARCH == arm64 ]; then - panic "Requirement: llvm-config must be base version 13 for arm64" + panic "Requirement: llvm-config must be base version 13 for arm64" else panic "Requirement: llvm-config must be base version greater than 11 for amd64/x86" fi - fi + fi - LDFLAGS="$LDFLAGS -liconv -ldl" - CFLAGS="$CFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" - LDFLAGS="$LDFLAGS -lLLVM-C" + LDFLAGS="$LDFLAGS -liconv -ldl" + CFLAGS="$CFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" + LDFLAGS="$LDFLAGS -lLLVM-C" } config_openbsd() { - LLVM_CONFIG=/usr/local/bin/llvm-config + LLVM_CONFIG=/usr/local/bin/llvm-config - LDFLAGS="$LDFLAGS -liconv" - CFLAGS="$CFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" - LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" + LDFLAGS="$LDFLAGS -liconv" + CFLAGS="$CFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" + LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" } config_linux() { - LLVM_CONFIG=llvm-config + LLVM_CONFIG=llvm-config - LDFLAGS="$LDFLAGS -ldl" - CFLAGS="$CFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" - LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" + LDFLAGS="$LDFLAGS -ldl" + CFLAGS="$CFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" + LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" } build_odin() { From 005d52cab7db883269e325ca8c0bb9e56a6e542e Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 06:08:48 -0800 Subject: [PATCH 29/56] more spacing issues --- build_odin.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_odin.sh b/build_odin.sh index e836cb0ac..634e4aa7f 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -26,7 +26,7 @@ config_darwin() { LLVM_VERSIONS="13.%.%" "12.0.1" "11.1.0" fi - if [ $($LLVM_CONFIG --version | grep -E $(LLVM_VERSION_PATTERN)) == 0 ]; then + if [ $($LLVM_CONFIG --version | grep -E $(LLVM_VERSION_PATTERN)) == 0 ]; then if [ ARCH == arm64 ]; then panic "Requirement: llvm-config must be base version 13 for arm64" else From f5cc8bd7bf0071d46fb39091a23fe19def22c02b Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 06:14:30 -0800 Subject: [PATCH 30/56] only build odin for report when necessary --- build_odin.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/build_odin.sh b/build_odin.sh index 634e4aa7f..77d69a6e5 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -89,8 +89,11 @@ fi if [[ $# -eq 1 ]]; then case $1 in report) - EXTRAFLAGS="-g" - build_odin + if [[ ! -f "./odin" ]]; then + EXTRAFLAGS="-g" + build_odin + fi + ./odin report exit 0 ;; From db169a4334862a8e49b7492452e4da51aeee814a Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 06:26:25 -0800 Subject: [PATCH 31/56] Cleanup build mode selection --- build_odin.sh | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/build_odin.sh b/build_odin.sh index 77d69a6e5..dac89acf7 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -56,6 +56,23 @@ config_linux() { } build_odin() { + case $1 in + debug) + EXTRAFLAGS="-g" + ;; + release) + EXTRAFLAGS="-O3" + ;; + release-native) + EXTRAFLAGS="-O3 -march=native" + ;; + nightly) + EXTRAFLAGS="-DNIGHTLY -O3" + ;; + *) + panic "Build mode unsupported!" + esac + set -x $CC src/main.cpp src/libtommath.cpp $DISABLED_WARNINGS $CFLAGS $EXTRAFLAGS $LDFLAGS -o odin set +x @@ -75,14 +92,13 @@ Darwin) OpenBSD) config_openbsd ;; +*) + panic "Platform unsupported!" esac if [[ $# -eq 0 ]]; then - EXTRAFLAGS="-g" - - build_odin + build_odin debug run_demo - exit 0 fi @@ -90,32 +106,17 @@ if [[ $# -eq 1 ]]; then case $1 in report) if [[ ! -f "./odin" ]]; then - EXTRAFLAGS="-g" - build_odin + build_odin debug fi ./odin report exit 0 ;; - debug) - EXTRAFLAGS="-g" - ;; - release) - EXTRAFLAGS="-O3" - ;; - release_native) - EXTRAFLAGS="-O3 -march=native" - ;; - nightly) - EXTRAFLAGS="-DNIGHTLY -O3" - ;; *) - panic "Unsupported build option!" + build_odin $1 ;; esac - build_odin run_demo - exit 0 fi From d5b0632e4f7aa289c2876d6248508bff6e68a7b5 Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 06:27:52 -0800 Subject: [PATCH 32/56] add handling for too many args --- build_odin.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build_odin.sh b/build_odin.sh index dac89acf7..8cd0849a7 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -119,4 +119,6 @@ if [[ $# -eq 1 ]]; then run_demo exit 0 +else + panic "Too many arguments!" fi From 9aea990184b35dadbd786b70730111735fb4fc0a Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 06:49:52 -0800 Subject: [PATCH 33/56] clean up osx semver handling in build --- build_odin.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build_odin.sh b/build_odin.sh index 8cd0849a7..80c35dc44 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -14,19 +14,21 @@ panic() { exit 1 } +function version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; } + config_darwin() { ARCH=$(uname -m) LLVM_CONFIG=llvm-config # allow for arm only llvm's with version 13 if [ ARCH == arm64 ]; then - LLVM_VERSIONS="13.%.%" + MIN_LLVM_VERSION=("13.0.0") else # allow for x86 / amd64 all llvm versions begining from 11 - LLVM_VERSIONS="13.%.%" "12.0.1" "11.1.0" + MIN_LLVM_VERSION=("11.1.0") fi - if [ $($LLVM_CONFIG --version | grep -E $(LLVM_VERSION_PATTERN)) == 0 ]; then + if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then if [ ARCH == arm64 ]; then panic "Requirement: llvm-config must be base version 13 for arm64" else From 34a9f55f3771c05695f3e4c886b7c067d7aec5e2 Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 06:52:22 -0800 Subject: [PATCH 34/56] Update ci to use build script --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 412587b3c..cbe3fc08c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ jobs: - name: Download LLVM, botan run: sudo apt-get install llvm-11 clang-11 llvm libbotan-2-dev botan - name: build odin - run: make release + run: ./build_odin.sh release - name: Odin version run: ./odin version timeout-minutes: 1 @@ -55,7 +55,7 @@ jobs: TMP_PATH=$(xcrun --show-sdk-path)/user/include echo "CPATH=$TMP_PATH" >> $GITHUB_ENV - name: build odin - run: make release + run: ./build_odin.sh release - name: Odin version run: ./odin version timeout-minutes: 1 From c543ecd64c0681a7dc92fd3edef670380a24756e Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 06:57:59 -0800 Subject: [PATCH 35/56] Try to find llvm-config-11 on goofy misconfigured CI box --- build_odin.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/build_odin.sh b/build_odin.sh index 80c35dc44..911e8a2d5 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -52,6 +52,15 @@ config_openbsd() { config_linux() { LLVM_CONFIG=llvm-config + MIN_LLVM_VERSION=("11.1.0") + if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then + + LLVM_CONFIG=llvm-config-11 + if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then + panic "Requirement: llvm-config must be base version greater than 11" + fi + fi + LDFLAGS="$LDFLAGS -ldl" CFLAGS="$CFLAGS $($LLVM_CONFIG --cxxflags --ldflags)" LDFLAGS="$LDFLAGS $($LLVM_CONFIG --libs core native --system-libs)" From 7adaa4dc2b3784997ad38e499133bdfe4651c02c Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 07:15:08 -0800 Subject: [PATCH 36/56] refix make, adjust build for CI weirdness --- Makefile | 22 +++++++++------------- build_odin.sh | 16 ++++++++++------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Makefile b/Makefile index e77acea93..8de6ff06b 100644 --- a/Makefile +++ b/Makefile @@ -40,19 +40,15 @@ ifeq ($(OS), Darwin) LDFLAGS:=$(LDFLAGS) -lLLVM-C endif ifeq ($(OS), Linux) - LLVM_CONFIG=llvm-config - - LLVM_VERSIONS = "13.%.%" "12.0.1" "11.1.0" - - LLVM_VERSION_PATTERN_SEPERATOR = )|( - LLVM_VERSION_PATTERNS_ESCAPED_DOT = $(subst .,\.,$(LLVM_VERSIONS)) - LLVM_VERSION_PATTERNS_REPLACE_PERCENT = $(subst %,.*,$(LLVM_VERSION_PATTERNS_ESCAPED_DOT)) - LLVM_VERSION_PATTERN_REMOVE_ELEMENTS = $(subst " ",$(LLVM_VERSION_PATTERN_SEPERATOR),$(LLVM_VERSION_PATTERNS_REPLACE_PERCENT)) - LLMV_VERSION_PATTERN_REMOVE_SINGLE_STR = $(subst ",,$(LLVM_VERSION_PATTERN_REMOVE_ELEMENTS)) - LLVM_VERSION_PATTERN = "^(($(LLMV_VERSION_PATTERN_REMOVE_SINGLE_STR)))" - - ifeq ($(shell $(LLVM_CONFIG) --version | grep -E $(LLVM_VERSION_PATTERN)),) - $(error "Requirement: llvm-config must be base version greater than 11") + LLVM_CONFIG=llvm-config-11 + ifneq ($(shell which llvm-config-11 2>/dev/null),) + LLVM_CONFIG=llvm-config-11 + else ifneq ($(shell which llvm-config-11-64 2>/dev/null),) + LLVM_CONFIG=llvm-config-11-64 + else + ifeq ($(shell $(LLVM_CONFIG) --version | grep '^11\.'),) + $(error "Requirement: llvm-config must be version 11") + endif endif LDFLAGS:=$(LDFLAGS) -ldl diff --git a/build_odin.sh b/build_odin.sh index 911e8a2d5..c707f4e67 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -50,15 +50,19 @@ config_openbsd() { } config_linux() { - LLVM_CONFIG=llvm-config + if which llvm-config > /dev/null 2>&1; then + LLVM_CONFIG=llvm-config + elif which llvm-config-11 > /dev/null 2>&1; then + LLVM_CONFIG=llvm-config-11 + elif which llvm-config-11-64 > /dev/null 2>&1; then + LLVM_CONFIG=llvm-config-11-64 + else + panic "Unable to find LLVM-config" + fi MIN_LLVM_VERSION=("11.1.0") if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then - - LLVM_CONFIG=llvm-config-11 - if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then - panic "Requirement: llvm-config must be base version greater than 11" - fi + panic "Requirement: llvm-config must be base version greater than 11" fi LDFLAGS="$LDFLAGS -ldl" From 3bd1ac4c82a0e6944f3218ad38c4f5f5995d703e Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 07:18:41 -0800 Subject: [PATCH 37/56] test adjusting apt arg order --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cbe3fc08c..d5179e51b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Download LLVM, botan - run: sudo apt-get install llvm-11 clang-11 llvm libbotan-2-dev botan + run: sudo apt-get install llvm llvm-11 clang-11 libbotan-2-dev botan - name: build odin run: ./build_odin.sh release - name: Odin version From 1306c53fb1829b3454c795bf923c8c7f6f3c4483 Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 07:21:19 -0800 Subject: [PATCH 38/56] more build tweaks? --- build_odin.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/build_odin.sh b/build_odin.sh index c707f4e67..dc6434e19 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -62,6 +62,7 @@ config_linux() { MIN_LLVM_VERSION=("11.1.0") if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then + echo "Tried to use " $(which $LLVM_CONFIG) "version" $($LLVM_CONFIG --version) panic "Requirement: llvm-config must be base version greater than 11" fi From 7f8a9587e0d375486e3b45f9627463b8ec9421a1 Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 07:22:48 -0800 Subject: [PATCH 39/56] more build tweaks? --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d5179e51b..a7aa1b265 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ jobs: steps: - uses: actions/checkout@v1 - name: Download LLVM, botan - run: sudo apt-get install llvm llvm-11 clang-11 libbotan-2-dev botan + run: sudo apt-get install llvm-11 clang-11 libbotan-2-dev botan - name: build odin run: ./build_odin.sh release - name: Odin version From a2250a5d4918498f6c68423c7dcd02c1910ceaec Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 07:24:49 -0800 Subject: [PATCH 40/56] lower minimum llvm version --- build_odin.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_odin.sh b/build_odin.sh index dc6434e19..11d098952 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -60,7 +60,7 @@ config_linux() { panic "Unable to find LLVM-config" fi - MIN_LLVM_VERSION=("11.1.0") + MIN_LLVM_VERSION=("11.0.0") if [ $(version $($LLVM_CONFIG --version)) -lt $(version $MIN_LLVM_VERSION) ]; then echo "Tried to use " $(which $LLVM_CONFIG) "version" $($LLVM_CONFIG --version) panic "Requirement: llvm-config must be base version greater than 11" From 2652c2d7a573cc44379d7843472b9f379246d31b Mon Sep 17 00:00:00 2001 From: Colin Davidson Date: Wed, 9 Mar 2022 07:42:38 -0800 Subject: [PATCH 41/56] normalize version parser --- build_odin.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_odin.sh b/build_odin.sh index 11d098952..a323782a1 100755 --- a/build_odin.sh +++ b/build_odin.sh @@ -14,7 +14,7 @@ panic() { exit 1 } -function version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; } +version() { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; } config_darwin() { ARCH=$(uname -m) From c6dc5170042057da9bd4708f81017a3a994b2293 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 11 Mar 2022 08:52:16 +0000 Subject: [PATCH 42/56] Correct: murmur32 --- core/hash/hash.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/hash/hash.odin b/core/hash/hash.odin index 5044d567a..f2152f1b6 100644 --- a/core/hash/hash.odin +++ b/core/hash/hash.odin @@ -151,7 +151,7 @@ murmur32 :: proc(data: []byte, seed := u32(0)) -> u32 { k1 ~= u32(tail[2]) << 16 fallthrough case 2: - k1 ~= u32(tail[2]) << 8 + k1 ~= u32(tail[1]) << 8 fallthrough case 1: k1 ~= u32(tail[0]) From 7a7b87181dda2f5b3ac3f3286861f033fdd60aa9 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Fri, 11 Mar 2022 11:09:58 +0100 Subject: [PATCH 43/56] [examples] Add `core:encoding/varint` to `examples/all`. --- examples/all/all_main.odin | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/all/all_main.odin b/examples/all/all_main.odin index e694060d2..7d2082250 100644 --- a/examples/all/all_main.odin +++ b/examples/all/all_main.odin @@ -54,6 +54,7 @@ import base64 "core:encoding/base64" import csv "core:encoding/csv" import hxa "core:encoding/hxa" import json "core:encoding/json" +import varint "core:encoding/varint" import fmt "core:fmt" import hash "core:hash" @@ -153,6 +154,7 @@ _ :: base64 _ :: csv _ :: hxa _ :: json +_ :: varint _ :: fmt _ :: hash _ :: image From 8982ae34e38d5937b7cb74d95c30cb6a2bac8146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sat, 12 Mar 2022 09:19:52 +0000 Subject: [PATCH 44/56] fix linux_arm64 - SYS_fork doesn't exist, uses SYS_clone - properly cast AT_FDCWD to uintptr --- core/os/os_linux.odin | 26 +++++++++++++++----------- core/sys/unix/syscalls_linux.odin | 2 ++ 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/core/os/os_linux.odin b/core/os/os_linux.odin index 9716e2925..ed73341c0 100644 --- a/core/os/os_linux.odin +++ b/core/os/os_linux.odin @@ -269,7 +269,7 @@ X_OK :: 1 // Test for execute permission W_OK :: 2 // Test for write permission R_OK :: 4 // Test for read permission -AT_FDCWD :: -100 +AT_FDCWD :: ~uintptr(99) /* -100 */ AT_REMOVEDIR :: uintptr(0x200) AT_SYMLINK_NOFOLLOW :: uintptr(0x100) @@ -278,7 +278,11 @@ _unix_personality :: proc(persona: u64) -> int { } _unix_fork :: proc() -> Pid { - res := int(intrinsics.syscall(unix.SYS_fork)) + when ODIN_ARCH != .arm64 { + res := int(intrinsics.syscall(unix.SYS_fork)) + } else { + res := int(intrinsics.syscall(unix.SYS_clone, unix.SIGCHLD)) + } return -1 if res < 0 else Pid(res) } @@ -286,7 +290,7 @@ _unix_open :: proc(path: cstring, flags: int, mode: int = 0o000) -> Handle { when ODIN_ARCH != .arm64 { res := int(intrinsics.syscall(unix.SYS_open, uintptr(rawptr(path)), uintptr(flags), uintptr(mode))) } else { // NOTE: arm64 does not have open - res := int(intrinsics.syscall(unix.SYS_openat, uintptr(AT_FDCWD), uintptr(rawptr(path), uintptr(flags), uintptr(mode)))) + res := int(intrinsics.syscall(unix.SYS_openat, AT_FDCWD, uintptr(rawptr(path)), uintptr(flags), uintptr(mode))) } return -1 if res < 0 else Handle(res) } @@ -321,7 +325,7 @@ _unix_stat :: proc(path: cstring, stat: ^OS_Stat) -> int { } else when ODIN_ARCH != .arm64 { return int(intrinsics.syscall(unix.SYS_stat64, uintptr(rawptr(path)), uintptr(stat))) } else { // NOTE: arm64 does not have stat - return int(intrinsics.syscall(unix.SYS_fstatat, uintptr(AT_FDCWD), uintptr(rawptr(path)), uintptr(stat), 0)) + return int(intrinsics.syscall(unix.SYS_fstatat, AT_FDCWD, uintptr(rawptr(path)), uintptr(stat), 0)) } } @@ -339,7 +343,7 @@ _unix_lstat :: proc(path: cstring, stat: ^OS_Stat) -> int { } else when ODIN_ARCH != .arm64 { return int(intrinsics.syscall(unix.SYS_lstat64, uintptr(rawptr(path)), uintptr(stat))) } else { // NOTE: arm64 does not have any lstat - return int(intrinsics.syscall(unix.SYS_fstatat, uintptr(AT_FDCWD), uintptr(rawptr(path)), uintptr(stat), AT_SYMLINK_NOFOLLOW)) + return int(intrinsics.syscall(unix.SYS_fstatat, AT_FDCWD, uintptr(rawptr(path)), uintptr(stat), AT_SYMLINK_NOFOLLOW)) } } @@ -347,7 +351,7 @@ _unix_readlink :: proc(path: cstring, buf: rawptr, bufsiz: uint) -> int { when ODIN_ARCH != .arm64 { return int(intrinsics.syscall(unix.SYS_readlink, uintptr(rawptr(path)), uintptr(buf), uintptr(bufsiz))) } else { // NOTE: arm64 does not have readlink - return int(intrinsics.syscall(unix.SYS_readlinkat, uintptr(AT_FDCWD), uintptr(rawptr(path)), uintptr(buf), uintptr(bufsiz))) + return int(intrinsics.syscall(unix.SYS_readlinkat, AT_FDCWD, uintptr(rawptr(path)), uintptr(buf), uintptr(bufsiz))) } } @@ -355,7 +359,7 @@ _unix_access :: proc(path: cstring, mask: int) -> int { when ODIN_ARCH != .arm64 { return int(intrinsics.syscall(unix.SYS_access, uintptr(rawptr(path)), uintptr(mask))) } else { // NOTE: arm64 does not have access - return int(intrinsics.syscall(unix.SYS_faccessat, uintptr(AT_FDCWD), uintptr(rawptr(path)), uintptr(mask))) + return int(intrinsics.syscall(unix.SYS_faccessat, AT_FDCWD, uintptr(rawptr(path)), uintptr(mask))) } } @@ -371,7 +375,7 @@ _unix_rename :: proc(old, new: cstring) -> int { when ODIN_ARCH != .arm64 { return int(intrinsics.syscall(unix.SYS_rename, uintptr(rawptr(old)), uintptr(rawptr(new)))) } else { // NOTE: arm64 does not have rename - return int(intrinsics.syscall(unix.SYS_renameat, uintptr(AT_FDCWD), uintptr(rawptr(old)), uintptr(rawptr(new)))) + return int(intrinsics.syscall(unix.SYS_renameat, AT_FDCWD, uintptr(rawptr(old)), uintptr(rawptr(new)))) } } @@ -379,7 +383,7 @@ _unix_unlink :: proc(path: cstring) -> int { when ODIN_ARCH != .arm64 { return int(intrinsics.syscall(unix.SYS_unlink, uintptr(rawptr(path)))) } else { // NOTE: arm64 does not have unlink - return int(intrinsics.syscall(unix.SYS_unlinkat, uintptr(AT_FDCWD), uintptr(rawptr(path), 0))) + return int(intrinsics.syscall(unix.SYS_unlinkat, AT_FDCWD, uintptr(rawptr(path)), 0)) } } @@ -387,7 +391,7 @@ _unix_rmdir :: proc(path: cstring) -> int { when ODIN_ARCH != .arm64 { return int(intrinsics.syscall(unix.SYS_rmdir, uintptr(rawptr(path)))) } else { // NOTE: arm64 does not have rmdir - return int(intrinsics.syscall(unix.SYS_unlinkat, uintptr(AT_FDCWD), uintptr(rawptr(path)), AT_REMOVEDIR)) + return int(intrinsics.syscall(unix.SYS_unlinkat, AT_FDCWD, uintptr(rawptr(path)), AT_REMOVEDIR)) } } @@ -395,7 +399,7 @@ _unix_mkdir :: proc(path: cstring, mode: u32) -> int { when ODIN_ARCH != .arm64 { return int(intrinsics.syscall(unix.SYS_mkdir, uintptr(rawptr(path)), uintptr(mode))) } else { // NOTE: arm64 does not have mkdir - return int(intrinsics.syscall(unix.SYS_mkdirat, uintptr(AT_FDCWD), uintptr(rawptr(path)), uintptr(mode))) + return int(intrinsics.syscall(unix.SYS_mkdirat, AT_FDCWD, uintptr(rawptr(path)), uintptr(mode))) } } diff --git a/core/sys/unix/syscalls_linux.odin b/core/sys/unix/syscalls_linux.odin index 0082c7261..3d06d42d4 100644 --- a/core/sys/unix/syscalls_linux.odin +++ b/core/sys/unix/syscalls_linux.odin @@ -675,6 +675,8 @@ when ODIN_ARCH == .amd64 { SYS_landlock_create_ruleset : uintptr : 444 SYS_landlock_add_rule : uintptr : 445 SYS_landlock_restrict_self : uintptr : 446 + + SIGCHLD :: 17 } else when ODIN_ARCH == .i386 { SYS_restart_syscall : uintptr : 0 SYS_exit : uintptr : 1 From 15f9795ab051b0ed711be51c0e1cbb4f7fbaae52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sat, 12 Mar 2022 09:21:46 +0000 Subject: [PATCH 45/56] enable linux_arm64 check in CI --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 412587b3c..a42716dd0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -87,6 +87,9 @@ jobs: - name: Odin check examples/all for Darwin arm64 run: ./odin check examples/all -vet -strict-style -target:darwin_arm64 timeout-minutes: 10 + - name: Odin check examples/all for Linux arm64 + run: ./odin check examples/all -vet -strict-style -target:linux_arm64 + timeout-minutes: 10 build_windows: runs-on: windows-2019 steps: From f7c8b40ea2c133d91827ed788adfb23b24fa1838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sat, 12 Mar 2022 09:40:55 +0000 Subject: [PATCH 46/56] use distinct type for fpos_t on OpenBSD --- core/c/libc/stdio.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/c/libc/stdio.odin b/core/c/libc/stdio.odin index fc65b954a..c0d9f9d14 100644 --- a/core/c/libc/stdio.odin +++ b/core/c/libc/stdio.odin @@ -79,7 +79,7 @@ when ODIN_OS == .Linux { } when ODIN_OS == .OpenBSD { - fpos_t :: i64 + fpos_t :: distinct i64 _IOFBF :: 0 _IOLBF :: 1 From c12c7d53701e1ba9d110a9c4bd61fc2cb19a8fd1 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 12 Mar 2022 10:47:52 +0000 Subject: [PATCH 47/56] Remove tag --- core/sync/sync2/primitives.odin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sync/sync2/primitives.odin b/core/sync/sync2/primitives.odin index 046ecbc35..6d056d439 100644 --- a/core/sync/sync2/primitives.odin +++ b/core/sync/sync2/primitives.odin @@ -11,7 +11,7 @@ current_thread_id :: proc "contextless" () -> int { // // A Mutex must not be copied after first use Mutex :: struct { - impl: _Mutex `This is a tag`, + impl: _Mutex, } // mutex_lock locks m From f907516cbd0078b69996929d02742d0c1a48c226 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 12 Mar 2022 10:48:31 +0000 Subject: [PATCH 48/56] #Fix 1615 Replace `llvm.readcyclecounter` with `cntvct_el0` on arm64 --- src/llvm_backend_proc.cpp | 21 +++++++++++++++------ src/llvm_backend_utility.cpp | 2 +- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index eb6c89b85..1698c211b 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -1402,14 +1402,23 @@ lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValue const &tv, case BuiltinProc_read_cycle_counter: { - char const *name = "llvm.readcyclecounter"; - unsigned id = LLVMLookupIntrinsicID(name, gb_strlen(name)); - GB_ASSERT_MSG(id != 0, "Unable to find %s", name); - LLVMValueRef ip = LLVMGetIntrinsicDeclaration(p->module->mod, id, nullptr, 0); - lbValue res = {}; - res.value = LLVMBuildCall(p->builder, ip, nullptr, 0, ""); res.type = tv.type; + + if (build_context.metrics.arch == TargetArch_arm64) { + LLVMTypeRef func_type = LLVMFunctionType(LLVMInt64TypeInContext(p->module->ctx), nullptr, 0, false); + bool has_side_effects = false; + LLVMValueRef the_asm = llvm_get_inline_asm(func_type, str_lit("mrs x9, cntvct_el0"), str_lit("=r"), has_side_effects); + GB_ASSERT(the_asm != nullptr); + res.value = LLVMBuildCall2(p->builder, func_type, the_asm, nullptr, 0, ""); + } else { + char const *name = "llvm.readcyclecounter"; + unsigned id = LLVMLookupIntrinsicID(name, gb_strlen(name)); + GB_ASSERT_MSG(id != 0, "Unable to find %s", name); + LLVMValueRef ip = LLVMGetIntrinsicDeclaration(p->module->mod, id, nullptr, 0); + + res.value = LLVMBuildCall(p->builder, ip, nullptr, 0, ""); + } return res; } diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 431cfea9b..15075380a 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1779,7 +1779,7 @@ LLVMValueRef llvm_get_inline_asm(LLVMTypeRef func_type, String const &str, Strin 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, + has_side_effects, is_align_stack, dialect #if LLVM_VERSION_MAJOR >= 13 , /*CanThrow*/false From ca67cf032c5a8e0c0fe711fe668cf4d77b080a62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sun, 13 Mar 2022 11:42:42 +0000 Subject: [PATCH 49/56] freebsd_amd64 support --- core/c/libc/stdio.odin | 25 ++ core/c/libc/wctype.odin | 14 +- core/os/dir_freebsd.odin | 70 ++++++ core/os/os_freebsd.odin | 311 +++++++++++++++++++++--- core/os/stat_unix.odin | 4 +- core/sync/sync2/futex_freebsd.odin | 75 ++++++ core/sync/sync2/primitives_freebsd.odin | 9 + core/sync/sync_freebsd.odin | 14 +- core/sys/unix/pthread_freebsd.odin | 90 +++---- 9 files changed, 515 insertions(+), 97 deletions(-) create mode 100644 core/os/dir_freebsd.odin create mode 100644 core/sync/sync2/futex_freebsd.odin create mode 100644 core/sync/sync2/primitives_freebsd.odin diff --git a/core/c/libc/stdio.odin b/core/c/libc/stdio.odin index fc65b954a..004b923e8 100644 --- a/core/c/libc/stdio.odin +++ b/core/c/libc/stdio.odin @@ -103,6 +103,31 @@ when ODIN_OS == .OpenBSD { } } +when ODIN_OS == .FreeBSD { + fpos_t :: distinct i64 + + _IOFBF :: 0 + _IOLBF :: 1 + _IONBF :: 1 + + BUFSIZ :: 1024 + + EOF :: int(-1) + + FOPEN_MAX :: 20 + FILENAME_MAX :: 1024 + + SEEK_SET :: 0 + SEEK_CUR :: 1 + SEEK_END :: 2 + + foreign libc { + stderr: ^FILE + stdin: ^FILE + stdout: ^FILE + } +} + when ODIN_OS == .Darwin { fpos_t :: distinct i64 diff --git a/core/c/libc/wctype.odin b/core/c/libc/wctype.odin index f833af51f..43aee9dc6 100644 --- a/core/c/libc/wctype.odin +++ b/core/c/libc/wctype.odin @@ -13,21 +13,23 @@ when ODIN_OS == .Windows { when ODIN_OS == .Windows { wctrans_t :: distinct wchar_t wctype_t :: distinct ushort -} -when ODIN_OS == .Linux { +} else when ODIN_OS == .Linux { wctrans_t :: distinct intptr_t wctype_t :: distinct ulong -} -when ODIN_OS == .Darwin { +} else when ODIN_OS == .Darwin { wctrans_t :: distinct int wctype_t :: distinct u32 -} -when ODIN_OS == .OpenBSD { +} else when ODIN_OS == .OpenBSD { wctrans_t :: distinct rawptr wctype_t :: distinct rawptr + +} else when ODIN_OS == .FreeBSD { + wctrans_t :: distinct int + wctype_t :: distinct ulong + } @(default_calling_convention="c") diff --git a/core/os/dir_freebsd.odin b/core/os/dir_freebsd.odin new file mode 100644 index 000000000..74c410a51 --- /dev/null +++ b/core/os/dir_freebsd.odin @@ -0,0 +1,70 @@ +package os + +import "core:strings" +import "core:mem" + +read_dir :: proc(fd: Handle, n: int, allocator := context.allocator) -> (fi: []File_Info, err: Errno) { + dirp: Dir + dirp, err = _fdopendir(fd) + if err != ERROR_NONE { + return + } + + defer _closedir(dirp) + + dirpath: string + dirpath, err = absolute_path_from_handle(fd) + + if err != ERROR_NONE { + return + } + + defer delete(dirpath) + + n := n + size := n + if n <= 0 { + n = -1 + size = 100 + } + + dfi := make([dynamic]File_Info, 0, size, allocator) + + for { + entry: Dirent + end_of_stream: bool + entry, err, end_of_stream = _readdir(dirp) + if err != ERROR_NONE { + for fi_ in dfi { + file_info_delete(fi_, allocator) + } + delete(dfi) + return + } else if end_of_stream { + break + } + + fi_: File_Info + filename := cast(string)(transmute(cstring)mem.Raw_Cstring{ data = &entry.name[0] }) + + if filename == "." || filename == ".." { + continue + } + + fullpath := strings.join( []string{ dirpath, filename }, "/", context.temp_allocator) + defer delete(fullpath, context.temp_allocator) + + fi_, err = stat(fullpath, allocator) + if err != ERROR_NONE { + for fi__ in dfi { + file_info_delete(fi__, allocator) + } + delete(dfi) + return + } + + append(&dfi, fi_) + } + + return dfi[:], ERROR_NONE +} diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index 9d09a790a..4a95028c1 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -10,7 +10,6 @@ import "core:c" Handle :: distinct i32 File_Time :: distinct u64 Errno :: distinct i32 -Syscall :: distinct i32 INVALID_HANDLE :: ~Handle(0) @@ -142,40 +141,74 @@ RTLD_TRACE :: 0x200 RTLD_NODELETE :: 0x01000 RTLD_NOLOAD :: 0x02000 +MAX_PATH :: 1024 + args := _alloc_command_line_arguments() Unix_File_Time :: struct { - seconds: i64, + seconds: time_t, nanoseconds: c.long, } +dev_t :: u64 +ino_t :: u64 +nlink_t :: u64 +off_t :: i64 +mode_t :: u16 pid_t :: u32 +uid_t :: u32 +gid_t :: u32 +blkcnt_t :: i64 +blksize_t :: i32 +fflags_t :: u32 + +when ODIN_ARCH == .amd64 /* LP64 */ { + time_t :: i64 +} else { + time_t :: i32 +} + OS_Stat :: struct { - device_id: u64, - serial: u64, - nlink: u64, - mode: u32, + device_id: dev_t, + serial: ino_t, + nlink: nlink_t, + mode: mode_t, _padding0: i16, - uid: u32, - gid: u32, + uid: uid_t, + gid: gid_t, _padding1: i32, - rdev: u64, + rdev: dev_t, last_access: Unix_File_Time, modified: Unix_File_Time, status_change: Unix_File_Time, birthtime: Unix_File_Time, - size: i64, - blocks: i64, - block_size: i32, + size: off_t, + blocks: blkcnt_t, + block_size: blksize_t, - flags: u32, + flags: fflags_t, gen: u64, - lspare: i64, + lspare: [10]u64, } + +// since FreeBSD v12 +Dirent :: struct { + ino: ino_t, + off: off_t, + reclen: u16, + type: u8, + _pad0: u8, + namlen: u16, + _pad1: u16, + name: [256]byte, +} + +Dir :: distinct rawptr // DIR* + // File type S_IFMT :: 0o170000 // Type of file mask S_IFIFO :: 0o010000 // Named pipe (fifo) @@ -211,13 +244,13 @@ S_ISGID :: 0o2000 // Set group id on execution S_ISVTX :: 0o1000 // Directory restrcted delete -S_ISLNK :: #force_inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFLNK -S_ISREG :: #force_inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFREG -S_ISDIR :: #force_inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFDIR -S_ISCHR :: #force_inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFCHR -S_ISBLK :: #force_inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFBLK -S_ISFIFO :: #force_inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFIFO -S_ISSOCK :: #force_inline proc(m: u32) -> bool do return (m & S_IFMT) == S_IFSOCK +S_ISLNK :: #force_inline proc(m: mode_t) -> bool do return (m & S_IFMT) == S_IFLNK +S_ISREG :: #force_inline proc(m: mode_t) -> bool do return (m & S_IFMT) == S_IFREG +S_ISDIR :: #force_inline proc(m: mode_t) -> bool do return (m & S_IFMT) == S_IFDIR +S_ISCHR :: #force_inline proc(m: mode_t) -> bool do return (m & S_IFMT) == S_IFCHR +S_ISBLK :: #force_inline proc(m: mode_t) -> bool do return (m & S_IFMT) == S_IFBLK +S_ISFIFO :: #force_inline proc(m: mode_t) -> bool do return (m & S_IFMT) == S_IFIFO +S_ISSOCK :: #force_inline proc(m: mode_t) -> bool do return (m & S_IFMT) == S_IFSOCK F_OK :: 0 // Test for file existance X_OK :: 1 // Test for execute permission @@ -225,27 +258,38 @@ W_OK :: 2 // Test for write permission R_OK :: 4 // Test for read permission foreign libc { - @(link_name="__error") __errno_location :: proc() -> ^int --- - @(link_name="syscall") syscall :: proc(number: Syscall, #c_vararg args: ..any) -> int --- + @(link_name="__error") __errno_location :: proc() -> ^int --- @(link_name="open") _unix_open :: proc(path: cstring, flags: c.int, mode: c.int) -> Handle --- @(link_name="close") _unix_close :: proc(fd: Handle) -> c.int --- @(link_name="read") _unix_read :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t --- @(link_name="write") _unix_write :: proc(fd: Handle, buf: rawptr, size: c.size_t) -> c.ssize_t --- - @(link_name="lseek") _unix_seek :: proc(fd: Handle, offset: i64, whence: c.int) -> i64 --- - @(link_name="gettid") _unix_gettid :: proc() -> u64 --- + @(link_name="lseek") _unix_seek :: proc(fd: Handle, offset: i64, whence: c.int) -> i64 --- @(link_name="getpagesize") _unix_getpagesize :: proc() -> c.int --- - @(link_name="stat") _unix_stat :: proc(path: cstring, stat: ^OS_Stat) -> c.int --- + @(link_name="stat") _unix_stat :: proc(path: cstring, stat: ^OS_Stat) -> c.int --- + @(link_name="lstat") _unix_lstat :: proc(path: cstring, sb: ^OS_Stat) -> c.int --- @(link_name="fstat") _unix_fstat :: proc(fd: Handle, stat: ^OS_Stat) -> c.int --- + @(link_name="readlink") _unix_readlink :: proc(path: cstring, buf: ^byte, bufsiz: c.size_t) -> c.ssize_t --- @(link_name="access") _unix_access :: proc(path: cstring, mask: c.int) -> c.int --- + @(link_name="getcwd") _unix_getcwd :: proc(buf: cstring, len: c.size_t) -> cstring --- + @(link_name="chdir") _unix_chdir :: proc(buf: cstring) -> c.int --- + @(link_name="rename") _unix_rename :: proc(old, new: cstring) -> c.int --- + @(link_name="unlink") _unix_unlink :: proc(path: cstring) -> c.int --- + @(link_name="rmdir") _unix_rmdir :: proc(path: cstring) -> c.int --- + @(link_name="mkdir") _unix_mkdir :: proc(path: cstring, mode: mode_t) -> c.int --- + + @(link_name="fdopendir") _unix_fdopendir :: proc(fd: Handle) -> Dir --- + @(link_name="closedir") _unix_closedir :: proc(dirp: Dir) -> c.int --- + @(link_name="rewinddir") _unix_rewinddir :: proc(dirp: Dir) --- + @(link_name="readdir_r") _unix_readdir_r :: proc(dirp: Dir, entry: ^Dirent, result: ^^Dirent) -> c.int --- @(link_name="malloc") _unix_malloc :: proc(size: c.size_t) -> rawptr --- @(link_name="calloc") _unix_calloc :: proc(num, size: c.size_t) -> rawptr --- @(link_name="free") _unix_free :: proc(ptr: rawptr) --- @(link_name="realloc") _unix_realloc :: proc(ptr: rawptr, size: c.size_t) -> rawptr --- + @(link_name="getenv") _unix_getenv :: proc(cstring) -> cstring --- - @(link_name="getcwd") _unix_getcwd :: proc(buf: cstring, len: c.size_t) -> cstring --- - @(link_name="chdir") _unix_chdir :: proc(buf: cstring) -> c.int --- + @(link_name="realpath") _unix_realpath :: proc(path: cstring, resolved_path: rawptr) -> rawptr --- @(link_name="exit") _unix_exit :: proc(status: c.int) -> ! --- } @@ -318,12 +362,102 @@ file_size :: proc(fd: Handle) -> (i64, Errno) { return s.size, ERROR_NONE } -stdin: Handle = 0 +rename :: proc(old_path, new_path: string) -> Errno { + old_path_cstr := strings.clone_to_cstring(old_path, context.temp_allocator) + new_path_cstr := strings.clone_to_cstring(new_path, context.temp_allocator) + res := _unix_rename(old_path_cstr, new_path_cstr) + if res == -1 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +remove :: proc(path: string) -> Errno { + path_cstr := strings.clone_to_cstring(path, context.temp_allocator) + res := _unix_unlink(path_cstr) + if res == -1 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +make_directory :: proc(path: string, mode: mode_t = 0o775) -> Errno { + path_cstr := strings.clone_to_cstring(path, context.temp_allocator) + res := _unix_mkdir(path_cstr, mode) + if res == -1 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +remove_directory :: proc(path: string) -> Errno { + path_cstr := strings.clone_to_cstring(path, context.temp_allocator) + res := _unix_rmdir(path_cstr) + if res == -1 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +is_file_handle :: proc(fd: Handle) -> bool { + s, err := _fstat(fd) + if err != ERROR_NONE { + return false + } + return S_ISREG(s.mode) +} + +is_file_path :: proc(path: string, follow_links: bool = true) -> bool { + s: OS_Stat + err: Errno + if follow_links { + s, err = _stat(path) + } else { + s, err = _lstat(path) + } + if err != ERROR_NONE { + return false + } + return S_ISREG(s.mode) +} + +is_dir_handle :: proc(fd: Handle) -> bool { + s, err := _fstat(fd) + if err != ERROR_NONE { + return false + } + return S_ISDIR(s.mode) +} + +is_dir_path :: proc(path: string, follow_links: bool = true) -> bool { + s: OS_Stat + err: Errno + if follow_links { + s, err = _stat(path) + } else { + s, err = _lstat(path) + } + if err != ERROR_NONE { + return false + } + return S_ISDIR(s.mode) +} + +is_file :: proc {is_file_path, is_file_handle} +is_dir :: proc {is_dir_path, is_dir_handle} + +// NOTE(bill): Uses startup to initialize it + +stdin: Handle = 0 stdout: Handle = 1 stderr: Handle = 2 +/* TODO(zangent): Implement these! +last_write_time :: proc(fd: Handle) -> File_Time {} +last_write_time_by_name :: proc(name: string) -> File_Time {} +*/ last_write_time :: proc(fd: Handle) -> (File_Time, Errno) { - s, err := fstat(fd) + s, err := _fstat(fd) if err != ERROR_NONE { return 0, err } @@ -332,7 +466,7 @@ last_write_time :: proc(fd: Handle) -> (File_Time, Errno) { } last_write_time_by_name :: proc(name: string) -> (File_Time, Errno) { - s, err := stat(name) + s, err := _stat(name) if err != ERROR_NONE { return 0, err } @@ -340,18 +474,33 @@ last_write_time_by_name :: proc(name: string) -> (File_Time, Errno) { return File_Time(modified), ERROR_NONE } -stat :: proc(path: string) -> (OS_Stat, Errno) { +@private +_stat :: proc(path: string) -> (OS_Stat, Errno) { cstr := strings.clone_to_cstring(path, context.temp_allocator) - s: OS_Stat - result := _unix_stat(cstr, &s) + s: OS_Stat = --- + result := _unix_lstat(cstr, &s) if result == -1 { return s, Errno(get_last_error()) } return s, ERROR_NONE } -fstat :: proc(fd: Handle) -> (OS_Stat, Errno) { - s: OS_Stat +@private +_lstat :: proc(path: string) -> (OS_Stat, Errno) { + cstr := strings.clone_to_cstring(path, context.temp_allocator) + + // deliberately uninitialized + s: OS_Stat = --- + res := _unix_lstat(cstr, &s) + if res == -1 { + return s, Errno(get_last_error()) + } + return s, ERROR_NONE +} + +@private +_fstat :: proc(fd: Handle) -> (OS_Stat, Errno) { + s: OS_Stat = --- result := _unix_fstat(fd, &s) if result == -1 { return s, Errno(get_last_error()) @@ -359,6 +508,95 @@ fstat :: proc(fd: Handle) -> (OS_Stat, Errno) { return s, ERROR_NONE } +@private +_fdopendir :: proc(fd: Handle) -> (Dir, Errno) { + dirp := _unix_fdopendir(fd) + if dirp == cast(Dir)nil { + return nil, Errno(get_last_error()) + } + return dirp, ERROR_NONE +} + +@private +_closedir :: proc(dirp: Dir) -> Errno { + rc := _unix_closedir(dirp) + if rc != 0 { + return Errno(get_last_error()) + } + return ERROR_NONE +} + +@private +_rewinddir :: proc(dirp: Dir) { + _unix_rewinddir(dirp) +} + +@private +_readdir :: proc(dirp: Dir) -> (entry: Dirent, err: Errno, end_of_stream: bool) { + result: ^Dirent + rc := _unix_readdir_r(dirp, &entry, &result) + + if rc != 0 { + err = Errno(get_last_error()) + return + } + err = ERROR_NONE + + if result == nil { + end_of_stream = true + return + } + + return +} + +@private +_readlink :: proc(path: string) -> (string, Errno) { + path_cstr := strings.clone_to_cstring(path, context.temp_allocator) + + bufsz : uint = MAX_PATH + buf := make([]byte, MAX_PATH) + for { + rc := _unix_readlink(path_cstr, &(buf[0]), bufsz) + if rc == -1 { + delete(buf) + return "", Errno(get_last_error()) + } else if rc == int(bufsz) { + bufsz += MAX_PATH + delete(buf) + buf = make([]byte, bufsz) + } else { + return strings.string_from_ptr(&buf[0], rc), ERROR_NONE + } + } + unreachable() +} + +// XXX FreeBSD +absolute_path_from_handle :: proc(fd: Handle) -> (string, Errno) { + return "", Errno(ENOSYS) +} + +absolute_path_from_relative :: proc(rel: string) -> (path: string, err: Errno) { + rel := rel + if rel == "" { + rel = "." + } + + rel_cstr := strings.clone_to_cstring(rel, context.temp_allocator) + + path_ptr := _unix_realpath(rel_cstr, nil) + if path_ptr == nil { + return "", Errno(get_last_error()) + } + defer _unix_free(path_ptr) + + path_cstr := transmute(cstring)path_ptr + path = strings.clone( string(path_cstr) ) + + return path, ERROR_NONE +} + access :: proc(path: string, mask: int) -> (bool, Errno) { cstr := strings.clone_to_cstring(path, context.temp_allocator) result := _unix_access(cstr, c.int(mask)) @@ -464,4 +702,3 @@ _alloc_command_line_arguments :: proc() -> []string { } return res } - diff --git a/core/os/stat_unix.odin b/core/os/stat_unix.odin index c82466b08..395d2e73e 100644 --- a/core/os/stat_unix.odin +++ b/core/os/stat_unix.odin @@ -1,4 +1,4 @@ -//+build linux, darwin, openbsd +//+build linux, darwin, freebsd, openbsd package os import "core:time" @@ -61,7 +61,7 @@ _make_time_from_unix_file_time :: proc(uft: Unix_File_Time) -> time.Time { _fill_file_info_from_stat :: proc(fi: ^File_Info, s: OS_Stat) { fi.size = s.size fi.mode = cast(File_Mode)s.mode - fi.is_dir = S_ISDIR(u32(s.mode)) + fi.is_dir = S_ISDIR(s.mode) // NOTE(laleksic, 2021-01-21): Not really creation time, but closest we can get (maybe better to leave it 0?) fi.creation_time = _make_time_from_unix_file_time(s.status_change) diff --git a/core/sync/sync2/futex_freebsd.odin b/core/sync/sync2/futex_freebsd.odin new file mode 100644 index 000000000..2cbdb4aaa --- /dev/null +++ b/core/sync/sync2/futex_freebsd.odin @@ -0,0 +1,75 @@ +//+private +//+build freebsd +package sync2 + +import "core:c" +import "core:os" +import "core:time" + +UMTX_OP_WAIT :: 2 +UMTX_OP_WAKE :: 3 + +foreign import libc "system:c" + +foreign libc { + _umtx_op :: proc "c" (obj: rawptr, op: c.int, val: c.ulong, uaddr: rawptr, uaddr2: rawptr) -> c.int --- +} + +_futex_wait :: proc(f: ^Futex, expected: u32) -> bool { + timeout := os.Unix_File_Time{ + seconds = 5, + nanoseconds = 0, + } + + for { + res := _umtx_op(f, UMTX_OP_WAIT, c.ulong(expected), nil, &timeout) + + if res != -1 { + return true + } + + if os.Errno(os.get_last_error()) == os.ETIMEDOUT { + continue + } + + panic("_futex_wait failure") + } + unreachable() +} + +_futex_wait_with_timeout :: proc(f: ^Futex, expected: u32, duration: time.Duration) -> bool { + if duration <= 0 { + return false + } + + res := _umtx_op(f, UMTX_OP_WAIT, c.ulong(expected), nil, &os.Unix_File_Time{ + seconds = (os.time_t)(duration/1e9), + nanoseconds = (c.long)(duration%1e9), + }) + + if res != -1 { + return true + } + + if os.Errno(os.get_last_error()) == os.ETIMEDOUT { + return false + } + + panic("_futex_wait_with_timeout failure") +} + +_futex_signal :: proc(f: ^Futex) { + res := _umtx_op(f, UMTX_OP_WAKE, 1, nil, nil) + + if res == -1 { + panic("_futex_signal failure") + } +} + +_futex_broadcast :: proc(f: ^Futex) { + res := _umtx_op(f, UMTX_OP_WAKE, c.ulong(max(i32)), nil, nil) + + if res == -1 { + panic("_futex_broadcast failure") + } +} diff --git a/core/sync/sync2/primitives_freebsd.odin b/core/sync/sync2/primitives_freebsd.odin new file mode 100644 index 000000000..2a25a18a4 --- /dev/null +++ b/core/sync/sync2/primitives_freebsd.odin @@ -0,0 +1,9 @@ +//+build freebsd +//+private +package sync2 + +import "core:os" + +_current_thread_id :: proc "contextless" () -> int { + return os.current_thread_id() +} diff --git a/core/sync/sync_freebsd.odin b/core/sync/sync_freebsd.odin index 240308b7d..20e6bfceb 100644 --- a/core/sync/sync_freebsd.odin +++ b/core/sync/sync_freebsd.odin @@ -5,8 +5,8 @@ import "core:intrinsics" current_thread_id :: proc "contextless" () -> int { - SYS_GETTID :: 186; - return int(intrinsics.syscall(SYS_GETTID)); + SYS_GETTID :: 186 + return int(intrinsics.syscall(SYS_GETTID)) } @@ -19,22 +19,22 @@ Semaphore :: struct #align 16 { } semaphore_init :: proc(s: ^Semaphore, initial_count := 0) { - assert(unix.sem_init(&s.handle, 0, u32(initial_count)) == 0); + assert(unix.sem_init(&s.handle, 0, u32(initial_count)) == 0) } semaphore_destroy :: proc(s: ^Semaphore) { - assert(unix.sem_destroy(&s.handle) == 0); - s.handle = {}; + assert(unix.sem_destroy(&s.handle) == 0) + s.handle = {} } semaphore_post :: proc(s: ^Semaphore, count := 1) { // NOTE: SPEED: If there's one syscall to do this, we should use it instead of the loop. for in 0.. ^sem_t ---; + sem_open :: proc(name: cstring, flags: c.int) -> ^sem_t --- - sem_init :: proc(sem: ^sem_t, pshared: c.int, initial_value: c.uint) -> c.int ---; - sem_destroy :: proc(sem: ^sem_t) -> c.int ---; - sem_post :: proc(sem: ^sem_t) -> c.int ---; - sem_wait :: proc(sem: ^sem_t) -> c.int ---; - sem_trywait :: proc(sem: ^sem_t) -> c.int ---; - // sem_timedwait :: proc(sem: ^sem_t, timeout: time.TimeSpec) -> c.int ---; + sem_init :: proc(sem: ^sem_t, pshared: c.int, initial_value: c.uint) -> c.int --- + sem_destroy :: proc(sem: ^sem_t) -> c.int --- + sem_post :: proc(sem: ^sem_t) -> c.int --- + sem_wait :: proc(sem: ^sem_t) -> c.int --- + sem_trywait :: proc(sem: ^sem_t) -> c.int --- + // sem_timedwait :: proc(sem: ^sem_t, timeout: time.TimeSpec) -> c.int --- // NOTE: unclear whether pthread_yield is well-supported on Linux systems, // see https://linux.die.net/man/3/pthread_yield - pthread_yield :: proc() ---; + pthread_yield :: proc() --- } From ed4c9335db7ba30679797eda7afe6c61a313ecc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sun, 13 Mar 2022 11:43:36 +0000 Subject: [PATCH 50/56] enable freebsd_amd64 inside CI --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 412587b3c..ecb01e8a5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,6 +41,9 @@ jobs: - name: Odin check examples/all for Linux i386 run: ./odin check examples/all -vet -strict-style -target:linux_i386 timeout-minutes: 10 + - name: Odin check examples/all for FreeBSD amd64 + run: ./odin check examples/all -vet -strict-style -target:freebsd_amd64 + timeout-minutes: 10 - name: Odin check examples/all for OpenBSD amd64 run: ./odin check examples/all -vet -strict-style -target:openbsd_amd64 timeout-minutes: 10 From 036900da51fb256bb9dbbc82172880440601b6f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Marie?= Date: Sun, 13 Mar 2022 12:41:03 +0000 Subject: [PATCH 51/56] fix mode_t on darwin - fix mkdir() prototype (mode_t is u16) - remove explicit cast --- core/os/os_darwin.odin | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/core/os/os_darwin.odin b/core/os/os_darwin.odin index ace622582..ae5336849 100644 --- a/core/os/os_darwin.odin +++ b/core/os/os_darwin.odin @@ -260,13 +260,13 @@ S_ISUID :: 0o4000 // Set user id on execution S_ISGID :: 0o2000 // Set group id on execution S_ISVTX :: 0o1000 // Directory restrcted delete -S_ISLNK :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFLNK } -S_ISREG :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFREG } -S_ISDIR :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFDIR } -S_ISCHR :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFCHR } -S_ISBLK :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFBLK } -S_ISFIFO :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFIFO } -S_ISSOCK :: #force_inline proc(m: u32) -> bool { return (m & S_IFMT) == S_IFSOCK } +S_ISLNK :: #force_inline proc(m: u16) -> bool { return (m & S_IFMT) == S_IFLNK } +S_ISREG :: #force_inline proc(m: u16) -> bool { return (m & S_IFMT) == S_IFREG } +S_ISDIR :: #force_inline proc(m: u16) -> bool { return (m & S_IFMT) == S_IFDIR } +S_ISCHR :: #force_inline proc(m: u16) -> bool { return (m & S_IFMT) == S_IFCHR } +S_ISBLK :: #force_inline proc(m: u16) -> bool { return (m & S_IFMT) == S_IFBLK } +S_ISFIFO :: #force_inline proc(m: u16) -> bool { return (m & S_IFMT) == S_IFIFO } +S_ISSOCK :: #force_inline proc(m: u16) -> bool { return (m & S_IFMT) == S_IFSOCK } R_OK :: 4 // Test for read permission W_OK :: 2 // Test for write permission @@ -313,7 +313,7 @@ foreign libc { @(link_name="getenv") _unix_getenv :: proc(cstring) -> cstring --- @(link_name="getcwd") _unix_getcwd :: proc(buf: cstring, len: c.size_t) -> cstring --- @(link_name="chdir") _unix_chdir :: proc(buf: cstring) -> c.int --- - @(link_name="mkdir") _unix_mkdir :: proc(buf: cstring, mode: u32) -> c.int --- + @(link_name="mkdir") _unix_mkdir :: proc(buf: cstring, mode: u16) -> c.int --- @(link_name="realpath") _unix_realpath :: proc(path: cstring, resolved_path: rawptr) -> rawptr --- @(link_name="strerror") _darwin_string_error :: proc(num : c.int) -> cstring --- @@ -433,7 +433,7 @@ is_file_handle :: proc(fd: Handle) -> bool { if err != ERROR_NONE { return false } - return S_ISREG(cast(u32)s.mode) + return S_ISREG(s.mode) } is_file_path :: proc(path: string, follow_links: bool = true) -> bool { @@ -447,7 +447,7 @@ is_file_path :: proc(path: string, follow_links: bool = true) -> bool { if err != ERROR_NONE { return false } - return S_ISREG(cast(u32)s.mode) + return S_ISREG(s.mode) } @@ -456,7 +456,7 @@ is_dir_handle :: proc(fd: Handle) -> bool { if err != ERROR_NONE { return false } - return S_ISDIR(cast(u32)s.mode) + return S_ISDIR(s.mode) } is_dir_path :: proc(path: string, follow_links: bool = true) -> bool { @@ -470,7 +470,7 @@ is_dir_path :: proc(path: string, follow_links: bool = true) -> bool { if err != ERROR_NONE { return false } - return S_ISDIR(cast(u32)s.mode) + return S_ISDIR(s.mode) } is_file :: proc {is_file_path, is_file_handle} @@ -670,7 +670,7 @@ set_current_directory :: proc(path: string) -> (err: Errno) { return ERROR_NONE } -make_directory :: proc(path: string, mode: u32 = 0o775) -> Errno { +make_directory :: proc(path: string, mode: u16 = 0o775) -> Errno { path_cstr := strings.clone_to_cstring(path, context.temp_allocator) res := _unix_mkdir(path_cstr, mode) if res == -1 { From ef3f448861303dcfe3c0bb7164d47ad694a03c0e Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Mon, 14 Mar 2022 13:06:50 +0100 Subject: [PATCH 52/56] Remove accidentally committed test binary. --- tests/core/crypto_hash | Bin 626328 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100755 tests/core/crypto_hash diff --git a/tests/core/crypto_hash b/tests/core/crypto_hash deleted file mode 100755 index 32f8217be6856cf6dcbfef1a3cd3a128eb3386e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 626328 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%0D?lFiF+2eBJBaB4in?O3 z6?>pjw+7M}=-vVj48z+KJQ&}596ZYFVffeM;Bf^H#$z4_4+wY|e(+#C?s4#dsE6SX z55{*M2agJR7=ofg!Q=m756javCpwUuXdgppdjnL^F*7ji{10-6 z;R%r2Km|M~BtYweJX%lsfEo{spmgZ}9kfgp8e!dg;BEzZ1{6Fl3=AHOzda5f=k+kW z4@n;%AnD^6a{Bn;aqzgHhat!V3ZSc3EYE`63pEa&9=1T*KcI?$nStTuP*ny>6<`gZ6IDP>QP5#QAe%u`%^-g76zE~!Q&hm}p*Qn_ zQa>m(Kx2%VERgyKG~)rPC_rX{#6eLA5(8NZs;59M2c5kHDq#yiB{FEu6$3Wap!yu7 z8gw%TsEh)YLLl2fjWUqUkRo+QLq8LFFn`Nej4J57GzfoP%ps(6$Oj#BeF7 zRRPj?tVIQ+gb}0`)U^j00Ahn$2_Sio)&nK%9?caV45b`Uwcy)1K=S;W;KH>=#lfSy zM8(6Sdx{F!`JhWBz{O^Z3ds4Oas=dj(4EN^9-S;IFCJZBVBilw0IEj8jnM8ENc@6M zK7_^q_!xE2aT%aZWW7tkXS;)jkihCetIC)VegQR9^Pw>TYOI2aR*)Y+ArBJ=g+55! zr!z$bH3mSsLGcCB35qYU7dm@XKrsNa5#$AsX&^6vLI>v@xMQr#t*9SAu~ul z;3LfWHCXp6Lz+RL;b(pg)&eLOlCP3Pz#D* zgLNvD3uK-_@oTWofO0|AF~0`uOehyrZS!le&Vq75NByRO zR*En)Ftq!E-499&u!glqXALwB6oK3bJ9-<$0d*Bj@<1ICXp-!lq5>*%K+Xpn(K$s0 zl$4;U7u2!@#Wtw%0-`|;6A%qLg#knhurh!fiwaQM0JLrmbRHO}uz<+0K~#X!2}lQM zpbSKV2E#x!Xuu0Zg9f!gG-%)oM1uyWKs0Co3UuQ+xFiD|0m=Zqf&|oa;0Af52c`7l z0r?mppcz4Gz$upw=495-=ZBWN|}*j14G4qyApM|} z4C;tjD&IFA)e?JBZ56JA+6cx}(c832QTHb<(xpxLZ(+#MK1GNc2CWGQ1T+JVE0T;Tk z>K}Ap7OYtSx-SddT5Ev935*ii`3J1{AHhvA(#ZU#Hei^?8>k=sU0VvaIur7siFF?4 z)VJf;U|j*_f|mI4Yp||_a=|-CkGH6NU}a#~st1j4*h(mnwV-?ezMuuVOAVaDVCQdw zI3VB7&V+<5-jz_jTU0>70LozCth zr}H}~L(G*%D+^F6drC4ss0aaj7}UdRG0#9`d{Q$!xNrgm851mr_Nbs{c<2NNCwyQ&y4R?HBNKF0 zE@&bQp1(V%gQm@nK_eX8rU5lq!D?E-Z5ofgpbW;qz`zD7z(65xgbk*zd(+N7w{J4t>q$hB^1>6FL z^(R104p0*TWD2G7t}xl>4SC>$m~!+hIu`@_o#pz z1!`}AI)tE}1=u6qJt|<2bhm�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

HV|1L3;mPYaqRUxlTy$KR^W1`(OMJ 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 From ffe6d81ecd3169d2cadd112fa878872ed5acd8bf Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 14 Mar 2022 12:24:10 +0000 Subject: [PATCH 53/56] Remove comments --- examples/demo/demo.odin | 4 ---- 1 file changed, 4 deletions(-) diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index 4d4490446..8c2321dae 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -1715,7 +1715,6 @@ deprecated_attribute :: proc() { } range_statements_with_multiple_return_values :: proc() { - // IMPORTANT NOTE(bill, 2019-11-02): This feature is subject to be changed/removed fmt.println("\n#range statements with multiple return values") My_Iterator :: struct { index: int, @@ -2005,7 +2004,6 @@ relative_data_types :: proc() { or_else_operator :: proc() { fmt.println("\n#'or_else'") - // IMPORTANT NOTE: 'or_else' is an experimental feature and subject to change/removal { m: map[string]int i: int @@ -2036,8 +2034,6 @@ or_else_operator :: proc() { or_return_operator :: proc() { fmt.println("\n#'or_return'") - // IMPORTANT NOTE: 'or_return' is an experimental feature and subject to change/removal - // // The concept of 'or_return' will work by popping off the end value in a multiple // valued expression and checking whether it was not 'nil' or 'false', and if so, // set the end return value to value if possible. If the procedure only has one From 286549693eb2e7b216effba01d9aa192eab78d12 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 14 Mar 2022 12:28:28 +0000 Subject: [PATCH 54/56] Fix `#1609` --- src/check_decl.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 12b0e43cb..d4a320f03 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -440,6 +440,12 @@ void check_const_decl(CheckerContext *ctx, Entity *e, Ast *type_expr, Ast *init, if (type_expr) { e->type = check_type(ctx, type_expr); + if (are_types_identical(e->type, t_typeid)) { + e->type = nullptr; + e->kind = Entity_TypeName; + check_type_decl(ctx, e, init, named_type); + return; + } } Operand operand = {}; From 6ea9ba16e72df9ae45d6ff77664d4af9a7197852 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 14 Mar 2022 12:38:56 +0000 Subject: [PATCH 55/56] Fix #1610 --- src/parser.cpp | 50 +++++++++++++++++++++----------------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index 94a585f35..a435d1317 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -1577,7 +1577,7 @@ void assign_removal_flag_to_semicolon(AstFile *f) { } } -void expect_semicolon(AstFile *f, Ast *s) { +void expect_semicolon(AstFile *f) { Token prev_token = {}; if (allow_token(f, Token_Semicolon)) { @@ -1602,17 +1602,17 @@ void expect_semicolon(AstFile *f, Ast *s) { if (f->curr_token.kind == Token_EOF) { return; } - - if (s != nullptr) { - return; - } switch (f->curr_token.kind) { case Token_EOF: return; } - String p = token_to_string(f->curr_token); - syntax_error(prev_token, "Expected ';', got %.*s", LIT(p)); - fix_advance_to_next_stmt(f); + + if (f->curr_token.pos.line == f->prev_token.pos.line) { + String p = token_to_string(f->curr_token); + prev_token.pos = token_pos_end(prev_token); + syntax_error(prev_token, "Expected ';', got %.*s", LIT(p)); + fix_advance_to_next_stmt(f); + } } @@ -3181,7 +3181,7 @@ Ast *parse_foreign_block(AstFile *f, Token token) { Ast *body = ast_block_stmt(f, decls, open, close); Ast *decl = ast_foreign_block_decl(f, token, foreign_library, body, docs); - expect_semicolon(f, decl); + expect_semicolon(f); return decl; } @@ -3227,15 +3227,11 @@ Ast *parse_value_decl(AstFile *f, Array names, CommentGroup *docs) { } if (f->expr_level >= 0) { - Ast *end = nullptr; - if (!is_mutable && values.count > 0) { - end = values[values.count-1]; - } if (f->curr_token.kind == Token_CloseBrace && f->curr_token.pos.line == f->prev_token.pos.line) { } else { - expect_semicolon(f, end); + expect_semicolon(f); } } @@ -4143,11 +4139,7 @@ Ast *parse_return_stmt(AstFile *f) { advance_token(f); } - Ast *end = nullptr; - if (results.count > 0) { - end = results[results.count-1]; - } - expect_semicolon(f, end); + expect_semicolon(f); return ast_return_stmt(f, token, results); } @@ -4398,7 +4390,7 @@ Ast *parse_import_decl(AstFile *f, ImportDeclKind kind) { syntax_error(import_name, "'using import' is not allowed, please use the import name explicitly"); } - expect_semicolon(f, s); + expect_semicolon(f); return s; } @@ -4456,7 +4448,7 @@ Ast *parse_foreign_decl(AstFile *f) { } else { s = ast_foreign_import_decl(f, token, filepaths, lib_name, docs, f->line_comment); } - expect_semicolon(f, s); + expect_semicolon(f); return s; } } @@ -4595,7 +4587,7 @@ Ast *parse_stmt(AstFile *f) { case Token_Not: case Token_And: s = parse_simple_stmt(f, StmtAllowFlag_Label); - expect_semicolon(f, s); + expect_semicolon(f); return s; @@ -4623,7 +4615,7 @@ Ast *parse_stmt(AstFile *f) { label = parse_ident(f); } s = ast_branch_stmt(f, token, label); - expect_semicolon(f, s); + expect_semicolon(f); return s; } @@ -4638,12 +4630,12 @@ Ast *parse_stmt(AstFile *f) { Array list = parse_lhs_expr_list(f); if (list.count == 0) { syntax_error(token, "Illegal use of 'using' statement"); - expect_semicolon(f, nullptr); + expect_semicolon(f); return ast_bad_stmt(f, token, f->curr_token); } if (f->curr_token.kind != Token_Colon) { - expect_semicolon(f, list[list.count-1]); + expect_semicolon(f); return ast_using_stmt(f, token, list); } expect_token_after(f, Token_Colon, "identifier list"); @@ -4700,13 +4692,13 @@ Ast *parse_stmt(AstFile *f) { } else if (tag == "assert" || tag == "panic") { Ast *t = ast_basic_directive(f, hash_token, name); Ast *stmt = ast_expr_stmt(f, parse_call_expr(f, t)); - expect_semicolon(f, stmt); + expect_semicolon(f); return stmt; } else if (name.string == "force_inline" || name.string == "force_no_inline") { Ast *expr = parse_force_inlining_operand(f, name); Ast *stmt = ast_expr_stmt(f, expr); - expect_semicolon(f, stmt); + expect_semicolon(f); return stmt; } else if (tag == "unroll") { return parse_unrolled_for_loop(f, name); @@ -4728,7 +4720,7 @@ Ast *parse_stmt(AstFile *f) { case Token_Semicolon: s = ast_empty_stmt(f, token); - expect_semicolon(f, nullptr); + expect_semicolon(f); return s; } @@ -5586,7 +5578,7 @@ bool parse_file(Parser *p, AstFile *f) { } Ast *pd = ast_package_decl(f, f->package_token, package_name, docs, f->line_comment); - expect_semicolon(f, pd); + expect_semicolon(f); f->pkg_decl = pd; if (f->error_count == 0) { From 1d147ba99339afbef47bf689a0e0d7591a33c633 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 14 Mar 2022 12:44:35 +0000 Subject: [PATCH 56/56] Fix typo --- vendor/directx/d3d12/d3d12_constants.odin | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vendor/directx/d3d12/d3d12_constants.odin b/vendor/directx/d3d12/d3d12_constants.odin index 3f83dca6b..a30296cc1 100644 --- a/vendor/directx/d3d12/d3d12_constants.odin +++ b/vendor/directx/d3d12/d3d12_constants.odin @@ -292,7 +292,8 @@ MAX_DEPTH :: 1.0 MAX_LIVE_STATIC_SAMPLERS :: 2032 MAX_MAXANISOTROPY :: 16 MAX_MULTISAMPLE_SAMPLE_COUNT :: 32 -MAX_POSITION_VALUE :: 3.402823466e+34D3D12_MAX_ROOT_COST :: 64 +MAX_POSITION_VALUE :: 3.402823466e+34 +MAX_ROOT_COST :: 64 MAX_SHADER_VISIBLE_DESCRIPTOR_HEAP_SIZE_TIER_1 :: 1000000 MAX_SHADER_VISIBLE_DESCRIPTOR_HEAP_SIZE_TIER_2 :: 1000000 MAX_SHADER_VISIBLE_SAMPLER_HEAP_SIZE :: 2048