Source: libunwind Followup-For: Bug #883858 Dear Maintainer,
The Gentoo guys seem to have beaten me to the punch. Their patches are available here: https://gitweb.gentoo.org/repo/gentoo.git/tree/sys-libs/libunwind/files I have included them along with this report for your convenience. -- System Information: Debian Release: buster/sid APT prefers unstable APT policy: (500, 'unstable') Architecture: ia64 Kernel: Linux 3.14-0.bpo.2-mckinley (SMP w/2 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: sysvinit (via /sbin/init)
https://bugs.gentoo.org/586092 this might not be correct, but at least it builds, and doesn't crash --- a/src/coredump/_UCD_access_reg_linux.c +++ b/src/coredump/_UCD_access_reg_linux.c @@ -51,6 +51,9 @@ _UCD_access_reg (unw_addr_space_t as, #elif defined(UNW_TARGET_TILEGX) if (regnum < 0 || regnum > UNW_TILEGX_CFA) goto badreg; +#elif defined(UNW_TARGET_IA64) || defined(UNW_TARGET_HPPA) || defined(UNW_TARGET_PPC32) || defined(UNW_TARGET_PPC64) + if (regnum < 0 || regnum >= ARRAY_SIZE(ui->prstatus->pr_reg)) + goto badreg; #else #if defined(UNW_TARGET_MIPS) static const uint8_t remap_regs[] =
Original libunwind release is missing a few ia64-specific files in tarball. diff --git a/src/ia64/mk_Gcursor_i.c b/src/ia64/mk_Gcursor_i.c new file mode 100644 index 0000000..67b14d5 --- /dev/null +++ b/src/ia64/mk_Gcursor_i.c @@ -0,0 +1,65 @@ +/* libunwind - a platform-independent unwind library + Copyright (C) 2003 Hewlett-Packard Co + Contributed by David Mosberger-Tang <dav...@hpl.hp.com> + +This file is part of libunwind. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +/* Utility to generate cursor_i.h. */ + +#include "libunwind_i.h" + +#ifdef offsetof +# undef offsetof +#endif + +#define offsetof(type,field) ((char *) &((type *) 0)->field - (char *) 0) + +#define OFFSET(sym, offset) \ + asm volatile("\n->" #sym " %0" : : "i" (offset)) + +int +main (void) +{ + OFFSET("IP_OFF", offsetof (struct cursor, ip)); + OFFSET("PR_OFF", offsetof (struct cursor, pr)); + OFFSET("BSP_OFF", offsetof (struct cursor, bsp)); + OFFSET("PSP_OFF", offsetof (struct cursor, psp)); + OFFSET("PFS_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_PFS])); + OFFSET("RNAT_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_RNAT])); + OFFSET("UNAT_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_UNAT])); + OFFSET("LC_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_LC])); + OFFSET("FPSR_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_FPSR])); + OFFSET("B1_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_B1])); + OFFSET("B2_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_B2])); + OFFSET("B3_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_B3])); + OFFSET("B4_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_B4])); + OFFSET("B5_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_B5])); + OFFSET("F2_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_F2])); + OFFSET("F3_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_F3])); + OFFSET("F4_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_F4])); + OFFSET("F5_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_F5])); + OFFSET("FR_LOC_OFF", offsetof (struct cursor, loc[IA64_REG_F16])); + OFFSET("LOC_SIZE", + (offsetof (struct cursor, loc[1]) - offsetof (struct cursor, loc[0]))); + OFFSET("SIGCONTEXT_ADDR_OFF", offsetof (struct cursor, sigcontext_addr)); + return 0; +} diff --git a/src/ia64/mk_Lcursor_i.c b/src/ia64/mk_Lcursor_i.c new file mode 100644 index 0000000..aee2e7e --- /dev/null +++ b/src/ia64/mk_Lcursor_i.c @@ -0,0 +1,2 @@ +#define UNW_LOCAL_ONLY +#include "mk_Gcursor_i.c" diff --git a/src/ia64/mk_cursor_i b/src/ia64/mk_cursor_i new file mode 100755 index 0000000..9211f91 --- /dev/null +++ b/src/ia64/mk_cursor_i @@ -0,0 +1,7 @@ +#!/bin/sh +test -z "$1" && exit 1 +echo "/* GENERATED */" +echo "#ifndef cursor_i_h" +echo "#define cursor_i_h" +sed -ne 's/^->"\(\S*\)" \(\d*\)/#define \1 \2/p' < $1 || exit $? +echo "#endif"
Fix build failure on ia64. coredump/_UPT_get_dyn_info_list_addr.c is almost identical to ptrace/_UPT_get_dyn_info_list_addr.c It's clearly an __ia64 implementation copy. diff --git a/src/coredump/_UPT_get_dyn_info_list_addr.c b/src/coredump/_UPT_get_dyn_info_list_addr.c index 0d11905..176b146 100644 --- a/src/coredump/_UPT_get_dyn_info_list_addr.c +++ b/src/coredump/_UPT_get_dyn_info_list_addr.c @@ -31,2 +31,3 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ # include "os-linux.h" +# include "../ptrace/_UPT_internal.h" @@ -40,3 +41,2 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg, char path[PATH_MAX]; - unw_dyn_info_t *di; unw_word_t res; @@ -50,5 +50,5 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg, - invalidate_edi (&ui->edi); + invalidate_edi(&ui->edi); - if (elf_map_image (&ui->ei, path) < 0) + if (elf_map_image (&ui->edi.ei, path) < 0) /* ignore unmappable stuff like "/SYSV00001b58 (deleted)" */ @@ -58,6 +58,5 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg, - di = tdep_find_unwind_table (&ui->edi, as, path, lo, off); - if (di) + if (tdep_find_unwind_table (&ui->edi, as, path, lo, off, 0) > 0) { - res = _Uia64_find_dyn_list (as, di, arg); + res = _Uia64_find_dyn_list (as, &ui->edi.di_cache, arg); if (res && count++ == 0)
diff --git a/src/mi/Gget_proc_name.c b/src/mi/Gget_proc_name.c index 5376f82..64d2503 100644 --- a/src/mi/Gget_proc_name.c +++ b/src/mi/Gget_proc_name.c @@ -106,8 +106,12 @@ unw_get_proc_name (unw_cursor_t *cursor, char *buf, size_t buf_len, ip = tdep_get_ip (c); +#if !defined(__ia64) if (c->dwarf.use_prev_instr) --ip; +#endif error = get_proc_name (tdep_get_as (c), ip, buf, buf_len, offp, tdep_get_as_arg (c)); +#if !defined(__ia64) if (c->dwarf.use_prev_instr && offp != NULL && error == 0) *offp += 1; +#endif return error;