Browse Source

Improve Haiku support

avanspector 1 year ago
parent
commit
88add0b6b1
6 changed files with 73 additions and 4 deletions
  1. 66 0
      src/build_settings.cpp
  2. 1 0
      src/check_builtin.cpp
  3. 1 0
      src/checker.cpp
  4. 2 2
      src/linker.cpp
  5. 2 2
      src/llvm_backend.cpp
  6. 1 0
      src/tilde.cpp

+ 66 - 0
src/build_settings.cpp

@@ -18,6 +18,7 @@ enum TargetOsKind : u16 {
 	TargetOs_essence,
 	TargetOs_essence,
 	TargetOs_freebsd,
 	TargetOs_freebsd,
 	TargetOs_openbsd,
 	TargetOs_openbsd,
+	TargetOs_haiku,
 	
 	
 	TargetOs_wasi,
 	TargetOs_wasi,
 	TargetOs_js,
 	TargetOs_js,
@@ -542,6 +543,13 @@ gb_global TargetMetrics target_openbsd_amd64 = {
 	str_lit("e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"),
 	str_lit("e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"),
 };
 };
 
 
+gb_global TargetMetrics target_haiku_amd64 = {
+	TargetOs_haiku,
+	TargetArch_amd64,
+	8, 8, 8, 16,
+	str_lit("x86_64-unknown-haiku"),
+};
+
 gb_global TargetMetrics target_essence_amd64 = {
 gb_global TargetMetrics target_essence_amd64 = {
 	TargetOs_essence,
 	TargetOs_essence,
 	TargetArch_amd64,
 	TargetArch_amd64,
@@ -641,6 +649,7 @@ gb_global NamedTargetMetrics named_targets[] = {
 	{ 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("haiku_amd64"),         &target_haiku_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 },
@@ -872,6 +881,58 @@ gb_internal String internal_odin_root_dir(void) {
 	return path;
 	return path;
 }
 }
 
 
+#elif defined(GB_SYSTEM_HAIKU)
+
+#include <FindDirectory.h>
+
+gb_internal String internal_odin_root_dir(void) {
+	String path = global_module_path;
+	isize len, i;
+	u8 *text;
+
+	if (global_module_path_set) {
+		return global_module_path;
+	}
+
+	auto path_buf = array_make<char>(heap_allocator(), 300);
+
+	len = 0;
+	for (;;) {
+		u32 sz = path_buf.count;
+		int res = find_path(B_APP_IMAGE_SYMBOL, B_FIND_PATH_IMAGE_PATH, nullptr, &path_buf[0], sz);
+		if(res == B_OK) {
+			len = sz;
+			break;
+		} else {
+			array_resize(&path_buf, sz + 1);
+		}
+	}
+
+	mutex_lock(&string_buffer_mutex);
+	defer (mutex_unlock(&string_buffer_mutex));
+
+	text = gb_alloc_array(permanent_allocator(), u8, len + 1);
+	gb_memmove(text, &path_buf[0], len);
+
+	path = path_to_fullpath(heap_allocator(), make_string(text, len), nullptr);
+
+	for (i = path.len-1; i >= 0; i--) {
+		u8 c = path[i];
+		if (c == '/' || c == '\\') {
+			break;
+		}
+		path.len--;
+	}
+
+	global_module_path = path;
+	global_module_path_set = true;
+
+
+	// array_free(&path_buf);
+
+	return path;
+}
+
 #elif defined(GB_SYSTEM_OSX)
 #elif defined(GB_SYSTEM_OSX)
 
 
 #include <mach-o/dyld.h>
 #include <mach-o/dyld.h>
@@ -1301,6 +1362,8 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
 			metrics = &target_freebsd_amd64;
 			metrics = &target_freebsd_amd64;
 		#elif defined(GB_SYSTEM_OPENBSD)
 		#elif defined(GB_SYSTEM_OPENBSD)
 			metrics = &target_openbsd_amd64;
 			metrics = &target_openbsd_amd64;
+		#elif defined(GB_SYSTEM_HAIKU)
+			metrics = &target_haiku_amd64;
 		#elif defined(GB_CPU_ARM)
 		#elif defined(GB_CPU_ARM)
 			metrics = &target_linux_arm64;
 			metrics = &target_linux_arm64;
 		#else
 		#else
@@ -1405,6 +1468,9 @@ gb_internal void init_build_context(TargetMetrics *cross_target, Subtarget subta
 		case TargetOs_openbsd:
 		case TargetOs_openbsd:
 			bc->link_flags = str_lit("-arch x86-64 ");
 			bc->link_flags = str_lit("-arch x86-64 ");
 			break;
 			break;
+		case TargetOs_haiku:
+			bc->link_flags = str_lit("-arch x86-64 ");
+			break;
 		}
 		}
 	} else if (bc->metrics.arch == TargetArch_i386) {
 	} else if (bc->metrics.arch == TargetArch_i386) {
 		switch (bc->metrics.os) {
 		switch (bc->metrics.os) {

+ 1 - 0
src/check_builtin.cpp

@@ -4928,6 +4928,7 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As
 			case TargetOs_essence:
 			case TargetOs_essence:
 			case TargetOs_freebsd:
 			case TargetOs_freebsd:
 			case TargetOs_openbsd:
 			case TargetOs_openbsd:
+			case TargetOs_haiku:
 				switch (build_context.metrics.arch) {
 				switch (build_context.metrics.arch) {
 				case TargetArch_i386:
 				case TargetArch_i386:
 				case TargetArch_amd64:
 				case TargetArch_amd64:

+ 1 - 0
src/checker.cpp

@@ -1007,6 +1007,7 @@ gb_internal void init_universal(void) {
 			{"Linux",        TargetOs_linux},
 			{"Linux",        TargetOs_linux},
 			{"Essence",      TargetOs_essence},
 			{"Essence",      TargetOs_essence},
 			{"FreeBSD",      TargetOs_freebsd},
 			{"FreeBSD",      TargetOs_freebsd},
+			{"Haiku",        TargetOs_haiku},
 			{"OpenBSD",      TargetOs_openbsd},
 			{"OpenBSD",      TargetOs_openbsd},
 			{"WASI",         TargetOs_wasi},
 			{"WASI",         TargetOs_wasi},
 			{"JS",           TargetOs_js},
 			{"JS",           TargetOs_js},

+ 2 - 2
src/linker.cpp

@@ -474,8 +474,8 @@ gb_internal i32 linker_stage(LinkerData *gen) {
 					link_settings = gb_string_appendc(link_settings, "-Wl,-fini,'_odin_exit_point' ");
 					link_settings = gb_string_appendc(link_settings, "-Wl,-fini,'_odin_exit_point' ");
 				}
 				}
 
 
-			} else if (build_context.metrics.os != TargetOs_openbsd) {
-				// OpenBSD defaults to PIE executable. do not pass -no-pie for it.
+			} else if (build_context.metrics.os != TargetOs_openbsd && build_context.metrics.os != TargetOs_haiku) {
+				// OpenBSD and Haiku default to PIE executable. do not pass -no-pie for it.
 				link_settings = gb_string_appendc(link_settings, "-no-pie ");
 				link_settings = gb_string_appendc(link_settings, "-no-pie ");
 			}
 			}
 
 

+ 2 - 2
src/llvm_backend.cpp

@@ -2602,8 +2602,8 @@ gb_internal bool lb_generate_code(lbGenerator *gen) {
 
 
 	switch (build_context.reloc_mode) {
 	switch (build_context.reloc_mode) {
 	case RelocMode_Default:
 	case RelocMode_Default:
-		if (build_context.metrics.os == TargetOs_openbsd) {
-			// Always use PIC for OpenBSD: it defaults to PIE
+		if (build_context.metrics.os == TargetOs_openbsd || build_context.metrics.os == TargetOs_haiku) {
+			// Always use PIC for OpenBSD and Haiku: they default to PIE
 			reloc_mode = LLVMRelocPIC;
 			reloc_mode = LLVMRelocPIC;
 		}
 		}
 		break;
 		break;

+ 1 - 0
src/tilde.cpp

@@ -825,6 +825,7 @@ gb_internal bool cg_generate_code(Checker *c, LinkerData *linker_data) {
 		case TargetOs_essence:
 		case TargetOs_essence:
 		case TargetOs_freebsd:
 		case TargetOs_freebsd:
 		case TargetOs_openbsd:
 		case TargetOs_openbsd:
+		case TargetOs_haiku:
 			debug_format = TB_DEBUGFMT_DWARF;
 			debug_format = TB_DEBUGFMT_DWARF;
 			break;
 			break;
 		}
 		}