gperftools: musl fixes, ppc fixes

This allows some parts of the code that previously didn't build
on musl to build. Additionally, it fixes build on musl ppc setups.
This commit is contained in:
q66 2019-10-08 01:58:36 +02:00 committed by Helmut Pozimski
parent 701441c61f
commit 4ff40bb829
3 changed files with 108 additions and 3 deletions

View file

@ -0,0 +1,13 @@
This relies on link.h, which is present in musl as well as glibc.
--- src/base/elf_mem_image.h
+++ src/base/elf_mem_image.h
@@ -43,7 +43,7 @@
// Maybe one day we can rewrite this file not to require the elf
// symbol extensions in glibc, but for right now we need them.
-#if defined(__ELF__) && defined(__GLIBC__) && !defined(__native_client__)
+#if defined(__ELF__) && !defined(__native_client__)
#define HAVE_ELF_MEM_IMAGE 1

View file

@ -0,0 +1,76 @@
Compatibility fixes for musl.
--- m4/pc_from_ucontext.m4
+++ m4/pc_from_ucontext.m4
@@ -31,6 +31,7 @@ AC_DEFUN([AC_PC_FROM_UCONTEXT],
pc_fields="$pc_fields uc_mcontext.gregs[[R15]]" # Linux (arm old [untested])
pc_fields="$pc_fields uc_mcontext.arm_pc" # Linux (arm arch 5)
pc_fields="$pc_fields uc_mcontext.gp_regs[[PT_NIP]]" # Suse SLES 11 (ppc64)
+ pc_fields="$pc_fields uc_mcontext.gregs[[PT_NIP]]"
pc_fields="$pc_fields uc_mcontext.mc_eip" # FreeBSD (i386)
pc_fields="$pc_fields uc_mcontext.mc_rip" # FreeBSD (x86_64 [untested])
pc_fields="$pc_fields uc_mcontext.__gregs[[_REG_EIP]]" # NetBSD (i386)
@@ -55,7 +56,8 @@ AC_DEFUN([AC_PC_FROM_UCONTEXT],
pc_field_found=true)
elif test "x$ac_cv_header_sys_ucontext_h" = xyes; then
AC_TRY_COMPILE([#define _GNU_SOURCE 1
- #include <sys/ucontext.h>],
+ #include <sys/ucontext.h>
+ #include <asm/ptrace.h>],
[ucontext_t u; return u.$pc_field == 0;],
AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field,
How to access the PC from a struct ucontext)
@@ -63,7 +65,8 @@ AC_DEFUN([AC_PC_FROM_UCONTEXT],
pc_field_found=true)
elif test "x$ac_cv_header_ucontext_h" = xyes; then
AC_TRY_COMPILE([#define _GNU_SOURCE 1
- #include <ucontext.h>],
+ #include <ucontext.h>
+ #include <asm/ptrace.h>],
[ucontext_t u; return u.$pc_field == 0;],
AC_DEFINE_UNQUOTED(PC_FROM_UCONTEXT, $pc_field,
How to access the PC from a struct ucontext)
--- src/getpc.h
+++ src/getpc.h
@@ -65,6 +65,9 @@
typedef ucontext ucontext_t;
#endif
+#if defined(__powerpc__) && !defined(PT_NIP)
+#define PT_NIP 32
+#endif
// Take the example where function Foo() calls function Bar(). For
// many architectures, Bar() is responsible for setting up and tearing
--- src/stacktrace_powerpc-linux-inl.h
+++ src/stacktrace_powerpc-linux-inl.h
@@ -186,7 +186,7 @@ static int GET_STACK_TRACE_OR_FRAMES {
ucontext_t uc;
// We don't care about the rest, since the IP value is at 'uc' field.
} *sigframe = reinterpret_cast<signal_frame_64*>(current);
- result[n] = (void*) sigframe->uc.uc_mcontext.gp_regs[PT_NIP];
+ result[n] = (void*) sigframe->uc.uc_mcontext.gp_regs[32];
}
#else
if (sigtramp32_vdso && (sigtramp32_vdso == current->return_addr)) {
@@ -196,7 +196,7 @@ static int GET_STACK_TRACE_OR_FRAMES {
mcontext_t mctx;
// We don't care about the rest, since IP value is at 'mctx' field.
} *sigframe = reinterpret_cast<signal_frame_32*>(current);
- result[n] = (void*) sigframe->mctx.gregs[PT_NIP];
+ result[n] = (void*) sigframe->mctx.gregs[32];
} else if (sigtramp32_rt_vdso && (sigtramp32_rt_vdso == current->return_addr)) {
struct rt_signal_frame_32 {
char dummy[64 + 16];
@@ -204,7 +204,11 @@ static int GET_STACK_TRACE_OR_FRAMES {
ucontext_t uc;
// We don't care about the rest, since IP value is at 'uc' field.A
} *sigframe = reinterpret_cast<rt_signal_frame_32*>(current);
+#if defined(__GLIBC__)
result[n] = (void*) sigframe->uc.uc_mcontext.uc_regs->gregs[PT_NIP];
+#else
+ result[n] = (void*) sigframe->uc.uc_mcontext.gregs[32];
+#endif
}
#endif

View file

@ -1,8 +1,9 @@
# Template file for 'gperftools'
pkgname=gperftools
version=2.7
revision=2
revision=3
build_style=gnu-configure
hostmakedepends="automake libtool"
makedepends="libunwind-devel"
checkdepends="perl"
short_desc="Multi-threaded malloc() and performance analysis tools"
@ -12,11 +13,22 @@ homepage="https://github.com/gperftools/gperftools"
distfiles="https://github.com/${pkgname}/${pkgname}/releases/download/${pkgname}-${version}/${pkgname}-${version}.tar.gz"
checksum=1ee8c8699a0eff6b6a203e59b43330536b22bbcbe6448f54c7091e5efb0763c9
if [ "$XBPS_TARGET_LIBC" = "musl" ]; then
# needed by some newly enabled code
CXXFLAGS+=" -D__WORDSIZE=$XBPS_TARGET_WORDSIZE"
# needed on musl other than x86_64
if [ "$XBPS_TARGET_MACHINE" != "x86_64-musl" ]; then
makedepends+=" libucontext-devel"
LDFLAGS+=" -lucontext"
fi
fi
case "$XBPS_TARGET_MACHINE" in
arm*-musl|aarch64-musl)
# having libunwind in makedepends still causes failures...
makedepends="libucontext-devel"
LDFLAGS=" -lucontext"
configure_args="--disable-libunwind"
configure_args+=" --disable-libunwind"
;;
esac
post_extract() {
@ -24,6 +36,10 @@ post_extract() {
src/base/linux_syscall_support.h src/malloc_hook_mmap_linux.h
}
pre_configure() {
autoreconf -fi
}
post_install() {
vlicense COPYING
rm -rf ${DESTDIR}/usr/share/doc