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