Dual architecture support - this commit is a major rework of the build
system that allows multiple copies of valgrind to be built so that we
can build both x86 and amd64 versions of the tools on amd64 machines.
The launcher is then modified to look at the program being run and
decide which tool to use to run it.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5027 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/Makefile.am b/coregrind/Makefile.am
index 9e4ae81..b614071 100644
--- a/coregrind/Makefile.am
+++ b/coregrind/Makefile.am
@@ -1,29 +1,40 @@
include $(top_srcdir)/Makefile.all.am
include $(top_srcdir)/Makefile.core.am
+include $(top_srcdir)/Makefile.install.am
-AM_CPPFLAGS += -DVG_LIBDIR="\"$(valdir)"\" \
+AM_CPPFLAGS_X86_LINUX += -DVG_LIBDIR="\"$(valdir)"\" \
+ -DKICKSTART_BASE=@KICKSTART_BASE@
+AM_CPPFLAGS_AMD64_LINUX += -DVG_LIBDIR="\"$(valdir)"\" \
+ -DKICKSTART_BASE=@KICKSTART_BASE@
+AM_CPPFLAGS_PPC32_LINUX += -DVG_LIBDIR="\"$(valdir)"\" \
-DKICKSTART_BASE=@KICKSTART_BASE@
default.supp: $(SUPP_FILES)
-noinst_LIBRARIES = \
- libcoregrind.a \
- libreplacemalloc_toolpreload.a
+noinst_LIBRARIES =
+if VG_X86_LINUX
+noinst_LIBRARIES += libcoregrind_x86_linux.a libreplacemalloc_toolpreload_x86_linux.a
+endif
+if VG_AMD64_LINUX
+noinst_LIBRARIES += libcoregrind_amd64_linux.a libreplacemalloc_toolpreload_amd64_linux.a
+endif
+if VG_PPC32_LINUX
+noinst_LIBRARIES += libcoregrind_ppc32_linux.a libreplacemalloc_toolpreload_ppc32_linux.a
+endif
bin_PROGRAMS = \
valgrind
-val_PROGRAMS = \
- vgpreload_core.so
-
-# Remember to include all the arch-specific files in the distribution.
-EXTRA_DIST = \
- $(addsuffix .c,$(addprefix m_coredump/coredump-,$(VG_PLATFORM_ALL))) \
- $(addsuffix .S,$(addprefix m_dispatch/dispatch-,$(VG_PLATFORM_ALL))) \
- $(addsuffix .c,$(addprefix m_sigframe/sigframe-,$(VG_PLATFORM_ALL))) \
- $(addsuffix .S,$(addprefix m_syswrap/syscall-,$(VG_PLATFORM_ALL))) \
- $(addsuffix .c,$(addprefix m_syswrap/syswrap-,$(VG_OS_ALL))) \
- $(addsuffix .c,$(addprefix m_syswrap/syswrap-,$(VG_PLATFORM_ALL)))
+noinst_PROGRAMS =
+if VG_X86_LINUX
+noinst_PROGRAMS += vgpreload_core-x86-linux.so
+endif
+if VG_AMD64_LINUX
+noinst_PROGRAMS += vgpreload_core-amd64-linux.so
+endif
+if VG_PPC32_LINUX
+noinst_PROGRAMS += vgpreload_core-ppc32-linux.so
+endif
noinst_HEADERS = \
coregrind.h \
@@ -97,7 +108,7 @@
launcher.c \
m_debuglog.c
-libcoregrind_a_SOURCES = \
+COREGRIND_SOURCES_COMMON = \
m_commandline.c \
m_cpuid.S \
m_clientstate.c \
@@ -133,8 +144,6 @@
m_ume.c \
m_aspacemgr/read_procselfmaps.c \
m_aspacemgr/aspacemgr.c \
- m_coredump/coredump-elf.c \
- m_coredump/coredump-@VG_PLATFORM@.c \
m_debuginfo/dwarf.c \
m_debuginfo/stabs.c \
m_debuginfo/symtab.c \
@@ -144,35 +153,92 @@
m_demangle/demangle.c \
m_demangle/dyn-string.c \
m_demangle/safe-ctype.c \
- m_dispatch/dispatch-@VG_PLATFORM@.S \
m_replacemalloc/replacemalloc_core.c \
m_scheduler/scheduler.c \
m_scheduler/sema.c \
- m_sigframe/sigframe-@VG_PLATFORM@.c \
- m_syswrap/syscall-@VG_PLATFORM@.S \
m_syswrap/syswrap-generic.c \
- m_syswrap/syswrap-@VG_OS@.c \
- m_syswrap/syswrap-@VG_OS@-variants.c \
- m_syswrap/syswrap-@VG_PLATFORM@.c \
m_syswrap/syswrap-main.c
-libreplacemalloc_toolpreload_a_SOURCES = m_replacemalloc/vg_replace_malloc.c
-libreplacemalloc_toolpreload_a_CFLAGS = $(PIC_AM_CFLAGS)
+COREGRIND_LINUX_SOURCE = \
+ m_coredump/coredump-elf.c \
+ m_syswrap/syswrap-linux.c \
+ m_syswrap/syswrap-linux-variants.c
-m_dispatch/dispatch-@VG_PLATFORM@.S: libvex_guest_offsets.h
-m_syswrap/syscall-@VG_PLATFORM@.S: libvex_guest_offsets.h
-m_syswrap/syswrap-main.c: libvex_guest_offsets.h
+libcoregrind_x86_linux_a_SOURCES = \
+ $(COREGRIND_SOURCES_COMMON) \
+ $(COREGRIND_LINUX_SOURCE) \
+ m_coredump/coredump-x86-linux.c \
+ m_dispatch/dispatch-x86-linux.S \
+ m_sigframe/sigframe-x86-linux.c \
+ m_syswrap/syscall-x86-linux.S \
+ m_syswrap/syswrap-x86-linux.c
+
+libcoregrind_x86_linux_a_CPPFLAGS = $(AM_CPPFLAGS_X86_LINUX)
+libcoregrind_x86_linux_a_CFLAGS = $(AM_CFLAGS_X86_LINUX)
+libcoregrind_x86_linux_a_CCASFLAGS = $(AM_CCASFLAGS_X86_LINUX)
+
+libcoregrind_amd64_linux_a_SOURCES = \
+ $(COREGRIND_SOURCES_COMMON) \
+ $(COREGRIND_LINUX_SOURCE) \
+ m_coredump/coredump-amd64-linux.c \
+ m_dispatch/dispatch-amd64-linux.S \
+ m_sigframe/sigframe-amd64-linux.c \
+ m_syswrap/syscall-amd64-linux.S \
+ m_syswrap/syswrap-amd64-linux.c
+
+libcoregrind_amd64_linux_a_CPPFLAGS = $(AM_CPPFLAGS_AMD64_LINUX)
+libcoregrind_amd64_linux_a_CFLAGS = $(AM_CFLAGS_AMD64_LINUX)
+libcoregrind_amd64_linux_a_CCASFLAGS = $(AM_CCASFLAGS_AMD64_LINUX)
+
+libcoregrind_ppc32_linux_a_SOURCES = \
+ $(COREGRIND_SOURCES_COMMON) \
+ $(COREGRIND_LINUX_SOURCE) \
+ m_coredump/coredump-ppc32-linux.c \
+ m_dispatch/dispatch-ppc32-linux.S \
+ m_sigframe/sigframe-ppc32-linux.c \
+ m_syswrap/syscall-ppc32-linux.S \
+ m_syswrap/syswrap-ppc32-linux.c
+
+libcoregrind_ppc32_linux_a_CPPFLAGS = $(AM_CPPFLAGS_PPC32_LINUX)
+libcoregrind_ppc32_linux_a_CFLAGS = $(AM_CFLAGS_PPC32_LINUX)
+libcoregrind_ppc32_linux_a_CCASFLAGS = $(AM_CCASFLAGS_PPC32_LINUX)
+
+libreplacemalloc_toolpreload_x86_linux_a_SOURCES = m_replacemalloc/vg_replace_malloc.c
+libreplacemalloc_toolpreload_x86_linux_a_CPPFLAGS = $(AM_CPPFLAGS_X86_LINUX)
+libreplacemalloc_toolpreload_x86_linux_a_CFLAGS = $(AM_CFLAGS_X86_LINUX) -fpic -fno-omit-frame-pointer
+
+libreplacemalloc_toolpreload_amd64_linux_a_SOURCES = m_replacemalloc/vg_replace_malloc.c
+libreplacemalloc_toolpreload_amd64_linux_a_CPPFLAGS = $(AM_CPPFLAGS_AMD64_LINUX)
+libreplacemalloc_toolpreload_amd64_linux_a_CFLAGS = $(AM_CFLAGS_AMD64_LINUX) -fpic -fno-omit-frame-pointer
+
+libreplacemalloc_toolpreload_ppc32_linux_a_SOURCES = m_replacemalloc/vg_replace_malloc.c
+libreplacemalloc_toolpreload_ppc32_linux_a_CPPFLAGS = $(AM_CPPFLAGS_PPC32_LINUX)
+libreplacemalloc_toolpreload_ppc32_linux_a_CFLAGS = $(AM_CFLAGS_PPC32_LINUX) -fpic -fno-omit-frame-pointer
+
+m_dispatch/dispatch-x86-linux.S: libvex_guest_offsets.h
+m_dispatch/dispatch-amd64-linux.S: libvex_guest_offsets.h
+m_dispatch/dispatch-ppc32-linux.S: libvex_guest_offsets.h
+m_syswrap/syscall-x86-linux.S: libvex_guest_offsets.h
+m_syswrap/syscall-amd64-linux.S: libvex_guest_offsets.h
+m_syswrap/syscall-ppc32-linux.S: libvex_guest_offsets.h
+m_syswrap/syswrap-main.c: libvex_guest_offsets.h
libvex_guest_offsets.h:
$(MAKE) -C @VEX_DIR@ pub/libvex_guest_offsets.h
-vgpreload_core_so_SOURCES = vg_preloaded.c
-vgpreload_core_so_CFLAGS = $(AM_CFLAGS) -fpic
-vgpreload_core_so_LDADD = -ldl
-vgpreload_core_so_LDFLAGS = \
- -shared \
- -Wl,--soname,vgpreload_core.so \
- -Wl,-z,initfirst
+VGPRELOAD_CORE_SOURCES_COMMON = vg_preloaded.c
+
+vgpreload_core_x86_linux_so_SOURCES = $(VGPRELOAD_CORE_SOURCES_COMMON)
+vgpreload_core_x86_linux_so_CFLAGS = $(AM_CFLAGS_X86_LINUX) $(AM_CFLAGS_PIC)
+vgpreload_core_x86_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_X86_LINUX)
+
+vgpreload_core_amd64_linux_so_SOURCES = $(VGPRELOAD_CORE_SOURCES_COMMON)
+vgpreload_core_amd64_linux_so_CFLAGS = $(AM_CFLAGS_AMD64_LINUX) $(AM_CFLAGS_PIC)
+vgpreload_core_amd64_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_AMD64_LINUX)
+
+vgpreload_core_ppc32_linux_so_SOURCES = $(VGPRELOAD_CORE_SOURCES_COMMON)
+vgpreload_core_ppc32_linux_so_CFLAGS = $(AM_CFLAGS_PPC32_LINUX) $(AM_CFLAGS_PIC)
+vgpreload_core_ppc32_linux_so_LDFLAGS = $(PRELOAD_LDFLAGS_PPC32_LINUX)
clean-local:
$(MAKE) -C @VEX_DIR@ CC="$(CC)" clean
@@ -180,10 +246,10 @@
MANUAL_DEPS = $(noinst_HEADERS) $(include_HEADERS)
all-local:
- mkdir -p $(inplacedir)
- for i in $(val_PROGRAMS); do \
- to=$(inplacedir)/$$i; \
- rm -f $$$to; \
- ln -sf ../$(subdir)/$$i $$to; \
+ for f in $(noinst_PROGRAMS); do \
+ p=`echo $$f | sed -e 's/^[^-]*-//' -e 's/\..*$$//'`; \
+ n=`echo $$f | sed -e 's/-[^-]\{1,\}-[^-.]\{1,\}//'`; \
+ mkdir -p $(inplacedir)/$$p; \
+ rm -f $(inplacedir)/$$p/$$n; \
+ ln -f -s ../../$(subdir)/$$f $(inplacedir)/$$p/$$n; \
done
-