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;

Reply via email to