1*7fd79137SRobert Mustacchi /* 2*7fd79137SRobert Mustacchi 3*7fd79137SRobert Mustacchi Copyright (C) 2000, 2004, 2006 Silicon Graphics, Inc. All Rights Reserved. 4*7fd79137SRobert Mustacchi 5*7fd79137SRobert Mustacchi This program is free software; you can redistribute it and/or modify it 6*7fd79137SRobert Mustacchi under the terms of version 2.1 of the GNU Lesser General Public License 7*7fd79137SRobert Mustacchi as published by the Free Software Foundation. 8*7fd79137SRobert Mustacchi 9*7fd79137SRobert Mustacchi This program is distributed in the hope that it would be useful, but 10*7fd79137SRobert Mustacchi WITHOUT ANY WARRANTY; without even the implied warranty of 11*7fd79137SRobert Mustacchi MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12*7fd79137SRobert Mustacchi 13*7fd79137SRobert Mustacchi Further, this software is distributed without any warranty that it is 14*7fd79137SRobert Mustacchi free of the rightful claim of any third person regarding infringement 15*7fd79137SRobert Mustacchi or the like. Any license provided herein, whether implied or 16*7fd79137SRobert Mustacchi otherwise, applies only to this software file. Patent licenses, if 17*7fd79137SRobert Mustacchi any, provided herein do not apply to combinations of this program with 18*7fd79137SRobert Mustacchi other software, or any other product whatsoever. 19*7fd79137SRobert Mustacchi 20*7fd79137SRobert Mustacchi You should have received a copy of the GNU Lesser General Public 21*7fd79137SRobert Mustacchi License along with this program; if not, write the Free Software 22*7fd79137SRobert Mustacchi Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301, 23*7fd79137SRobert Mustacchi USA. 24*7fd79137SRobert Mustacchi 25*7fd79137SRobert Mustacchi Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, 26*7fd79137SRobert Mustacchi Mountain View, CA 94043, or: 27*7fd79137SRobert Mustacchi 28*7fd79137SRobert Mustacchi http://www.sgi.com 29*7fd79137SRobert Mustacchi 30*7fd79137SRobert Mustacchi For further information regarding this notice, see: 31*7fd79137SRobert Mustacchi 32*7fd79137SRobert Mustacchi http://oss.sgi.com/projects/GenInfo/NoticeExplan 33*7fd79137SRobert Mustacchi 34*7fd79137SRobert Mustacchi */ 35*7fd79137SRobert Mustacchi 36*7fd79137SRobert Mustacchi 37*7fd79137SRobert Mustacchi 38*7fd79137SRobert Mustacchi /* The dwarf 2.0 standard dictates that only the following 39*7fd79137SRobert Mustacchi * fields can be read when an unexpected augmentation string 40*7fd79137SRobert Mustacchi * (in the cie) is encountered: CIE length, CIE_id, version and 41*7fd79137SRobert Mustacchi * augmentation; FDE: length, CIE pointer, initial location and 42*7fd79137SRobert Mustacchi * address range. Unfortunately, with the above restrictions, it 43*7fd79137SRobert Mustacchi * is impossible to read the instruction table from a CIE or a FDE 44*7fd79137SRobert Mustacchi * when a new augmentation string is encountered. 45*7fd79137SRobert Mustacchi * To fix this problem, the following layout is used, if the 46*7fd79137SRobert Mustacchi * augmentation string starts with the string "z". 47*7fd79137SRobert Mustacchi * CIE FDE 48*7fd79137SRobert Mustacchi * length length 49*7fd79137SRobert Mustacchi * CIE_id CIE_pointer 50*7fd79137SRobert Mustacchi * version initial_location 51*7fd79137SRobert Mustacchi * augmentation address_range 52*7fd79137SRobert Mustacchi * length_of_augmented_fields (*NEW*) 53*7fd79137SRobert Mustacchi * code_alignment_factor Any new fields as necessary 54*7fd79137SRobert Mustacchi * data_alignment_factor instruction_table 55*7fd79137SRobert Mustacchi * return_address 56*7fd79137SRobert Mustacchi * length_of_augmented fields 57*7fd79137SRobert Mustacchi * Any new fields as necessary 58*7fd79137SRobert Mustacchi * initial_instructions 59*7fd79137SRobert Mustacchi * 60*7fd79137SRobert Mustacchi * The type of all the old data items are the same as what is 61*7fd79137SRobert Mustacchi * described in dwarf 2.0 standard. The length_of_augmented_fields 62*7fd79137SRobert Mustacchi * is an LEB128 data item that denotes the size (in bytes) of 63*7fd79137SRobert Mustacchi * the augmented fields (not including the size of 64*7fd79137SRobert Mustacchi * "length_of_augmented_fields" itself). 65*7fd79137SRobert Mustacchi 66*7fd79137SRobert Mustacchi * Handling of cie augmentation strings is necessarly a heuristic. 67*7fd79137SRobert Mustacchi * See dwarf_frame.c for the currently known augmentation strings. 68*7fd79137SRobert Mustacchi 69*7fd79137SRobert Mustacchi 70*7fd79137SRobert Mustacchi ---START SGI-ONLY COMMENT: 71*7fd79137SRobert Mustacchi * SGI-IRIX versions of cie or fde were intended to use "z1", "z2" as the 72*7fd79137SRobert Mustacchi * augmenter strings if required for new augmentation. 73*7fd79137SRobert Mustacchi * However, that never happened (as of March 2005). 74*7fd79137SRobert Mustacchi * 75*7fd79137SRobert Mustacchi * The fde's augmented by the string "z" have a new field 76*7fd79137SRobert Mustacchi * (signed constant, 4 byte field) 77*7fd79137SRobert Mustacchi * called offset_into_exception_tables, following the 78*7fd79137SRobert Mustacchi * length_of_augmented field. This field contains an offset 79*7fd79137SRobert Mustacchi * into the "_MIPS_eh_region", which describes 80*7fd79137SRobert Mustacchi * the IRIX CC exception handling tables. 81*7fd79137SRobert Mustacchi ---END SGI-ONLY COMMENT 82*7fd79137SRobert Mustacchi 83*7fd79137SRobert Mustacchi 84*7fd79137SRobert Mustacchi * GNU .eh_frame has an augmentation string of z[RLP]* (gcc 3.4) 85*7fd79137SRobert Mustacchi * The similarity to IRIX 'z' (and proposed but never 86*7fd79137SRobert Mustacchi * implemented IRIX z1, z2 etc) was confusing things. 87*7fd79137SRobert Mustacchi * If the section is .eh_frame then 'z' means GNU exception 88*7fd79137SRobert Mustacchi * information 'Augmentation Data' not IRIX 'z'. 89*7fd79137SRobert Mustacchi * See The Linux Standard Base Core Specification version 3.0 90*7fd79137SRobert Mustacchi */ 91*7fd79137SRobert Mustacchi 92*7fd79137SRobert Mustacchi #define DW_DEBUG_FRAME_VERSION 1 /* DWARF2 */ 93*7fd79137SRobert Mustacchi #define DW_DEBUG_FRAME_VERSION3 3 /* DWARF3 */ 94*7fd79137SRobert Mustacchi #define DW_DEBUG_FRAME_VERSION4 4 /* DWARF4 */ 95*7fd79137SRobert Mustacchi /* The following is SGI/IRIX specific, and probably no longer 96*7fd79137SRobert Mustacchi in use anywhere. */ 97*7fd79137SRobert Mustacchi #define DW_DEBUG_FRAME_AUGMENTER_STRING "mti v1" 98*7fd79137SRobert Mustacchi 99*7fd79137SRobert Mustacchi /* The value of the offset field for Cie's. */ 100*7fd79137SRobert Mustacchi #define DW_CIE_OFFSET ~(0x0) 101*7fd79137SRobert Mustacchi 102*7fd79137SRobert Mustacchi /* The augmentation string may be NULL. */ 103*7fd79137SRobert Mustacchi #define DW_EMPTY_STRING "" 104*7fd79137SRobert Mustacchi 105*7fd79137SRobert Mustacchi #define DW_FRAME_INSTR_OPCODE_SHIFT 6 106*7fd79137SRobert Mustacchi #define DW_FRAME_INSTR_OFFSET_MASK 0x3f 107*7fd79137SRobert Mustacchi 108*7fd79137SRobert Mustacchi /* 109*7fd79137SRobert Mustacchi This struct denotes the rule for a register in a row of 110*7fd79137SRobert Mustacchi the frame table. In other words, it is one element of 111*7fd79137SRobert Mustacchi the table. 112*7fd79137SRobert Mustacchi */ 113*7fd79137SRobert Mustacchi struct Dwarf_Reg_Rule_s { 114*7fd79137SRobert Mustacchi 115*7fd79137SRobert Mustacchi /* 116*7fd79137SRobert Mustacchi Is a flag indicating whether the rule includes the offset 117*7fd79137SRobert Mustacchi field, ie whether the ru_offset field is valid or not. 118*7fd79137SRobert Mustacchi Applies only if DW_EXPR_OFFSET or DW_EXPR_VAL_OFFSET. 119*7fd79137SRobert Mustacchi It is important, since reg+offset (offset of 0) is different from 120*7fd79137SRobert Mustacchi just 'register' since the former means 'read memory at address 121*7fd79137SRobert Mustacchi given by the sum of register contents plus offset to get the 122*7fd79137SRobert Mustacchi value'. whereas the latter means 'the value is in the register'. 123*7fd79137SRobert Mustacchi 124*7fd79137SRobert Mustacchi The 'register' numbers are either real registers (ie, table 125*7fd79137SRobert Mustacchi columns defined as real registers) or defined entries that are 126*7fd79137SRobert Mustacchi not really hardware registers, such as DW_FRAME_SAME_VAL or 127*7fd79137SRobert Mustacchi DW_FRAME_CFA_COL. 128*7fd79137SRobert Mustacchi 129*7fd79137SRobert Mustacchi */ 130*7fd79137SRobert Mustacchi Dwarf_Sbyte ru_is_off; 131*7fd79137SRobert Mustacchi 132*7fd79137SRobert Mustacchi /* DW_EXPR_OFFSET (0, DWARF2) 133*7fd79137SRobert Mustacchi DW_EXPR_VAL_OFFSET 1 (dwarf2/3) 134*7fd79137SRobert Mustacchi DW_EXPR_EXPRESSION 2 (dwarf2/3) 135*7fd79137SRobert Mustacchi DW_EXPR_VAL_EXPRESSION 3 (dwarf2/3) 136*7fd79137SRobert Mustacchi See dwarf_frame.h. */ 137*7fd79137SRobert Mustacchi Dwarf_Sbyte ru_value_type; 138*7fd79137SRobert Mustacchi 139*7fd79137SRobert Mustacchi /* Register involved in this rule. */ 140*7fd79137SRobert Mustacchi Dwarf_Half ru_register; 141*7fd79137SRobert Mustacchi 142*7fd79137SRobert Mustacchi /* Offset to add to register, if indicated by ru_is_offset 143*7fd79137SRobert Mustacchi and if DW_EXPR_OFFSET or DW_EXPR_VAL_OFFSET. 144*7fd79137SRobert Mustacchi If DW_EXPR_EXPRESSION or DW_EXPR_VAL_EXPRESSION 145*7fd79137SRobert Mustacchi this is DW_FORM_block block-length, not offset. */ 146*7fd79137SRobert Mustacchi Dwarf_Unsigned ru_offset_or_block_len; 147*7fd79137SRobert Mustacchi 148*7fd79137SRobert Mustacchi /* For DW_EXPR_EXPRESSION DW_EXPR_VAL_EXPRESSION these is set, 149*7fd79137SRobert Mustacchi else 0. */ 150*7fd79137SRobert Mustacchi Dwarf_Small *ru_block; 151*7fd79137SRobert Mustacchi }; 152*7fd79137SRobert Mustacchi 153*7fd79137SRobert Mustacchi typedef struct Dwarf_Frame_s *Dwarf_Frame; 154*7fd79137SRobert Mustacchi 155*7fd79137SRobert Mustacchi /* 156*7fd79137SRobert Mustacchi This structure represents a row of the frame table. 157*7fd79137SRobert Mustacchi Fr_loc is the pc value for this row, and Fr_reg 158*7fd79137SRobert Mustacchi contains the rule for each column. 159*7fd79137SRobert Mustacchi 160*7fd79137SRobert Mustacchi Entry DW_FRAME_CFA_COL of fr_reg was the tradional MIPS 161*7fd79137SRobert Mustacchi way of setting CFA. cfa_rule is the new one. 162*7fd79137SRobert Mustacchi */ 163*7fd79137SRobert Mustacchi struct Dwarf_Frame_s { 164*7fd79137SRobert Mustacchi 165*7fd79137SRobert Mustacchi /* Pc value corresponding to this row of the frame table. */ 166*7fd79137SRobert Mustacchi Dwarf_Addr fr_loc; 167*7fd79137SRobert Mustacchi 168*7fd79137SRobert Mustacchi /* Rules for all the registers in this row. */ 169*7fd79137SRobert Mustacchi struct Dwarf_Reg_Rule_s fr_cfa_rule; 170*7fd79137SRobert Mustacchi 171*7fd79137SRobert Mustacchi /* fr_reg_count is the the number of 172*7fd79137SRobert Mustacchi entries of the fr_reg array. */ 173*7fd79137SRobert Mustacchi unsigned long fr_reg_count; 174*7fd79137SRobert Mustacchi struct Dwarf_Reg_Rule_s *fr_reg; 175*7fd79137SRobert Mustacchi 176*7fd79137SRobert Mustacchi Dwarf_Frame fr_next; 177*7fd79137SRobert Mustacchi }; 178*7fd79137SRobert Mustacchi 179*7fd79137SRobert Mustacchi typedef struct Dwarf_Frame_Op_List_s *Dwarf_Frame_Op_List; 180*7fd79137SRobert Mustacchi 181*7fd79137SRobert Mustacchi /* This is used to chain together Dwarf_Frame_Op structures. */ 182*7fd79137SRobert Mustacchi struct Dwarf_Frame_Op_List_s { 183*7fd79137SRobert Mustacchi Dwarf_Frame_Op *fl_frame_instr; 184*7fd79137SRobert Mustacchi Dwarf_Frame_Op_List fl_next; 185*7fd79137SRobert Mustacchi }; 186*7fd79137SRobert Mustacchi 187*7fd79137SRobert Mustacchi /* See dwarf_frame.c for the heuristics used to set the 188*7fd79137SRobert Mustacchi Dwarf_Cie ci_augmentation_type. 189*7fd79137SRobert Mustacchi 190*7fd79137SRobert Mustacchi This succinctly helps interpret the size and meaning of .debug_frame 191*7fd79137SRobert Mustacchi and (for gcc) .eh_frame. 192*7fd79137SRobert Mustacchi 193*7fd79137SRobert Mustacchi In the case of gcc .eh_frame (gcc 3.3, 3.4) 194*7fd79137SRobert Mustacchi z may be followed by one or more of 195*7fd79137SRobert Mustacchi L R P. 196*7fd79137SRobert Mustacchi 197*7fd79137SRobert Mustacchi */ 198*7fd79137SRobert Mustacchi enum Dwarf_augmentation_type { 199*7fd79137SRobert Mustacchi aug_empty_string, /* Default empty augmentation string. */ 200*7fd79137SRobert Mustacchi aug_irix_exception_table, /* IRIX plain "z", 201*7fd79137SRobert Mustacchi for exception handling, IRIX CC compiler. 202*7fd79137SRobert Mustacchi Proposed z1 z2 ... never implemented. */ 203*7fd79137SRobert Mustacchi aug_gcc_eh_z, /* gcc z augmentation, (including 204*7fd79137SRobert Mustacchi L R P variations). gcc 3.3 3.4 exception 205*7fd79137SRobert Mustacchi handling in eh_frame. */ 206*7fd79137SRobert Mustacchi aug_irix_mti_v1, /* IRIX "mti v1" augmentation string. Probably 207*7fd79137SRobert Mustacchi never in any released SGI-IRIX compiler. */ 208*7fd79137SRobert Mustacchi aug_eh, /* For gcc .eh_frame, "eh" is the string., 209*7fd79137SRobert Mustacchi gcc 1,2, egcs. Older values. */ 210*7fd79137SRobert Mustacchi aug_armcc, /* "armcc+" meaning the cfa calculation 211*7fd79137SRobert Mustacchi is corrected to be standard (output by 212*7fd79137SRobert Mustacchi Arm C RVCT 3.0 SP1 and later). See 213*7fd79137SRobert Mustacchi http://sourceware.org/ml/gdb-patches/2006-12/msg00249.html 214*7fd79137SRobert Mustacchi for details. */ 215*7fd79137SRobert Mustacchi aug_unknown, /* Unknown augmentation, we cannot do much. */ 216*7fd79137SRobert Mustacchi aug_past_last 217*7fd79137SRobert Mustacchi }; 218*7fd79137SRobert Mustacchi 219*7fd79137SRobert Mustacchi 220*7fd79137SRobert Mustacchi /* 221*7fd79137SRobert Mustacchi This structure contains all the pertinent info for a Cie. Most 222*7fd79137SRobert Mustacchi of the fields are taken straight from the definition of a Cie. 223*7fd79137SRobert Mustacchi Ci_cie_start points to the address (in .debug_frame) where this 224*7fd79137SRobert Mustacchi Cie begins. Ci_cie_instr_start points to the first byte of the 225*7fd79137SRobert Mustacchi frame instructions for this Cie. Ci_dbg points to the associated 226*7fd79137SRobert Mustacchi Dwarf_Debug structure. Ci_initial_table is a pointer to the table 227*7fd79137SRobert Mustacchi row generated by the instructions for this Cie. 228*7fd79137SRobert Mustacchi */ 229*7fd79137SRobert Mustacchi struct Dwarf_Cie_s { 230*7fd79137SRobert Mustacchi Dwarf_Unsigned ci_length; 231*7fd79137SRobert Mustacchi char *ci_augmentation; 232*7fd79137SRobert Mustacchi Dwarf_Small ci_code_alignment_factor; 233*7fd79137SRobert Mustacchi Dwarf_Sbyte ci_data_alignment_factor; 234*7fd79137SRobert Mustacchi Dwarf_Small ci_return_address_register; 235*7fd79137SRobert Mustacchi Dwarf_Small *ci_cie_start; 236*7fd79137SRobert Mustacchi Dwarf_Small *ci_cie_instr_start; 237*7fd79137SRobert Mustacchi Dwarf_Debug ci_dbg; 238*7fd79137SRobert Mustacchi Dwarf_Frame ci_initial_table; 239*7fd79137SRobert Mustacchi Dwarf_Cie ci_next; 240*7fd79137SRobert Mustacchi Dwarf_Small ci_length_size; 241*7fd79137SRobert Mustacchi Dwarf_Small ci_extension_size; 242*7fd79137SRobert Mustacchi Dwarf_Half ci_cie_version_number; 243*7fd79137SRobert Mustacchi enum Dwarf_augmentation_type ci_augmentation_type; 244*7fd79137SRobert Mustacchi 245*7fd79137SRobert Mustacchi /* The following 2 for GNU .eh_frame exception handling 246*7fd79137SRobert Mustacchi Augmentation Data. Set if ci_augmentation_type 247*7fd79137SRobert Mustacchi is aug_gcc_eh_z. Zero if unused. */ 248*7fd79137SRobert Mustacchi Dwarf_Unsigned ci_gnu_eh_augmentation_len; 249*7fd79137SRobert Mustacchi Dwarf_Ptr ci_gnu_eh_augmentation_bytes; 250*7fd79137SRobert Mustacchi 251*7fd79137SRobert Mustacchi /* These are extracted from the gnu eh_frame 252*7fd79137SRobert Mustacchi augmentation if the 253*7fd79137SRobert Mustacchi augmentation begins with 'z'. See Linux LSB documents. 254*7fd79137SRobert Mustacchi Otherwize these are zero. */ 255*7fd79137SRobert Mustacchi unsigned char ci_gnu_personality_handler_encoding; 256*7fd79137SRobert Mustacchi unsigned char ci_gnu_lsda_encoding; 257*7fd79137SRobert Mustacchi unsigned char ci_gnu_fde_begin_encoding; 258*7fd79137SRobert Mustacchi 259*7fd79137SRobert Mustacchi /* If 'P' augmentation present, is handler addr. Else 260*7fd79137SRobert Mustacchi is zero. */ 261*7fd79137SRobert Mustacchi Dwarf_Addr ci_gnu_personality_handler_addr; 262*7fd79137SRobert Mustacchi 263*7fd79137SRobert Mustacchi 264*7fd79137SRobert Mustacchi /* In creating list of cie's (which will become an array) 265*7fd79137SRobert Mustacchi record the position so fde can get it on fde creation. */ 266*7fd79137SRobert Mustacchi Dwarf_Unsigned ci_index; 267*7fd79137SRobert Mustacchi Dwarf_Small * ci_section_ptr; 268*7fd79137SRobert Mustacchi /* DWARF4 adds address size and segment size to the CIE: the .debug_info 269*7fd79137SRobert Mustacchi section may not always be present to allow libdwarf to 270*7fd79137SRobert Mustacchi find address_size from the compilation-unit. */ 271*7fd79137SRobert Mustacchi Dwarf_Half ci_address_size; 272*7fd79137SRobert Mustacchi Dwarf_Half ci_segment_size; 273*7fd79137SRobert Mustacchi 274*7fd79137SRobert Mustacchi }; 275*7fd79137SRobert Mustacchi 276*7fd79137SRobert Mustacchi /* 277*7fd79137SRobert Mustacchi This structure contains all the pertinent info for a Fde. 278*7fd79137SRobert Mustacchi Most of the fields are taken straight from the definition. 279*7fd79137SRobert Mustacchi fd_cie_index is the index of the Cie associated with this 280*7fd79137SRobert Mustacchi Fde in the list of Cie's for this debug_frame. Fd_cie 281*7fd79137SRobert Mustacchi points to the corresponsing Dwarf_Cie structure. Fd_fde_start 282*7fd79137SRobert Mustacchi points to the start address of the Fde. Fd_fde_instr_start 283*7fd79137SRobert Mustacchi points to the start of the instructions for this Fde. Fd_dbg 284*7fd79137SRobert Mustacchi points to the associated Dwarf_Debug structure. 285*7fd79137SRobert Mustacchi */ 286*7fd79137SRobert Mustacchi struct Dwarf_Fde_s { 287*7fd79137SRobert Mustacchi Dwarf_Unsigned fd_length; 288*7fd79137SRobert Mustacchi Dwarf_Addr fd_cie_offset; 289*7fd79137SRobert Mustacchi Dwarf_Unsigned fd_cie_index; 290*7fd79137SRobert Mustacchi Dwarf_Cie fd_cie; 291*7fd79137SRobert Mustacchi Dwarf_Addr fd_initial_location; 292*7fd79137SRobert Mustacchi Dwarf_Small *fd_initial_loc_pos; 293*7fd79137SRobert Mustacchi Dwarf_Addr fd_address_range; 294*7fd79137SRobert Mustacchi Dwarf_Small *fd_fde_start; 295*7fd79137SRobert Mustacchi Dwarf_Small *fd_fde_instr_start; 296*7fd79137SRobert Mustacchi Dwarf_Debug fd_dbg; 297*7fd79137SRobert Mustacchi 298*7fd79137SRobert Mustacchi /* fd_offset_into_exception_tables is SGI/IRIX exception table 299*7fd79137SRobert Mustacchi offset. Unused and zero if not IRIX .debug_frame. */ 300*7fd79137SRobert Mustacchi Dwarf_Signed fd_offset_into_exception_tables; 301*7fd79137SRobert Mustacchi 302*7fd79137SRobert Mustacchi Dwarf_Fde fd_next; 303*7fd79137SRobert Mustacchi Dwarf_Small fd_length_size; 304*7fd79137SRobert Mustacchi Dwarf_Small fd_extension_size; 305*7fd79137SRobert Mustacchi /* So we know from an fde which 'count' of fde-s in 306*7fd79137SRobert Mustacchi Dwarf_Debug applies: eh or standard. */ 307*7fd79137SRobert Mustacchi Dwarf_Small fd_is_eh; 308*7fd79137SRobert Mustacchi /* The following 2 for GNU .eh_frame exception handling 309*7fd79137SRobert Mustacchi Augmentation Data. Set if CIE ci_augmentation_type 310*7fd79137SRobert Mustacchi is aug_gcc_eh_z. Zero if unused. */ 311*7fd79137SRobert Mustacchi Dwarf_Unsigned fd_gnu_eh_augmentation_len; 312*7fd79137SRobert Mustacchi Dwarf_Ptr fd_gnu_eh_augmentation_bytes; 313*7fd79137SRobert Mustacchi Dwarf_Addr fd_gnu_eh_lsda; /* If 'L' augmentation letter 314*7fd79137SRobert Mustacchi present: is address of the 315*7fd79137SRobert Mustacchi Language Specific Data Area (LSDA). If not 'L" is zero. */ 316*7fd79137SRobert Mustacchi 317*7fd79137SRobert Mustacchi /* The following 3 are about the Elf section the FDEs come from. */ 318*7fd79137SRobert Mustacchi Dwarf_Small * fd_section_ptr; 319*7fd79137SRobert Mustacchi Dwarf_Unsigned fd_section_length; 320*7fd79137SRobert Mustacchi Dwarf_Unsigned fd_section_index; 321*7fd79137SRobert Mustacchi 322*7fd79137SRobert Mustacchi }; 323*7fd79137SRobert Mustacchi 324*7fd79137SRobert Mustacchi 325*7fd79137SRobert Mustacchi int 326*7fd79137SRobert Mustacchi _dwarf_frame_address_offsets(Dwarf_Debug dbg, Dwarf_Addr ** addrlist, 327*7fd79137SRobert Mustacchi Dwarf_Off ** offsetlist, 328*7fd79137SRobert Mustacchi Dwarf_Signed * returncount, 329*7fd79137SRobert Mustacchi Dwarf_Error * err); 330*7fd79137SRobert Mustacchi 331*7fd79137SRobert Mustacchi int 332*7fd79137SRobert Mustacchi _dwarf_get_fde_list_internal(Dwarf_Debug dbg, 333*7fd79137SRobert Mustacchi Dwarf_Cie ** cie_data, 334*7fd79137SRobert Mustacchi Dwarf_Signed * cie_element_count, 335*7fd79137SRobert Mustacchi Dwarf_Fde ** fde_data, 336*7fd79137SRobert Mustacchi Dwarf_Signed * fde_element_count, 337*7fd79137SRobert Mustacchi Dwarf_Small * section_ptr, 338*7fd79137SRobert Mustacchi Dwarf_Unsigned section_index, 339*7fd79137SRobert Mustacchi Dwarf_Unsigned section_length, 340*7fd79137SRobert Mustacchi Dwarf_Unsigned cie_id_value, 341*7fd79137SRobert Mustacchi int use_gnu_cie_calc, /* If non-zero, 342*7fd79137SRobert Mustacchi this is gcc eh_frame. */ 343*7fd79137SRobert Mustacchi Dwarf_Error * error); 344*7fd79137SRobert Mustacchi 345*7fd79137SRobert Mustacchi enum Dwarf_augmentation_type 346*7fd79137SRobert Mustacchi _dwarf_get_augmentation_type(Dwarf_Debug dbg, 347*7fd79137SRobert Mustacchi Dwarf_Small *augmentation_string, 348*7fd79137SRobert Mustacchi int is_gcc_eh_frame); 349*7fd79137SRobert Mustacchi 350*7fd79137SRobert Mustacchi Dwarf_Unsigned _dwarf_get_return_address_reg(Dwarf_Small *frame_ptr, 351*7fd79137SRobert Mustacchi int version, 352*7fd79137SRobert Mustacchi unsigned long *size); 353*7fd79137SRobert Mustacchi 354*7fd79137SRobert Mustacchi /* Temporary recording of crucial cie/fde prefix data. 355*7fd79137SRobert Mustacchi * Vastly simplifies some argument lists. 356*7fd79137SRobert Mustacchi */ 357*7fd79137SRobert Mustacchi struct cie_fde_prefix_s { 358*7fd79137SRobert Mustacchi /* cf_start_addr is a pointer to the first byte of this fde/cie 359*7fd79137SRobert Mustacchi we are reading now. */ 360*7fd79137SRobert Mustacchi Dwarf_Small * cf_start_addr; 361*7fd79137SRobert Mustacchi Dwarf_Small * cf_addr_after_prefix; 362*7fd79137SRobert Mustacchi Dwarf_Unsigned cf_length; 363*7fd79137SRobert Mustacchi int cf_local_length_size; 364*7fd79137SRobert Mustacchi int cf_local_extension_size; 365*7fd79137SRobert Mustacchi Dwarf_Unsigned cf_cie_id; 366*7fd79137SRobert Mustacchi Dwarf_Small * cf_cie_id_addr; /* used for eh_frame calculations. */ 367*7fd79137SRobert Mustacchi 368*7fd79137SRobert Mustacchi /* Simplifies passing around these values to create fde having 369*7fd79137SRobert Mustacchi these here. */ 370*7fd79137SRobert Mustacchi /* cf_section_ptr is a pointer to the first byte 371*7fd79137SRobert Mustacchi of the object section the prefix is read from. */ 372*7fd79137SRobert Mustacchi Dwarf_Small * cf_section_ptr; 373*7fd79137SRobert Mustacchi Dwarf_Unsigned cf_section_index; 374*7fd79137SRobert Mustacchi Dwarf_Unsigned cf_section_length; 375*7fd79137SRobert Mustacchi }; 376*7fd79137SRobert Mustacchi 377*7fd79137SRobert Mustacchi int 378*7fd79137SRobert Mustacchi _dwarf_exec_frame_instr(Dwarf_Bool make_instr, 379*7fd79137SRobert Mustacchi Dwarf_Frame_Op ** ret_frame_instr, 380*7fd79137SRobert Mustacchi Dwarf_Bool search_pc, 381*7fd79137SRobert Mustacchi Dwarf_Addr search_pc_val, 382*7fd79137SRobert Mustacchi Dwarf_Addr initial_loc, 383*7fd79137SRobert Mustacchi Dwarf_Small * start_instr_ptr, 384*7fd79137SRobert Mustacchi Dwarf_Small * final_instr_ptr, 385*7fd79137SRobert Mustacchi Dwarf_Frame table, 386*7fd79137SRobert Mustacchi Dwarf_Cie cie, 387*7fd79137SRobert Mustacchi Dwarf_Debug dbg, 388*7fd79137SRobert Mustacchi Dwarf_Half reg_num_of_cfa, 389*7fd79137SRobert Mustacchi Dwarf_Sword * returned_count, 390*7fd79137SRobert Mustacchi int *returned_error); 391*7fd79137SRobert Mustacchi 392*7fd79137SRobert Mustacchi 393*7fd79137SRobert Mustacchi int dwarf_read_cie_fde_prefix(Dwarf_Debug dbg, 394*7fd79137SRobert Mustacchi Dwarf_Small *frame_ptr_in, 395*7fd79137SRobert Mustacchi Dwarf_Small *section_ptr_in, 396*7fd79137SRobert Mustacchi Dwarf_Unsigned section_index_in, 397*7fd79137SRobert Mustacchi Dwarf_Unsigned section_length_in, 398*7fd79137SRobert Mustacchi struct cie_fde_prefix_s *prefix_out, 399*7fd79137SRobert Mustacchi Dwarf_Error *error); 400*7fd79137SRobert Mustacchi 401*7fd79137SRobert Mustacchi int dwarf_create_fde_from_after_start(Dwarf_Debug dbg, 402*7fd79137SRobert Mustacchi struct cie_fde_prefix_s * prefix, 403*7fd79137SRobert Mustacchi Dwarf_Small *section_pointer, 404*7fd79137SRobert Mustacchi Dwarf_Small *frame_ptr, 405*7fd79137SRobert Mustacchi int use_gnu_cie_calc, 406*7fd79137SRobert Mustacchi Dwarf_Cie cie_ptr_in, 407*7fd79137SRobert Mustacchi Dwarf_Fde *fde_ptr_out, 408*7fd79137SRobert Mustacchi Dwarf_Error *error); 409*7fd79137SRobert Mustacchi 410*7fd79137SRobert Mustacchi int dwarf_create_cie_from_after_start(Dwarf_Debug dbg, 411*7fd79137SRobert Mustacchi struct cie_fde_prefix_s *prefix, 412*7fd79137SRobert Mustacchi Dwarf_Small* section_pointer, 413*7fd79137SRobert Mustacchi Dwarf_Small* frame_ptr, 414*7fd79137SRobert Mustacchi Dwarf_Unsigned cie_count, 415*7fd79137SRobert Mustacchi int use_gnu_cie_calc, 416*7fd79137SRobert Mustacchi Dwarf_Cie *cie_ptr_out, 417*7fd79137SRobert Mustacchi Dwarf_Error *error); 418*7fd79137SRobert Mustacchi 419*7fd79137SRobert Mustacchi 420*7fd79137SRobert Mustacchi int _dwarf_frame_constructor(Dwarf_Debug dbg,void * ); 421*7fd79137SRobert Mustacchi void _dwarf_frame_destructor (void *); 422