Selaa lähdekoodia

Begin work on new pseudo-architecture: wasm64p32

gingerBill 2 vuotta sitten
vanhempi
commit
f5d9ca64f9

+ 1 - 1
core/mem/alloc.odin

@@ -56,7 +56,7 @@ Allocator :: struct {
 DEFAULT_ALIGNMENT :: 2*align_of(rawptr)
 DEFAULT_ALIGNMENT :: 2*align_of(rawptr)
 
 
 DEFAULT_PAGE_SIZE ::
 DEFAULT_PAGE_SIZE ::
-	64 * 1024 when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64 else
+	64 * 1024 when ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32 else
 	16 * 1024 when ODIN_OS == .Darwin && ODIN_ARCH == .arm64 else
 	16 * 1024 when ODIN_OS == .Darwin && ODIN_ARCH == .arm64 else
 	4 * 1024
 	4 * 1024
 
 

+ 1 - 1
core/runtime/core.odin

@@ -471,7 +471,7 @@ Odin_OS_Type :: type_of(ODIN_OS)
 		arm32,
 		arm32,
 		arm64,
 		arm64,
 		wasm32,
 		wasm32,
-		wasm64,
+		wasm64p32,
 	}
 	}
 */
 */
 Odin_Arch_Type :: type_of(ODIN_ARCH)
 Odin_Arch_Type :: type_of(ODIN_ARCH)

+ 1 - 1
core/runtime/entry_wasm.odin

@@ -1,5 +1,5 @@
 //+private
 //+private
-//+build wasm32, wasm64
+//+build wasm32, wasm64p32
 package runtime
 package runtime
 
 
 import "core:intrinsics"
 import "core:intrinsics"

+ 1 - 1
core/runtime/internal.odin

@@ -3,7 +3,7 @@ package runtime
 import "core:intrinsics"
 import "core:intrinsics"
 
 
 @(private="file")
 @(private="file")
