From: Paul Floyd Date: Thu, 7 Oct 2021 05:53:33 +0000 (+0200) Subject: FreeBSD support, patch 2 X-Git-Tag: VALGRIND_3_18_0~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e2583c02a5638fcbe7b3d693f7127ebde5d7c359;p=thirdparty%2Fvalgrind.git FreeBSD support, patch 2 Files in the root directory Several Makefile.am files that have dependencies on FreeBSD autoconf variables. Included a few new filter files to act as placeholders to create new freebsd subdirectories. Updated NEWS with the FreeBSD bugzilla items plus a couple of other items fixed indirectly. --- diff --git a/.gitignore b/.gitignore index bb8578d680..86962b4780 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,7 @@ /auxprogs/getoff-nanomips-linux /auxprogs/getoff-amd64-solaris /auxprogs/getoff-x86-solaris +/auxprogs/getoff-*-freebsd /auxprogs/libmpiwrap-PPC32_LINUX.so /auxprogs/libmpiwrap-PPC64_LINUX.so /auxprogs/libmpiwrap-x86-darwin.so @@ -73,6 +74,7 @@ /cachegrind/cachegrind-*-darwin /cachegrind/cachegrind-*-linux /cachegrind/cachegrind-*-solaris +/cachegrind/cachegrind-*-freebsd /cachegrind/cg_annotate /cachegrind/cg_diff /cachegrind/cg_merge @@ -119,6 +121,7 @@ /callgrind/callgrind-*-darwin /callgrind/callgrind-*-linux /callgrind/callgrind-*-solaris +/callgrind/callgrind-*-freebsd /callgrind/callgrind_annotate /callgrind/callgrind_control /callgrind/Makefile @@ -152,6 +155,7 @@ /coregrind/link_tool_exe_darwin /coregrind/link_tool_exe_linux /coregrind/link_tool_exe_solaris +/coregrind/link_tool_exe_freebsd /coregrind/Makefile /coregrind/Makefile.in /coregrind/no_op_client_for_valgrind @@ -259,11 +263,13 @@ /dhat/dhat-*-darwin /dhat/dhat-*-linux /dhat/dhat-*-solaris +/dhat/dhat-*-freebsd /dhat/Makefile /dhat/Makefile.in /dhat/vgpreload_dhat-*-linux.so /dhat/vgpreload_dhat-*-darwin.so /dhat/vgpreload_dhat-*-solaris.so +/dhat/vgpreload_dhat-*-freebsd.so # /dhat/tests/ /dhat/tests/Makefile @@ -324,12 +330,14 @@ /drd/drd-*-darwin /drd/drd-*-linux /drd/drd-*-solaris +/drd/drd-*-freebsd /drd/Makefile /drd/Makefile.in /drd/splash2 /drd/vgpreload_drd-*-linux.so /drd/vgpreload_drd-*-darwin.so /drd/vgpreload_drd-*-solaris.so +/drd/vgpreload_drd-*-freebsd.so # /drd/docs/ /drd/docs/.deps @@ -455,6 +463,7 @@ /drd/tests/tc24_nonzero_sem /drd/tests/threaded-fork /drd/tests/thread_name +/drd/tests/thread_name_freebsd /drd/tests/trylock /drd/tests/tsan_unittest /drd/tests/unit_bitmap @@ -552,6 +561,11 @@ /gdbserver_tests/*.dSYM /gdbserver_tests/*.diff* /gdbserver_tests/*.out +/gdbserver_tests/filter_gdb +/gdbserver_tests/filter_memcheck_monitor +/gdbserver_tests/filter_stderr +/gdbserver_tests/filter_vgdb +/gdbserver_tests/filter_vgdb.in.orig /gdbserver_tests/.deps /gdbserver_tests/clean_after_fork /gdbserver_tests/detailed @@ -597,11 +611,13 @@ /helgrind/helgrind-*-darwin /helgrind/helgrind-*-linux /helgrind/helgrind-*-solaris +/helgrind/helgrind-*-freebsd /helgrind/Makefile /helgrind/Makefile.in /helgrind/vgpreload_helgrind-*-linux.so /helgrind/vgpreload_helgrind-*-darwin.so /helgrind/vgpreload_helgrind-*-solaris.so +/helgrind/vgpreload_helgrind-*-freebsd.so # /helgrind/docs/ /helgrind/docs/Makefile @@ -683,6 +699,7 @@ /lackey/lackey-*-darwin /lackey/lackey-*-linux /lackey/lackey-*-solaris +/lackey/lackey-*-freebsd /lackey/Makefile /lackey/Makefile.in @@ -707,6 +724,7 @@ /massif/massif-*-darwin /massif/massif-*-linux /massif/massif-*-solaris +/massif/massif-*-freebsd /massif/ms_print # /massif/docs/ @@ -765,6 +783,7 @@ /memcheck/memcheck-*-darwin /memcheck/memcheck-*-linux /memcheck/memcheck-*-solaris +/memcheck/memcheck-*-freebsd # /memcheck/docs/ /memcheck/docs/Makefile.in @@ -777,6 +796,8 @@ /memcheck/tests/*.stderr.out /memcheck/tests/*.stdout.diff* /memcheck/tests/*.stdout.out +/memcheck/tests/filter_dw4 +/memcheck/tests/filter_overlaperror /memcheck/tests/.deps /memcheck/tests/accounting /memcheck/tests/addressable @@ -968,7 +989,7 @@ /memcheck/tests/zeropage # /memcheck/tests/amd64/ -/memcheck/tests/amd64/*.diff +/memcheck/tests/amd64/*.diff* /memcheck/tests/amd64/*.dSYM /memcheck/tests/amd64/*.out /memcheck/tests/amd64/.deps @@ -1204,6 +1225,7 @@ /memcheck/tests/x86/*.stderr.out /memcheck/tests/x86/*.stdout.diff /memcheck/tests/x86/*.stdout.out +/memcheck/tests/x86/filter_pushfpopf /memcheck/tests/x86/.deps /memcheck/tests/x86/Makefile /memcheck/tests/x86/Makefile.in @@ -1260,6 +1282,65 @@ /memcheck/tests/x86-solaris/ldsoexec /memcheck/tests/x86-solaris/scalar +# /memcheck/tests/freebsd/ +/memcheck/tests/freebsd/*.stderr.diff* +/memcheck/tests/freebsd/*.stderr.out +/memcheck/tests/freebsd/*.stdout.diff +/memcheck/tests/freebsd/*.stdout.out +/memcheck/tests/freebsd/.deps +/memcheck/tests/freebsd/Makefile +/memcheck/tests/freebsd/Makefile.in +/memcheck/tests/freebsd/statfs +/memcheck/tests/freebsd/pdfork_pdkill +/memcheck/tests/freebsd/getfsstat +/memcheck/tests/freebsd/inlinfo +/memcheck/tests/freebsd/inlinfo_nested.so +/memcheck/tests/freebsd/extattr +/memcheck/tests/freebsd/sigwait +/memcheck/tests/freebsd/chflags +/memcheck/tests/freebsd/get_set_login +/memcheck/tests/freebsd/revoke +/memcheck/tests/freebsd/scalar +/memcheck/tests/freebsd/capsicum +/memcheck/tests/freebsd/getfh +/memcheck/tests/freebsd/linkat +/memcheck/tests/freebsd/scalar_fork +/memcheck/tests/freebsd/scalar_thr_exit +/memcheck/tests/freebsd/scalar_abort2 +/memcheck/tests/freebsd/scalar_pdfork +/memcheck/tests/freebsd/scalar_vfork +/memcheck/tests/freebsd/stat +/memcheck/tests/freebsd/file_locking_wait6 +/memcheck/tests/freebsd/utimens +/memcheck/tests/freebsd/access +/memcheck/tests/freebsd/chmod_chown +/memcheck/tests/freebsd/misc +/memcheck/tests/freebsd/get_set_context +/memcheck/tests/freebsd/utimes +/memcheck/tests/freebsd/static_allocs + +# /memcheck/tests/amd64-freebsd +/memcheck/tests/amd64-freebsd/*.stderr.diff +/memcheck/tests/amd64-freebsd/*.stderr.out +/memcheck/tests/amd64-freebsd/*.stdout.diff +/memcheck/tests/amd64-freebsd/*.stdout.out +/memcheck/tests/amd64-freebsd/.deps +/memcheck/tests/amd64-freebsd/Makefile +/memcheck/tests/amd64-freebsd/Makefile.in +/memcheck/tests/amd64-freebsd/posix_fadvise +/memcheck/tests/amd64-freebsd/posix_fallocate + +# /memcheck/tests/x86-freebsd +/memcheck/tests/x86-freebsd/*.stderr.diff +/memcheck/tests/x86-freebsd/*.stderr.out +/memcheck/tests/x86-freebsd/*.stdout.diff +/memcheck/tests/x86-freebsd/*.stdout.out +/memcheck/tests/x86-freebsd/.deps +/memcheck/tests/x86-freebsd/Makefile +/memcheck/tests/x86-freebsd/Makefile.in +/memcheck/tests/x86-freebsd/posix_fadvise +/memcheck/tests/x86-freebsd/posix_fallocate + # /mpi/ /mpi/*.dSYM /mpi/*.so @@ -1290,6 +1371,7 @@ /none/none-*-darwin /none/none-*-linux /none/none-*-solaris +/none/none-*-freebsd # /none/docs/ /none/docs/Makefile.in @@ -1946,6 +2028,18 @@ /none/tests/solaris/stack_prot /none/tests/solaris/threads_exitall +# /none/tests/freebsd/ +/none/tests/freebsd/*.stderr.diff +/none/tests/freebsd/*.stderr.out +/none/tests/freebsd/*.stdout.diff +/none/tests/freebsd/*.stdout.out +/none/tests/freebsd/.deps +/none/tests/freebsd/Makefile +/none/tests/freebsd/Makefile.in +/none/tests/freebsd/auxv +/none/tests/freebsd/osrel +/none/tests/freebsd/swapcontext + # /none/tests/x86/ /none/tests/x86/*.dSYM /none/tests/x86/*.stderr.diff diff --git a/Makefile.all.am b/Makefile.all.am old mode 100644 new mode 100755 index 06b23c99e0..1de1f13a7e --- a/Makefile.all.am +++ b/Makefile.all.am @@ -151,9 +151,17 @@ AM_CFLAGS_PSO_BASE = -dynamic \ -O -g -fno-omit-frame-pointer -fno-strict-aliasing \ -fpic -fPIC -fno-builtin @FLAG_FNO_IPA_ICF@ else +if VGCONF_OS_IS_FREEBSD +AM_CFLAGS_PSO_BASE = -O -g -fno-omit-frame-pointer -fno-strict-aliasing \ + -fpic -fPIC -fno-builtin +if COMPILER_IS_CLANG + AM_CFLAGS_BASE += @FLAG_W_NO_EXPANSION_TO_DEFINED@ +endif +else AM_CFLAGS_PSO_BASE = -O -g -fno-omit-frame-pointer -fno-strict-aliasing \ -fpic -fno-builtin @FLAG_FNO_IPA_ICF@ endif +endif # Flags for specific targets. @@ -218,6 +226,12 @@ AM_CFLAGS_PPC64LE_LINUX = @FLAG_M64@ $(AM_CFLAGS_BASE) $(ISA_3_0_BUILD_FLAG) AM_CFLAGS_PSO_PPC64LE_LINUX = @FLAG_M64@ $(AM_CFLAGS_BASE) $(AM_CFLAGS_PSO_BASE) AM_CCASFLAGS_PPC64LE_LINUX = @FLAG_M64@ -g +AM_FLAG_M3264_X86_FREEBSD = @FLAG_M32@ +AM_CFLAGS_X86_FREEBSD = @FLAG_M32@ @PREFERRED_STACK_BOUNDARY_2@ \ + $(AM_CFLAGS_BASE) -fomit-frame-pointer +AM_CFLAGS_PSO_X86_FREEBSD = @FLAG_M32@ $(AM_CFLAGS_BASE) $(AM_CFLAGS_PSO_BASE) +AM_CCASFLAGS_X86_FREEBSD = @FLAG_M32@ -g + AM_FLAG_M3264_ARM_LINUX = @FLAG_M32@ AM_CFLAGS_ARM_LINUX = @FLAG_M32@ \ $(AM_CFLAGS_BASE) -marm -mcpu=cortex-a8 @@ -231,6 +245,14 @@ AM_CFLAGS_ARM64_LINUX = @FLAG_M64@ $(AM_CFLAGS_BASE) AM_CFLAGS_PSO_ARM64_LINUX = @FLAG_M64@ $(AM_CFLAGS_BASE) $(AM_CFLAGS_PSO_BASE) AM_CCASFLAGS_ARM64_LINUX = @FLAG_M64@ -g + +AM_FLAG_M3264_AMD64_FREEBSD = @FLAG_M64@ +AM_CFLAGS_AMD64_FREEBSD = @FLAG_M64@ \ + $(AM_CFLAGS_BASE) -fomit-frame-pointer +AM_CFLAGS_PSO_AMD64_FREEBSD = @FLAG_M64@ $(AM_CFLAGS_BASE) $(AM_CFLAGS_PSO_BASE) +AM_CCASFLAGS_AMD64_FREEBSD = @FLAG_M64@ -g + + AM_FLAG_M3264_X86_DARWIN = -arch i386 AM_CFLAGS_X86_DARWIN = $(WERROR) -arch i386 $(AM_CFLAGS_BASE) \ -mmacosx-version-min=10.6 \ @@ -299,6 +321,7 @@ endif # Baseline link flags for making vgpreload shared objects. # PRELOAD_LDFLAGS_COMMON_LINUX = -nodefaultlibs -shared -Wl,-z,interpose,-z,initfirst +PRELOAD_LDFLAGS_COMMON_FREEBSD = -nodefaultlibs -shared -Wl,-z,interpose,-z,initfirst PRELOAD_LDFLAGS_COMMON_DARWIN = -dynamic -dynamiclib -all_load PRELOAD_LDFLAGS_COMMON_SOLARIS = -nodefaultlibs -shared -Wl,-z,interpose,-z,initfirst if SOLARIS_XPG_SYMBOLS_PRESENT @@ -319,6 +342,8 @@ PRELOAD_LDFLAGS_PPC64BE_LINUX = $(PRELOAD_LDFLAGS_COMMON_LINUX) @FLAG_M64@ PRELOAD_LDFLAGS_PPC64LE_LINUX = $(PRELOAD_LDFLAGS_COMMON_LINUX) @FLAG_M64@ PRELOAD_LDFLAGS_ARM_LINUX = $(PRELOAD_LDFLAGS_COMMON_LINUX) @FLAG_M32@ PRELOAD_LDFLAGS_ARM64_LINUX = $(PRELOAD_LDFLAGS_COMMON_LINUX) @FLAG_M64@ +PRELOAD_LDFLAGS_X86_FREEBSD = $(PRELOAD_LDFLAGS_COMMON_FREEBSD) @FLAG_M32@ +PRELOAD_LDFLAGS_AMD64_FREEBSD= $(PRELOAD_LDFLAGS_COMMON_FREEBSD) @FLAG_M64@ PRELOAD_LDFLAGS_X86_DARWIN = $(PRELOAD_LDFLAGS_COMMON_DARWIN) -arch i386 PRELOAD_LDFLAGS_AMD64_DARWIN = $(PRELOAD_LDFLAGS_COMMON_DARWIN) -arch x86_64 PRELOAD_LDFLAGS_S390X_LINUX = $(PRELOAD_LDFLAGS_COMMON_LINUX) @FLAG_M64@ diff --git a/Makefile.am b/Makefile.am index f5935eb692..7749442e9f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -45,6 +45,7 @@ SUPP_FILES = \ glibc-2.2-LinuxThreads-helgrind.supp \ glibc-2.X-drd.supp \ darwin9.supp darwin9-drd.supp \ + freebsd.supp freebsd-helgrind.supp freebsd-drd.supp \ darwin10.supp darwin10-drd.supp \ darwin11.supp darwin12.supp darwin13.supp darwin14.supp darwin15.supp \ darwin16.supp darwin17.supp \ @@ -116,6 +117,7 @@ EXTRA_DIST = \ README.mips \ README.aarch64 \ README.solaris \ + README.freebsd \ NEWS.old \ valgrind.pc.in \ valgrind.spec.in \ diff --git a/Makefile.tool.am b/Makefile.tool.am index 2bf90de5da..fe5f002cec 100644 --- a/Makefile.tool.am +++ b/Makefile.tool.am @@ -40,13 +40,21 @@ TOOL_LDFLAGS_COMMON_DARWIN = \ TOOL_LDFLAGS_COMMON_SOLARIS = \ -static -nodefaultlibs -nostartfiles -u _start \ -Wl,-M,/usr/lib/ld/map.noexstk +TOOL_LDFLAGS_COMMON_FREEBSD = -static \ + -nodefaultlibs -nostartfiles -Wl,-u,_start @FLAG_NO_BUILD_ID@ TOOL_LDFLAGS_X86_LINUX = \ $(TOOL_LDFLAGS_COMMON_LINUX) @FLAG_M32@ +TOOL_LDFLAGS_X86_FREEBSD = \ + $(TOOL_LDFLAGS_COMMON_FREEBSD) @FLAG_M32@ + TOOL_LDFLAGS_AMD64_LINUX = \ $(TOOL_LDFLAGS_COMMON_LINUX) @FLAG_M64@ +TOOL_LDFLAGS_AMD64_FREEBSD = \ + $(TOOL_LDFLAGS_COMMON_FREEBSD) @FLAG_M64@ + TOOL_LDFLAGS_PPC32_LINUX = \ $(TOOL_LDFLAGS_COMMON_LINUX) @FLAG_M32@ @@ -125,12 +133,18 @@ LIBREPLACEMALLOC_PPC64BE_LINUX = \ LIBREPLACEMALLOC_PPC64LE_LINUX = \ $(top_builddir)/coregrind/libreplacemalloc_toolpreload-ppc64le-linux.a +LIBREPLACEMALLOC_X86_FREEBSD = \ + $(top_builddir)/coregrind/libreplacemalloc_toolpreload-x86-freebsd.a + LIBREPLACEMALLOC_ARM_LINUX = \ $(top_builddir)/coregrind/libreplacemalloc_toolpreload-arm-linux.a LIBREPLACEMALLOC_ARM64_LINUX = \ $(top_builddir)/coregrind/libreplacemalloc_toolpreload-arm64-linux.a +LIBREPLACEMALLOC_AMD64_FREEBSD = \ + $(top_builddir)/coregrind/libreplacemalloc_toolpreload-amd64-freebsd.a + LIBREPLACEMALLOC_X86_DARWIN = \ $(top_builddir)/coregrind/libreplacemalloc_toolpreload-x86-darwin.a @@ -187,6 +201,16 @@ LIBREPLACEMALLOC_LDFLAGS_ARM64_LINUX = \ $(LIBREPLACEMALLOC_ARM64_LINUX) \ -Wl,--no-whole-archive +LIBREPLACEMALLOC_LDFLAGS_X86_FREEBSD = \ + -Wl,--whole-archive \ + $(LIBREPLACEMALLOC_X86_FREEBSD) \ + -Wl,--no-whole-archive + +LIBREPLACEMALLOC_LDFLAGS_AMD64_FREEBSD = \ + -Wl,--whole-archive \ + $(LIBREPLACEMALLOC_AMD64_FREEBSD) \ + -Wl,--no-whole-archive + LIBREPLACEMALLOC_LDFLAGS_X86_DARWIN = \ $(LIBREPLACEMALLOC_X86_DARWIN) diff --git a/NEWS b/NEWS index e4cec71c56..68315a77ad 100644 --- a/NEWS +++ b/NEWS @@ -37,7 +37,9 @@ bugzilla (https://bugs.kde.org/enter_bug.cgi?product=valgrind) rather than mailing the developers (or mailing lists) directly -- bugs that are not entered into bugzilla tend to get forgotten about or ignored. +208531 [PATCH]: FreeBSD support for valgrind 368960 WARNING: unhandled amd64-linux syscall: 163 (acct) +407589 [Linux] Add support for C11 aligned_alloc() and GNU reallocarray() 423963 Error in child thread when CLONE_PIDFD is used 429375 PPC ISA 3.1 support is missing, part 9 431157 PPC_FEATURE2_SCV needs to be masked in AT_HWCAP2 diff --git a/README b/README index b8cc51de83..ae21cc74d6 100644 --- a/README +++ b/README @@ -46,6 +46,8 @@ platforms: - nanoMIPS/Linux - X86/Solaris - AMD64/Solaris +- X86/FreeBSD +- AMD64/FreeBSD Note that AMD64 is just another name for x86_64, and Valgrind runs fine on Intel processors. Also note that the core of macOS is called diff --git a/README.freebsd b/README.freebsd new file mode 100644 index 0000000000..c6e6818211 --- /dev/null +++ b/README.freebsd @@ -0,0 +1,180 @@ +Installing from ports or via pkg +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you are using FreeBSD 11.3 or later, then you should be able to install +Valgrind using either + +pkg install devel/valgrind + +or alternatively from ports (if installed) + +cd /usr/ports/devel/valgrind && make install clean + + +Building Valgrind +~~~~~~~~~~~~~~~~~ + +Install ports for autoconf, automake, libtool and gmake. + +$ sh autogen.sh +$ ./configure --prefix=/where/ever +$ gmake +$ gmake install + +Known Limitations (December 2020) + +0. Be aware that if you use a wrapper script and run Valgrind on the wrapper + script Valgrind may hit restrictions if the wrapper script runs any + Capsicum enabled applications. Examples of Capsicum enabled applications + are echo, basename, tee, uniq and wc. It is recommended that you either + avoid these applications or that you run Valgrind directly on your test + application. +1. There are some limitations when running Valgrind on code that was compiled + with clang. These issues are not present with code compiled with GCC. + a) There may be missing source information concerning variables. + b) The client request mechanism may not work entirely correctly. + c) Code that uses OpenMP will generate spurious errors. +2. There are some limitations specific to i386 + a) In some cases signals are mishandled causing Valgrind to terminate and + report a SIGSEGV. + b) Applications that create and join many threads may crash. + +Notes for Developers +~~~~~~~~~~~~~~~~~~~~ + +See README_DEVELOPERS, README_MISSING_SYSCALL_OR_IOCTL and docs/* +for more general information for developers. + +0. Adding syscalls. + +When adding syscalls, you need to look at the manpage and also syscalls.master +(online at +https://github.com/freebsd/freebsd/blob/master/sys/kern/syscalls.master +and for 32bit +https://github.com/freebsd/freebsd/blob/master/sys/compat/freebsd32/syscalls.master + +and if you installed the src package there should also be + +/usr/src/sys/kern/syscalls.master +and +/usr/src/sys/compat/freebsd32/syscalls.master) + +syscalls.master is particularly useful for seeing quickly whether parameters +are inputs or outputs. + +The syscall wrappers can vary from trivial to difficult. Fortunately, many are +either trivial (no arguments) or easy (Valgrind just needs to know what memory +is being read or written). Some syscalls, such as those involving process +creation and termination, signals and memory mapping require deeper interaction +with Valgrind. + +When you add syscalls you will need to modify several files + a) include/vki/vki-scnums-freebsd.h + This file contains one #define for each syscall. The _NR_ prefix (Linux + style) is used rather than SYS_ for compatibility with the rest of the + Valgrind source. + b) coregrind/m_syswrap/priv_syswrap-freebsd.h + This uses the DECL_TEMPLATE macro to generate declarations for the syscall + before and after wrappers. + c) coregrind/m_syswrap/syswrap-freebsd.c + This is where the bulk of the code resides. Toward the end of the file + the BSDX_/BSDXY macros are used to generate entries in the table of + syscalls. BSDX_ is used for wrappers that only have a 'before', BSDXY + if both wrappers are required. In general, syscalls that have no arguments + or only input arguments just need a BSDX_ macro (before only). Syscalls + with output arguments need a BSDXY macro (before and after). + d) If the syscall uses 64bit arguments (long long) then instead of putting + the wrapper definitions in syswrap-freebsd.c there will be one definition + for each platform amd64 and x86 in syswrap-x86-freebsd.c and + syswrap-amd64-freebsd.c. + Each long long needs to be split into two ARGs in the x86 version. + +The PRE (before) wrapper +------------------------ + +Each PRE wrapper always contains the following two macro calls + +PRINT. This outputs the syscall name and argument values when Valgrind is +executed with +--trace-syscalls=yes + +PRE_READ_REGX. This macro lets Valgrind know about the number and types of the +syscall arguments which allows Valgrind to check that they are initialized. +X is the number of arguments. It is best that the argument names match +the man page, but the must match the types and number of arguments in +syscalls.master. +Occasionally there are differences between the two. + +If the syscall takes pointers to memory there will be one of the following for +each pointer argument. + +PRE_MEM_RASCIIZ for NULL terminated ascii strings. + +PRE_MEM_READ for pointers to structures or arrays that are read. + +PRE_MEM_WRITE for pointers to structures or arrays that are written. + +As a rule, the definitions of structures are copied into vki-freebsd.h +with the vki- prefix. [vki - Valgrind kernel interface; this was done +historically to protect against discrepancies between user include +structure definitions and kernel definitions on Linux]. + +The POST (after) wrapper +------------------------ + +These are much easier. + +They just contain a POST_MEM_WRITE macro for each output argument. + + +Feedback +~~~~~~~~ + +If you find any problems please create a bugzilla report at +https://bugs.kde.org using the Valgrind product. + +Alternatively you can use the FreeBSD bugilla +https://bugs.freebsd.org + +Credits +~~~~~~~ + +Valgrind was originally ported to FreeBSD by Doug Rabson +in 2004. + +Paul Floyd (that's me), started looking at this project in late 2018, +took a long pause and then continued in earnest in January 2020. + +A big thanks to Nick Briggs for helping with the x86 version. + +Kyle Evans and Ed Maste for contributing patches and helping with the +integration with FreeBSD ports. + +Prior to 2018 many others have also contributed. + +Dimitry Andric +Simon Barner +Roman Bogorodskiy +Rebecca Cran +Bryan Drewery +Brian Fundakowski Feldman +Denis Generalov +Mikolaj Golub +Eugene Kilachkoff +Xin LI +Phil Longstaff +Pav Lucistnik +Conrad Meyer +Julien Nadeau +Frerich Raabe +Doug Rabson +Craig Rodrigues +Tom Russo +Stephen Sanders +Stanislav Sedov +Andrei V. Shetuhin +Niklas Sorensson +Ryan Stone +Jerry Toung +Yuri + diff --git a/cachegrind/tests/Makefile.am b/cachegrind/tests/Makefile.am index 571ae222a8..7eb20e294b 100644 --- a/cachegrind/tests/Makefile.am +++ b/cachegrind/tests/Makefile.am @@ -30,7 +30,9 @@ AM_CFLAGS += $(AM_FLAG_M3264_PRI) AM_CXXFLAGS += $(AM_FLAG_M3264_PRI) # C ones +if !VGCONF_OS_IS_FREEBSD dlclose_LDADD = -ldl +endif if VGCONF_OS_IS_DARWIN myprint_so_LDFLAGS = $(AM_CFLAGS) -dynamic -dynamiclib -all_load -fpic else diff --git a/configure.ac b/configure.ac index 0398aafa1c..c05994516f 100755 --- a/configure.ac +++ b/configure.ac @@ -224,7 +224,7 @@ case "${host_cpu}" in ARCH_MAX="x86" ;; - x86_64) + x86_64|amd64) AC_MSG_RESULT([ok (${host_cpu})]) ARCH_MAX="amd64" ;; @@ -360,6 +360,57 @@ case "${host_os}" in ;; + *freebsd*) + AC_MSG_RESULT([ok (${host_os})]) + VGCONF_OS="freebsd" + AC_DEFINE([FREEBSD_10], 1000, [FREEBSD_VERS value for FreeBSD 10.x]) + AC_DEFINE([FREEBSD_11], 1100, [FREEBSD_VERS value for FreeBSD 11.x]) + AC_DEFINE([FREEBSD_12], 1200, [FREEBSD_VERS value for FreeBSD 12.0 to 12.1]) + AC_DEFINE([FREEBSD_12_2], 1220, [FREEBSD_VERS value for FreeBSD 12.2]) + AC_DEFINE([FREEBSD_13], 1300, [FREEBSD_VERS value for FreeBSD 13.x]) + AC_DEFINE([FREEBSD_14], 1400, [FREEBSD_VERS value for FreeBSD 14.x]) + + AC_MSG_CHECKING([for the kernel version]) + kernel=`uname -r` + + case "${kernel}" in + 10.*) + AC_MSG_RESULT([FreeBSD 10.x (${kernel})]) + AC_DEFINE([FREEBSD_VERS], FREEBSD_10, [FreeBSD version]) + ;; + 11.*) + AC_MSG_RESULT([FreeBSD 11.x (${kernel})]) + AC_DEFINE([FREEBSD_VERS], FREEBSD_11, [FreeBSD version]) + ;; + 12.*) + case "${kernel}" in + 12.[[0-1]]-*) + AC_MSG_RESULT([FreeBSD 12.x (${kernel})]) + AC_DEFINE([FREEBSD_VERS], FREEBSD_12, [FreeBSD version]) + ;; + *) + AC_MSG_RESULT([FreeBSD 12.x (${kernel})]) + AC_DEFINE([FREEBSD_VERS], FREEBSD_12_2, [FreeBSD version]) + ;; + esac + ;; + 13.*) + AC_MSG_RESULT([FreeBSD 13.x (${kernel})]) + AC_DEFINE([FREEBSD_VERS], FREEBSD_13, [FreeBSD version]) + ;; + 14.*) + AC_MSG_RESULT([FreeBSD 14.x (${kernel})]) + AC_DEFINE([FREEBSD_VERS], FREEBSD_14, [FreeBSD version]) + ;; + *) + AC_MSG_RESULT([unsupported (${kernel})]) + AC_MSG_ERROR([Valgrind works on FreeBSD 10.x to 14.x]) + ;; + esac + + DEFAULT_SUPP="freebsd.supp freebsd-helgrind.supp freebsd-drd.supp ${DEFAULT_SUPP}" + ;; + *darwin*) AC_MSG_RESULT([ok (${host_os})]) VGCONF_OS="darwin" @@ -660,6 +711,48 @@ case "$ARCH_MAX-$VGCONF_OS" in valt_load_address_pri_inner="0x38000000" AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})]) ;; + x86-freebsd) + VGCONF_ARCH_PRI="x86" + VGCONF_ARCH_SEC="" + VGCONF_PLATFORM_PRI_CAPS="X86_FREEBSD" + VGCONF_PLATFORM_SEC_CAPS="" + valt_load_address_pri_norml="0x38000000" + valt_load_address_pri_inner="0x28000000" + valt_load_address_sec_norml="0xUNSET" + valt_load_address_sec_inner="0xUNSET" + AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})]) + ;; + amd64-freebsd) + if test x$vg_cv_only64bit = xyes; then + VGCONF_ARCH_PRI="amd64" + VGCONF_ARCH_SEC="" + VGCONF_PLATFORM_PRI_CAPS="AMD64_FREEBSD" + VGCONF_PLATFORM_SEC_CAPS="" + elif test x$vg_cv_only32bit = xyes; then + VGCONF_ARCH_PRI="x86" + VGCONF_ARCH_SEC="" + VGCONF_PLATFORM_PRI_CAPS="X86_FREEBSD" + VGCONF_PLATFORM_SEC_CAPS="" + else + VGCONF_ARCH_PRI="amd64" + VGCONF_ARCH_SEC="x86" + VGCONF_PLATFORM_PRI_CAPS="AMD64_FREEBSD" + VGCONF_PLATFORM_SEC_CAPS="X86_FREEBSD" + fi + # These work with either base clang or ports installed gcc + # Hand rolled compilers probably need INSTALL_DIR/lib (at least for gcc) + if test x$is_clang = xclang ; then + FLAG_32ON64="-B/usr/lib32" + else + GCC_MAJOR_VERSION=`${CC} -dumpversion | $SED 's/\..*//' 2>/dev/null` + FLAG_32ON64="-B/usr/local/lib32/gcc${GCC_MAJOR_VERSION} -Wl,-rpath,/usr/local/lib32/gcc${GCC_MAJOR_VERSION}/" + fi + valt_load_address_pri_norml="0x38000000" + valt_load_address_pri_inner="0x28000000" + valt_load_address_sec_norml="0x38000000" + valt_load_address_sec_inner="0x28000000" + AC_MSG_RESULT([ok (${ARCH_MAX}-${VGCONF_OS})]) + ;; # Darwin gets identified as 32-bit even when it supports 64-bit. # (Not sure why, possibly because 'uname' returns "i386"?) Just about # all Macs support both 32-bit and 64-bit, so we just build both. If @@ -860,12 +953,15 @@ esac AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_X86, test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \ -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX \ + -o x$VGCONF_PLATFORM_PRI_CAPS = xX86_FREEBSD \ + -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_FREEBSD \ -o x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \ -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN \ -o x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS \ -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_SOLARIS ) AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_AMD64, test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \ + -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_FREEBSD \ -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN \ -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_SOLARIS ) AM_CONDITIONAL(VGCONF_ARCHS_INCLUDE_PPC32, @@ -918,7 +1014,12 @@ AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_MIPS64_LINUX, test x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX) AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_NANOMIPS_LINUX, test x$VGCONF_PLATFORM_PRI_CAPS = xNANOMIPS_LINUX) -AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_DARWIN, +AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_FREEBSD, + test x$VGCONF_PLATFORM_PRI_CAPS = xX86_FREEBSD \ + -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_FREEBSD) +AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_FREEBSD, + test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_FREEBSD) +AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_X86_DARWIN, test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \ -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN) AM_CONDITIONAL(VGCONF_PLATFORMS_INCLUDE_AMD64_DARWIN, @@ -945,12 +1046,20 @@ AM_CONDITIONAL(VGCONF_OS_IS_LINUX, -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \ -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX \ -o x$VGCONF_PLATFORM_PRI_CAPS = xNANOMIPS_LINUX) +AM_CONDITIONAL(VGCONF_OS_IS_FREEBSD, + test x$VGCONF_PLATFORM_PRI_CAPS = xX86_FREEBSD \ + -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_FREEBSD) AM_CONDITIONAL(VGCONF_OS_IS_DARWIN, test x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \ -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN) AM_CONDITIONAL(VGCONF_OS_IS_SOLARIS, test x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS \ -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_SOLARIS) +AM_CONDITIONAL(VGCONF_OS_IS_DARWIN_OR_FREEBSD, + test x$VGCONF_PLATFORM_PRI_CAPS = xX86_FREEBSD \ + -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_FREEBSD \ + -o x$VGCONF_PLATFORM_PRI_CAPS = xX86_DARWIN \ + -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_DARWIN) # Sometimes, in the Makefile.am files, it's useful to know whether or not @@ -1068,6 +1177,14 @@ AC_EGREP_CPP([DARWIN_LIBC], [ ], GLIBC_VERSION="darwin") +AC_EGREP_CPP([FREEBSD_LIBC], [ +#include +#if defined(__FreeBSD__) + FREEBSD_LIBC +#endif +], +GLIBC_VERSION="freebsd") + # not really a version check AC_EGREP_CPP([BIONIC_LIBC], [ #if defined(__ANDROID__) @@ -1159,6 +1276,11 @@ case "${GLIBC_VERSION}" in AC_DEFINE([DARWIN_LIBC], 1, [Define to 1 if you're using Darwin]) # DEFAULT_SUPP set by kernel version check above. ;; + freebsd) + AC_MSG_RESULT(FreeBSD) + AC_DEFINE([FREEBSD_LIBC], 1, [Define to 1 if you're using FreeBSD]) + # DEFAULT_SUPP set by kernel version check above. + ;; bionic) AC_MSG_RESULT(Bionic) AC_DEFINE([BIONIC_LIBC], 1, [Define to 1 if you're using Bionic]) @@ -1929,12 +2051,12 @@ case "${host_cpu}" in AC_MSG_CHECKING([if gcc accepts -m32]) safe_CFLAGS=$CFLAGS - CFLAGS="-m32 -Werror" + CFLAGS="${FLAG_32ON64} -m32 -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ return 0; ]])], [ - FLAG_M32="-m32" + FLAG_M32="${FLAG_32ON64} -m32" AC_MSG_RESULT([yes]) ], [ FLAG_M32="" @@ -2273,6 +2395,7 @@ AC_GCC_WARNING_SUBST_NO([unused-function], [FLAG_W_NO_UNUSED_FUNCTION]) AC_GCC_WARNING_SUBST_NO([static-local-in-inline], [FLAG_W_NO_STATIC_LOCAL_IN_INLINE]) AC_GCC_WARNING_SUBST_NO([mismatched-new-delete], [FLAG_W_NO_MISMATCHED_NEW_DELETE]) AC_GCC_WARNING_SUBST_NO([infinite-recursion], [FLAG_W_NO_INFINITE_RECURSION]) +AC_GCC_WARNING_SUBST_NO([expansion-to-defined], [FLAG_W_NO_EXPANSION_TO_DEFINED]) AC_GCC_WARNING_SUBST([write-strings], [FLAG_W_WRITE_STRINGS]) AC_GCC_WARNING_SUBST([empty-body], [FLAG_W_EMPTY_BODY]) @@ -2656,7 +2779,7 @@ CFLAGS=$safe_CFLAGS AC_MSG_CHECKING([if gcc accepts -no-pie]) safe_CFLAGS=$CFLAGS -CFLAGS="-no-pie" +CFLAGS="-no-pie -Werror" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ return 0; @@ -2679,30 +2802,52 @@ CFLAGS=$safe_CFLAGS # will reside. -Ttext aligns just the .text section start (but not any # other section). # -# So test for -Ttext-segment which is supported by all bfd ld versions +# LLVM ld.lld 10.0 changed the semantics of its -Ttext. See "Breaking changes" +# in https://releases.llvm.org/10.0.0/tools/lld/docs/ReleaseNotes.html +# The --image-base option (since version 6.0?) provides the semantics needed. +# -Ttext-segment generates an error, but -Ttext now more closely +# follows the GNU (bfd) ld's -Ttext. +# +# So test first for --image-base support, and if that fails then +# for -Ttext-segment which is supported by all bfd ld versions # and use that if it exists. If it doesn't exist it must be an older # version of gold and we can fall back to using -Ttext which has the # right semantics. -AC_MSG_CHECKING([if the linker accepts -Wl,-Ttext-segment]) - safe_CFLAGS=$CFLAGS -CFLAGS="-static -nodefaultlibs -nostartfiles -Wl,-Ttext-segment=$valt_load_address_pri_norml -Werror" +AC_MSG_CHECKING([if the linker accepts -Wl,--image-base]) + +CFLAGS="-static -nodefaultlibs -nostartfiles -Wl,--image-base=$valt_load_address_pri_norml -Werror" AC_LINK_IFELSE( [AC_LANG_SOURCE([int _start () { return 0; }])], [ linker_using_t_text="no" - AC_SUBST([FLAG_T_TEXT], ["-Ttext-segment"]) + AC_SUBST([FLAG_T_TEXT], ["--image-base"]) AC_MSG_RESULT([yes]) ], [ - linker_using_t_text="yes" - AC_SUBST([FLAG_T_TEXT], ["-Ttext"]) AC_MSG_RESULT([no]) + + AC_MSG_CHECKING([if the linker accepts -Wl,-Ttext-segment]) + + CFLAGS="-static -nodefaultlibs -nostartfiles -Wl,-Ttext-segment=$valt_load_address_pri_norml -Werror" + + AC_LINK_IFELSE( + [AC_LANG_SOURCE([int _start () { return 0; }])], + [ + linker_using_t_text="no" + AC_SUBST([FLAG_T_TEXT], ["-Ttext-segment"]) + AC_MSG_RESULT([yes]) + ], [ + linker_using_t_text="yes" + AC_SUBST([FLAG_T_TEXT], ["-Ttext"]) + AC_MSG_RESULT([no]) + ]) ]) + CFLAGS=$safe_CFLAGS -# If the linker only supports -Ttext (not -Ttext-segment) then we will +# If the linker only supports -Ttext (not -Ttext-segment or --image-base) then we will # have to strip any build-id ELF NOTEs from the statically linked tools. # Otherwise the build-id NOTE might end up at the default load address. # (Pedantically if the linker is gold then -Ttext is fine, but newer @@ -2728,7 +2873,7 @@ AC_LINK_IFELSE( AC_MSG_RESULT([no]) ]) else -AC_MSG_NOTICE([ld -Ttext-segment used, no need to strip build-id NOTEs.]) +AC_MSG_NOTICE([ld --image-base or -Ttext-segment used, no need to strip build-id NOTEs.]) AC_SUBST([FLAG_NO_BUILD_ID], [""]) fi CFLAGS=$safe_CFLAGS @@ -4515,6 +4660,7 @@ AC_PATH_PROG([MPI_CC], [mpicc], [mpicc], mflag_primary= if test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \ + -o x$VGCONF_PLATFORM_PRI_CAPS = xX86_FREEBSD \ -o x$VGCONF_PLATFORM_PRI_CAPS = xPPC32_LINUX \ -o x$VGCONF_PLATFORM_PRI_CAPS = xARM_LINUX \ -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS32_LINUX \ @@ -4522,6 +4668,7 @@ if test x$VGCONF_PLATFORM_PRI_CAPS = xX86_LINUX \ -o x$VGCONF_PLATFORM_PRI_CAPS = xX86_SOLARIS ; then mflag_primary=$FLAG_M32 elif test x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_LINUX \ + -o x$VGCONF_PLATFORM_PRI_CAPS = xAMD64_FREEBSD \ -o x$VGCONF_PLATFORM_PRI_CAPS = xPPC64_LINUX \ -o x$VGCONF_PLATFORM_PRI_CAPS = xARM64_LINUX \ -o x$VGCONF_PLATFORM_PRI_CAPS = xMIPS64_LINUX \ @@ -4537,7 +4684,8 @@ mflag_secondary= if test x$VGCONF_PLATFORM_SEC_CAPS = xX86_LINUX \ -o x$VGCONF_PLATFORM_SEC_CAPS = xPPC32_LINUX \ -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_SOLARIS \ - -o x$VGCONF_PLATFORM_SEC_CAPS = xMIPS32_LINUX ; then + -o x$VGCONF_PLATFORM_SEC_CAPS = xMIPS32_LINUX \ + -o x$VGCONF_PLATFORM_SEC_CAPS = xX86_FREEBSD ; then mflag_secondary=$FLAG_M32 elif test x$VGCONF_PLATFORM_SEC_CAPS = xX86_DARWIN ; then mflag_secondary="$FLAG_M32 -arch i386" @@ -4558,6 +4706,9 @@ AC_SUBST(MPI_CC) AM_COND_IF([VGCONF_OS_IS_LINUX], [CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -fpic" LDFLAGS_MPI="-fpic -shared"]) +AM_COND_IF([VGCONF_OS_IS_FREEBSD], + [CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -fpic" + LDFLAGS_MPI="-fpic -shared"]) AM_COND_IF([VGCONF_OS_IS_DARWIN], [CFLAGS_MPI="-g -O -fno-omit-frame-pointer -Wall -dynamic" LDFLAGS_MPI="-dynamic -dynamiclib -all_load"]) diff --git a/coregrind/Makefile.am b/coregrind/Makefile.am index 65d2c705ad..ee70cfde31 100644 --- a/coregrind/Makefile.am +++ b/coregrind/Makefile.am @@ -49,6 +49,11 @@ valgrind_SOURCES = \ launcher-linux.c \ m_debuglog.c endif +if VGCONF_OS_IS_FREEBSD +valgrind_SOURCES = \ + launcher-freebsd.c \ + m_debuglog.c +endif # for valgrind coregrind building, use the LTO versions, in case they differ from non lto versions AR = ${LTO_AR} @@ -92,6 +97,12 @@ endif if VGCONF_OS_IS_SOLARIS vgdb_SOURCES += vgdb-invoker-solaris.c endif +if VGCONF_OS_IS_FREEBSD +# As with Darwin, we don't have ptrace PTRACE_PEEKTEXT +# so we can't use vgdb-invoker-ptrace.c +# Need to find an alternative, like Solaris +vgdb_SOURCES += vgdb-invoker-none.c +endif vgdb_CPPFLAGS = $(AM_CPPFLAGS_PRI) vgdb_CFLAGS = $(AM_CFLAGS_PRI) $(LTO_CFLAGS) diff --git a/docs/Makefile.am b/docs/Makefile.am index e9d659d2ec..5c777a263a 100644 --- a/docs/Makefile.am +++ b/docs/Makefile.am @@ -113,7 +113,11 @@ valkyriedir = $(top_builddir)/docs/vg-html downloadsdir = $(top_builddir)/docs/downloads vgdir = $(top_builddir)/docs/valgrind +if VGCONF_OS_IS_FREEBSD +XML_CATALOG_FILES = /usr/local/share/xml/catalog +else XML_CATALOG_FILES = /etc/xml/catalog +endif # file to log print output to LOGFILE = print.log @@ -132,6 +136,7 @@ XSL_FO_STYLE = $(mylibdir)/vg-fo.xsl XSL_TEXT_STYLE = $(mylibdir)/vg-faq2txt.xsl XSL_WEBSITE_STYLE = $(mylibdir)/vg-html-website.xsl XSL_MAN_STYLES = \ + /usr/local/share/xsl/docbook/manpages/docbook.xsl \ /usr/share/sgml/docbook/xsl-stylesheets/manpages/docbook.xsl \ /usr/share/xml/docbook/stylesheet/nwalsh/current/manpages/docbook.xsl \ /usr/share/xml/docbook/stylesheet/nwalsh/manpages/docbook.xsl diff --git a/drd/tests/Makefile.am b/drd/tests/Makefile.am index 3889fb15e3..b53eeefebe 100644 --- a/drd/tests/Makefile.am +++ b/drd/tests/Makefile.am @@ -400,7 +400,6 @@ check_PROGRAMS = \ pth_inconsistent_cond_wait \ pth_mutex_reinit \ pth_process_shared_mutex \ - pth_uninitialized_cond \ recursive_mutex \ rwlock_race \ rwlock_test \ @@ -428,8 +427,12 @@ endif if HAVE_BUILTIN_ATOMIC_CXX check_PROGRAMS += \ - annotate_smart_pointer \ - tsan_unittest + annotate_smart_pointer +endif + +if !VGCONF_OS_IS_FREEBSD +check_PROGRAMS += tsan_unittest \ + pth_uninitialized_cond endif # clang 3.3 will generate errors about libstdc++ headers from @@ -477,6 +480,10 @@ if !VGCONF_OS_IS_DARWIN check_PROGRAMS += sem_wait endif +if VGCONF_OS_IS_FREEBSD +check_PROGRAMS += thread_name_freebsd +endif + AM_CFLAGS += $(AM_FLAG_M3264_PRI) @FLAG_W_EXTRA@ -Wno-inline -Wno-unused-parameter AM_CXXFLAGS += $(AM_FLAG_M3264_PRI) @FLAG_W_EXTRA@ @FLAG_FALIGNED_NEW@ \ @@ -487,7 +494,9 @@ LDADD = -lpthread bug322621_SOURCES = bug322621.cpp concurrent_close_SOURCES = concurrent_close.cpp +if !VGCONF_OS_IS_FREEBSD dlopen_main_LDADD = -ldl +endif dlopen_lib_so_SOURCES = dlopen_lib.c dlopen_lib_so_CFLAGS = -fPIC dlopen_lib_so_LDFLAGS = -shared -fPIC diff --git a/freebsd-drd.supp b/freebsd-drd.supp new file mode 100644 index 0000000000..a3414b544a --- /dev/null +++ b/freebsd-drd.supp @@ -0,0 +1,170 @@ +# Suppressions for FreeBSD / DRD + +{ + DRD-LDRT + drd:ConflictingAccess + obj:/libexec/ld-elf*.so.1 +} +{ + DRD-PTHREAD-EXIT1 + drd:ConflictingAccess + ... + fun:pthread_exit +} +{ + DRD-PTHREAD_CREATE1 + drd:ConflictingAccess + ... + fun:pthread_create +} +{ + DRD-PTHREAD-EXIT2 + drd:ConflictingAccess + obj:*/lib*/libthr.so.3 + fun:pthread_exit +} +{ + DRD-PRINTF1 + drd:ConflictingAccess + fun:f*lockfile +} +{ + DRD-MANY1 + drd:ConflictingAccess + obj:/lib/libthr.so.3 + obj:/libexec/ld-elf*.so.1 +} +{ + DRD-MANY2 + drd:ConflictingAccess + obj:*/lib*/libthr.so.3 + obj:*/lib*/libthr.so.3 + obj:/libexec/ld-elf*.so.1 +} +{ + DRD-MANY3 + drd:ConflictingAccess + obj:*/lib*/libthr.so.3 + obj:*/lib*/libthr.so.3 + obj:*/lib*/libthr.so.3 + obj:/libexec/ld-elf*.so.1 +} +{ + DRD-UNWIND1 + drd:ConflictingAccess + ... + fun:dl_iterate_phdr + obj:*/lib*/libgcc_s.so.1 +} +{ + DRD-PTHREAD-DETACH1 + drd:ConflictingAccess + obj:*/lib*/libthr.so.3 + fun:pthread_detach +} +{ + DRD-LIBGOMP + drd:ConflictingAccess + obj:/usr/local/lib*/gcc*/libgomp.so.1.0.0 +} +{ + DRD-LIBOMP + drd:ConflictingAccess + obj:/usr/lib*/libomp.so +} +{ + DRD-LIBGOMP3 + drd:ConflictingAccess + fun:.omp_outlined* +} +{ + DRD-LIBGOMP4 + drd:ConflictingAccess + obj:*/lib*/libthr.so.3 + obj:*/lib*/libthr.so.3 + obj:*/lib*/libthr.so.3 + fun:pthread_setspecific +} +{ + DRD-UNWIND1 + drd:ConflictingAccess + fun:_Unwind_GetCFA + obj:*/lib*/libthr.so.3 + obj:*/lib*/libgcc_s.so.1 +} +{ + DRD-UNWIND2 + drd:ConflictingAccess + ... + fun:_Unwind_ForcedUnwind +} +{ + DRD-PTHREAD-ATTR1 + drd:ConflictingAccess + fun:pthread_attr_get_np +} +{ + DRD-PTHREAD-SETSPECIFIC + drd:ConflictingAccess + fun:pthread_setspecific +} +{ + DRD-MEMSET + drd:ConflictingAccess + fun:memset + obj:*/lib*/libthr.so.3 +} +{ + DRD-SET-POINTER + drd:ConflictingAccess + fun:_ZNSt3__121__thread_specific_ptrINS_15__thread_structEE11set_pointerEPS1_ +} +{ + DRD-DL-ITERATE-PHDR + drd:ConflictingAccess + ... + obj:*/lib*/libthr.so.3 + obj:/libexec/ld-elf*.so.1 + fun:dl_iterate_phdr +} +{ + DRD-LIBGCC-S + drd:ConflictingAccess + obj:*/lib*/libgcc_s.so.1 + obj:*/lib*/libgcc_s.so.1 + obj:*/lib*/libgcc_s.so.1 + obj:*/lib*/libgcc_s.so.1 + obj:*/lib*/libgcc_s.so.1 + obj:*/lib*/libgcc_s.so.1 +} +{ + DRD-DLOPEN + drd:ConflictingAccess + obj:*/lib*/libthr.so.3 + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 + fun:dlopen +} +{ + DRD-LD-ELF + drd:ConflictingAccess + obj:*/lib*/libthr.so.3 + ... + obj:/libexec/ld-elf*.so.1 +} +{ + DRD-SNPRINTF + drd:ConflictingAccess + ... + obj:*/lib*/libc.so.7 + fun:snprintf +} +{ + DRD-FREEBSD122-OMP + drd:MutexErr + fun:pthread_mutex_destroy_intercept + fun:pthread_mutex_destroy + fun:_ZNSt3__15mutexD1Ev + fun:__cxa_finalize +} diff --git a/freebsd-helgrind.supp b/freebsd-helgrind.supp new file mode 100644 index 0000000000..d24ff859bf --- /dev/null +++ b/freebsd-helgrind.supp @@ -0,0 +1,162 @@ +# Suppressions for FreeBSD / Helgrind + +{ + HELGRIND-LIBTHR1 + Helgrind:Race + obj:*/lib*/libthr.so.3 +} +{ + HELGRIND-LIB-LDRT1 + Helgrind:Race + obj:/libexec/ld-elf*.so.1 +} +{ + HELGRIND-PTHREAD-EXIT0 + Helgrind:Race + fun:thr_exit + obj:*/lib*/libthr.so.3 + obj:*/lib*/libthr.so.3 +} +{ + HELGRIND-PTHREAD-EXIT1 + Helgrind:Race + fun:_pthread_exit_mask + fun:pthread_exit + obj:*/lib*/libthr.so.3 +} +{ + HELGRIND-PTHREAD-EXIT2 + Helgrind:Race + fun:__sys_thr_exit + fun:_pthread_exit_mask + fun:pthread_exit + obj:*/lib*/libthr.so.3 +} +{ + HELGRIND-PTHREAD-EXIT4 + Helgrind:Race + fun:_thr_try_gc + obj:*/lib*/libthr.so.3 + fun:pthread_join_WRK + fun:pthread_join +} +{ + HELGRIND-PTHREAD-EXIT5 + Helgrind:Race + fun:__sys_thr_exit + obj:*/lib*/libthr.so.3 + fun:_pthread_exit_mask + fun:pthread_exit + obj:/lib/libthr.so.3 +} +{ + HELGRIND-PTHREAD-BARRIER2 + Helgrind:Race + fun:pthread_barrier_init +} +# added PJF +{ + HELGRIND-EXIT1 + Helgrind:Race + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 + fun:__cxa_finalize + fun:exit +} +{ + HELGRIND-EXIT2 + Helgrind:Race + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 + fun:_rtld_error + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 + fun:__cxa_finalize + fun:exit +} +{ + HELGRIND-EDIT3 + Helgrind:Race + fun:_rtld_error + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 + fun:__cxa_finalize + fun:exit +} +{ + HELGRIND-EXIT3 + Helgrind:Race + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 + fun:__cxa_finalize + fun:exit +} +# PJF not sure exactly what the cause of this is, but it looks like it is the +# tls used for pthread_self() with a conflict between pthread_create and +# mythread_wrapper which coverst create/join/exit +{ + HELGRIND-PTHREAD-CREATE1 + Helgrind:Race + obj:/libexec/ld-elf*.so.1 + fun:_rtld_allocate_tls + obj:*/lib*/libthr.so.3 + obj:*/lib*/libthr.so.3 + fun:pthread_create +} +{ + HELGRIND-PTHREAD-CREATE2 + Helgrind:Race + fun:memset + obj:*/lib*/libthr.so.3 + fun:pthread_create +} +# PJF again a pthread_self() hazard +{ + HELGRIND-PTHREAD-SELF1 + Helgrind:Race + fun:mythread_wrapper + obj:*/lib*/libthr.so.3 +} +{ + HELGRIND-SEM-CLOCKWAIT1 + Helgrind:Race + fun:sem_clockwait_np +} +{ + HELGRIND-UMTX-OP1 + Helgrind:Race + fun:_umtx_op +} +{ + HELGRIND-SEM-POST1 + Helgrind:Race + fun:sem_post +} +{ + HELGRIND-GCC-UNWIND1 + Helgrind:Race + obj:/lib/libgcc_s.so.1 +} +{ + HELGRIND-LIBC-PRINTF1 + Helgrind:Race + fun:flockfile +} +{ + HELGRIND-LIBC-PRINTF2 + Helgrind:Race + fun:funlockfile +} +{ + HELGRIND-MUTEX-LOCK1 + Helgrind:Race + fun:memset + obj:*/lib*/libthr.so.3 +} +{ + HELGRIND-LIBOMP + Helgrind:Race + obj:/usr/lib*/libomp.so +} diff --git a/freebsd.supp b/freebsd.supp new file mode 100644 index 0000000000..7345d713de --- /dev/null +++ b/freebsd.supp @@ -0,0 +1,51 @@ +# Suppressions for FreeBSD / Memcheck +#This is a workaround for a bug in rtld +{ + MEMCHECK-RTLD-32ON64 + Memcheck:Addr4 + fun:memcpy + fun:elf_aux_info +} +{ + MEMCHECK-RTLD-COND + Memcheck:Cond + obj:/libexec/ld-elf*.so.1 +} +{ + MEMCHECK-RTLD-32ON64-ADDR4 + Memcheck:Addr4 + obj:/libexec/ld-elf32.so.1 + obj:/libexec/ld-elf32.so.1 +} + +{ + MEMCHECK-LIBSTDC++-REACHABLE + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + obj:/usr/local/lib*/gcc9/libstdc++.so.* + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 + obj:/libexec/ld-elf*.so.1 +} +{ + MEMCHECK-LIBC-REACHABLE + Memcheck:Leak + match-leak-kinds: reachable + fun:malloc + obj:*/lib*/libc.so.7 + obj:*/lib*/libc.so.7 + obj:*/lib*/libc.so.7 + fun:vfprintf_l +} +# clang only, should check that this is not a genuine error +{ + MEMCHECK-POSIX-FADVISE + Memcheck:Cond + fun:posix_fadvise +} +{ + MEMCHECK-POSIX-FALLOCATE + Memcheck:Cond + fun:posix_fallocate +} diff --git a/gdbserver_tests/Makefile.am b/gdbserver_tests/Makefile.am index 1a5c51356a..e93ead322f 100644 --- a/gdbserver_tests/Makefile.am +++ b/gdbserver_tests/Makefile.am @@ -155,17 +155,20 @@ check_PROGRAMS = \ clean_after_fork \ fork_chain \ gone \ - main_pic \ passsigalrm \ self_invalidate \ sleepers \ t \ watchpoints +if !VGCONF_OS_IS_FREEBSD + check_PROGRAMS += main_pic + + main_pic_LDFLAGS = @FLAG_PIE@ + main_pic_CFLAGS = $(AM_CFLAGS) -fPIC +endif + AM_CFLAGS += $(AM_FLAG_M3264_PRI) AM_CXXFLAGS += $(AM_FLAG_M3264_PRI) LDADD = -lpthread - -main_pic_LDFLAGS = @FLAG_PIE@ -main_pic_CFLAGS = $(AM_CFLAGS) -fPIC diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index 38a087cdfc..9fe8082b94 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -36,6 +36,9 @@ endif if VGCONF_OS_IS_SOLARIS SUBDIRS += solaris endif +if VGCONF_OS_IS_FREEBSD +SUBDIRS += freebsd +endif # Platform-specific tests if VGCONF_PLATFORMS_INCLUDE_X86_LINUX @@ -53,6 +56,12 @@ endif if VGCONF_PLATFORMS_INCLUDE_AMD64_SOLARIS SUBDIRS += amd64-solaris endif +if VGCONF_PLATFORMS_INCLUDE_X86_FREEBSD +SUBDIRS += x86-freebsd +endif +if VGCONF_PLATFORMS_INCLUDE_AMD64_FREEBSD +SUBDIRS += amd64-freebsd +endif DIST_SUBDIRS = x86 amd64 ppc32 ppc64 s390x linux \ darwin solaris x86-linux amd64-linux arm64-linux \ diff --git a/memcheck/tests/amd64-freebsd/filter_stderr b/memcheck/tests/amd64-freebsd/filter_stderr new file mode 100755 index 0000000000..a778e971fc --- /dev/null +++ b/memcheck/tests/amd64-freebsd/filter_stderr @@ -0,0 +1,3 @@ +#! /bin/sh + +../filter_stderr "$@" diff --git a/memcheck/tests/freebsd/filter_pts b/memcheck/tests/freebsd/filter_pts new file mode 100755 index 0000000000..81dd4f2041 --- /dev/null +++ b/memcheck/tests/freebsd/filter_pts @@ -0,0 +1,5 @@ +#! /bin/sh + +../filter_stderr "$@" | + +gsed 's/Open file descriptor.*/Open file descriptor .../' diff --git a/memcheck/tests/x86-freebsd/filter_stderr b/memcheck/tests/x86-freebsd/filter_stderr new file mode 100755 index 0000000000..a778e971fc --- /dev/null +++ b/memcheck/tests/x86-freebsd/filter_stderr @@ -0,0 +1,3 @@ +#! /bin/sh + +../filter_stderr "$@" diff --git a/mpi/Makefile.am b/mpi/Makefile.am index 471fee02a9..69b69aa925 100644 --- a/mpi/Makefile.am +++ b/mpi/Makefile.am @@ -40,6 +40,10 @@ if VGCONF_OS_IS_LINUX MPI_FLAG_M3264_PRI = $(AM_FLAG_M3264_PRI) MPI_FLAG_M3264_SEC = $(AM_FLAG_M3264_SEC) endif +if VGCONF_OS_IS_FREEBSD + MPI_FLAG_M3264_PRI = $(AM_FLAG_M3264_PRI) + MPI_FLAG_M3264_SEC = $(AM_FLAG_M3264_SEC) +endif if VGCONF_OS_IS_DARWIN MPI_FLAG_M3264_PRI = $(AM_FLAG_M3264_PRI) MPI_FLAG_M3264_SEC = $(AM_FLAG_M3264_SEC) diff --git a/none/tests/Makefile.am b/none/tests/Makefile.am index e4a12cadc3..617c92854d 100644 --- a/none/tests/Makefile.am +++ b/none/tests/Makefile.am @@ -47,6 +47,9 @@ endif if VGCONF_OS_IS_SOLARIS SUBDIRS += solaris endif +if VGCONF_OS_IS_FREEBSD +SUBDIRS += freebsd +endif # Platform-specific tests if VGCONF_PLATFORMS_INCLUDE_AMD64_LINUX @@ -69,7 +72,7 @@ SUBDIRS += x86-solaris endif DIST_SUBDIRS = x86 amd64 ppc32 ppc64 arm arm64 s390x mips32 mips64 nanomips \ - linux darwin solaris amd64-linux x86-linux amd64-darwin \ + linux darwin solaris freebsd amd64-linux x86-linux amd64-darwin \ x86-darwin amd64-solaris x86-solaris scripts . dist_noinst_SCRIPTS = \ @@ -265,9 +268,12 @@ if HAVE_NESTED_FUNCTIONS endif # This doesn't appear to be compilable on Darwin. +if ! VGCONF_OS_IS_DARWIN_OR_FREEBSD + check_PROGRAMS += rlimit64_nofile +endif + if ! VGCONF_OS_IS_DARWIN - check_PROGRAMS += rlimit64_nofile \ - ppoll_alarm + check_PROGRAMS += ppoll_alarm endif # clang does not know -ansi @@ -328,9 +334,14 @@ pth_self_kill_LDADD = -lpthread pth_stackalign_LDADD = -lpthread pth_2sig_LDADD = -lpthread pth_term_signal_LDADD = -lpthread -res_search_LDADD = -lresolv -lpthread +if VGCONF_OS_IS_FREEBSD + res_search_LDADD = -lpthread + resolv_LDADD = -lpthread +else + res_search_LDADD = -lresolv -lpthread + resolv_LDADD = -lresolv -lpthread +endif resolv_CFLAGS = $(AM_CFLAGS) -resolv_LDADD = -lresolv -lpthread if VGCONF_OS_IS_SOLARIS resolv_CFLAGS += -U_REENTRANT endif @@ -366,7 +377,7 @@ else endif vgprintf_nvalgrind_SOURCES = vgprintf.c -vgprintf_nvalgrind_CFLAGS = -DNVALGRIND +vgprintf_nvalgrind_CFLAGS = ${AM_CFLAGS} -DNVALGRIND valgrind_cpp_test_SOURCES = valgrind_cpp_test.cpp valgrind_cpp_test_LDADD = -lstdc++ diff --git a/none/tests/freebsd/filter_stderr b/none/tests/freebsd/filter_stderr new file mode 100755 index 0000000000..a778e971fc --- /dev/null +++ b/none/tests/freebsd/filter_stderr @@ -0,0 +1,3 @@ +#! /bin/sh + +../filter_stderr "$@"