This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 8/9] Throw exception in i386 unwinders


This patch changes i386 unwinders not to throw exceptions.

gdb:

2017-07-31  Yao Qi  <yao.qi@linaro.org>

	* i386-tdep.c (i386_frame_cache) <base_p>: Remove.
	(i386_alloc_frame_cache): Update.
	(i386_frame_cache_1): Likewise.
	(i386_frame_cache): Don't catch exceptions.
	(i386_frame_this_id): Don't check cache->base_p.
	(i386_frame_unwind_stop_reason): Likewise.
	(i386_epilogue_frame_cache): Don't catch exceptions.
	(i386_epilogue_frame_unwind_stop_reason): Don't check
	cache->base_p.
	(i386_epilogue_frame_this_id): Likewise.
	(i386_sigtramp_frame_cache): Don't catch exceptions.
	(i386_sigtramp_frame_unwind_stop_reason): Don't check
	cache->base_p.
	(i386_sigtramp_frame_this_id): Likewise.
---
 gdb/i386-tdep.c | 111 ++++++++++++++------------------------------------------
 1 file changed, 27 insertions(+), 84 deletions(-)

diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c
index bd728f0..c09130e 100644
--- a/gdb/i386-tdep.c
+++ b/gdb/i386-tdep.c
@@ -1074,7 +1074,6 @@ struct i386_frame_cache
 {
   /* Base address.  */
   CORE_ADDR base;
-  int base_p;
   LONGEST sp_offset;
   CORE_ADDR pc;
 
@@ -1099,7 +1098,6 @@ i386_alloc_frame_cache (void)
   cache = FRAME_OBSTACK_ZALLOC (struct i386_frame_cache);
 
   /* Base address.  */
-  cache->base_p = 0;
   cache->base = 0;
   cache->sp_offset = -4;
   cache->pc = 0;
@@ -1997,10 +1995,7 @@ i386_frame_cache_1 (struct frame_info *this_frame,
   get_frame_register (this_frame, I386_EBP_REGNUM, buf);
   cache->base = extract_unsigned_integer (buf, 4, byte_order);
   if (cache->base == 0)
-    {
-      cache->base_p = 1;
-      return;
-    }
+    return;
 
   /* For normal frames, %eip is stored at 4(%ebp).  */
   cache->saved_regs[I386_EIP_REGNUM] = 4;
@@ -2071,8 +2066,6 @@ i386_frame_cache_1 (struct frame_info *this_frame,
   for (i = 0; i < I386_NUM_SAVED_REGS; i++)
     if (cache->saved_regs[i] != -1)
       cache->saved_regs[i] += cache->base;
-
-  cache->base_p = 1;
 }
 
 static struct i386_frame_cache *
@@ -2086,16 +2079,7 @@ i386_frame_cache (struct frame_info *this_frame, void **this_cache)
   cache = i386_alloc_frame_cache ();
   *this_cache = cache;
 
-  TRY
-    {
-      i386_frame_cache_1 (this_frame, cache);
-    }
-  CATCH (ex, RETURN_MASK_ERROR)
-    {
-      if (ex.error != NOT_AVAILABLE_ERROR)
-	throw_exception (ex);
-    }
-  END_CATCH
+  i386_frame_cache_1 (this_frame, cache);
 
   return cache;
 }
@@ -2106,9 +2090,7 @@ i386_frame_this_id (struct frame_info *this_frame, void **this_cache,
 {
   struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
 
-  if (!cache->base_p)
-    (*this_id) = frame_id_build_unavailable_stack (cache->pc);
-  else if (cache->base == 0)
+  if (cache->base == 0)
     {
       /* This marks the outermost frame.  */
     }
@@ -2125,9 +2107,6 @@ i386_frame_unwind_stop_reason (struct frame_info *this_frame,
 {
   struct i386_frame_cache *cache = i386_frame_cache (this_frame, this_cache);
 
-  if (!cache->base_p)
-    return UNWIND_UNAVAILABLE;
-
   /* This marks the outermost frame.  */
   if (cache->base == 0)
     return UNWIND_OUTERMOST;
@@ -2256,26 +2235,15 @@ i386_epilogue_frame_cache (struct frame_info *this_frame, void **this_cache)
   cache = i386_alloc_frame_cache ();
   *this_cache = cache;
 
-  TRY
-    {
-      cache->pc = get_frame_func (this_frame);
+  cache->pc = get_frame_func (this_frame);
 
-      /* At this point the stack looks as if we just entered the
-	 function, with the return address at the top of the
-	 stack.  */
-      sp = get_frame_register_unsigned (this_frame, I386_ESP_REGNUM);
-      cache->base = sp + cache->sp_offset;
-      cache->saved_sp = cache->base + 8;
-      cache->saved_regs[I386_EIP_REGNUM] = cache->base + 4;
-
-      cache->base_p = 1;
-    }
-  CATCH (ex, RETURN_MASK_ERROR)
-    {
-      if (ex.error != NOT_AVAILABLE_ERROR)
-	throw_exception (ex);
-    }
-  END_CATCH
+  /* At this point the stack looks as if we just entered the
+     function, with the return address at the top of the
+     stack.  */
+  sp = get_frame_register_unsigned (this_frame, I386_ESP_REGNUM);
+  cache->base = sp + cache->sp_offset;
+  cache->saved_sp = cache->base + 8;
+  cache->saved_regs[I386_EIP_REGNUM] = cache->base + 4;
 
   return cache;
 }
@@ -2287,9 +2255,6 @@ i386_epilogue_frame_unwind_stop_reason (struct frame_info *this_frame,
   struct i386_frame_cache *cache =
     i386_epilogue_frame_cache (this_frame, this_cache);
 
-  if (!cache->base_p)
-    return UNWIND_UNAVAILABLE;
-
   return UNWIND_NO_REASON;
 }
 
@@ -2301,10 +2266,7 @@ i386_epilogue_frame_this_id (struct frame_info *this_frame,
   struct i386_frame_cache *cache =
     i386_epilogue_frame_cache (this_frame, this_cache);
 
-  if (!cache->base_p)
-    (*this_id) = frame_id_build_unavailable_stack (cache->pc);
-  else
-    (*this_id) = frame_id_build (cache->base + 8, cache->pc);
+  (*this_id) = frame_id_build (cache->base + 8, cache->pc);
 }
 
 static struct value *
@@ -2442,36 +2404,25 @@ i386_sigtramp_frame_cache (struct frame_info *this_frame, void **this_cache)
 
   cache = i386_alloc_frame_cache ();
 
-  TRY
-    {
-      get_frame_register (this_frame, I386_ESP_REGNUM, buf);
-      cache->base = extract_unsigned_integer (buf, 4, byte_order) - 4;
+  get_frame_register (this_frame, I386_ESP_REGNUM, buf);
+  cache->base = extract_unsigned_integer (buf, 4, byte_order) - 4;
 
-      addr = tdep->sigcontext_addr (this_frame);
-      if (tdep->sc_reg_offset)
-	{
-	  int i;
+  addr = tdep->sigcontext_addr (this_frame);
+  if (tdep->sc_reg_offset)
+    {
+      int i;
 
-	  gdb_assert (tdep->sc_num_regs <= I386_NUM_SAVED_REGS);
+      gdb_assert (tdep->sc_num_regs <= I386_NUM_SAVED_REGS);
 
-	  for (i = 0; i < tdep->sc_num_regs; i++)
-	    if (tdep->sc_reg_offset[i] != -1)
-	      cache->saved_regs[i] = addr + tdep->sc_reg_offset[i];
-	}
-      else
-	{
-	  cache->saved_regs[I386_EIP_REGNUM] = addr + tdep->sc_pc_offset;
-	  cache->saved_regs[I386_ESP_REGNUM] = addr + tdep->sc_sp_offset;
-	}
-
-      cache->base_p = 1;
+      for (i = 0; i < tdep->sc_num_regs; i++)
+	if (tdep->sc_reg_offset[i] != -1)
+	  cache->saved_regs[i] = addr + tdep->sc_reg_offset[i];
     }
-  CATCH (ex, RETURN_MASK_ERROR)
+  else
     {
-      if (ex.error != NOT_AVAILABLE_ERROR)
-	throw_exception (ex);
+      cache->saved_regs[I386_EIP_REGNUM] = addr + tdep->sc_pc_offset;
+      cache->saved_regs[I386_ESP_REGNUM] = addr + tdep->sc_sp_offset;
     }
-  END_CATCH
 
   *this_cache = cache;
   return cache;
@@ -2484,9 +2435,6 @@ i386_sigtramp_frame_unwind_stop_reason (struct frame_info *this_frame,
   struct i386_frame_cache *cache =
     i386_sigtramp_frame_cache (this_frame, this_cache);
 
-  if (!cache->base_p)
-    return UNWIND_UNAVAILABLE;
-
   return UNWIND_NO_REASON;
 }
 
@@ -2497,13 +2445,8 @@ i386_sigtramp_frame_this_id (struct frame_info *this_frame, void **this_cache,
   struct i386_frame_cache *cache =
     i386_sigtramp_frame_cache (this_frame, this_cache);
 
-  if (!cache->base_p)
-    (*this_id) = frame_id_build_unavailable_stack (get_frame_pc (this_frame));
-  else
-    {
-      /* See the end of i386_push_dummy_call.  */
-      (*this_id) = frame_id_build (cache->base + 8, get_frame_pc (this_frame));
-    }
+  /* See the end of i386_push_dummy_call.  */
+  (*this_id) = frame_id_build (cache->base + 8, get_frame_pc (this_frame));
 }
 
 static struct value *
-- 
1.9.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]