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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186045 138bc75d-0d04-0410-961f-82ee72b054a4

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

index f44f52e..0adcc5a 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-29  H.J. Lu  <hongjiu.lu@intel.com>
 
        * config/i386/linux-unwind.h (x86_64_fallback_frame_state): Define
index 10cf136..2bb9100 100644 (file)
@@ -2169,8 +2169,20 @@ uw_install_context (struct _Unwind_Context *current __attribute__((unused)),
                    struct _Unwind_Context *target)
 {
   unw_word ireg_buf[4], ireg_nat = 0, ireg_pr = 0;
+  unw_word saved_lc;
   int 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 unw_word 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.  */