From 9419e88ca21e44917edfed599133d7f46fd0783c Mon Sep 17 00:00:00 2001 From: Calvin Hill Date: Wed, 22 May 2019 11:23:37 +0000 Subject: Initial Haiku support for Node.js diff --git a/common.gypi b/common.gypi index 102f090..c7e57b9 100644 --- a/common.gypi +++ b/common.gypi @@ -138,6 +138,9 @@ ['target_arch in "ppc64 s390x"', { 'v8_enable_backtrace': 1, }], + ['OS=="haiku"', { + 'clang%': 0, + }], ], }, @@ -166,6 +169,10 @@ 'cflags': [ '-fPIC' ], 'ldflags': [ '-fPIC' ] }], + ['OS == "haiku"', { + 'cflags': [ '-fPIC' ], + 'ldflags': [ '-fPIC'] + }], ], 'msvs_settings': { 'VCCLCompilerTool': { @@ -226,6 +233,10 @@ 'cflags': [ '-fPIC' ], 'ldflags': [ '-fPIC' ] }], + ['OS == "haiku"', { + 'cflags': [ '-fPIC' ], + 'ldflags': [ '-fPIC'] + }], ], 'msvs_settings': { 'VCCLCompilerTool': { @@ -364,7 +375,7 @@ 'cflags': [ '-pthread' ], 'ldflags': [ '-pthread' ], }], - [ 'OS in "linux freebsd openbsd solaris android aix cloudabi"', { + [ 'OS in "linux freebsd openbsd solaris android aix cloudabi haiku"', { 'cflags': [ '-Wall', '-Wextra', '-Wno-unused-parameter', ], 'cflags_cc': [ '-fno-rtti', '-fno-exceptions', '-std=gnu++1y' ], 'defines': [ '__STDC_FORMAT_MACROS' ], @@ -378,6 +389,10 @@ 'cflags': [ '-I/usr/local/include' ], 'ldflags': [ '-Wl,-z,wxneeded' ], }], + ['OS=="haiku"', { + 'cflags': [ '-fPIC' ], + 'ldflags': [ '-fPIC' ], + }], ], 'conditions': [ [ 'target_arch=="ia32"', { @@ -537,6 +552,12 @@ 'OPENSSL_NO_PINSHARED' ], }], + ['OS=="haiku"', { + 'ldflags': [ '-lroot', '-lbsd', '-lstdc++', '-lnetwork', '-Wl,-Bsymbolic', '-Wl,--export-dynamic', '-fPIC' ], + 'ldflags!': [ '-pthreads', '-pthread', '-rdynamic' ], + 'clang%': 0, + '%v8_use_snapshot':0, + }], ['node_shared_openssl!="true"', { # `OPENSSL_THREADS` is defined via GYP for openSSL for all architectures. 'defines': [ diff --git a/configure.py b/configure.py index e6485a7..2663035 100755 --- a/configure.py +++ b/configure.py @@ -47,7 +47,7 @@ from fetch_deps import FetchDeps parser = optparse.OptionParser() valid_os = ('win', 'mac', 'solaris', 'freebsd', 'openbsd', 'linux', - 'android', 'aix', 'cloudabi') + 'android', 'aix', 'cloudabi', 'haiku') valid_arch = ('arm', 'arm64', 'ia32', 'mips', 'mipsel', 'mips64el', 'ppc', 'ppc64', 'x32','x64', 'x86', 'x86_64', 's390x') valid_arm_float_abi = ('soft', 'softfp', 'hard') diff --git a/deps/openssl/config/archs/linux-x86_64/no-asm/openssl-cl.gypi b/deps/openssl/config/archs/linux-x86_64/no-asm/openssl-cl.gypi index 76984d4..eda4459 100644 --- a/deps/openssl/config/archs/linux-x86_64/no-asm/openssl-cl.gypi +++ b/deps/openssl/config/archs/linux-x86_64/no-asm/openssl-cl.gypi @@ -8,11 +8,9 @@ ], 'openssl_cflags_linux-x86_64': [ '-Wall -O3', - '-pthread -m64', - '-Wall -O3', + '-m64', ], 'openssl_ex_libs_linux-x86_64': [ - '-ldl -pthread', ], 'openssl_cli_srcs_linux-x86_64': [ 'openssl/apps/asn1pars.c', diff --git a/deps/openssl/config/archs/linux-x86_64/no-asm/openssl.gypi b/deps/openssl/config/archs/linux-x86_64/no-asm/openssl.gypi index 11d3aa6..aba5d54 100644 --- a/deps/openssl/config/archs/linux-x86_64/no-asm/openssl.gypi +++ b/deps/openssl/config/archs/linux-x86_64/no-asm/openssl.gypi @@ -692,11 +692,10 @@ ], 'openssl_cflags_linux-x86_64': [ '-Wall -O3', - '-pthread -m64', + '-m64', '-Wall -O3', ], - 'openssl_ex_libs_linux-x86_64': [ - '-ldl -pthread', + 'openssl_ex_libs_linux-x86_64': [ ], }, 'include_dirs': [ diff --git a/deps/openssl/openssl/crypto/rand/rand_unix.c b/deps/openssl/openssl/crypto/rand/rand_unix.c index ec6be79..861f56a 100644 --- a/deps/openssl/openssl/crypto/rand/rand_unix.c +++ b/deps/openssl/openssl/crypto/rand/rand_unix.c @@ -369,7 +369,7 @@ static ssize_t syscall_random(void *buf, size_t buflen) * Note: Sometimes getentropy() can be provided but not implemented * internally. So we need to check errno for ENOSYS */ -# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) && !defined(__hpux) +# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__) && !defined(__hpux) && !defined(__HAIKU__) extern int getentropy(void *buffer, size_t length) __attribute__((weak)); if (getentropy != NULL) { diff --git a/deps/openssl/openssl_common.gypi b/deps/openssl/openssl_common.gypi index d866630..52558d8 100644 --- a/deps/openssl/openssl_common.gypi +++ b/deps/openssl/openssl_common.gypi @@ -56,7 +56,14 @@ 'ENGINESDIR="/dev/null"', '__EXTENSIONS__' ], - }, { + },'OS=="haiku"', { + '!ldflags': ['-pthread', '-pthreads'], + 'defines': [ + 'OPENSSLDIR="/boot/system/data/ssl/"', + 'ENGINESDIR="/dev/null"', + 'TERMIOS', + ], + },{ # linux and others 'cflags': ['-Wno-missing-field-initializers',], 'defines': [ diff --git a/node.gypi b/node.gypi index 116c1c7..9d5e5f3 100644 --- a/node.gypi +++ b/node.gypi @@ -257,6 +257,16 @@ 'NODE_PLATFORM="sunos"', ], }], + [ 'OS=="haiku"', { + 'libraries': [ + '-lroot', + '-lnetwork', + '-lbsd', + ], + 'defines': [ + 'NODE_PLATFORM="haiku"', + ], + }], [ '(OS=="freebsd" or OS=="linux") and node_shared=="false"' ' and force_load=="true"', { 'ldflags': [ diff --git a/src/node.cc b/src/node.cc index 00ae36c..87b8b03 100644 --- a/src/node.cc +++ b/src/node.cc @@ -554,7 +554,7 @@ inline void PlatformInit() { if (nr == SIGKILL || nr == SIGSTOP) continue; act.sa_handler = (nr == SIGPIPE || nr == SIGXFSZ) ? SIG_IGN : SIG_DFL; - CHECK_EQ(0, sigaction(nr, &act, nullptr)); + //CHECK_EQ(0, sigaction(nr, &act, nullptr)); } #endif // !NODE_SHARED_MODE diff --git a/src/node_os.cc b/src/node_os.cc index b6fbb12..f97528b 100644 --- a/src/node_os.cc +++ b/src/node_os.cc @@ -34,7 +34,7 @@ #include #include #include - +#include namespace node { namespace os { @@ -120,7 +120,17 @@ static void GetCPUInfo(const FunctionCallbackInfo& args) { // [model, speed, (5 entries of cpu_times), model2, speed2, ...] std::vector> result(count * 7); for (int i = 0, j = 0; i < count; i++) { + /* uv_cpu_info_t* ci = cpu_infos + i; + + std::cout << ci->speed << std::endl; + std::cout << ci->model << std::endl; + std::cout << ci->cpu_times.user << std::endl; + std::cout << ci->cpu_times.nice << std::endl; + std::cout << ci->cpu_times.sys << std::endl; + std::cout << ci->cpu_times.idle << std::endl; + std::cout << ci->cpu_times.irq << std::endl; + result[j++] = OneByteString(isolate, ci->model); result[j++] = Number::New(isolate, ci->speed); result[j++] = Number::New(isolate, ci->cpu_times.user); @@ -128,10 +138,11 @@ static void GetCPUInfo(const FunctionCallbackInfo& args) { result[j++] = Number::New(isolate, ci->cpu_times.sys); result[j++] = Number::New(isolate, ci->cpu_times.idle); result[j++] = Number::New(isolate, ci->cpu_times.irq); + */ } uv_free_cpu_info(cpu_infos, count); - args.GetReturnValue().Set(Array::New(isolate, result.data(), result.size())); + // args.GetReturnValue().Set(Array::New(isolate, result.data(), result.size())); } diff --git a/src/node_report.cc b/src/node_report.cc index c93e03a..a4f57df 100644 --- a/src/node_report.cc +++ b/src/node_report.cc @@ -686,16 +686,16 @@ static void PrintSystemInformation(JSONWriter* writer) { {"core_file_size_blocks", RLIMIT_CORE}, {"data_seg_size_kbytes", RLIMIT_DATA}, {"file_size_blocks", RLIMIT_FSIZE}, -#if !(defined(_AIX) || defined(__sun)) +#if !(defined(_AIX) || defined(__sun) || defined(__HAIKU__)) {"max_locked_memory_bytes", RLIMIT_MEMLOCK}, #endif -#ifndef __sun +#if !(defined(__sun) || defined(__HAIKU__)) {"max_memory_size_kbytes", RLIMIT_RSS}, #endif {"open_files", RLIMIT_NOFILE}, {"stack_size_bytes", RLIMIT_STACK}, {"cpu_time_seconds", RLIMIT_CPU}, -#ifndef __sun +#if !(defined(__sun) || defined(__HAIKU__)) {"max_user_processes", RLIMIT_NPROC}, #endif #ifndef __OpenBSD__ diff --git a/tools/utils.py b/tools/utils.py index 9734836..94e4d8c 100644 --- a/tools/utils.py +++ b/tools/utils.py @@ -57,6 +57,8 @@ def GuessOS(): return 'win32' elif id == 'FreeBSD': return 'freebsd' + elif id == 'Haiku': + return 'haiku' elif id == 'OpenBSD': return 'openbsd' elif id == 'SunOS': -- 2.30.0 From 156f441d65fda25326d3c3a982dc02ac9a4ccb25 Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Sat, 27 Mar 2021 21:40:26 +0100 Subject: v8 Haiku patches diff --git a/deps/v8/BUILD.gn b/deps/v8/BUILD.gn index 90ec409..3f754fa 100644 --- a/deps/v8/BUILD.gn +++ b/deps/v8/BUILD.gn @@ -679,7 +679,7 @@ config("toolchain") { } } - if (is_clang) { + if (is_clang && !is_haiku) { cflags += [ "-Wmissing-field-initializers" ] if (v8_current_cpu != "mips" && v8_current_cpu != "mipsel") { @@ -3638,6 +3638,11 @@ v8_component("v8_libbase") { "src/base/debug/stack_trace_fuchsia.cc", "src/base/platform/platform-fuchsia.cc", ] + } else if (is_haiku) { + sources += [ + "src/base/debug/stack_trace_posix.cc", + "src/base/platform/platform-haiku.cc", + ] } else if (is_mac || is_ios) { sources += [ "src/base/debug/stack_trace_posix.cc", @@ -4076,6 +4081,13 @@ if (is_fuchsia && !build_with_chromium) { group("v8_fuzzers") { testonly = true + + if(host_os == "haiku"){ + data_deps = [] + } + + if (host_os != "haiku") { + data_deps = [ ":v8_simple_json_fuzzer", ":v8_simple_multi_return_fuzzer", @@ -4087,6 +4099,8 @@ group("v8_fuzzers") { ":v8_simple_wasm_compile_fuzzer", ":v8_simple_wasm_fuzzer", ] + } + } if (is_component_build) { diff --git a/deps/v8/include/v8config.h b/deps/v8/include/v8config.h index 7670c0e..646c599 100644 --- a/deps/v8/include/v8config.h +++ b/deps/v8/include/v8config.h @@ -61,6 +61,7 @@ // V8_OS_CYGWIN - Cygwin // V8_OS_DRAGONFLYBSD - DragonFlyBSD // V8_OS_FREEBSD - FreeBSD +// V8_OS_HAIKU - Haiku // V8_OS_FUCHSIA - Fuchsia // V8_OS_LINUX - Linux // V8_OS_MACOSX - Mac OS X @@ -100,6 +101,9 @@ # define V8_OS_BSD 1 # define V8_OS_FREEBSD 1 # define V8_OS_POSIX 1 +#elif defined(__HAIKU__) +# define V8_OS_HAIKU 1 +# define V8_OS_POSIX 1 #elif defined(__Fuchsia__) # define V8_OS_FUCHSIA 1 # define V8_OS_POSIX 1 diff --git a/deps/v8/src/base/debug/stack_trace_posix.cc b/deps/v8/src/base/debug/stack_trace_posix.cc index ed602af..58b3b5d 100644 --- a/deps/v8/src/base/debug/stack_trace_posix.cc +++ b/deps/v8/src/base/debug/stack_trace_posix.cc @@ -25,14 +25,15 @@ #include #include -#if V8_LIBC_GLIBC || V8_LIBC_BSD || V8_LIBC_UCLIBC || V8_OS_SOLARIS +#if V8_LIBC_GLIBC || V8_LIBC_BSD || V8_LIBC_UCLIBC || V8_OS_SOLARIS || V8_OS_HAIKU #define HAVE_EXECINFO_H 1 #endif -#if HAVE_EXECINFO_H +#if defined(HAVE_EXECINFO_H) #include #include #endif + #if V8_OS_MACOSX #include #endif diff --git a/deps/v8/src/base/export-template.h b/deps/v8/src/base/export-template.h index 861cfe4..8c6d885 100644 --- a/deps/v8/src/base/export-template.h +++ b/deps/v8/src/base/export-template.h @@ -83,6 +83,7 @@ // definition sites instead. #define EXPORT_TEMPLATE_DECLARE_MSVC_HACK(export, _) #define EXPORT_TEMPLATE_DEFINE_MSVC_HACK(export, _) export +#define EXPORT_TEMPLATE_TEST_MSVC_HACK_DEFAULT(...) true // EXPORT_TEMPLATE_STYLE is an internal helper macro that identifies which // export style needs to be used for the provided FOO_EXPORT macro definition. @@ -159,5 +160,5 @@ EXPORT_TEMPLATE_TEST(DEFAULT, __declspec(dllimport)); #undef EXPORT_TEMPLATE_TEST #undef EXPORT_TEMPLATE_TEST_DEFAULT_DEFAULT #undef EXPORT_TEMPLATE_TEST_MSVC_HACK_MSVC_HACK - +#undef EXPORT_TEMPLATE_TEST_MSVC_HACK_DEFAULT #endif // V8_BASE_EXPORT_TEMPLATE_H_ diff --git a/deps/v8/src/base/platform/platform-haiku.cc b/deps/v8/src/base/platform/platform-haiku.cc new file mode 100644 index 0000000..7367510 --- /dev/null +++ b/deps/v8/src/base/platform/platform-haiku.cc @@ -0,0 +1,50 @@ +// Copyright 2012 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Platform-specific code for Haiku goes here. For the POSIX-compatible +// parts, the implementation is in platform-posix.cc. + +#include +#include +#include +#include +#include +#include +#include + +#include +#include // open +#include +#include // index +#include // mmap & munmap +#include // open +#include // mmap & munmap +#include // sysconf + +#include + +#undef MAP_TYPE + +#include "src/base/macros.h" +#include "src/base/platform/platform-posix-time.h" +#include "src/base/platform/platform-posix.h" +#include "src/base/platform/platform.h" + +namespace v8 { +namespace base { + +TimezoneCache* OS::CreateTimezoneCache() { + return new PosixDefaultTimezoneCache(); +} + +std::vector OS::GetSharedLibraryAddresses() { + return std::vector(); +} + +void OS::SignalCodeMovingGC() {} + +void OS::AdjustSchedulingParams() {} + +} // namespace base +} // namespace v8 diff --git a/deps/v8/src/base/platform/platform-posix.cc b/deps/v8/src/base/platform/platform-posix.cc index c50cdd7..477bde5 100644 --- a/deps/v8/src/base/platform/platform-posix.cc +++ b/deps/v8/src/base/platform/platform-posix.cc @@ -60,7 +60,7 @@ #include #endif -#if !defined(_AIX) && !defined(V8_OS_FUCHSIA) +#if !defined(_AIX) && !defined(V8_OS_FUCHSIA) && !defined(__HAIKU__) #include #endif @@ -76,6 +76,14 @@ extern int madvise(caddr_t, size_t, int); #endif #endif +#if defined(__HAIKU__) +extern "C" int posix_madvise(void*, size_t, int); +#endif + +#if defined(__HAIKU__) +#define MADV_FREE POSIX_MADV_DONTNEED +#endif + #ifndef MADV_FREE #define MADV_FREE MADV_DONTNEED #endif @@ -127,7 +135,7 @@ int GetProtectionFromMemoryPermission(OS::MemoryPermission access) { int GetFlagsForMemoryPermission(OS::MemoryPermission access) { int flags = MAP_PRIVATE | MAP_ANONYMOUS; if (access == OS::MemoryPermission::kNoAccess) { -#if !V8_OS_AIX && !V8_OS_FREEBSD && !V8_OS_QNX +#if !V8_OS_AIX && !V8_OS_FREEBSD && !V8_OS_QNX && !V8_OS_HAIKU flags |= MAP_NORESERVE; #endif // !V8_OS_AIX && !V8_OS_FREEBSD && !V8_OS_QNX #if V8_OS_QNX @@ -362,6 +370,8 @@ bool OS::DiscardSystemPages(void* address, size_t size) { int ret = madvise(address, size, MADV_FREE_REUSABLE); #elif defined(_AIX) || defined(V8_OS_SOLARIS) int ret = madvise(reinterpret_cast(address), size, MADV_FREE); +#elif defined(__HAIKU__) + int ret = posix_madvise(address, size, MADV_FREE); #else int ret = madvise(address, size, MADV_FREE); #endif @@ -373,6 +383,8 @@ bool OS::DiscardSystemPages(void* address, size_t size) { // imply runtime support. #if defined(_AIX) || defined(V8_OS_SOLARIS) ret = madvise(reinterpret_cast(address), size, MADV_DONTNEED); +#elif defined(__HAIKU__) + ret = posix_madvise(address, size, MADV_FREE); #else ret = madvise(address, size, MADV_DONTNEED); #endif diff --git a/deps/v8/src/libsampler/sampler.cc b/deps/v8/src/libsampler/sampler.cc index e445dfc..77fa74c 100644 --- a/deps/v8/src/libsampler/sampler.cc +++ b/deps/v8/src/libsampler/sampler.cc @@ -12,7 +12,7 @@ #include #include -#if !V8_OS_QNX && !V8_OS_AIX +#if !V8_OS_QNX && !V8_OS_AIX && !V8_OS_HAIKU #include // NOLINT #endif @@ -20,7 +20,7 @@ #include // OpenBSD doesn't have . ucontext_t lives in // and is a typedef for struct sigcontext. There is no uc_mcontext. -#elif !V8_OS_OPENBSD +#elif !V8_OS_OPENBSD && !V8_OS_HAIKU #include #endif @@ -481,6 +481,16 @@ void SignalHandler::FillRegisterState(void* context, RegisterState* state) { state->sp = reinterpret_cast(mcontext.mc_r13); state->fp = reinterpret_cast(mcontext.mc_r11); #endif // V8_HOST_ARCH_* +#elif V8_OS_HAIKU +#if V8_HOST_ARCH_IA32 + state->pc = reinterpret_cast(mcontext.eip); + state->sp = reinterpret_cast(mcontext.esp); + state->fp = reinterpret_cast(mcontext.ebp); +#elif V8_HOST_ARCH_X64 + state->pc = reinterpret_cast(mcontext.rip); + state->sp = reinterpret_cast(mcontext.rsp); + state->fp = reinterpret_cast(mcontext.rbp); +#endif // V8_HOST_ARCH_* #elif V8_OS_NETBSD #if V8_HOST_ARCH_IA32 state->pc = reinterpret_cast(mcontext.__gregs[_REG_EIP]); diff --git a/deps/v8/tools/mb/mb.py b/deps/v8/tools/mb/mb.py index f66f82a..f20ff24 100755 --- a/deps/v8/tools/mb/mb.py +++ b/deps/v8/tools/mb/mb.py @@ -855,12 +855,15 @@ class MetaBuildWrapper(object): subdir, exe = 'linux64', 'gn' elif self.platform == 'darwin': subdir, exe = 'mac', 'gn' + elif self.platform == 'haiku1': + subdir, exe = 'haiku','gn' + gn_path = "/bin/gn" else: subdir, exe = 'win', 'gn.exe' arch = platform.machine() if (arch.startswith('s390') or arch.startswith('ppc') or - self.platform.startswith('aix')): + self.platform.startswith('aix') or self.platform.startswith('haiku')): # use gn in PATH gn_path = 'gn' else: -- 2.30.0 From a42c21ff72c6dec2384fa78d0f3634a88d2fb0b7 Mon Sep 17 00:00:00 2001 From: Jerome Duval Date: Sun, 28 Mar 2021 10:37:44 +0200 Subject: v8 gyp build for Haiku diff --git a/tools/v8_gypfiles/features.gypi b/tools/v8_gypfiles/features.gypi index 602d606..5f9a0f6 100644 --- a/tools/v8_gypfiles/features.gypi +++ b/tools/v8_gypfiles/features.gypi @@ -46,6 +46,11 @@ }, { 'is_fuchsia': 0, }], + ['OS == "haiku"', { + 'is_haiku': 1, + }, { + 'is_haiku': 0, + }], ['OS=="android"', { # GYP reverts OS to linux so use `-D OS=android` 'is_android': 1, }, { diff --git a/tools/v8_gypfiles/v8.gyp b/tools/v8_gypfiles/v8.gyp index 26b8e56..f480c04 100644 --- a/tools/v8_gypfiles/v8.gyp +++ b/tools/v8_gypfiles/v8.gyp @@ -991,6 +991,17 @@ '<(V8_ROOT)/src/base/platform/platform-fuchsia.cc', ] }], + ['is_haiku', { + 'link_settings': { + 'libraries': [ + '-lexecinfo', + ] + }, + 'sources': [ + '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc', + '<(V8_ROOT)/src/base/platform/platform-haiku.cc', + ] + }], ['OS == "mac" or OS == "ios"', { 'sources': [ '<(V8_ROOT)/src/base/debug/stack_trace_posix.cc', -- 2.30.0