diff options
| author | gingerBill <bill@gingerbill.org> | 2021-11-04 00:50:28 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-11-04 00:50:28 +0000 |
| commit | 9ab71ca0da6a68806ff9825000799e8ddfbfc341 (patch) | |
| tree | 981a837391fb65baf6ece23420527eb382f7b08b | |
| parent | 3d06dddb72e00409b14df36959bb3bcdc8d42999 (diff) | |
Add `ODIN_NO_CRT` global constant
| -rw-r--r-- | core/runtime/procs.odin | 37 | ||||
| -rw-r--r-- | core/runtime/procs_windows_amd64.odin | 16 | ||||
| -rw-r--r-- | examples/demo/demo.odin | 76 | ||||
| -rw-r--r-- | src/checker.cpp | 1 | ||||
| -rw-r--r-- | src/llvm_backend.cpp | 2 |
5 files changed, 90 insertions, 42 deletions
diff --git a/core/runtime/procs.odin b/core/runtime/procs.odin index 09ad25379..7ea6145b9 100644 --- a/core/runtime/procs.odin +++ b/core/runtime/procs.odin @@ -25,6 +25,43 @@ when ODIN_ARCH == "wasm32" || ODIN_ARCH == "wasm64" { return dst } +} else when ODIN_NO_CRT { + @(link_name="memset") + memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr { + if ptr != nil && len != 0 { + b := byte(val) + p := ([^]byte)(ptr) + for i in 0..<len { + p[i] = b + } + } + return ptr + } + + @(link_name="memmove") + memmove :: proc "c" (dst, src: rawptr, len: int) -> rawptr { + if dst != src { + d, s := ([^]byte)(dst), ([^]byte)(src) + d_end, s_end := d[len:], s[len:] + for i := len-1; i >= 0; i -= 1 { + d[i] = s[i] + } + } + return dst + + } + @(link_name="memcpy") + memcpy :: proc "c" (dst, src: rawptr, len: int) -> rawptr { + if dst != src { + d, s := ([^]byte)(dst), ([^]byte)(src) + d_end, s_end := d[len:], s[len:] + for i := len-1; i >= 0; i -= 1 { + d[i] = s[i] + } + } + return dst + + } } else { memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr { if ptr != nil && len != 0 { diff --git a/core/runtime/procs_windows_amd64.odin b/core/runtime/procs_windows_amd64.odin index e5f24e53b..8faed87e5 100644 --- a/core/runtime/procs_windows_amd64.odin +++ b/core/runtime/procs_windows_amd64.odin @@ -19,10 +19,12 @@ windows_trap_type_assertion :: proc "contextless" () -> ! { windows_trap_array_bounds() } -// @private -// @(link_name="_tls_index") -// _tls_index: u32; - -// @private -// @(link_name="_fltused") -// _fltused: i32 = 0x9875; +when ODIN_NO_CRT { + @private + @(link_name="_tls_index") + _tls_index: u32 + + @private + @(link_name="_fltused") + _fltused: i32 = 0x9875 +}
\ No newline at end of file diff --git a/examples/demo/demo.odin b/examples/demo/demo.odin index c287e4054..d12df2776 100644 --- a/examples/demo/demo.odin +++ b/examples/demo/demo.odin @@ -2339,10 +2339,18 @@ matrix_type :: proc() { m4 := mat4(m2) assert(m4[2, 2] == 1) assert(m4[3, 3] == 1) - fmt.println("m2", m2) + fmt.printf("m2 %#v\n", m2) fmt.println("m4", m4) fmt.println("mat2(m4)", mat2(m4)) assert(mat2(m4) == m2) + + b4 := mat4{ + 1, 2, 0, 0, + 3, 4, 0, 0, + 5, 0, 6, 0, + 0, 7, 0, 8, + } + fmt.println("b4", matrix_flatten(b4)) } { // Casting non-square matrices @@ -2414,39 +2422,39 @@ matrix_type :: proc() { main :: proc() { when true { - the_basics() - control_flow() - named_proc_return_parameters() - explicit_procedure_overloading() - struct_type() - union_type() - using_statement() - implicit_context_system() - parametric_polymorphism() - array_programming() - map_type() - implicit_selector_expression() - partial_switch() - cstring_example() - bit_set_type() - deferred_procedure_associations() - reflection() - quaternions() - unroll_for_statement() - where_clauses() - foreign_system() - ranged_fields_for_array_compound_literals() - deprecated_attribute() - range_statements_with_multiple_return_values() - threading_example() - soa_struct_layout() - constant_literal_expressions() - union_maybe() - explicit_context_definition() - relative_data_types() - or_else_operator() - or_return_operator() - arbitrary_precision_maths() + // the_basics() + // control_flow() + // named_proc_return_parameters() + // explicit_procedure_overloading() + // struct_type() + // union_type() + // using_statement() + // implicit_context_system() + // parametric_polymorphism() + // array_programming() + // map_type() + // implicit_selector_expression() + // partial_switch() + // cstring_example() + // bit_set_type() + // deferred_procedure_associations() + // reflection() + // quaternions() + // unroll_for_statement() + // where_clauses() + // foreign_system() + // ranged_fields_for_array_compound_literals() + // deprecated_attribute() + // range_statements_with_multiple_return_values() + // threading_example() + // soa_struct_layout() + // constant_literal_expressions() + // union_maybe() + // explicit_context_definition() + // relative_data_types() + // or_else_operator() + // or_return_operator() + // arbitrary_precision_maths() matrix_type() } } diff --git a/src/checker.cpp b/src/checker.cpp index f0f463816..92e38a643 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -782,6 +782,7 @@ void init_universal(void) { add_global_bool_constant("ODIN_DISABLE_ASSERT", bc->ODIN_DISABLE_ASSERT); add_global_bool_constant("ODIN_DEFAULT_TO_NIL_ALLOCATOR", bc->ODIN_DEFAULT_TO_NIL_ALLOCATOR); add_global_bool_constant("ODIN_NO_DYNAMIC_LITERALS", bc->no_dynamic_literals); + add_global_bool_constant("ODIN_NO_CRT", bc->no_crt); add_global_bool_constant("ODIN_TEST", bc->command_kind == Command_test); diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 730b9c1ba..c0a7b60df 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -785,7 +785,7 @@ lbProcedure *lb_create_main_procedure(lbModule *m, lbProcedure *startup_runtime) params->Tuple.variables[1] = alloc_entity_param(nullptr, make_token_ident("fdwReason"), t_u32, false, true); params->Tuple.variables[2] = alloc_entity_param(nullptr, make_token_ident("lpReserved"), t_rawptr, false, true); call_cleanup = false; - } else if (build_context.metrics.os == TargetOs_windows && build_context.metrics.arch == TargetArch_386) { + } else if (build_context.metrics.os == TargetOs_windows && (build_context.metrics.arch == TargetArch_386 || build_context.no_crt)) { name = str_lit("mainCRTStartup"); } else if (is_arch_wasm()) { name = str_lit("_start"); |