From 1165d65c94db7210d1fdb34fdaa44b68ca80c4c6 Mon Sep 17 00:00:00 2001 From: Feoramund <161657516+Feoramund@users.noreply.github.com> Date: Sun, 5 May 2024 07:26:45 -0400 Subject: [PATCH] Minimally support compiling Odin on FreeBSD arm64 This is enough to get Odin itself compiling and the demo running. --- core/os/os_freebsd.odin | 2 +- src/build_settings.cpp | 15 ++++++++++++++- src/gb/gb.h | 2 ++ src/threading.cpp | 2 ++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/os/os_freebsd.odin b/core/os/os_freebsd.odin index be86854dd..cdd44d301 100644 --- a/core/os/os_freebsd.odin +++ b/core/os/os_freebsd.odin @@ -159,7 +159,7 @@ blkcnt_t :: i64 blksize_t :: i32 fflags_t :: u32 -when ODIN_ARCH == .amd64 /* LP64 */ { +when ODIN_ARCH == .amd64 || ODIN_ARCH == .arm64 /* LP64 */ { time_t :: i64 } else { time_t :: i32 diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 8509394ff..42a9a4258 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -549,6 +549,14 @@ gb_global TargetMetrics target_freebsd_amd64 = { str_lit("e-m:w-i64:64-f80:128-n8:16:32:64-S128"), }; +gb_global TargetMetrics target_freebsd_arm64 = { + TargetOs_freebsd, + TargetArch_arm64, + 8, 8, 16, 16, + str_lit("aarch64-unknown-freebsd-elf"), + str_lit("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"), +}; + gb_global TargetMetrics target_openbsd_amd64 = { TargetOs_openbsd, TargetArch_amd64, @@ -670,6 +678,7 @@ gb_global NamedTargetMetrics named_targets[] = { { str_lit("freebsd_i386"), &target_freebsd_i386 }, { str_lit("freebsd_amd64"), &target_freebsd_amd64 }, + { str_lit("freebsd_arm64"), &target_freebsd_arm64 }, { str_lit("openbsd_amd64"), &target_openbsd_amd64 }, { str_lit("haiku_amd64"), &target_haiku_amd64 }, @@ -1424,7 +1433,11 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta metrics = &target_darwin_amd64; #endif #elif defined(GB_SYSTEM_FREEBSD) - metrics = &target_freebsd_amd64; + #if defined(GB_CPU_ARM) + metrics = &target_freebsd_arm64; + #else + metrics = &target_freebsd_amd64; + #endif #elif defined(GB_SYSTEM_OPENBSD) metrics = &target_openbsd_amd64; #elif defined(GB_SYSTEM_HAIKU) diff --git a/src/gb/gb.h b/src/gb/gb.h index 868e11a16..c55ff8a9a 100644 --- a/src/gb/gb.h +++ b/src/gb/gb.h @@ -3009,6 +3009,8 @@ gb_inline u32 gb_thread_current_id(void) { thread_id = gettid(); #elif defined(GB_SYSTEM_HAIKU) thread_id = find_thread(NULL); +#elif defined(GB_SYSTEM_FREEBSD) + thread_id = pthread_getthreadid_np(); #else #error Unsupported architecture for gb_thread_current_id() #endif diff --git a/src/threading.cpp b/src/threading.cpp index fbe8997d1..f2e0789f8 100644 --- a/src/threading.cpp +++ b/src/threading.cpp @@ -492,6 +492,8 @@ gb_internal u32 thread_current_id(void) { thread_id = gettid(); #elif defined(GB_SYSTEM_HAIKU) thread_id = find_thread(NULL); +#elif defined(GB_SYSTEM_FREEBSD) + thread_id = pthread_getthreadid_np(); #else #error Unsupported architecture for thread_current_id() #endif