diff --git a/vlib/builtin/builtin.v b/vlib/builtin/builtin.v index 5399ae11bf..145ddf5c9f 100644 --- a/vlib/builtin/builtin.v +++ b/vlib/builtin/builtin.v @@ -99,6 +99,12 @@ pub fn eprintln(s string) { C.fflush(stderr) return } + $if freebsd { + C.fprintf(stderr, '%.*s\n', s.len, s.str) + C.fflush(stderr) + return + } + // TODO issues with stderr and cross compiling for Linux println(s) } @@ -171,4 +177,3 @@ pub fn is_atty(fd int) int { return C.isatty(fd) } } - diff --git a/vlib/builtin/builtin_nix.v b/vlib/builtin/builtin_nix.v index 1a4e275284..35950b50d0 100644 --- a/vlib/builtin/builtin_nix.v +++ b/vlib/builtin/builtin_nix.v @@ -18,6 +18,7 @@ fn print_backtrace_skipping_top_frames_nix(xskipframes int) bool { skipframes := xskipframes + 2 $if mac { return print_backtrace_skipping_top_frames_mac(skipframes) } $if linux { return print_backtrace_skipping_top_frames_linux(skipframes) } + $if freebsd { return print_backtrace_skipping_top_frames_freebsd(skipframes) } return false } @@ -32,6 +33,15 @@ fn print_backtrace_skipping_top_frames_mac(skipframes int) bool { return true } +fn print_backtrace_skipping_top_frames_freebsd(skipframes int) bool { + $if freebsd { + buffer := [100]byteptr + nr_ptrs := C.backtrace(*voidptr(buffer), 100) + C.backtrace_symbols_fd(*voidptr(&buffer[skipframes]), nr_ptrs-skipframes, 1) + } + return true +} + fn print_backtrace_skipping_top_frames_linux(skipframes int) bool { $if tinyc { println('TODO: print_backtrace_skipping_top_frames_linux $skipframes with tcc fails tests with "stack smashing detected" .') diff --git a/vlib/compiler/cgen.v b/vlib/compiler/cgen.v index 6740408c2d..d37a54d5f9 100644 --- a/vlib/compiler/cgen.v +++ b/vlib/compiler/cgen.v @@ -309,6 +309,7 @@ fn platform_postfix_to_ifdefguard(name string) string { '_nix.v' { '#ifndef _WIN32' } '_lin.v', '_linux.v' { '#ifdef __linux__' } '_mac.v', '_darwin.v' { '#ifdef __APPLE__' } + '_bsd.v', '_freebsd.v '{ '#ifdef __FreeBSD__'} '_solaris.v' { '#ifdef __sun' } '_haiku.v' { '#ifdef __haiku__' } else {