Could the attached patch please be considered for inclusion in the
Debian GCC v3.3 package?  As you can see from the attached message, I
also submitted the patch for inclusion in GCC v3.3.3 and the
equivalent fixes are already in pre-v3.4.  The bug-fixes are important
because NPTL-enabled glibc won't work properly on ia64 unless GCC is
built with libunwind-support enabled (libunwind support is automatically
enabled if libunwind v0.95 is installed on the build-machine; I'm working
with Al Stone to get the Debian package for libunwind v0.95 be available
by default on ia64 for Debian/unstable).

Thanks,

        --david

--------------------------------------------------------
From: David Mosberger <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
cc: [EMAIL PROTECTED]
Subject: patch for GCC v3.3.3
Date: Tue, 2 Dec 2003 10:45:26 -0800
Reply-To: [EMAIL PROTECTED]
X-URL: http://www.hpl.hp.com/personal/David_Mosberger/

Hi Gabriel,

Jim Wilson told me that you're the release manager for GCC v3.3.3.  I
have a small patch consisting of fixes backported from pre-v3.4 which
are needed on IA-64 to get the libunwind support working.  Working
libunwind support is getting more important on IA-64 now because the
latest versions of glibc stress the unwinder much more and the
built-in unwinder for IA-64 (config/ia64/unwind-ia64.c) is hopelessly
broken (I looked into fixing the built-in unwinder, but the scope of
the fixes would be large and would have a real potential of
introducing a new set of bugs so I concluded it's better to leave the
built-in unwinder as is and switch to libunwind instead).  The patch
should be completely safe because it won't affect the building of GCC
in any fashion unless libunwind is installed.  And even then libunwind
support could easily be turned off with
--disable-libunwind-exceptions, should there be some unexpected
problems.  Also, I have tested this patch with an NPTL-enabled glibc
and "make check" passes all tests with this patch applied.

One caveat: the patch below is relative to the GCC as distributed by
Debian package gcc-3.3-3.3.2ds5.  I believe this is very close to the
official GCC v3.3.2, but if there are any unexpected problems, please
let me know.

Thanks,

        --david

gcc/ChangeLog

2003-11-29  James E Wilson  <[EMAIL PROTECTED]>

        * gcc.c (init_spec): Pass -lunwind to init_gcc_specs in eh_name
        instead of in shared_name.

2003-11-20 David Mosberger  <[EMAIL PROTECTED]>

        * config/t-libunwind (LIB2ADDEH): Add unwind-c.c.
        (SHLIB_LC): Define.
        * unwind-libunwind.c (_Unwind_GetCFA): Implement.
        (_Unwind_GetBSP) [UNW_TARGET_IA64]: New function.

diff -urN gcc-3.3-3.3.2ds5/src/gcc/config/t-libunwind 
gcc-3.3-3.3.2ds5-davidm/src/gcc/config/t-libunwind
--- gcc-3.3-3.3.2ds5/src/gcc/config/t-libunwind 2003-08-10 16:11:27.000000000 
-0700
+++ gcc-3.3-3.3.2ds5-davidm/src/gcc/config/t-libunwind  2003-12-02 
10:09:16.000000000 -0800
@@ -1 +1,6 @@
-LIB2ADDEH = $(srcdir)/unwind-libunwind.c $(srcdir)/unwind-sjlj.c
+# Override the default value from t-slibgcc-elf-ver and mention -lunwind
+# so that the resulting libgcc_s.so has the necessary DT_NEEDED entry for
+# libunwind.
+SHLIB_LC = -lunwind -lc
+LIB2ADDEH = $(srcdir)/unwind-libunwind.c $(srcdir)/unwind-sjlj.c \
+           $(srcdir)/unwind-c.c
diff -urN gcc-3.3-3.3.2ds5/src/gcc/gcc.c gcc-3.3-3.3.2ds5-davidm/src/gcc/gcc.c
--- gcc-3.3-3.3.2ds5/src/gcc/gcc.c      2003-12-02 10:05:06.000000000 -0800
+++ gcc-3.3-3.3.2ds5-davidm/src/gcc/gcc.c       2003-12-02 10:12:36.000000000 
-0800
@@ -1556,12 +1556,14 @@
 #else
                            "-lgcc_s%M"
 #endif
+                           ,
+                           "-lgcc",
+                           "-lgcc_eh"
 #ifdef USE_LIBUNWIND_EXCEPTIONS
                            " -lunwind"
 #endif
-                           ,
-                           "-lgcc",
-                           "-lgcc_eh");
+                           );
+
            p += 5;
            in_sep = 0;
          }
@@ -1577,7 +1579,11 @@
 #endif
                            ,
                            "libgcc.a%s",
-                           "libgcc_eh.a%s");
+                           "libgcc_eh.a%s"
+#ifdef USE_LIBUNWIND_EXCEPTIONS
+                           "libunwind.a%s"
+#endif
+                           );
            p += 10;
            in_sep = 0;
          }
diff -urN gcc-3.3-3.3.2ds5/src/gcc/unwind-libunwind.c 
gcc-3.3-3.3.2ds5-davidm/src/gcc/unwind-libunwind.c
--- gcc-3.3-3.3.2ds5/src/gcc/unwind-libunwind.c 2003-08-10 16:11:26.000000000 
-0700
+++ gcc-3.3-3.3.2ds5-davidm/src/gcc/unwind-libunwind.c  2003-12-01 
22:58:56.000000000 -0800
@@ -110,9 +110,11 @@
 _Unwind_Word
 _Unwind_GetCFA (struct _Unwind_Context *context)
 {
-  /* ??? Is there any way to get this information?  */
-  return NULL;
-} 
+  unw_word_t ret;
+
+  unw_get_reg (&context->cursor, UNW_IA64_SP, &ret);
+  return ret;
+}
 
 /* Overwrite the saved value for register REG in CONTEXT with VAL.  */
 
@@ -167,6 +169,19 @@
   return NULL;
 }
 
+#ifdef UNW_TARGET_IA64
+
+_Unwind_Word
+_Unwind_GetBSP (struct _Unwind_Context *context)
+{
+  unw_word_t ret;
+
+  unw_get_reg (&context->cursor, UNW_IA64_BSP, &ret);
+  return ret;
+}
+
+#endif
+
 #include "unwind.inc"
 
 #endif /* !__USING_SJLJ_EXCEPTIONS__ */


Reply via email to