aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-11-04 00:50:28 +0000
committergingerBill <bill@gingerbill.org>2021-11-04 00:50:28 +0000
commit9ab71ca0da6a68806ff9825000799e8ddfbfc341 (patch)
tree981a837391fb65baf6ece23420527eb382f7b08b
parent3d06dddb72e00409b14df36959bb3bcdc8d42999 (diff)
Add `ODIN_NO_CRT` global constant
-rw-r--r--core/runtime/procs.odin37
-rw-r--r--core/runtime/procs_windows_amd64.odin16
-rw-r--r--examples/demo/demo.odin76
-rw-r--r--src/checker.cpp1
-rw-r--r--src/llvm_backend.cpp2
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");