Skip to content

Commit

Permalink
gperftools: musl fixes, ppc fixes
Browse files Browse the repository at this point in the history
This allows some parts of the code that previously didn't build
on musl to build. Additionally, it fixes build on musl ppc setups.
  • Loading branch information
q66 authored and Hoshpak committed Oct 8, 2019
1 parent 701441c commit 4ff40bb
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 3 deletions.
13 changes: 13 additions & 0 deletions srcpkgs/gperftools/patches/elf-mem-image-musl.patch
Original file line number Diff line number Diff line change
@@ -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

76 changes: 76 additions & 0 deletions srcpkgs/gperftools/patches/ppc-musl.patch
Original file line number Diff line number Diff line change
@@ -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

22 changes: 19 additions & 3 deletions srcpkgs/gperftools/template
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -12,18 +13,33 @@ 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() {
sed -i -e 's/__off64_t/off64_t/' \
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
Expand Down

0 comments on commit 4ff40bb

Please sign in to comment.