[gcc r16-6561] [PATCH] ia64: properly include libunwind support during configuration
Jeff Law
law@gcc.gnu.org
Wed Jan 7 15:59:46 GMT 2026
https://gcc.gnu.org/g:bb9cb9c7c0abb3bad257322f55b60293b7fecf27
commit r16-6561-gbb9cb9c7c0abb3bad257322f55b60293b7fecf27
Author: Xinhui Yang <cyan@cyano.uk>
Date: Wed Jan 7 08:59:01 2026 -0700
[PATCH] ia64: properly include libunwind support during configuration
By using the test `with_system_libunwind', libgcc can use either
in-house implementation or reference external libunwind symbols.
However, this breaks the static libgcc.a library, as in t-linux it
references unwind-compat.c, which turns some _Unwind_* symbols into
references of the corresponding symbols in libunwind, but libunwind does
not exist in some conditions (e.g. bootstrapping a toolchain). The
linker complains about `missing version node for symbol', since it can
not find the symbol it is referring to.
The unwind-compat.c module should only exist, if system libunwind is
being used. Also GCC itself should add -lunwind only if this condition
is met, too.
Implementing better control for whether to embed unwind implementation
into libgcc to fix this issue.
gcc/
* config.gcc: limit -lunwind usage by testing if the system
libunwind is being used.
libgcc/
* config.host (ia64): include unwind-compat only if the system
libunwind is being used.
* config/ia64/t-linux-libunwind: include libgcc symver definition
for libgcc symbols, since it bears the same role as t-linux
(except libunwind); Include fde-glibc.c since the unwind
implementation requires _Unwind_FindTableEntry in this file.
* config/ia64/unwind-ia64.c: protect _Unwind_FindTableEntry inside
inihbit_libc ifndefs to allow it to build with newlib or
without proper headers.
Diff:
---
gcc/config.gcc | 5 ++++-
libgcc/config.host | 4 +++-
libgcc/config/ia64/t-linux-libunwind | 4 ++++
libgcc/config/ia64/unwind-ia64.c | 9 ++++++++-
4 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/gcc/config.gcc b/gcc/config.gcc
index b2a48c02d3be..3cce8876dbc5 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -2361,7 +2361,10 @@ ia64*-*-freebsd*)
;;
ia64*-*-linux*)
tm_file="${tm_file} elfos.h gnu-user.h linux.h glibc-stdint.h ia64/sysv4.h ia64/linux.h"
- tmake_file="${tmake_file} ia64/t-ia64 ia64/t-linux t-libunwind"
+ tmake_file="${tmake_file} ia64/t-ia64 ia64/t-linux"
+ if test x$with_system_libunwind = xyes ; then
+ tmake_file="${tmake_file} t-libunwind"
+ fi
target_cpu_default="MASK_GNU_AS|MASK_GNU_LD"
;;
ia64*-*-hpux*)
diff --git a/libgcc/config.host b/libgcc/config.host
index 2434844b8337..443b4567a7c6 100644
--- a/libgcc/config.host
+++ b/libgcc/config.host
@@ -957,9 +957,11 @@ ia64*-*-freebsd*)
ia64*-*-linux*)
# Don't use crtbeginT.o from *-*-linux* default.
extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtfastmath.o"
- tmake_file="$tmake_file ia64/t-ia64 ia64/t-ia64-elf t-crtfm t-softfp-tf ia64/t-softfp t-softfp ia64/t-softfp-compat ia64/t-eh-ia64 t-libunwind ia64/t-linux"
+ tmake_file="${tmake_file} ia64/t-ia64 ia64/t-ia64-elf t-crtfm t-softfp-tf ia64/t-softfp t-softfp ia64/t-softfp-compat ia64/t-eh-ia64"
if test x$with_system_libunwind != xyes ; then
tmake_file="${tmake_file} t-libunwind-elf ia64/t-linux-libunwind"
+ else
+ tmake_file="${tmake_file} ia64/t-linux t-libunwind"
fi
md_unwind_header=ia64/linux-unwind.h
;;
diff --git a/libgcc/config/ia64/t-linux-libunwind b/libgcc/config/ia64/t-linux-libunwind
index 8b1736a2d678..daef9e97bdb9 100644
--- a/libgcc/config/ia64/t-linux-libunwind
+++ b/libgcc/config/ia64/t-linux-libunwind
@@ -1,3 +1,7 @@
# Build libunwind for IA-64 GLIBC based system.
LIBUNWIND = $(srcdir)/config/ia64/fde-glibc.c \
$(srcdir)/config/ia64/unwind-ia64.c
+
+LIB2ADDEH += $(srcdir)/config/ia64/fde-glibc.c
+
+SHLIB_MAPFILES += $(srcdir)/config/ia64/libgcc-glibc.ver
diff --git a/libgcc/config/ia64/unwind-ia64.c b/libgcc/config/ia64/unwind-ia64.c
index d46cf99473c1..a45ea8549554 100644
--- a/libgcc/config/ia64/unwind-ia64.c
+++ b/libgcc/config/ia64/unwind-ia64.c
@@ -1730,6 +1730,7 @@ _Unwind_GetRegionStart (struct _Unwind_Context *context)
void *
_Unwind_FindEnclosingFunction (void *pc)
{
+#ifndef inhibit_libc
struct unw_table_entry *entp, ent;
unw_word segment_base, gp;
@@ -1738,6 +1739,9 @@ _Unwind_FindEnclosingFunction (void *pc)
return NULL;
else
return (void *)(segment_base + entp->start_offset);
+#else
+ return NULL;
+#endif
}
/* Get the value of the CFA as saved in CONTEXT. In GCC/Dwarf2 parlance,
@@ -1780,9 +1784,12 @@ uw_frame_state_for (struct _Unwind_Context *context, _Unwind_FrameState *fs)
for (r = fs->curr.reg; r < fs->curr.reg + UNW_NUM_REGS; ++r)
r->when = UNW_WHEN_NEVER;
context->lsda = 0;
-
+#ifndef inhibit_libc
entp = _Unwind_FindTableEntry ((void *) context->rp,
&segment_base, &context->gp, &ent);
+#else
+ entp = NULL;
+#endif
if (entp == NULL)
{
/* Couldn't find unwind info for this function. Try an
More information about the Gcc-cvs
mailing list