unwind-dw2-fde.h revision 169689
1178476Sjb/* Subroutines needed for unwinding stack frames for exception handling. */ 2178476Sjb/* Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 3178476Sjb Free Software Foundation, Inc. 4178476Sjb Contributed by Jason Merrill <jason@cygnus.com>. 5178476Sjb 6178476SjbThis file is part of GCC. 7178476Sjb 8178476SjbGCC is free software; you can redistribute it and/or modify it under 9178476Sjbthe terms of the GNU General Public License as published by the Free 10178476SjbSoftware Foundation; either version 2, or (at your option) any later 11178476Sjbversion. 12178476Sjb 13178476SjbIn addition to the permissions in the GNU General Public License, the 14178476SjbFree Software Foundation gives you unlimited permission to link the 15178476Sjbcompiled version of this file into combinations with other programs, 16178476Sjband to distribute those combinations without any restriction coming 17178476Sjbfrom the use of this file. (The General Public License restrictions 18178476Sjbdo apply in other respects; for example, they cover modification of 19178476Sjbthe file, and distribution when not linked into a combine 20178476Sjbexecutable.) 21178476Sjb 22178476SjbGCC is distributed in the hope that it will be useful, but WITHOUT ANY 23178476SjbWARRANTY; without even the implied warranty of MERCHANTABILITY or 24178476SjbFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 25178476Sjbfor more details. 26178476Sjb 27178476SjbYou should have received a copy of the GNU General Public License 28178476Sjbalong with GCC; see the file COPYING. If not, write to the Free 29178476SjbSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 30178476Sjb02110-1301, USA. */ 31178476Sjb 32178476Sjb#ifndef GCC_UNWIND_DW2_FDE_H 33178476Sjb#define GCC_UNWIND_DW2_FDE_H 34178476Sjb 35178476Sjb#ifndef HIDE_EXPORTS 36178476Sjb#pragma GCC visibility push(default) 37178476Sjb#endif 38178476Sjb 39178476Sjbstruct fde_vector 40178476Sjb{ 41178476Sjb const void *orig_data; 42178476Sjb size_t count; 43178476Sjb const struct dwarf_fde *array[]; 44178476Sjb}; 45178476Sjb 46178476Sjbstruct object 47178476Sjb{ 48178476Sjb void *pc_begin; 49178476Sjb void *tbase; 50178476Sjb void *dbase; 51178476Sjb union { 52178476Sjb const struct dwarf_fde *single; 53178476Sjb struct dwarf_fde **array; 54178476Sjb struct fde_vector *sort; 55178476Sjb } u; 56178476Sjb 57178476Sjb union { 58178476Sjb struct { 59178476Sjb unsigned long sorted : 1; 60178476Sjb unsigned long from_array : 1; 61178476Sjb unsigned long mixed_encoding : 1; 62178476Sjb unsigned long encoding : 8; 63178476Sjb /* ??? Wish there was an easy way to detect a 64-bit host here; 64 we've got 32 bits left to play with... */ 65 unsigned long count : 21; 66 } b; 67 size_t i; 68 } s; 69 70#ifdef DWARF2_OBJECT_END_PTR_EXTENSION 71 char *fde_end; 72#endif 73 74 struct object *next; 75}; 76 77/* This is the original definition of struct object. While the struct 78 itself was opaque to users, they did know how large it was, and 79 allocate one statically in crtbegin for each DSO. Keep this around 80 so that we're aware of the static size limitations for the new struct. */ 81struct old_object 82{ 83 void *pc_begin; 84 void *pc_end; 85 struct dwarf_fde *fde_begin; 86 struct dwarf_fde **fde_array; 87 size_t count; 88 struct old_object *next; 89}; 90 91struct dwarf_eh_bases 92{ 93 void *tbase; 94 void *dbase; 95 void *func; 96}; 97 98 99extern void __register_frame_info_bases (const void *, struct object *, 100 void *, void *); 101extern void __register_frame_info (const void *, struct object *); 102extern void __register_frame (void *); 103extern void __register_frame_info_table_bases (void *, struct object *, 104 void *, void *); 105extern void __register_frame_info_table (void *, struct object *); 106extern void __register_frame_table (void *); 107extern void *__deregister_frame_info (const void *); 108extern void *__deregister_frame_info_bases (const void *); 109extern void __deregister_frame (void *); 110 111 112typedef int sword __attribute__ ((mode (SI))); 113typedef unsigned int uword __attribute__ ((mode (SI))); 114typedef unsigned int uaddr __attribute__ ((mode (pointer))); 115typedef int saddr __attribute__ ((mode (pointer))); 116typedef unsigned char ubyte; 117 118/* Terminology: 119 CIE - Common Information Element 120 FDE - Frame Descriptor Element 121 122 There is one per function, and it describes where the function code 123 is located, and what the register lifetimes and stack layout are 124 within the function. 125 126 The data structures are defined in the DWARF specification, although 127 not in a very readable way (see LITERATURE). 128 129 Every time an exception is thrown, the code needs to locate the FDE 130 for the current function, and starts to look for exception regions 131 from that FDE. This works in a two-level search: 132 a) in a linear search, find the shared image (i.e. DLL) containing 133 the PC 134 b) using the FDE table for that shared object, locate the FDE using 135 binary search (which requires the sorting). */ 136 137/* The first few fields of a CIE. The CIE_id field is 0 for a CIE, 138 to distinguish it from a valid FDE. FDEs are aligned to an addressing 139 unit boundary, but the fields within are unaligned. */ 140struct dwarf_cie 141{ 142 uword length; 143 sword CIE_id; 144 ubyte version; 145 unsigned char augmentation[]; 146} __attribute__ ((packed, aligned (__alignof__ (void *)))); 147 148/* The first few fields of an FDE. */ 149struct dwarf_fde 150{ 151 uword length; 152 sword CIE_delta; 153 unsigned char pc_begin[]; 154} __attribute__ ((packed, aligned (__alignof__ (void *)))); 155 156typedef struct dwarf_fde fde; 157 158/* Locate the CIE for a given FDE. */ 159 160static inline const struct dwarf_cie * 161get_cie (const struct dwarf_fde *f) 162{ 163 return (void *)&f->CIE_delta - f->CIE_delta; 164} 165 166static inline const fde * 167next_fde (const fde *f) 168{ 169 return (const fde *) ((char *) f + f->length + sizeof (f->length)); 170} 171 172extern const fde * _Unwind_Find_FDE (void *, struct dwarf_eh_bases *); 173 174static inline int 175last_fde (struct object *obj __attribute__ ((__unused__)), const fde *f) 176{ 177#ifdef DWARF2_OBJECT_END_PTR_EXTENSION 178 return (char *)f == obj->fde_end || f->length == 0; 179#else 180 return f->length == 0; 181#endif 182} 183 184#ifndef HIDE_EXPORTS 185#pragma GCC visibility pop 186#endif 187 188#endif /* unwind-dw2-fde.h */ 189