From 83893355b0ee67de7012e3b27eb51cb6a90d7029 Mon Sep 17 00:00:00 2001
From: "mostang.com!davidm" <mostang.com!davidm>
Date: Thu, 23 Jan 2003 18:47:51 +0000
Subject: [PATCH] (update_frame_state): Handle "cfm" cache.

(Logical change 1.42)
---
 src/ia64/Gstep-ia64.c | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/src/ia64/Gstep-ia64.c b/src/ia64/Gstep-ia64.c
index 53a829d8..a7ff7108 100644
--- a/src/ia64/Gstep-ia64.c
+++ b/src/ia64/Gstep-ia64.c
@@ -76,7 +76,7 @@ check_rbs_switch (struct cursor *c)
 static inline int
 update_frame_state (struct cursor *c)
 {
-  unw_word_t prev_ip, prev_sp, prev_bsp, ip, pr, num_regs, cfm;
+  unw_word_t prev_ip, prev_sp, prev_bsp, ip, pr, num_regs;
   int ret;
 
   prev_ip = c->ip;
@@ -84,6 +84,10 @@ update_frame_state (struct cursor *c)
   prev_bsp = c->bsp;
 
   c->cfm_loc = c->pfs_loc;
+  /* update the CFM cache: */
+  ret = ia64_get (c, c->cfm_loc, &c->cfm);
+  if (ret < 0)
+    return ret;
 
   num_regs = 0;
   if (c->is_signal_frame)
@@ -102,24 +106,19 @@ update_frame_state (struct cursor *c)
 	     unwind info for sigtramp.  Fix it up here.  */
 	  c->ip_loc  = (c->sigcontext_loc + SIGCONTEXT_IP_OFF);
 	  c->cfm_loc = (c->sigcontext_loc + SIGCONTEXT_CFM_OFF);
+	  /* update the CFM cache: */
+	  ret = ia64_get (c, c->cfm_loc, &c->cfm);
+	  if (ret < 0)
+	    return ret;
 	}
 
       /* do what can't be described by unwind directives: */
       c->pfs_loc = (c->sigcontext_loc + SIGCONTEXT_AR_PFS_OFF);
 
-      ret = ia64_get (c, c->cfm_loc, &cfm);
-      if (ret < 0)
-	return ret;
-
-      num_regs = cfm & 0x7f;		/* size of frame */
+      num_regs = c->cfm & 0x7f;		/* size of frame */
     }
   else
-    {
-      ret = ia64_get (c, c->cfm_loc, &cfm);
-      if (ret < 0)
-	return ret;
-      num_regs = (cfm >> 7) & 0x7f;	/* size of locals */
-    }
+    num_regs = (c->cfm >> 7) & 0x7f;	/* size of locals */
 
   if (c->bsp_loc)
     {