Minor cleanup of ia64 unwind handler code.
authorJim Wilson <wilson@cygnus.com>
Wed, 23 Aug 2000 20:55:01 +0000 (20:55 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Wed, 23 Aug 2000 20:55:01 +0000 (13:55 -0700)
* frame.h (IA64_UNW_EHANDLER, IA64_UNW_UHANDLER): New.
* config/ia64/frame-ia64.c (__get_personality): Return zero if neither
EHANDLER nor UHANDLER bit is set.
(__get_except_table): Likewise.

From-SVN: r35922

gcc/ChangeLog
gcc/config/ia64/frame-ia64.c
gcc/frame.h

index 0ada585abdb57f26da924215ed9c8e2ef792b43c..7c28f4bbd08e851c5368e3bf16d440e9264cefd2 100644 (file)
@@ -1,3 +1,10 @@
+2000-08-23  Jim Wilson  <wilson@cygnus.com>
+
+       * frame.h (IA64_UNW_EHANDLER, IA64_UNW_UHANDLER): New.
+       * config/ia64/frame-ia64.c (__get_personality): Return zero if neither
+       EHANDLER nor UHANDLER bit is set.
+       (__get_except_table): Likewise.
+
 2000-08-23  Nick Clifton  <nickc@redhat.com>
 
        * config/arm/lib1funcs.asm: Replace upper case condition codes
index efddd9f08bb7957706e87b33af867c1622b635c8..5d5e3a308ffe853866c9f50a0f1409b56bddb668 100644 (file)
@@ -1376,27 +1376,38 @@ __build_ia64_frame_state (pc, frame, bsp, sp, pc_base_ptr)
   return unw_info_ptr;
 }
 
-/* Given an unwind info pointer, return the personailty routine.  */
+/* Given an unwind info pointer, return the personality routine.  */
 void *
 __get_personality (ptr)
      unwind_info_ptr *ptr;
 {
   void **p;
+
+  /* There is a personality routine only if one of the EHANDLER or UHANDLER
+     bits is set.  */
+  if (! (IA64_UNW_HDR_FLAGS (ptr->header)
+        & (IA64_UNW_EHANDLER|IA64_UNW_UHANDLER)))
+    return 0;
+
   p = (void **) (ptr->unwind_descriptors
                 + IA64_UNW_HDR_LENGTH (ptr->header) * 8);
   return *p;
 }
 
+/* Given an unwind info pointer, return the exception table.  */
 void *
 __get_except_table (ptr)
      unwind_info_ptr *ptr;
 {
-  void **p, *table;
-  p = (void **) (ptr->unwind_descriptors
-                + IA64_UNW_HDR_LENGTH (ptr->header) * 8);
-  /* If there is no personality, there is no handler data.  */
-  if (*p == 0)
+  void *table;
+
+  /* If there is no personality, there is no handler data.
+     There is a personality routine only if one of the EHANDLER or UHANDLER
+     bits is set.  */
+  if (! (IA64_UNW_HDR_FLAGS (ptr->header)
+        & (IA64_UNW_EHANDLER|IA64_UNW_UHANDLER)))
     return 0;
+
   table = (void *) (ptr->unwind_descriptors
                    + IA64_UNW_HDR_LENGTH (ptr->header) * 8 + 8);
   return table;
index 472d358327c6baf465b92f3207b2a72dccfb1342..d8ebb6e9b7e080ea59ad528c17c72b4e5258a66f 100644 (file)
@@ -267,6 +267,10 @@ typedef struct unwind_info_ptr
 #define IA64_UNW_HDR_FLAGS(x)  (((x) >> 32) & 0xffffUL)
 #define IA64_UNW_HDR_VERSION(x)        (((x) >> 48) & 0xffffUL)
 
+/* Header flag bits, after extraction by IA64_UNW_HDR_FLAGS.  */
+#define IA64_UNW_EHANDLER      0x1
+#define IA64_UNW_UHANDLER      0x2
+
 extern unwind_info_ptr *__build_ia64_frame_state (unsigned char *, 
                                                  ia64_frame_state *,
                                                  void *, void *,