-IS_WASM :: ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64
+IS_WASM :: ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32
 
 
 @(private)
 @(private)
 RUNTIME_LINKAGE :: "strong" when (
 RUNTIME_LINKAGE :: "strong" when (

+ 1 - 1
core/runtime/procs.odin

@@ -25,7 +25,7 @@ when ODIN_NO_CRT && ODIN_OS == .Windows {
 		RtlMoveMemory(dst, src, len)
 		RtlMoveMemory(dst, src, len)
 		return dst
 		return dst
 	}
 	}
-} else when ODIN_NO_CRT || (ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64) {
+} else when ODIN_NO_CRT || (ODIN_ARCH == .wasm32 || ODIN_ARCH == .wasm64p32) {
 	@(link_name="memset", linkage="strong", require)
 	@(link_name="memset", linkage="strong", require)
 	memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr {
 	memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr {
 		if ptr != nil && len != 0 {
 		if ptr != nil && len != 0 {

+ 1 - 1
core/sync/futex_wasm.odin

@@ -1,5 +1,5 @@
 //+private
 //+private
-//+build wasm32, wasm64
+//+build wasm32, wasm64p32
 package sync
 package sync
 
 
 import "core:intrinsics"
 import "core:intrinsics"

+ 1 - 1
core/sync/primitives_wasm.odin

@@ -1,5 +1,5 @@
 //+private
 //+private
-//+build wasm32, wasm64
+//+build wasm32, wasm64p32
 package sync
 package sync
 
 
 _current_thread_id :: proc "contextless" () -> int {
 _current_thread_id :: proc "contextless" () -> int {

+ 40 - 13
src/build_settings.cpp

@@ -35,7 +35,7 @@ enum TargetArchKind : u16 {
 	TargetArch_arm32,
 	TargetArch_arm32,
 	TargetArch_arm64,
 	TargetArch_arm64,
 	TargetArch_wasm32,
 	TargetArch_wasm32,
-	TargetArch_wasm64,
+	TargetArch_wasm64p32,
 
 
 	TargetArch_COUNT,
 	TargetArch_COUNT,
 };
 };
@@ -81,7 +81,7 @@ gb_global String target_arch_names[TargetArch_COUNT] = {
 	str_lit("arm32"),
 	str_lit("arm32"),
 	str_lit("arm64"),
 	str_lit("arm64"),
 	str_lit("wasm32"),
 	str_lit("wasm32"),
-	str_lit("wasm64"),
+	str_lit("wasm64p32"),
 };
 };
 
 
 gb_global String target_endian_names[TargetEndian_COUNT] = {
 gb_global String target_endian_names[TargetEndian_COUNT] = {
@@ -475,14 +475,32 @@ gb_global TargetMetrics target_wasi_wasm32 = {
 };
 };
 
 
 
 
-gb_global TargetMetrics target_js_wasm64 = {
+gb_global TargetMetrics target_freestanding_wasm64p32 = {
+	TargetOs_freestanding,
+	TargetArch_wasm64p32,
+	4, 8, 8, 16,
+	str_lit("wasm32-freestanding-js"),
+	str_lit("e-m:e-p:32:32-i64:64-n32:64-S128"),
+};
+
+gb_global TargetMetrics target_js_wasm64p32 = {
 	TargetOs_js,
 	TargetOs_js,
-	TargetArch_wasm64,
-	8, 8, 8, 16,
-	str_lit("wasm64-js-js"),
-	str_lit(""),
+	TargetArch_wasm64p32,
+	4, 8, 8, 16,
+	str_lit("wasm32-js-js"),
+	str_lit("e-m:e-p:32:32-i64:64-n32:64-S128"),
 };
 };
 
 
+gb_global TargetMetrics target_wasi_wasm64p32 = {
+	TargetOs_wasi,
+	TargetArch_wasm32,
+	4, 8, 8, 16,
+	str_lit("wasm32-wasi-js"),
+	str_lit("e-m:e-p:32:32-i64:64-n32:64-S128"),
+};
+
+
+
 gb_global TargetMetrics target_freestanding_amd64_sysv = {
 gb_global TargetMetrics target_freestanding_amd64_sysv = {
 	TargetOs_freestanding,
 	TargetOs_freestanding,
 	TargetArch_amd64,
 	TargetArch_amd64,
@@ -502,20 +520,29 @@ struct NamedTargetMetrics {
 gb_global NamedTargetMetrics named_targets[] = {
 gb_global NamedTargetMetrics named_targets[] = {
 	{ str_lit("darwin_amd64"),        &target_darwin_amd64   },
 	{ str_lit("darwin_amd64"),        &target_darwin_amd64   },
 	{ str_lit("darwin_arm64"),        &target_darwin_arm64   },
 	{ str_lit("darwin_arm64"),        &target_darwin_arm64   },
+
 	{ str_lit("essence_amd64"),       &target_essence_amd64  },
 	{ str_lit("essence_amd64"),       &target_essence_amd64  },
+
 	{ str_lit("linux_i386"),          &target_linux_i386     },
 	{ str_lit("linux_i386"),          &target_linux_i386     },
 	{ str_lit("linux_amd64"),         &target_linux_amd64    },
 	{ str_lit("linux_amd64"),         &target_linux_amd64    },
 	{ str_lit("linux_arm64"),         &target_linux_arm64    },
 	{ str_lit("linux_arm64"),         &target_linux_arm64    },
 	{ str_lit("linux_arm32"),         &target_linux_arm32    },
 	{ str_lit("linux_arm32"),         &target_linux_arm32    },
+
 	{ str_lit("windows_i386"),        &target_windows_i386   },
 	{ str_lit("windows_i386"),        &target_windows_i386   },
 	{ str_lit("windows_amd64"),       &target_windows_amd64  },
 	{ str_lit("windows_amd64"),       &target_windows_amd64  },
+
 	{ str_lit("freebsd_i386"),        &target_freebsd_i386   },
 	{ str_lit("freebsd_i386"),        &target_freebsd_i386   },
 	{ str_lit("freebsd_amd64"),       &target_freebsd_amd64  },
 	{ str_lit("freebsd_amd64"),       &target_freebsd_amd64  },
+
 	{ str_lit("openbsd_amd64"),       &target_openbsd_amd64  },
 	{ str_lit("openbsd_amd64"),       &target_openbsd_amd64  },
+
 	{ str_lit("freestanding_wasm32"), &target_freestanding_wasm32 },
 	{ str_lit("freestanding_wasm32"), &target_freestanding_wasm32 },
 	{ str_lit("wasi_wasm32"),         &target_wasi_wasm32 },
 	{ str_lit("wasi_wasm32"),         &target_wasi_wasm32 },
 	{ str_lit("js_wasm32"),           &target_js_wasm32 },
 	{ str_lit("js_wasm32"),           &target_js_wasm32 },
-	// { str_lit("js_wasm64"),           &target_js_wasm64 },
+
+	{ str_lit("freestanding_wasm64p32"), &target_freestanding_wasm64p32 },
+	{ str_lit("js_wasm64p32"),           &target_js_wasm64p32 },
+	{ str_lit("wasi_wasm64p32"),         &target_wasi_wasm64p32 },
 
 
 	{ str_lit("freestanding_amd64_sysv"), &target_freestanding_amd64_sysv },
 	{ str_lit("freestanding_amd64_sysv"), &target_freestanding_amd64_sysv },
 };
 };
@@ -624,7 +651,7 @@ gb_internal bool find_library_collection_path(String name, String *path) {
 gb_internal bool is_arch_wasm(void) {
 gb_internal bool is_arch_wasm(void) {
 	switch (build_context.metrics.arch) {
 	switch (build_context.metrics.arch) {
 	case TargetArch_wasm32:
 	case TargetArch_wasm32:
-	case TargetArch_wasm64:
+	case TargetArch_wasm64p32:
 		return true;
 		return true;
 	}
 	}
 	return false;
 	return false;
@@ -642,7 +669,7 @@ gb_internal bool is_arch_x86(void) {
 gb_internal bool allow_check_foreign_filepath(void) {
 gb_internal bool allow_check_foreign_filepath(void) {
 	switch (build_context.metrics.arch) {
 	switch (build_context.metrics.arch) {
 	case TargetArch_wasm32:
 	case TargetArch_wasm32:
-	case TargetArch_wasm64:
+	case TargetArch_wasm64p32:
 		return false;
 		return false;
 	}
 	}
 	return true;
 	return true;
@@ -1266,9 +1293,9 @@ gb_internal void init_build_context(TargetMetrics *cross_target) {
 		// link_flags = gb_string_appendc(link_flags, "--export-all ");
 		// link_flags = gb_string_appendc(link_flags, "--export-all ");
 		// link_flags = gb_string_appendc(link_flags, "--export-table ");
 		// link_flags = gb_string_appendc(link_flags, "--export-table ");
 		link_flags = gb_string_appendc(link_flags, "--allow-undefined ");
 		link_flags = gb_string_appendc(link_flags, "--allow-undefined ");
-		if (bc->metrics.arch == TargetArch_wasm64) {
-			link_flags = gb_string_appendc(link_flags, "-mwasm64 ");
-		}
+		// if (bc->metrics.arch == TargetArch_wasm64) {
+		// 	link_flags = gb_string_appendc(link_flags, "-mwasm64 ");
+		// }
 		if (bc->no_entry_point) {
 		if (bc->no_entry_point) {
 			link_flags = gb_string_appendc(link_flags, "--no-entry ");
 			link_flags = gb_string_appendc(link_flags, "--no-entry ");
 		}
 		}

+ 7 - 7
src/checker.cpp

@@ -971,13 +971,13 @@ gb_internal void init_universal(void) {
 
 
 	{
 	{
 		GlobalEnumValue values[TargetArch_COUNT] = {
 		GlobalEnumValue values[TargetArch_COUNT] = {
-			{"Unknown", TargetArch_Invalid},
-			{"amd64",   TargetArch_amd64},
-			{"i386",    TargetArch_i386},
-			{"arm32",   TargetArch_arm32},
-			{"arm64",   TargetArch_arm64},
-			{"wasm32",  TargetArch_wasm32},
-			{"wasm64",  TargetArch_wasm64},
+			{"Unknown",   TargetArch_Invalid},
+			{"amd64",     TargetArch_amd64},
+			{"i386",      TargetArch_i386},
+			{"arm32",     TargetArch_arm32},
+			{"arm64",     TargetArch_arm64},
+			{"wasm32",    TargetArch_wasm32},
+			{"wasm64p32", TargetArch_wasm64p32},
 		};
 		};
 
 
 		auto fields = add_global_enum_type(str_lit("Odin_Arch_Type"), values, gb_count_of(values));
 		auto fields = add_global_enum_type(str_lit("Odin_Arch_Type"), values, gb_count_of(values));

+ 1 - 1
src/llvm_abi.cpp

@@ -1467,7 +1467,7 @@ gb_internal LB_ABI_INFO(lb_get_abi_info_internal) {
 	case TargetArch_arm64:
 	case TargetArch_arm64:
 		return lbAbiArm64::abi_info(c, arg_types, arg_count, return_type, return_is_defined, return_is_tuple, calling_convention);
 		return lbAbiArm64::abi_info(c, arg_types, arg_count, return_type, return_is_defined, return_is_tuple, calling_convention);
 	case TargetArch_wasm32:
 	case TargetArch_wasm32:
-	case TargetArch_wasm64:
+	case TargetArch_wasm64p32:
 		return lbAbiWasm::abi_info(c, arg_types, arg_count, return_type, return_is_defined, return_is_tuple, calling_convention);
 		return lbAbiWasm::abi_info(c, arg_types, arg_count, return_type, return_is_defined, return_is_tuple, calling_convention);
 	}
 	}
 
 

+ 1 - 1
src/llvm_backend.cpp

@@ -1975,7 +1975,7 @@ gb_internal bool lb_generate_code(lbGenerator *gen) {
 		LLVMInitializeAArch64Disassembler();
 		LLVMInitializeAArch64Disassembler();
 		break;
 		break;
 	case TargetArch_wasm32:
 	case TargetArch_wasm32:
-	case TargetArch_wasm64:
+	case TargetArch_wasm64p32:
 		LLVMInitializeWebAssemblyTargetInfo();
 		LLVMInitializeWebAssemblyTargetInfo();
 		LLVMInitializeWebAssemblyTarget();
 		LLVMInitializeWebAssemblyTarget();
 		LLVMInitializeWebAssemblyTargetMC();
 		LLVMInitializeWebAssemblyTargetMC();

+ 1 - 1
src/llvm_backend_expr.cpp

@@ -528,7 +528,7 @@ gb_internal bool lb_is_matrix_simdable(Type *t) {
 				return true;
 				return true;
 			case TargetArch_i386:
 			case TargetArch_i386:
 			case TargetArch_wasm32:
 			case TargetArch_wasm32:
-			case TargetArch_wasm64:
+			case TargetArch_wasm64p32:
 				return false;
 				return false;
 			}
 			}
 		}
 		}

+ 1 - 1
src/llvm_backend_utility.cpp

@@ -1685,7 +1685,7 @@ gb_internal lbValue lb_emit_mul_add(lbProcedure *p, lbValue a, lbValue b, lbValu
 			break;
 			break;
 		case TargetArch_i386:
 		case TargetArch_i386:
 		case TargetArch_wasm32:
 		case TargetArch_wasm32:
-		case TargetArch_wasm64:
+		case TargetArch_wasm64p32:
 			is_possible = false;
 			is_possible = false;
 			break;
 			break;
 		}
 		}

+ 1 - 1
vendor/wasm/js/dom.odin

@@ -1,4 +1,4 @@
-//+build js wasm32, js wasm64
+//+build js wasm32, js wasm64p32
 package wasm_js_interface
 package wasm_js_interface
 
 
 foreign import dom_lib "odin_dom"
 foreign import dom_lib "odin_dom"

+ 1 - 1
vendor/wasm/js/events.odin

@@ -1,4 +1,4 @@
-//+build js wasm32, js wasm64
+//+build js wasm32, js wasm64p32
 package wasm_js_interface
 package wasm_js_interface
 
 
 foreign import dom_lib "odin_dom"
 foreign import dom_lib "odin_dom"

+ 1 - 1
vendor/wasm/js/general.odin

@@ -1,4 +1,4 @@
-//+build js wasm32, js wasm64
+//+build js wasm32, js wasm64p32
 package wasm_js_interface
 package wasm_js_interface
 
 
 foreign import "odin_env"
 foreign import "odin_env"

+ 1 - 1
vendor/wasm/js/memory_js.odin

@@ -1,4 +1,4 @@
-//+build js wasm32, js wasm64
+//+build js wasm32, js wasm64p32
 package wasm_js_interface
 package wasm_js_interface
 
 
 import "core:mem"
 import "core:mem"