diff --git a/CMakeLists.txt b/CMakeLists.txt index 65b014b46..7913ca01d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -262,7 +262,11 @@ if(C3_WITH_LLVM) find_library(LLD_COFF NAMES liblldCOFF.dylib lldCOFF.lib lldCOFF.a liblldCOFF.dll.a liblldCOFF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) find_library(LLD_COMMON NAMES liblldCommon.dylib lldCommon.lib lldCommon.a liblldCommon.dll.a liblldCommon.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) find_library(LLD_ELF NAMES liblldELF.dylib lldELF.lib lldELF.a liblldELF.dll.a liblldELF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) - find_library(LLD_MACHO NAMES liblldMachO.dylib lldMachO.lib lldMachO.a liblldMachO.dll.a liblldMachO.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) + if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") + find_library(LLD_MACHO NAMES liblldMachO.dylib lldMachO.lib lldMachO.a liblldMachO.dll.a liblldMachO.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) + else() + set(LLD_MACHO "") + endif() find_library(LLD_MINGW NAMES liblldMinGW.dylib lldMinGW.lib lldMinGW.a liblldMinGW.dll.a liblldMinGW.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) find_library(LLD_WASM NAMES liblldWasm.dylib lldWasm.lib lldWasm.a liblldWasm.dll.a liblldWasm.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) else() @@ -275,7 +279,11 @@ if(C3_WITH_LLVM) find_library(LLD_COFF NAMES liblldCOFF.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) find_library(LLD_COMMON NAMES liblldCommon.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) find_library(LLD_ELF NAMES liblldELF.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) - find_library(LLD_MACHO NAMES liblldMachO.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) + if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") + find_library(LLD_MACHO NAMES liblldMachO.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) + else() + set(LLD_MACHO "") + endif() find_library(LLD_MINGW NAMES liblldMinGW.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) find_library(LLD_WASM NAMES liblldWasm.so PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) endif() @@ -512,7 +520,7 @@ endif () if (CURL_FOUND) target_link_libraries(c3c ${CURL_LIBRARIES}) - target_include_directories(c3c PRIVATE ${CURL_INCLUDES}) + target_include_directories(c3c PRIVATE ${CURL_INCLUDE_DIRS}) target_compile_definitions(c3c PUBLIC CURL_FOUND=1) else() target_compile_definitions(c3c PUBLIC CURL_FOUND=0) diff --git a/src/compiler/compiler.c b/src/compiler/compiler.c index 88cf62280..fd68d6118 100644 --- a/src/compiler/compiler.c +++ b/src/compiler/compiler.c @@ -1757,7 +1757,8 @@ static bool is_posix(OsType os) case OS_TYPE_NETBSD: case OS_TYPE_LINUX: case OS_TYPE_KFREEBSD: - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: + case OS_TYPE_OPENBSD: case OS_TYPE_SOLARIS: return true; case OS_TYPE_WIN32: diff --git a/src/compiler/enums.h b/src/compiler/enums.h index d6e251443..d71e41742 100644 --- a/src/compiler/enums.h +++ b/src/compiler/enums.h @@ -973,7 +973,7 @@ typedef enum OS_TYPE_ANANAS, OS_TYPE_CLOUD_ABI, OS_TYPE_DRAGON_FLY, - OS_TYPE_FREE_BSD, + OS_TYPE_FREEBSD, OS_TYPE_FUCHSIA, OS_TYPE_IOS, OS_TYPE_KFREEBSD, diff --git a/src/compiler/linker.c b/src/compiler/linker.c index da7b05e25..eaf814b7c 100644 --- a/src/compiler/linker.c +++ b/src/compiler/linker.c @@ -669,7 +669,7 @@ static bool linker_setup(const char ***args_ref, const char **files_to_link, uns case OS_TYPE_TVOS: case OS_TYPE_WASI: break; - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: case OS_TYPE_OPENBSD: case OS_TYPE_NETBSD: linker_setup_freebsd(args_ref, linker_type, is_dylib); @@ -776,7 +776,7 @@ Linker linker_find_linker_type(void) case OS_UNSUPPORTED: case OS_TYPE_UNKNOWN: case OS_TYPE_NONE: - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: case OS_TYPE_LINUX: case OS_TYPE_NETBSD: case OS_TYPE_OPENBSD: @@ -1120,7 +1120,7 @@ bool static_lib_linker(const char *output_file, const char **files, unsigned fil case OS_TYPE_WIN32: format = AR_COFF; break; - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: case OS_TYPE_NETBSD: case OS_TYPE_OPENBSD: format = AR_BSD; diff --git a/src/compiler/target.c b/src/compiler/target.c index 7acf4bdff..38894fadf 100644 --- a/src/compiler/target.c +++ b/src/compiler/target.c @@ -120,7 +120,7 @@ static bool os_target_use_thread_local(OsType os) case OS_TYPE_NONE: return false; case OS_DARWIN_TYPES: - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: case OS_TYPE_LINUX: case OS_TYPE_ANDROID: case OS_TYPE_NETBSD: @@ -269,7 +269,7 @@ static inline void target_setup_x86_abi(BuildTarget *target) { case OS_DARWIN_TYPES: case OS_TYPE_DRAGON_FLY: - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: case OS_TYPE_ELFIAMCU: case OS_TYPE_OPENBSD: case OS_TYPE_WIN32: @@ -1279,7 +1279,7 @@ static OsType os_from_llvm_string(StringSlice os_string) STRCASE("cloudabi", OS_TYPE_CLOUD_ABI) STRCASE("darwin", OS_TYPE_MACOSX) STRCASE("dragonfly", OS_TYPE_DRAGON_FLY) - STRCASE("freebsd", OS_TYPE_FREE_BSD) + STRCASE("freebsd", OS_TYPE_FREEBSD) STRCASE("fuchsia", OS_TYPE_FUCHSIA) STRCASE("ios", OS_TYPE_IOS) STRCASE("kfreebsd", OS_TYPE_KFREEBSD) @@ -1480,7 +1480,7 @@ static ObjectFormatType object_format_from_os(OsType os, ArchType arch_type) case OS_TYPE_ANDROID: case OS_TYPE_NETBSD: case OS_TYPE_OPENBSD: - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: return OBJ_FORMAT_ELF; case OS_DARWIN_TYPES: return OBJ_FORMAT_MACHO; @@ -1535,7 +1535,7 @@ static unsigned os_target_c_type_bits(OsType os, ArchType arch, CType type) case OS_TYPE_LINUX: case OS_TYPE_ANDROID: case OS_TYPE_NONE: - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: case OS_TYPE_NETBSD: case OS_TYPE_OPENBSD: case OS_TYPE_WASI: @@ -1715,7 +1715,7 @@ static RelocModel arch_os_reloc_default(ArchType arch, OsType os, EnvironmentTyp return RELOC_BIG_PIC; case OS_TYPE_WASI: return RELOC_NONE; - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: case OS_TYPE_NETBSD: case OS_TYPE_UNKNOWN: case OS_TYPE_NONE: @@ -1734,7 +1734,7 @@ static RelocModel arch_os_reloc_default(ArchType arch, OsType os, EnvironmentTyp { case OS_TYPE_UNKNOWN: case OS_TYPE_NONE: - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: case OS_TYPE_NETBSD: switch (arch) { @@ -1773,7 +1773,7 @@ static bool arch_os_pic_default_forced(ArchType arch, OsType os) case OS_TYPE_WASI: case OS_TYPE_UNKNOWN: case OS_TYPE_NONE: - case OS_TYPE_FREE_BSD: + case OS_TYPE_FREEBSD: case OS_TYPE_LINUX: case OS_TYPE_ANDROID: case OS_TYPE_NETBSD: diff --git a/src/utils/hostinfo.c b/src/utils/hostinfo.c index 33df62d33..5b63196f2 100644 --- a/src/utils/hostinfo.c +++ b/src/utils/hostinfo.c @@ -85,7 +85,7 @@ OsType hostinfo_os_type(void) #if __APPLE__ return OS_TYPE_MACOSX; #else - if (system("freebsd-version -k") == 0) return OS_TYPE_FREE_BSD; + if (system("freebsd-version -k") == 0) return OS_TYPE_FREEBSD; if (system("uname -r") == 0) return OS_TYPE_LINUX; if (system("cd C:/Windows") == 0) return OS_TYPE_WIN32; return OS_TYPE_UNKNOWN; @@ -96,7 +96,8 @@ static const char *llvm_os_name(OsType os) { switch (os) { - case OS_TYPE_FREE_BSD: return "freebsd"; + case OS_TYPE_FREEBSD: return "freebsd"; + case OS_TYPE_OPENBSD: return "openbsd"; case OS_TYPE_LINUX: return "linux"; case OS_TYPE_WIN32: return "win32"; case OS_TYPE_MACOSX: return "darwin"; diff --git a/src/utils/vmem.c b/src/utils/vmem.c index 6622cc051..eb109f76a 100644 --- a/src/utils/vmem.c +++ b/src/utils/vmem.c @@ -28,7 +28,7 @@ static inline void mmap_init(Vmem *vmem, size_t size) } #elif PLATFORM_POSIX void* ptr = NULL; - size_t min_size = size / 128; + size_t min_size = size / 512; if (min_size < 1) min_size = size; while (size >= min_size) { @@ -108,4 +108,4 @@ void vmem_free(Vmem *vmem) vmem->allocated = 0; vmem->ptr = 0; vmem->size = 0; -} \ No newline at end of file +} diff --git a/src/utils/whereami.c b/src/utils/whereami.c index 16665aa68..3257bb04c 100644 --- a/src/utils/whereami.c +++ b/src/utils/whereami.c @@ -140,6 +140,42 @@ static int get_executable_path_raw(char *out) return length; } +#elif defined(__OpenBSD__) +// this target doesn't have a reliable way to get full path to the executable +// a partially functional fix is implemented + +extern const char *compiler_exe_name; + +static int get_executable_path_raw(char *out) +{ + char tmp[PATH_MAX] = { 0 }; + if (compiler_exe_name[0] == '.') + realpath(compiler_exe_name, tmp); + else if (compiler_exe_name[0] == '/') + strcpy(tmp, compiler_exe_name); + else if (strcmp(compiler_exe_name, "c3c") == 0) { + char *path = getenv("PATH"); + int len = 0; + do { + len = strcspn(path, ":"); + strncat(tmp, path, len); + tmp[len] = '/'; + strcat(tmp, "c3c"); + if (realpath(tmp, tmp) != NULL) break; + memset(tmp, 0, len + 4); // to account for /c3c + path += len + 1; + } while (path[-1]); + if (path[-1] == 0) error_exit("Unable to find full path of the executable"); + } else error_exit("Unable to find full path of the executable"); + + int length = strlen(tmp); + if (length >= MAX_EXE_PATH) error_exit("Executable path too long"); + memcpy(out, tmp, length); + out[length] = 0; + + return length; +} + #else #error unsupported platform @@ -173,4 +209,4 @@ const char *find_executable_path(void) } buffer[0] = 0; return buffer; -} \ No newline at end of file +} diff --git a/wrapper/src/wrapper.cpp b/wrapper/src/wrapper.cpp index 5eadd1acd..786d5d49d 100644 --- a/wrapper/src/wrapper.cpp +++ b/wrapper/src/wrapper.cpp @@ -107,9 +107,13 @@ static bool llvm_link(ObjFormat format, const char **args, int arg_count, const case ELF: success = lld::elf::link(CALL_ARGS); break; +#ifndef __OpenBSD__ case MACHO: success = lld::macho::link(CALL_ARGS); break; +#else +#warning "the maintainers of LLVM on this platform has deliberately excluded targets, which makes it impossible to offer the standard cross compilation available in the normal compiler" +#endif case WASM: success = lld::wasm::link(CALL_ARGS); break;