+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
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;
#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 *,