From ef023186992bf2c4bb8b86bae291479b54bd963d Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Thu, 7 Mar 2024 07:55:10 +0000 Subject: [PATCH 1/8] missing \n in error message --- src/jitlayers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/jitlayers.cpp b/src/jitlayers.cpp index c3ccb5746e37a..4197bdf191b9a 100644 --- a/src/jitlayers.cpp +++ b/src/jitlayers.cpp @@ -1802,7 +1802,7 @@ void JuliaOJIT::addModule(orc::ThreadSafeModule TSM) auto Lookups = ES.lookup({{&JD, orc::JITDylibLookupFlags::MatchExportedSymbolsOnly}}, NewExports); if (!Lookups) { ES.reportError(Lookups.takeError()); - errs() << "Failed to lookup symbols in module!"; + errs() << "Failed to lookup symbols in module!\n"; if (CurrentlyCompiling) { CurrentlyCompiling.withModuleDo([](Module &M) JL_NOTSAFEPOINT { errs() << "Dumping failing module\n" << M << "\n"; }); } else { From bb4279517396ed26848bfa642d8614cf4247ff50 Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Thu, 7 Mar 2024 07:55:10 +0000 Subject: [PATCH 2/8] deps: adjustments in common - libsuitesparse: use $(MAKE) instead of hardcoding "make" (it is "gmake" on BSD) - patchelf: pass MAKE variable - libssh2: pass -fPIC if need (permit libgit2 to link on OpenBSD) --- deps/libssh2.mk | 4 ++++ deps/libsuitesparse.mk | 4 ++-- deps/patchelf.mk | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/deps/libssh2.mk b/deps/libssh2.mk index 3f9738515e4a1..9a1738d8440bc 100644 --- a/deps/libssh2.mk +++ b/deps/libssh2.mk @@ -11,6 +11,10 @@ endif LIBSSH2_OPTS := $(CMAKE_COMMON) -DBUILD_SHARED_LIBS=ON -DBUILD_EXAMPLES=OFF \ -DCMAKE_BUILD_TYPE=Release +ifneq ($(fPIC),) +LIBSSH2_OPTS += -DCMAKE_C_FLAGS="-fPIC" +endif + ifeq ($(OS),WINNT) LIBSSH2_OPTS += -DCRYPTO_BACKEND=WinCNG -DENABLE_ZLIB_COMPRESSION=OFF ifeq ($(BUILD_OS),WINNT) diff --git a/deps/libsuitesparse.mk b/deps/libsuitesparse.mk index 7e36bce8f4f9d..61a0ab33f21c0 100644 --- a/deps/libsuitesparse.mk +++ b/deps/libsuitesparse.mk @@ -59,8 +59,8 @@ $(BUILDDIR)/SuiteSparse-$(LIBSUITESPARSE_VER)/build-compiled: | $(build_prefix)/ $(BUILDDIR)/SuiteSparse-$(LIBSUITESPARSE_VER)/build-compiled: $(BUILDDIR)/SuiteSparse-$(LIBSUITESPARSE_VER)/source-patched cd $(dir $<) && $(CMAKE) . $(LIBSUITESPARSE_CMAKE_FLAGS) - make -C $(dir $<) - make -C $(dir $<) install + $(MAKE) -C $(dir $<) + $(MAKE) -C $(dir $<) install echo 1 > $@ ifeq ($(OS),WINNT) diff --git a/deps/patchelf.mk b/deps/patchelf.mk index 9b4947f183117..c019892058d0e 100644 --- a/deps/patchelf.mk +++ b/deps/patchelf.mk @@ -20,7 +20,7 @@ $(BUILDDIR)/patchelf-$(PATCHELF_VER)/build-configured: XC_HOST:=$(BUILD_MACHINE) $(BUILDDIR)/patchelf-$(PATCHELF_VER)/build-configured: $(SRCCACHE)/patchelf-$(PATCHELF_VER)/source-extracted mkdir -p $(dir $@) cd $(dir $@) && \ - $(dir $<)/configure $(CONFIGURE_COMMON) LDFLAGS="$(CXXLDFLAGS)" CPPFLAGS="$(CPPFLAGS)" + $(dir $<)/configure $(CONFIGURE_COMMON) LDFLAGS="$(CXXLDFLAGS)" CPPFLAGS="$(CPPFLAGS)" MAKE=$(MAKE) echo 1 > $@ $(BUILDDIR)/patchelf-$(PATCHELF_VER)/build-compiled: $(BUILDDIR)/patchelf-$(PATCHELF_VER)/build-configured From 690971d56d2ba07a0b2066ba464befa3bd10f0f8 Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Thu, 7 Mar 2024 07:55:10 +0000 Subject: [PATCH 3/8] deps: openbsd specifics bits - libgit2: search iconv.h in right directory - pcre2: avoid RWX memory by disabling jit on OpenBSD - libssh2 - libsuitesparse - mbedtls --- deps/libgit2.mk | 6 +++++- deps/libssh2.mk | 2 +- deps/libsuitesparse.mk | 2 +- deps/mbedtls.mk | 2 +- deps/pcre.mk | 3 +++ 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/deps/libgit2.mk b/deps/libgit2.mk index d68a7a80d6d5b..b65ac022885a3 100644 --- a/deps/libgit2.mk +++ b/deps/libgit2.mk @@ -33,8 +33,12 @@ LIBGIT2_OPTS += -DBUILD_TESTS=OFF -DDLLTOOL=`which $(CROSS_COMPILE)dlltool` LIBGIT2_OPTS += -DCMAKE_FIND_ROOT_PATH=/usr/$(XC_HOST) -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY endif endif +ifeq ($(OS),OpenBSD) +# iconv.h is third-party +LIBGIT2_OPTS += -DCMAKE_C_FLAGS="-I/usr/local/include" +endif -ifneq (,$(findstring $(OS),Linux FreeBSD)) +ifneq (,$(findstring $(OS),Linux FreeBSD OpenBSD)) LIBGIT2_OPTS += -DUSE_HTTPS="mbedTLS" -DUSE_SHA1="CollisionDetection" -DCMAKE_INSTALL_RPATH="\$$ORIGIN" endif diff --git a/deps/libssh2.mk b/deps/libssh2.mk index 9a1738d8440bc..c293d8309d2bc 100644 --- a/deps/libssh2.mk +++ b/deps/libssh2.mk @@ -24,7 +24,7 @@ else LIBSSH2_OPTS += -DCRYPTO_BACKEND=mbedTLS -DENABLE_ZLIB_COMPRESSION=OFF endif -ifneq (,$(findstring $(OS),Linux FreeBSD)) +ifneq (,$(findstring $(OS),Linux FreeBSD OpenBSD)) LIBSSH2_OPTS += -DCMAKE_INSTALL_RPATH="\$$ORIGIN" endif diff --git a/deps/libsuitesparse.mk b/deps/libsuitesparse.mk index 61a0ab33f21c0..0207c5ef7c099 100644 --- a/deps/libsuitesparse.mk +++ b/deps/libsuitesparse.mk @@ -36,7 +36,7 @@ else LIBSUITESPARSE_CMAKE_FLAGS += -DSUITESPARSE_USE_64BIT_BLAS=NO endif -ifneq (,$(findstring $(OS),Linux FreeBSD)) +ifneq (,$(findstring $(OS),Linux FreeBSD OpenBSD)) LIBSUITESPARSE_CMAKE_FLAGS += -DCMAKE_INSTALL_RPATH="\$$ORIGIN" endif diff --git a/deps/mbedtls.mk b/deps/mbedtls.mk index b4147c2c2684e..39cf817d70658 100644 --- a/deps/mbedtls.mk +++ b/deps/mbedtls.mk @@ -13,7 +13,7 @@ ifeq ($(BUILD_OS),WINNT) MBEDTLS_OPTS += -G"MSYS Makefiles" endif -ifneq (,$(findstring $(OS),Linux FreeBSD)) +ifneq (,$(findstring $(OS),Linux FreeBSD OpenBSD)) MBEDTLS_OPTS += -DCMAKE_INSTALL_RPATH="\$$ORIGIN" endif diff --git a/deps/pcre.mk b/deps/pcre.mk index cd1180d992885..3ff85d5569ad9 100644 --- a/deps/pcre.mk +++ b/deps/pcre.mk @@ -9,6 +9,9 @@ PCRE_LDFLAGS := $(RPATH_ESCAPED_ORIGIN) ifeq ($(OS),emscripten) PCRE_CFLAGS += -fPIC PCRE_JIT = --disable-jit +else ifeq ($(OS),OpenBSD) +# jit will need RWX memory +PCRE_JIT = --disable-jit else PCRE_JIT = --enable-jit endif From ba7c3f0b670e7e6e0d1dae0c071df22ca62afe3b Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Thu, 7 Mar 2024 07:55:10 +0000 Subject: [PATCH 4/8] openbsd: normalize_triplet --- contrib/normalize_triplet.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/normalize_triplet.py b/contrib/normalize_triplet.py index 77c047b360b76..b1bab29487b8f 100755 --- a/contrib/normalize_triplet.py +++ b/contrib/normalize_triplet.py @@ -19,6 +19,7 @@ platform_mapping = { 'darwin': "-apple-darwin[\\d\\.]*", 'freebsd': "-(.*-)?freebsd[\\d\\.]*", + 'openbsd': "-(.*-)?openbsd[\\d\\.]*", 'windows': "-w64-mingw32", 'linux': "-(.*-)?linux", } @@ -96,6 +97,7 @@ def p(x): 'darwin': 'apple-darwin', 'windows': 'w64-mingw32', 'freebsd': 'unknown-freebsd', + 'openbsd': 'unknown-openbsd', } x = r(x) if x: From 288796494fdcaefbfa8719af1595be280a69e0f4 Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Thu, 7 Mar 2024 07:55:14 +0000 Subject: [PATCH 5/8] add OpenBSD support --- Make.inc | 19 +++++++++++++++--- base/binaryplatforms.jl | 16 ++++++++++++--- base/sysinfo.jl | 2 +- cli/Makefile | 4 +++- cli/loader_lib.c | 2 +- deps/Makefile | 4 +++- src/Makefile | 2 ++ src/aotcompile.cpp | 2 +- src/cgmemmgr.cpp | 3 +++ src/codegen.cpp | 2 +- src/gc-stacks.c | 11 +++++++++++ src/jitlayers.cpp | 20 +++++++++++++++++++ src/julia.expmap.in | 2 +- src/julia_threads.h | 10 ++++++++++ src/signals-unix.c | 28 ++++++++++++++++++++++++-- src/support/dtypes.h | 2 +- src/support/platform.h | 3 +++ src/support/strtod.c | 2 +- src/support/utf8.c | 4 ++-- src/sys.c | 44 +++++++++++++++++++++++++++++++++++++++-- 20 files changed, 161 insertions(+), 21 deletions(-) diff --git a/Make.inc b/Make.inc index 5d58454c80333..9dc920d3c046b 100644 --- a/Make.inc +++ b/Make.inc @@ -670,7 +670,7 @@ JL_MAJOR_SHLIB_EXT := $(SHLIB_EXT).$(SOMAJOR) endif endif -ifeq ($(OS), FreeBSD) +ifneq ($(findstring $(OS),FreeBSD OpenBSD),) LOCALBASE ?= /usr/local else LOCALBASE ?= /usr @@ -726,7 +726,7 @@ SANITIZE_LDFLAGS := ifeq ($(SANITIZE_MEMORY),1) SANITIZE_OPTS += -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer SANITIZE_LDFLAGS += $(SANITIZE_OPTS) -ifneq ($(findstring $(OS),Linux FreeBSD),) +ifneq ($(findstring $(OS),Linux FreeBSD OpenBSD),) SANITIZE_LDFLAGS += -Wl,--warn-unresolved-symbols endif # OS Linux or FreeBSD endif # SANITIZE_MEMORY=1 @@ -1069,7 +1069,7 @@ JCFLAGS+=-DSYSTEM_LIBUNWIND JCPPFLAGS+=-DSYSTEM_LIBUNWIND endif else -ifeq ($(OS),Darwin) +ifneq ($(findstring $(OS),Darwin OpenBSD),) LIBUNWIND:=-lunwind JCPPFLAGS+=-DLLVMLIBUNWIND else @@ -1380,6 +1380,19 @@ OSLIBS += -Wl,--export-dynamic -Wl,--version-script=$(BUILDROOT)/src/julia.expma $(NO_WHOLE_ARCHIVE) endif +ifeq ($(OS), OpenBSD) +JLDFLAGS += -Wl,--Bdynamic +ifneq ($(SANITIZE),1) +JLDFLAGS += -Wl,-no-undefined +endif + +JLIBLDFLAGS += -Wl,-Bsymbolic-functions + +OSLIBS += -Wl,--no-as-needed -lpthread -lm -lc++abi -lc +OSLIBS += -Wl,--whole-archive -lcompiler_rt -Wl,--no-whole-archive +OSLIBS += -Wl,--export-dynamic,--as-needed,--version-script=$(BUILDROOT)/src/julia.expmap +endif + ifeq ($(OS), Darwin) SHLIB_EXT := dylib OSLIBS += -framework CoreFoundation diff --git a/base/binaryplatforms.jl b/base/binaryplatforms.jl index 9e45275f02636..c585a00a2e7f2 100644 --- a/base/binaryplatforms.jl +++ b/base/binaryplatforms.jl @@ -198,7 +198,7 @@ function validate_tags(tags::Dict) throw_invalid_key("arch") end # Validate `os` - if tags["os"] ∉ ("linux", "macos", "freebsd", "windows") + if tags["os"] ∉ ("linux", "macos", "freebsd", "openbsd", "windows") throw_invalid_key("os") end # Validate `os`/`arch` combination @@ -377,6 +377,8 @@ function os() return "macos" elseif Sys.isbsd() return "freebsd" + elseif Sys.isopenbsd() + return "openbsd" else return "linux" end @@ -422,6 +424,7 @@ const platform_names = Dict( "macos" => "macOS", "windows" => "Windows", "freebsd" => "FreeBSD", + "openbsd" => "OpenBSD", nothing => "Unknown", ) @@ -556,6 +559,8 @@ function os_str(p::AbstractPlatform) else return "-unknown-freebsd" end + elseif os(p) == "openbsd" + return "-unknown-openbsd" else return "-unknown" end @@ -581,7 +586,8 @@ Sys.isapple(p::AbstractPlatform) = os(p) == "macos" Sys.islinux(p::AbstractPlatform) = os(p) == "linux" Sys.iswindows(p::AbstractPlatform) = os(p) == "windows" Sys.isfreebsd(p::AbstractPlatform) = os(p) == "freebsd" -Sys.isbsd(p::AbstractPlatform) = os(p) ∈ ("freebsd", "macos") +Sys.isopenbsd(p::AbstractPlatform) = os(p) == "openbsd" +Sys.isbsd(p::AbstractPlatform) = os(p) ∈ ("freebsd", "openbsd", "macos") Sys.isunix(p::AbstractPlatform) = Sys.isbsd(p) || Sys.islinux(p) const arch_mapping = Dict( @@ -632,6 +638,7 @@ end const os_mapping = Dict( "macos" => "-apple-darwin[\\d\\.]*", "freebsd" => "-(.*-)?freebsd[\\d\\.]*", + "openbsd" => "-(.*-)?openbsd[\\d\\.]*", "windows" => "-w64-mingw32", "linux" => "-(.*-)?linux", ) @@ -745,6 +752,9 @@ function Base.parse(::Type{Platform}, triplet::String; validate_strict::Bool = f if os == "freebsd" os_version = extract_os_version("freebsd", r".*freebsd([\d.]+)"sa) end + if os == "openbsd" + os_version = extract_os_version("openbsd", r".*openbsd([\d.]+)"sa) + end tags["os_version"] = os_version return Platform(arch, os, tags; validate_strict) @@ -802,7 +812,7 @@ function parse_dl_name_version(path::String, os::String) # On OSX, libraries look like `libnettle.6.3.dylib` dlregex = r"^(.*?)((?:\.[\d]+)*)\.dylib$"sa else - # On Linux and FreeBSD, libraries look like `libnettle.so.6.3.0` + # On Linux and others BSD, libraries look like `libnettle.so.6.3.0` dlregex = r"^(.*?)\.so((?:\.[\d]+)*)$"sa end diff --git a/base/sysinfo.jl b/base/sysinfo.jl index c5744873312d6..0acf09b39fea4 100644 --- a/base/sysinfo.jl +++ b/base/sysinfo.jl @@ -399,7 +399,7 @@ end Get the maximum resident set size utilized in bytes. See also: - - man page of `getrusage`(2) on Linux and FreeBSD. + - man page of `getrusage`(2) on Linux and BSD. - Windows API `GetProcessMemoryInfo`. """ maxrss() = ccall(:jl_maxrss, Csize_t, ()) diff --git a/cli/Makefile b/cli/Makefile index 4e32c53b9a6f0..017f713446e1a 100644 --- a/cli/Makefile +++ b/cli/Makefile @@ -24,6 +24,8 @@ else ifeq ($(OS),Linux) LOADER_LDFLAGS += -Wl,--no-as-needed -ldl -lpthread -rdynamic -lc -Wl,--as-needed -Wl,-z,notext else ifeq ($(OS),FreeBSD) LOADER_LDFLAGS += -Wl,--no-as-needed -ldl -lpthread -rdynamic -lc -Wl,--as-needed +else ifeq ($(OS),OpenBSD) +LOADER_LDFLAGS += -Wl,--no-as-needed -lpthread -rdynamic -lc -Wl,--as-needed else ifeq ($(OS),Darwin) LOADER_LDFLAGS += -lSystem endif @@ -107,7 +109,7 @@ julia-debug: $(build_bindir)/julia-debug$(EXE) libjulia-release: $(build_shlibdir)/libjulia.$(SHLIB_EXT) libjulia-debug: $(build_shlibdir)/libjulia-debug.$(SHLIB_EXT) -ifneq (,$(filter $(OS), Linux FreeBSD)) +ifneq (,$(filter $(OS), Linux FreeBSD OpenBSD)) VERSIONSCRIPT := -Wl,--version-script=$(BUILDDIR)/julia.expmap endif diff --git a/cli/loader_lib.c b/cli/loader_lib.c index 02030cf2717a5..d09d21e10abd1 100644 --- a/cli/loader_lib.c +++ b/cli/loader_lib.c @@ -520,7 +520,7 @@ __attribute__((constructor)) void jl_load_libjulia_internal(void) { (*jl_codegen_exported_func_addrs[symbol_idx]) = addr; } // Next, if we're on Linux/FreeBSD, set up fast TLS. -#if !defined(_OS_WINDOWS_) && !defined(_OS_DARWIN_) +#if !defined(_OS_WINDOWS_) && !defined(_OS_DARWIN_) && !defined(_OS_OPENBSD_) void (*jl_pgcstack_setkey)(void*, void*(*)(void)) = lookup_symbol(libjulia_internal, "jl_pgcstack_setkey"); if (jl_pgcstack_setkey == NULL) { jl_loader_print_stderr("ERROR: Cannot find jl_pgcstack_setkey() function within libjulia-internal!\n"); diff --git a/deps/Makefile b/deps/Makefile index 27f5fdbb693d5..fd8f5267e9d7e 100644 --- a/deps/Makefile +++ b/deps/Makefile @@ -64,13 +64,15 @@ ifeq ($(OS), Linux) DEP_LIBS += unwind else ifeq ($(OS), FreeBSD) DEP_LIBS += unwind +else ifeq ($(OS), OpenBSD) +DEP_LIBS += llvmunwind else ifeq ($(OS), Darwin) DEP_LIBS += llvmunwind endif endif endif -ifneq (,$(findstring $(OS),Linux FreeBSD)) +ifneq (,$(findstring $(OS),Linux FreeBSD OpenBSD)) ifeq ($(USE_SYSTEM_PATCHELF), 0) DEP_LIBS += patchelf PATCHELF:=$(build_depsbindir)/patchelf diff --git a/src/Makefile b/src/Makefile index ce81ff03cdd70..6334c09c2696e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -474,6 +474,8 @@ $(build_shlibdir)/lib%Plugin.$(SHLIB_EXT): $(SRCDIR)/clangsa/%.cpp $(LLVM_CONFIG ANALYSIS_DEPS := llvm clang llvm-tools libuv utf8proc ifeq ($(OS),Darwin) ANALYSIS_DEPS += llvmunwind +else ifeq ($(OS),OpenBSD) +ANALYSIS_DEPS += llvmunwind else ifneq ($(OS),WINNT) ANALYSIS_DEPS += unwind endif diff --git a/src/aotcompile.cpp b/src/aotcompile.cpp index c07f7bf32780a..235b999a4e0d8 100644 --- a/src/aotcompile.cpp +++ b/src/aotcompile.cpp @@ -1606,7 +1606,7 @@ void jl_dump_native_impl(void *native_code, TheTriple.setOSName(Str); } Optional RelocModel; - if (TheTriple.isOSLinux() || TheTriple.isOSFreeBSD()) { + if (TheTriple.isOSLinux() || TheTriple.isOSFreeBSD() || TheTriple.isOSOpenBSD()) { RelocModel = Reloc::PIC_; } CodeModel::Model CMModel = CodeModel::Small; diff --git a/src/cgmemmgr.cpp b/src/cgmemmgr.cpp index b627224e027a9..c78e6092ca5db 100644 --- a/src/cgmemmgr.cpp +++ b/src/cgmemmgr.cpp @@ -25,6 +25,9 @@ # include # include #endif +#ifdef _OS_OPENBSD_ +# include +#endif #include "julia_assert.h" namespace { diff --git a/src/codegen.cpp b/src/codegen.cpp index faa9de2762471..d73e63dc2f5dc 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -86,7 +86,7 @@ static bool jl_fpo_disabled(const Triple &TT) { // MSAN doesn't support FPO return true; #endif - if (TT.isOSLinux() || TT.isOSWindows() || TT.isOSFreeBSD()) { + if (TT.isOSLinux() || TT.isOSWindows() || TT.isOSFreeBSD() || TT.isOSOpenBSD()) { return true; } return false; diff --git a/src/gc-stacks.c b/src/gc-stacks.c index 2d0fc011802c9..e42b2fddaf8aa 100644 --- a/src/gc-stacks.c +++ b/src/gc-stacks.c @@ -50,6 +50,16 @@ static void free_stack(void *stkbuf, size_t bufsz) #else +# ifdef _OS_OPENBSD_ +static void *malloc_stack(size_t bufsz) JL_NOTSAFEPOINT +{ + void* stk = mmap(0, bufsz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0); + if (stk == MAP_FAILED) + return MAP_FAILED; + jl_atomic_fetch_add(&num_stack_mappings, 1); + return stk; +} +# else static void *malloc_stack(size_t bufsz) JL_NOTSAFEPOINT { void* stk = mmap(0, bufsz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); @@ -65,6 +75,7 @@ static void *malloc_stack(size_t bufsz) JL_NOTSAFEPOINT jl_atomic_fetch_add_relaxed(&num_stack_mappings, 1); return stk; } +# endif static void free_stack(void *stkbuf, size_t bufsz) { diff --git a/src/jitlayers.cpp b/src/jitlayers.cpp index 4197bdf191b9a..86cde7eeca145 100644 --- a/src/jitlayers.cpp +++ b/src/jitlayers.cpp @@ -113,6 +113,15 @@ static void *getTLSAddress(void *control) } #endif +#ifdef _OS_OPENBSD_ +extern "C" { + __int128 __divti3(__int128, __int128); + __int128 __modti3(__int128, __int128); + unsigned __int128 __udivti3(unsigned __int128, unsigned __int128); + unsigned __int128 __umodti3(unsigned __int128, unsigned __int128); +} +#endif + // Snooping on which functions are being compiled, and how long it takes extern "C" JL_DLLEXPORT_CODEGEN void jl_dump_compiles_impl(void *s) @@ -1726,6 +1735,17 @@ JuliaOJIT::JuliaOJIT() }; cantFail(GlobalJD.define(orc::symbolAliases(jl_crt))); +#ifdef _OS_OPENBSD_ + orc::SymbolMap i128_crt; + + i128_crt[mangle("__divti3")] = JITEvaluatedSymbol::fromPointer(&__divti3, JITSymbolFlags::Exported); + i128_crt[mangle("__modti3")] = JITEvaluatedSymbol::fromPointer(&__modti3, JITSymbolFlags::Exported); + i128_crt[mangle("__udivti3")] = JITEvaluatedSymbol::fromPointer(&__udivti3, JITSymbolFlags::Exported); + i128_crt[mangle("__umodti3")] = JITEvaluatedSymbol::fromPointer(&__umodti3, JITSymbolFlags::Exported); + + cantFail(GlobalJD.define(orc::absoluteSymbols(i128_crt))); +#endif + #ifdef MSAN_EMUTLS_WORKAROUND orc::SymbolMap msan_crt; msan_crt[mangle("__emutls_get_address")] = JITEvaluatedSymbol::fromPointer(msan_workaround::getTLSAddress, JITSymbolFlags::Exported); diff --git a/src/julia.expmap.in b/src/julia.expmap.in index 213d087fdc2ad..e5f9ee890205f 100644 --- a/src/julia.expmap.in +++ b/src/julia.expmap.in @@ -1,7 +1,7 @@ @JULIA_SHLIB_SYMBOL_VERSION@ { global: pthread*; - __stack_chk_guard; + __stack_chk_*; asprintf; bitvector_*; ios_*; diff --git a/src/julia_threads.h b/src/julia_threads.h index 3f8f5391919b4..3a4e9a66cf5a7 100644 --- a/src/julia_threads.h +++ b/src/julia_threads.h @@ -37,6 +37,16 @@ JL_DLLEXPORT int8_t jl_threadpoolid(int16_t tid) JL_NOTSAFEPOINT; #define JL_HAVE_UCONTEXT typedef win32_ucontext_t jl_stack_context_t; typedef jl_stack_context_t _jl_ucontext_t; + +#elif defined(_OS_OPENBSD_) +#define JL_HAVE_UNW_CONTEXT +#define UNW_LOCAL_ONLY +#include +typedef unw_context_t _jl_ucontext_t; +typedef struct { + jl_jmp_buf uc_mcontext; +} jl_stack_context_t; + #else typedef struct { jl_jmp_buf uc_mcontext; diff --git a/src/signals-unix.c b/src/signals-unix.c index eb51a5fccfaba..39123c22e769d 100644 --- a/src/signals-unix.c +++ b/src/signals-unix.c @@ -24,10 +24,12 @@ #endif // Figure out the best signals/timers to use for this platform -#ifdef __APPLE__ // Darwin's mach ports allow signal-free thread management +#if defined(__APPLE__) // Darwin's mach ports allow signal-free thread management #define HAVE_MACH #define HAVE_KEVENT -#else // generic Linux or BSD +#elif defined(__OpenBSD__) +#define HAVE_KEVENT +#else // generic Linux or FreeBSD #define HAVE_TIMER #endif @@ -83,6 +85,9 @@ static inline __attribute__((unused)) uintptr_t jl_get_rsp_from_ctx(const void * #elif defined(_OS_FREEBSD_) && defined(_CPU_X86_64_) const ucontext_t *ctx = (const ucontext_t*)_ctx; return ctx->uc_mcontext.mc_rsp; +#elif defined(_OS_OPENBSD_) && defined(_CPU_X86_64_) + const struct sigcontext *ctx = (const struct sigcontext *)_ctx; + return ctx->sc_rsp; #else // TODO Add support for PowerPC(64)? return 0; @@ -145,6 +150,11 @@ JL_NO_ASAN static void jl_call_in_ctx(jl_ptls_t ptls, void (*fptr)(void), int si rsp -= sizeof(void*); ctx->uc_mcontext.mc_esp = rsp; ctx->uc_mcontext.mc_eip = (uintptr_t)fptr; +#elif defined(_OS_OPENBSD_) && defined(_CPU_X86_64_) + struct sigcontext *ctx = (struct sigcontext *)_ctx; + rsp -= sizeof(void*); + ctx->sc_rsp = rsp; + ctx->sc_rip = fptr; #elif defined(_OS_LINUX_) && defined(_CPU_AARCH64_) ucontext_t *ctx = (ucontext_t*)_ctx; ctx->uc_mcontext.sp = rsp; @@ -237,8 +247,12 @@ static void sigdie_handler(int sig, siginfo_t *info, void *context) info->si_code == SI_KERNEL || #endif info->si_code == SI_QUEUE || +#ifdef SI_MESGQ info->si_code == SI_MESGQ || +#endif +#ifdef SI_ASYNCIO info->si_code == SI_ASYNCIO || +#endif #ifdef SI_SIGIO info->si_code == SI_SIGIO || #endif @@ -336,6 +350,11 @@ int is_write_fault(void *context) { ucontext_t *ctx = (ucontext_t*)context; return exc_reg_is_write_fault(ctx->uc_mcontext.mc_err); } +#elif defined(_OS_OPENBSD_) && defined(_CPU_X86_64_) +int is_write_fault(void *context) { + struct sigcontext *ctx = (struct sigcontext *)context; + return exc_reg_is_write_fault(ctx->sc_err); +} #else #pragma message("Implement this query for consistent PROT_NONE handling") int is_write_fault(void *context) { @@ -653,6 +672,9 @@ void jl_install_thread_signal_handler(jl_ptls_t ptls) ss.ss_flags = 0; ss.ss_size = ssize; assert(ssize != 0); + +#ifndef _OS_OPENBSD_ + /* fallback to malloc(), but it isn't possible on OpenBSD */ if (signal_stack == NULL) { signal_stack = malloc(ssize); ssize = 0; @@ -661,6 +683,8 @@ void jl_install_thread_signal_handler(jl_ptls_t ptls) else jl_safe_printf("\nwarning: julia signal stack allocated without guard page (launch foreign threads earlier to avoid this warning).\n"); } +#endif + if (signal_stack != NULL) { ss.ss_sp = signal_stack; if (sigaltstack(&ss, NULL) < 0) diff --git a/src/support/dtypes.h b/src/support/dtypes.h index 4e9868ed45c23..57f4fa99f0016 100644 --- a/src/support/dtypes.h +++ b/src/support/dtypes.h @@ -99,7 +99,7 @@ typedef intptr_t ssize_t; #define BYTE_ORDER __BYTE_ORDER #endif -#if defined(__APPLE__) || defined(__FreeBSD__) +#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) #include #define __LITTLE_ENDIAN LITTLE_ENDIAN #define __BIG_ENDIAN BIG_ENDIAN diff --git a/src/support/platform.h b/src/support/platform.h index 9ab28ac1c70c3..a0dd84c9c20b6 100644 --- a/src/support/platform.h +++ b/src/support/platform.h @@ -16,6 +16,7 @@ * _COMPILER_GCC_ * OS: * _OS_FREEBSD_ + * _OS_OPENBSD_ * _OS_LINUX_ * _OS_WINDOWS_ * _OS_DARWIN_ @@ -81,6 +82,8 @@ #if defined(__FreeBSD__) #define _OS_FREEBSD_ +#elif defined(__OpenBSD__) +#define _OS_OPENBSD_ #elif defined(__linux__) #define _OS_LINUX_ #elif defined(_WIN32) || defined(_WIN64) diff --git a/src/support/strtod.c b/src/support/strtod.c index 24f556d0c086b..e0ad1bf33435a 100644 --- a/src/support/strtod.c +++ b/src/support/strtod.c @@ -11,7 +11,7 @@ extern "C" { #endif -#if !defined(_OS_WINDOWS_) +#if !defined(_OS_WINDOWS_) && !defined(__OpenBSD__) // This code path should be used for systems that support the strtod_l function // Cache locale object diff --git a/src/support/utf8.c b/src/support/utf8.c index 17dcf5f1efd51..02f541492b0f0 100644 --- a/src/support/utf8.c +++ b/src/support/utf8.c @@ -29,9 +29,9 @@ #include #define snprintf _snprintf #else -#ifndef __FreeBSD__ +#if !defined(__FreeBSD__) && !defined(__OpenBSD__) #include -#endif /* __FreeBSD__ */ +#endif /* !__FreeBSD__ && !__OpenBSD__ */ #endif #include diff --git a/src/sys.c b/src/sys.c index 0c0016ee07657..6f8648bba4f88 100644 --- a/src/sys.c +++ b/src/sys.c @@ -635,6 +635,38 @@ JL_DLLEXPORT long jl_SC_CLK_TCK(void) #endif } +#ifdef _OS_OPENBSD_ +// Helper for jl_pathname_for_handle() +struct dlinfo_data { + void *searched; + const char *result; +}; + +static int dlinfo_helper(struct dl_phdr_info *info, size_t size, void *vdata) +{ + struct dlinfo_data *data = (struct dlinfo_data *)vdata; + void *handle; + + /* ensure dl_phdr_info at compile-time to be compatible with the one at runtime */ + if (sizeof(*info) < size) + return -1; + + /* dlopen the name */ + handle = dlopen(info->dlpi_name, RTLD_LAZY | RTLD_NOLOAD); + if (handle == NULL) + return 0; + + /* check if the opened library is the same as the searched handle */ + if (data->searched == handle) + data->result = info->dlpi_name; + + dlclose(handle); + + /* continue if still not found */ + return (data->result != NULL); +} +#endif + // Takes a handle (as returned from dlopen()) and returns the absolute path to the image loaded JL_DLLEXPORT const char *jl_pathname_for_handle(void *handle) { @@ -677,6 +709,14 @@ JL_DLLEXPORT const char *jl_pathname_for_handle(void *handle) free(pth16); return filepath; +#elif defined(_OS_OPENBSD_) + struct dlinfo_data data = { + .searched = handle, + .result = NULL, + }; + dl_iterate_phdr(&dlinfo_helper, &data); + return data.result; + #else // Linux, FreeBSD, ... struct link_map *map; @@ -754,11 +794,11 @@ JL_DLLEXPORT size_t jl_maxrss(void) // FIXME: `rusage` is available on OpenBSD, DragonFlyBSD and NetBSD as well. // All of them return `ru_maxrss` in kilobytes. -#elif defined(_OS_LINUX_) || defined(_OS_DARWIN_) || defined (_OS_FREEBSD_) +#elif defined(_OS_LINUX_) || defined(_OS_DARWIN_) || defined (_OS_FREEBSD_) || defined (_OS_OPENBSD_) struct rusage rusage; getrusage( RUSAGE_SELF, &rusage ); -#if defined(_OS_LINUX_) || defined(_OS_FREEBSD_) +#if defined(_OS_LINUX_) || defined(_OS_FREEBSD_) || defined (_OS_OPENBSD_) return (size_t)(rusage.ru_maxrss * 1024); #else return (size_t)rusage.ru_maxrss; From 0d32545cb8b7917b1ab847c604713736c7b861b5 Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Thu, 7 Mar 2024 07:55:14 +0000 Subject: [PATCH 6/8] openbsd: no profiling for now, but be kind and not error out --- src/signals-unix.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/signals-unix.c b/src/signals-unix.c index 39123c22e769d..5751a66f1c625 100644 --- a/src/signals-unix.c +++ b/src/signals-unix.c @@ -634,6 +634,17 @@ JL_DLLEXPORT void jl_profile_stop_timer(void) } } +#elif defined(__OpenBSD__) + +JL_DLLEXPORT int jl_profile_start_timer(void) +{ + return -1; +} + +JL_DLLEXPORT void jl_profile_stop_timer(void) +{ +} + #else #error no profile tools available From 9584fb1cbdafaf4c3769920220a8ae0c3b233071 Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Thu, 7 Mar 2024 08:20:49 +0000 Subject: [PATCH 7/8] fix whitespaces --- src/jitlayers.cpp | 6 +++--- src/signals-unix.c | 4 ++-- src/sys.c | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/jitlayers.cpp b/src/jitlayers.cpp index 86cde7eeca145..9c2c49e14b83d 100644 --- a/src/jitlayers.cpp +++ b/src/jitlayers.cpp @@ -119,7 +119,7 @@ extern "C" { __int128 __modti3(__int128, __int128); unsigned __int128 __udivti3(unsigned __int128, unsigned __int128); unsigned __int128 __umodti3(unsigned __int128, unsigned __int128); -} +} #endif // Snooping on which functions are being compiled, and how long it takes @@ -1742,10 +1742,10 @@ JuliaOJIT::JuliaOJIT() i128_crt[mangle("__modti3")] = JITEvaluatedSymbol::fromPointer(&__modti3, JITSymbolFlags::Exported); i128_crt[mangle("__udivti3")] = JITEvaluatedSymbol::fromPointer(&__udivti3, JITSymbolFlags::Exported); i128_crt[mangle("__umodti3")] = JITEvaluatedSymbol::fromPointer(&__umodti3, JITSymbolFlags::Exported); - + cantFail(GlobalJD.define(orc::absoluteSymbols(i128_crt))); #endif - + #ifdef MSAN_EMUTLS_WORKAROUND orc::SymbolMap msan_crt; msan_crt[mangle("__emutls_get_address")] = JITEvaluatedSymbol::fromPointer(msan_workaround::getTLSAddress, JITSymbolFlags::Exported); diff --git a/src/signals-unix.c b/src/signals-unix.c index 5751a66f1c625..91c47421669f2 100644 --- a/src/signals-unix.c +++ b/src/signals-unix.c @@ -638,7 +638,7 @@ JL_DLLEXPORT void jl_profile_stop_timer(void) JL_DLLEXPORT int jl_profile_start_timer(void) { - return -1; + return -1; } JL_DLLEXPORT void jl_profile_stop_timer(void) @@ -683,7 +683,7 @@ void jl_install_thread_signal_handler(jl_ptls_t ptls) ss.ss_flags = 0; ss.ss_size = ssize; assert(ssize != 0); - + #ifndef _OS_OPENBSD_ /* fallback to malloc(), but it isn't possible on OpenBSD */ if (signal_stack == NULL) { diff --git a/src/sys.c b/src/sys.c index 6f8648bba4f88..107a8f7637763 100644 --- a/src/sys.c +++ b/src/sys.c @@ -638,15 +638,15 @@ JL_DLLEXPORT long jl_SC_CLK_TCK(void) #ifdef _OS_OPENBSD_ // Helper for jl_pathname_for_handle() struct dlinfo_data { - void *searched; - const char *result; + void *searched; + const char *result; }; static int dlinfo_helper(struct dl_phdr_info *info, size_t size, void *vdata) { struct dlinfo_data *data = (struct dlinfo_data *)vdata; void *handle; - + /* ensure dl_phdr_info at compile-time to be compatible with the one at runtime */ if (sizeof(*info) < size) return -1; @@ -659,7 +659,7 @@ static int dlinfo_helper(struct dl_phdr_info *info, size_t size, void *vdata) /* check if the opened library is the same as the searched handle */ if (data->searched == handle) data->result = info->dlpi_name; - + dlclose(handle); /* continue if still not found */ From bd339088a178becad49effa628366f84b88a950b Mon Sep 17 00:00:00 2001 From: Sebastien Marie Date: Sat, 9 Mar 2024 06:22:31 +0100 Subject: [PATCH 8/8] base/binaryplatforms.jl: "freebsd" is isfreebsd() Co-authored-by: Max Horn --- base/binaryplatforms.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base/binaryplatforms.jl b/base/binaryplatforms.jl index c585a00a2e7f2..8c6fa2a5f4a03 100644 --- a/base/binaryplatforms.jl +++ b/base/binaryplatforms.jl @@ -375,7 +375,7 @@ function os() return "windows" elseif Sys.isapple() return "macos" - elseif Sys.isbsd() + elseif Sys.isfreebsd() return "freebsd" elseif Sys.isopenbsd() return "openbsd"