]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
FreeBSD support, patch 2
authorPaul Floyd <pjfloyd@wanadoo.fr>
Thu, 7 Oct 2021 05:53:33 +0000 (07:53 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Thu, 7 Oct 2021 06:18:47 +0000 (08:18 +0200)
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.

23 files changed:
.gitignore
Makefile.all.am [changed mode: 0644->0755]
Makefile.am
Makefile.tool.am
NEWS
README
README.freebsd [new file with mode: 0644]
cachegrind/tests/Makefile.am
configure.ac
coregrind/Makefile.am
docs/Makefile.am
drd/tests/Makefile.am
freebsd-drd.supp [new file with mode: 0644]
freebsd-helgrind.supp [new file with mode: 0644]
freebsd.supp [new file with mode: 0644]
gdbserver_tests/Makefile.am
memcheck/tests/Makefile.am
memcheck/tests/amd64-freebsd/filter_stderr [new file with mode: 0755]
memcheck/tests/freebsd/filter_pts [new file with mode: 0755]
memcheck/tests/x86-freebsd/filter_stderr [new file with mode: 0755]
mpi/Makefile.am
none/tests/Makefile.am
none/tests/freebsd/filter_stderr [new file with mode: 0755]

index bb8578d6802de6fb99653c024a173cb3e820bdd0..86962b47809a328bc53d5d050ea21a92e37b30b1 100644 (file)
@@ -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
 /callgrind/callgrind-*-darwin
 /callgrind/callgrind-*-linux
 /callgrind/callgrind-*-solaris
+/callgrind/callgrind-*-freebsd
 /callgrind/callgrind_annotate
 /callgrind/callgrind_control
 /callgrind/Makefile
 /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
 /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
 /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
 /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
 /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
 /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
 /lackey/lackey-*-darwin
 /lackey/lackey-*-linux
 /lackey/lackey-*-solaris
+/lackey/lackey-*-freebsd
 /lackey/Makefile
 /lackey/Makefile.in
 
 /massif/massif-*-darwin
 /massif/massif-*-linux
 /massif/massif-*-solaris
+/massif/massif-*-freebsd
 /massif/ms_print
 
 # /massif/docs/
 /memcheck/memcheck-*-darwin
 /memcheck/memcheck-*-linux
 /memcheck/memcheck-*-solaris
+/memcheck/memcheck-*-freebsd
 
 # /memcheck/docs/
 /memcheck/docs/Makefile.in
 /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
 /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
 /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
 /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
 /none/none-*-darwin
 /none/none-*-linux
 /none/none-*-solaris
+/none/none-*-freebsd
 
 # /none/docs/
 /none/docs/Makefile.in
 /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
old mode 100644 (file)
new mode 100755 (executable)
index 06b23c9..1de1f13
@@ -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@
index f5935eb6924678afe9e7b8d5c019a91dc65a9a49..7749442e9f6aec79d6c5636814098a8c21c50a48 100644 (file)
@@ -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 \
index 2bf90de5da6d9e90cf73cc910552753aff4ccb67..fe5f002cece8a792785adfb095a42b4c4a0f72cf 100644 (file)
@@ -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 e4cec71c5614950b4216a77bb4f84c0236ef0935..68315a77ad31863800a7bc565673aa6ad6c2ab16 100644 (file)
--- 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 b8cc51de831e6b97068693332158fbd31c60594b..ae21cc74d6eced4e632bc630690d907bdadb9aba 100644 (file)
--- 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 (file)
index 0000000..c6e6818
--- /dev/null
@@ -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
+
index 571ae222a8c635c6515d3a7d6418b47fa4f8417e..7eb20e294bf883264eeacfa63a0a116feacecd5b 100644 (file)
@@ -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
index 0398aafa1c82f7b9a9e0a7507921db40c8cca88e..c05994516f6ce1f6610c695ac37b813f0f3c6cb6 100755 (executable)
@@ -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 <sys/cdefs.h>
+#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"])
index 65d2c705adeb77fd9e6f20190eb4d39742938e48..ee70cfde31d52511de2b2db1471ad6c4241c7961 100644 (file)
@@ -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)
index e9d659d2ece5bf192756576b36d70834705398af..5c777a263a342b7551149f6d1b81510954d789f6 100644 (file)
@@ -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
index 3889fb15e3ee6e72edc3159d9e9370b900cde57e..b53eeefebe15836b384cd1c9e7ba502443ea2f24 100644 (file)
@@ -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 (file)
index 0000000..a3414b5
--- /dev/null
@@ -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 (file)
index 0000000..d24ff85
--- /dev/null
@@ -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 (file)
index 0000000..7345d71
--- /dev/null
@@ -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
+}
index 1a5c51356a07c6b83f49f32bf6689c41f37d6d9c..e93ead322fc6e749e82b6eb80f1f4a1b04ed3df6 100644 (file)
@@ -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
index 38a087cdfcde2bd063a4efe66563cb3c2182237b..9fe8082b949e6bfeee484390c12aa4fb101049d4 100644 (file)
@@ -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 (executable)
index 0000000..a778e97
--- /dev/null
@@ -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 (executable)
index 0000000..81dd4f2
--- /dev/null
@@ -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 (executable)
index 0000000..a778e97
--- /dev/null
@@ -0,0 +1,3 @@
+#! /bin/sh
+
+../filter_stderr "$@"
index 471fee02a9e5f3b6d33ae730685983dd63da9083..69b69aa92539c4d141974c004c35e35dc4383e40 100644 (file)
@@ -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)
index e4a12cadc35e42ed33570f4c883d093ff5743e9f..617c92854d9e80afa58a7c524be838e79ef671ce 100644 (file)
@@ -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 (executable)
index 0000000..a778e97
--- /dev/null
@@ -0,0 +1,3 @@
+#! /bin/sh
+
+../filter_stderr "$@"