Browse Source

Add `ODIN_NO_CRT` global constant

gingerBill 3 years ago
parent
commit
9ab71ca0da
5 changed files with 90 additions and 42 deletions
  1. 37 0
      core/runtime/procs.odin
  2. 9 7
      core/runtime/procs_windows_amd64.odin
  3. 42 34
      examples/demo/demo.odin
  4. 1 0
      src/checker.cpp
  5. 1 1
      src/llvm_backend.cpp

+ 37 - 0
core/runtime/procs.odin

@@ -24,6 +24,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 {

+ 9 - 7
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
+}

+ 42 - 34
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()
 	}
 }

+ 1 - 0
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);
 
 

+ 1 - 1
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");