00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 struct fde_vector
00034 {
00035 void *orig_data;
00036 size_t count;
00037 struct dwarf_fde *array[];
00038 };
00039
00040 struct object
00041 {
00042 void *pc_begin;
00043 void *tbase;
00044 void *dbase;
00045 union {
00046 struct dwarf_fde *single;
00047 struct dwarf_fde **array;
00048 struct fde_vector *sort;
00049 } u;
00050
00051 union {
00052 struct {
00053 unsigned long sorted : 1;
00054 unsigned long from_array : 1;
00055 unsigned long mixed_encoding : 1;
00056 unsigned long encoding : 8;
00057
00058
00059 unsigned long count : 21;
00060 } b;
00061 size_t i;
00062 } s;
00063
00064 #ifdef DWARF2_OBJECT_END_PTR_EXTENSION
00065 char *fde_end;
00066 #endif
00067
00068 struct object *next;
00069 };
00070
00071
00072
00073
00074
00075 struct old_object
00076 {
00077 void *pc_begin;
00078 void *pc_end;
00079 struct dwarf_fde *fde_begin;
00080 struct dwarf_fde **fde_array;
00081 size_t count;
00082 struct old_object *next;
00083 };
00084
00085 struct dwarf_eh_bases
00086 {
00087 void *tbase;
00088 void *dbase;
00089 void *func;
00090 };
00091
00092
00093 extern void __register_frame_info_bases (void *, struct object *,
00094 void *, void *);
00095 extern void __register_frame_info (void *, struct object *);
00096 extern void __register_frame (void *);
00097 extern void __register_frame_info_table_bases (void *, struct object *,
00098 void *, void *);
00099 extern void __register_frame_info_table (void *, struct object *);
00100 extern void __register_frame_table (void *);
00101 extern void *__deregister_frame_info (void *);
00102 extern void *__deregister_frame_info_bases (void *);
00103 extern void __deregister_frame (void *);
00104
00105
00106 typedef int sword __attribute__ ((mode (SI)));
00107 typedef unsigned int uword __attribute__ ((mode (SI)));
00108 typedef unsigned int uaddr __attribute__ ((mode (pointer)));
00109 typedef int saddr __attribute__ ((mode (pointer)));
00110 typedef unsigned char ubyte;
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 struct dwarf_cie
00135 {
00136 uword length;
00137 sword CIE_id;
00138 ubyte version;
00139 unsigned char augmentation[];
00140 } __attribute__ ((packed, aligned (__alignof__ (void *))));
00141
00142
00143 struct dwarf_fde
00144 {
00145 uword length;
00146 sword CIE_delta;
00147 unsigned char pc_begin[];
00148 } __attribute__ ((packed, aligned (__alignof__ (void *))));
00149
00150 typedef struct dwarf_fde fde;
00151
00152
00153
00154 static inline struct dwarf_cie *
00155 get_cie (struct dwarf_fde *f)
00156 {
00157 return (void *)&f->CIE_delta - f->CIE_delta;
00158 }
00159
00160 static inline fde *
00161 next_fde (fde *f)
00162 {
00163 return (fde *) ((char *) f + f->length + sizeof (f->length));
00164 }
00165
00166 extern fde * _Unwind_Find_FDE (void *, struct dwarf_eh_bases *);
00167
00168 static inline int
00169 last_fde (struct object *obj __attribute__ ((__unused__)), fde *f)
00170 {
00171 #ifdef DWARF2_OBJECT_END_PTR_EXTENSION
00172 return (char *)f == obj->fde_end || f->length == 0;
00173 #else
00174 return f->length == 0;
00175 #endif
00176 }