OSDN Git Service

* config/ia64/unwind-ia64.c (uw_install_context): Manually save LC
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 31 Mar 2012 16:24:24 +0000 (16:24 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 31 Mar 2012 16:24:24 +0000 (16:24 +0000)
if it hasn't been previously saved.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@186046 138bc75d-0d04-0410-961f-82ee72b054a4

libgcc/ChangeLog
libgcc/config/ia64/unwind-ia64.c

index 2955125..555672a 100644 (file)
@@ -1,3 +1,8 @@
+2012-03-31  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * config/ia64/unwind-ia64.c (uw_install_context): Manually save LC
+       if it hasn't been previously saved.
+
 2012-03-28  Georg-Johann Lay  <avr@gjlay.de>
 
        Backport from 2012-03-28 mainline r185907.
index ca5c267..0e40774 100644 (file)
@@ -2171,8 +2171,20 @@ uw_install_context (struct _Unwind_Context *current __attribute__((unused)),
                    struct _Unwind_Context *target)
 {
   unsigned long ireg_buf[4], ireg_nat = 0, ireg_pr = 0;
+  unsigned long saved_lc;
   long i;
 
+  /* ??? LC is a fixed register so the call to __builtin_unwind_init in
+     uw_init_context doesn't cause it to be saved.  In case it isn't in
+     the user frames either, we need to manually do so here, lest it be
+     clobbered by the loop just below.  */
+  if (target->lc_loc == NULL)
+    {
+      register unsigned long lc asm ("ar.lc");
+      saved_lc = lc;
+      target->lc_loc = &saved_lc;
+    }
+
   /* Copy integer register data from the target context to a
      temporary buffer.  Do this so that we can frob AR.UNAT
      to get the NaT bits for these registers set properly.  */