149d3bc91SRichard Lowe /*
207dc1947SRichard Lowe   Copyright (C) 2000, 2004 Silicon Graphics, Inc.  All Rights Reserved.
3*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2015-2020 David Anderson. All Rights Reserved.
449d3bc91SRichard Lowe 
5*4d9fdb46SRobert Mustacchi   This program is free software; you can redistribute it
6*4d9fdb46SRobert Mustacchi   and/or modify it under the terms of version 2.1 of the
7*4d9fdb46SRobert Mustacchi   GNU Lesser General Public License as published by the Free
8*4d9fdb46SRobert Mustacchi   Software Foundation.
949d3bc91SRichard Lowe 
10*4d9fdb46SRobert Mustacchi   This program is distributed in the hope that it would be
11*4d9fdb46SRobert Mustacchi   useful, but WITHOUT ANY WARRANTY; without even the implied
12*4d9fdb46SRobert Mustacchi   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
13*4d9fdb46SRobert Mustacchi   PURPOSE.
1449d3bc91SRichard Lowe 
15*4d9fdb46SRobert Mustacchi   Further, this software is distributed without any warranty
16*4d9fdb46SRobert Mustacchi   that it is free of the rightful claim of any third person
17*4d9fdb46SRobert Mustacchi   regarding infringement or the like.  Any license provided
18*4d9fdb46SRobert Mustacchi   herein, whether implied or otherwise, applies only to this
19*4d9fdb46SRobert Mustacchi   software file.  Patent licenses, if any, provided herein
20*4d9fdb46SRobert Mustacchi   do not apply to combinations of this program with other
21*4d9fdb46SRobert Mustacchi   software, or any other product whatsoever.
2249d3bc91SRichard Lowe 
23*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General
24*4d9fdb46SRobert Mustacchi   Public License along with this program; if not, write the
25*4d9fdb46SRobert Mustacchi   Free Software Foundation, Inc., 51 Franklin Street - Fifth
26*4d9fdb46SRobert Mustacchi   Floor, Boston MA 02110-1301, USA.
2749d3bc91SRichard Lowe */
28*4d9fdb46SRobert Mustacchi #ifndef DWARF_LOC_H
29*4d9fdb46SRobert Mustacchi #define DWARF_LOC_H
30*4d9fdb46SRobert Mustacchi #ifdef __cplusplus
31*4d9fdb46SRobert Mustacchi extern "C" {
32*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */
3349d3bc91SRichard Lowe 
3449d3bc91SRichard Lowe 
3549d3bc91SRichard Lowe typedef struct Dwarf_Loc_Chain_s *Dwarf_Loc_Chain;
3649d3bc91SRichard Lowe struct Dwarf_Loc_Chain_s {
3749d3bc91SRichard Lowe     Dwarf_Small lc_atom;
38*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_raw1;
39*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_raw2;
40*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_raw3;
4149d3bc91SRichard Lowe     Dwarf_Unsigned lc_number;
4249d3bc91SRichard Lowe     Dwarf_Unsigned lc_number2;
43*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_number3;
4449d3bc91SRichard Lowe     Dwarf_Unsigned lc_offset;
45*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_opnumber;
4649d3bc91SRichard Lowe     Dwarf_Loc_Chain lc_next;
4749d3bc91SRichard Lowe };
48*4d9fdb46SRobert Mustacchi 
49*4d9fdb46SRobert Mustacchi /*  Dwarf_Loclists_Context_s contains the data from the .debug_loclists
50*4d9fdb46SRobert Mustacchi     section headers (if that section exists).  Dwarf 2,3,4 .debug_loc
51*4d9fdb46SRobert Mustacchi     has no such data.  The array (one of these per header in
52*4d9fdb46SRobert Mustacchi     .debug_loclists) is recorded in Dwarf_Debug. These
53*4d9fdb46SRobert Mustacchi     are filled in at startup at the same time .debug_info
54*4d9fdb46SRobert Mustacchi     is opened.  Nothing of this struct is exposed to
55*4d9fdb46SRobert Mustacchi     libdwarf callers */
56*4d9fdb46SRobert Mustacchi struct Dwarf_Loclists_Context_s {
57*4d9fdb46SRobert Mustacchi     Dwarf_Debug    lc_dbg;
58*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned lc_index; /* An index  assigned by
59*4d9fdb46SRobert Mustacchi         libdwarf to each loclists context. Starting
60*4d9fdb46SRobert Mustacchi         with zero at the zero offset in .debug_loclists. */
61*4d9fdb46SRobert Mustacchi 
62*4d9fdb46SRobert Mustacchi     /* Offset of the .debug_loclists header involved. */
63*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lc_header_offset;
64*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lc_length;
65*4d9fdb46SRobert Mustacchi 
66*4d9fdb46SRobert Mustacchi     /* Many places in in libdwarf this is called length_size. */
67*4d9fdb46SRobert Mustacchi     Dwarf_Small     lc_offset_size;
68*4d9fdb46SRobert Mustacchi 
69*4d9fdb46SRobert Mustacchi     /*  rc_extension_size is zero unless this is standard
70*4d9fdb46SRobert Mustacchi         DWARF3 and later 64bit dwarf using the extension mechanism.
71*4d9fdb46SRobert Mustacchi         64bit DWARF3 and later: rc_extension_size is 4.
72*4d9fdb46SRobert Mustacchi         64bit DWARF2 MIPS/IRIX: rc_extension_size is zero.
73*4d9fdb46SRobert Mustacchi         32bit DWARF:            rc_extension_size is zero.  */
74*4d9fdb46SRobert Mustacchi     Dwarf_Small     lc_extension_size;
75*4d9fdb46SRobert Mustacchi 
76*4d9fdb46SRobert Mustacchi     unsigned        lc_version; /* 5 */
77*4d9fdb46SRobert Mustacchi     Dwarf_Small     lc_address_size;
78*4d9fdb46SRobert Mustacchi     Dwarf_Small     lc_segment_selector_size;
79*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lc_offset_entry_count;
80*4d9fdb46SRobert Mustacchi 
81*4d9fdb46SRobert Mustacchi     /* offset in the section of the offset entries */
82*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lc_offsets_off_in_sect;
83*4d9fdb46SRobert Mustacchi 
84*4d9fdb46SRobert Mustacchi     /* Do not free. Points into section memory */
85*4d9fdb46SRobert Mustacchi     Dwarf_Small   * lc_offsets_array;
86*4d9fdb46SRobert Mustacchi 
87*4d9fdb46SRobert Mustacchi     /*  Offset in the .debug_loclists section of the
88*4d9fdb46SRobert Mustacchi         first loclist in the set of loclists for the
89*4d9fdb46SRobert Mustacchi         CU. */
90*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lc_first_loclist_offset;
91*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lc_past_last_loclist_offset;
92*4d9fdb46SRobert Mustacchi 
93*4d9fdb46SRobert Mustacchi     /* pointer to 1st byte of loclist header*/
94*4d9fdb46SRobert Mustacchi     Dwarf_Small *  lc_loclists_header;
95*4d9fdb46SRobert Mustacchi     /*  pointer to first byte of the loclist data
96*4d9fdb46SRobert Mustacchi         for loclist involved. Do not free. */
97*4d9fdb46SRobert Mustacchi     Dwarf_Small    *lc_startaddr;
98*4d9fdb46SRobert Mustacchi     /*  pointer one past end of the loclist data. */
99*4d9fdb46SRobert Mustacchi     Dwarf_Small    *lc_endaddr;
100*4d9fdb46SRobert Mustacchi };
101*4d9fdb46SRobert Mustacchi 
102*4d9fdb46SRobert Mustacchi 
103*4d9fdb46SRobert Mustacchi 
104*4d9fdb46SRobert Mustacchi /*  Contains info on an uninterpreted block of data,
105*4d9fdb46SRobert Mustacchi     the data is DWARF location expression operators.  */
106*4d9fdb46SRobert Mustacchi struct Dwarf_Block_c_s {
107*4d9fdb46SRobert Mustacchi     /* length of block bl_data points at */
108*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  bl_len;
109*4d9fdb46SRobert Mustacchi 
110*4d9fdb46SRobert Mustacchi     /*  Uninterpreted data, location expressions,
111*4d9fdb46SRobert Mustacchi         DW_OP_reg31 etc */
112*4d9fdb46SRobert Mustacchi     Dwarf_Ptr       bl_data;
113*4d9fdb46SRobert Mustacchi 
114*4d9fdb46SRobert Mustacchi     /*  DW_LKIND, see libdwarf.h.in  */
115*4d9fdb46SRobert Mustacchi     Dwarf_Small     bl_kind;
116*4d9fdb46SRobert Mustacchi 
117*4d9fdb46SRobert Mustacchi     /* Section (not CU) offset which 'data' comes from. */
118*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  bl_section_offset;
119*4d9fdb46SRobert Mustacchi 
120*4d9fdb46SRobert Mustacchi     /*  Section offset where the location description
121*4d9fdb46SRobert Mustacchi         itself starts.  So a few bytes lower than
122*4d9fdb46SRobert Mustacchi         bl_section_offset */
123*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  bl_locdesc_offset;
124*4d9fdb46SRobert Mustacchi };
125*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Block_c_s Dwarf_Block_c;
126*4d9fdb46SRobert Mustacchi 
127*4d9fdb46SRobert Mustacchi /* Location record. Records up to 3 operand values.
128*4d9fdb46SRobert Mustacchi    For DWARF5 ops with a 1 byte size and then a block
129*4d9fdb46SRobert Mustacchi    of data of that size we the size in an operand
130*4d9fdb46SRobert Mustacchi    and follow that with the next operand as a
131*4d9fdb46SRobert Mustacchi    pointer to the block. The pointer is inserted
132*4d9fdb46SRobert Mustacchi    via  cast, so an ugly hack.
133*4d9fdb46SRobert Mustacchi    This struct is opaque. Not visible to callers.
134*4d9fdb46SRobert Mustacchi */
135*4d9fdb46SRobert Mustacchi typedef struct Dwarf_Loc_Expr_Op_s *Dwarf_Loc_Expr_Op;
136*4d9fdb46SRobert Mustacchi struct Dwarf_Loc_Expr_Op_s {
137*4d9fdb46SRobert Mustacchi     Dwarf_Small     lr_atom;        /* Location operation */
138*4d9fdb46SRobert Mustacchi 
139*4d9fdb46SRobert Mustacchi     /*  Operands exactly as in DWARF. */
140*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lr_raw1;
141*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lr_raw2;
142*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lr_raw3;
143*4d9fdb46SRobert Mustacchi 
144*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lr_number;      /* First operand */
145*4d9fdb46SRobert Mustacchi 
146*4d9fdb46SRobert Mustacchi     /*  Second operand.
147*4d9fdb46SRobert Mustacchi         For OP_bregx, OP_bit_piece, OP_[GNU_]const_type,
148*4d9fdb46SRobert Mustacchi         OP_[GNU_]deref_type, OP_[GNU_]entry_value,
149*4d9fdb46SRobert Mustacchi         OP_implicit_value,
150*4d9fdb46SRobert Mustacchi         OP_[GNU_]implicit_pointer, OP_[GNU_]regval_type,
151*4d9fdb46SRobert Mustacchi         OP_xderef_type,  */
152*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lr_number2;
153*4d9fdb46SRobert Mustacchi 
154*4d9fdb46SRobert Mustacchi     /*  Third Operand.
155*4d9fdb46SRobert Mustacchi         For OP_[GNU_]const type, pointer to
156*4d9fdb46SRobert Mustacchi         block of length 'lr_number2'
157*4d9fdb46SRobert Mustacchi         FIXME: retrieve the value at the pointer,
158*4d9fdb46SRobert Mustacchi         store the value here instead*/
159*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lr_number3;
160*4d9fdb46SRobert Mustacchi 
161*4d9fdb46SRobert Mustacchi     /*  The number assigned. 0 to the number-of-ops - 1 in
162*4d9fdb46SRobert Mustacchi         the expression we are expanding. */
163*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lr_opnumber;
164*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned  lr_offset; /* offset  for OP_BRA etc */
165*4d9fdb46SRobert Mustacchi     Dwarf_Loc_Expr_Op     lr_next; /* When a list is useful.*/
166*4d9fdb46SRobert Mustacchi };
167*4d9fdb46SRobert Mustacchi 
168*4d9fdb46SRobert Mustacchi /* Location description DWARF 2,3,4,5
169*4d9fdb46SRobert Mustacchi    Adds the DW_LLE value (new in DWARF5).
170*4d9fdb46SRobert Mustacchi    This struct is opaque. Not visible to callers. */
171*4d9fdb46SRobert Mustacchi struct Dwarf_Locdesc_c_s {
172*4d9fdb46SRobert Mustacchi     Dwarf_Small      ld_kind; /* DW_LKIND */
173*4d9fdb46SRobert Mustacchi 
174*4d9fdb46SRobert Mustacchi     /*  A DW_LLEX or DW_LLE value, real or synthesized */
175*4d9fdb46SRobert Mustacchi     Dwarf_Small      ld_lle_value;
176*4d9fdb46SRobert Mustacchi     /*  Failed means .debug_addr section needed but missing.
177*4d9fdb46SRobert Mustacchi         (possibly tied file needed) */
178*4d9fdb46SRobert Mustacchi     Dwarf_Bool       ld_index_failed;
179*4d9fdb46SRobert Mustacchi 
180*4d9fdb46SRobert Mustacchi     /*  Beginning of active range. This is actually an offset
181*4d9fdb46SRobert Mustacchi         of an applicable base address, not a pc value.  */
182*4d9fdb46SRobert Mustacchi     Dwarf_Addr       ld_rawlow;
183*4d9fdb46SRobert Mustacchi     /*  Translated to address */
184*4d9fdb46SRobert Mustacchi     Dwarf_Addr       ld_lopc;
185*4d9fdb46SRobert Mustacchi 
186*4d9fdb46SRobert Mustacchi     /*  End of active range. This is actually an offset
187*4d9fdb46SRobert Mustacchi         of an applicable base address,
188*4d9fdb46SRobert Mustacchi         or a length, never a pc value.  */
189*4d9fdb46SRobert Mustacchi     Dwarf_Addr       ld_rawhigh;
190*4d9fdb46SRobert Mustacchi     /*  Translated to address */
191*4d9fdb46SRobert Mustacchi     Dwarf_Addr       ld_highpc;
192*4d9fdb46SRobert Mustacchi 
193*4d9fdb46SRobert Mustacchi     /*  Byte length of the  entire record for this entry,
194*4d9fdb46SRobert Mustacchi         including any DW_OP entries */
195*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ld_entrylen;
196*4d9fdb46SRobert Mustacchi 
197*4d9fdb46SRobert Mustacchi     /*   For .debug_loclists, eases building record. */
198*4d9fdb46SRobert Mustacchi     Dwarf_Block_c    ld_opsblock;
199*4d9fdb46SRobert Mustacchi 
200*4d9fdb46SRobert Mustacchi     /*  count of struct Dwarf_Loc_Expr_Op_s (expression operators)
201*4d9fdb46SRobert Mustacchi         in array. */
202*4d9fdb46SRobert Mustacchi     Dwarf_Half       ld_cents;
203*4d9fdb46SRobert Mustacchi     /* pointer to array of expression operator structs */
204*4d9fdb46SRobert Mustacchi     Dwarf_Loc_Expr_Op      ld_s;
205*4d9fdb46SRobert Mustacchi 
206*4d9fdb46SRobert Mustacchi     /* Section (not CU) offset where loc-expr begins*/
207*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ld_section_offset;
208*4d9fdb46SRobert Mustacchi 
209*4d9fdb46SRobert Mustacchi     /* Section (not CU) offset where location descr begins*/
210*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ld_locdesc_offset;
211*4d9fdb46SRobert Mustacchi 
212*4d9fdb46SRobert Mustacchi     /* Pointer to our header (in which we are located). */
213*4d9fdb46SRobert Mustacchi     Dwarf_Loc_Head_c ld_loclist_head;
214*4d9fdb46SRobert Mustacchi     Dwarf_Locdesc_c  ld_next; /*helps building the locdescs*/
215*4d9fdb46SRobert Mustacchi };
216*4d9fdb46SRobert Mustacchi 
217*4d9fdb46SRobert Mustacchi /*  A 'header' to the loclist and  the
218*4d9fdb46SRobert Mustacchi     location description(s)  attached to an attribute.
219*4d9fdb46SRobert Mustacchi     This struct is opaque. The contents not visible to
220*4d9fdb46SRobert Mustacchi     callers. */
221*4d9fdb46SRobert Mustacchi struct Dwarf_Loc_Head_c_s {
222*4d9fdb46SRobert Mustacchi     /*  The array (1 or more entries) of
223*4d9fdb46SRobert Mustacchi         struct Loc_Desc_c_s
224*4d9fdb46SRobert Mustacchi         If 1 it may really be a locexpr */
225*4d9fdb46SRobert Mustacchi     Dwarf_Locdesc_c  ll_locdesc;
226*4d9fdb46SRobert Mustacchi 
227*4d9fdb46SRobert Mustacchi     /*  Entry count of the ll_locdesc array.  */
228*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ll_locdesc_count;
229*4d9fdb46SRobert Mustacchi 
230*4d9fdb46SRobert Mustacchi     unsigned         ll_attrnum;
231*4d9fdb46SRobert Mustacchi     unsigned         ll_attrform;
232*4d9fdb46SRobert Mustacchi     unsigned         ll_cuversion;
233*4d9fdb46SRobert Mustacchi     unsigned         ll_address_size;
234*4d9fdb46SRobert Mustacchi     unsigned         ll_offset_size;
235*4d9fdb46SRobert Mustacchi     /*  The CU Context of this loclist or locexpr. */
236*4d9fdb46SRobert Mustacchi     Dwarf_CU_Context ll_context;
237*4d9fdb46SRobert Mustacchi     /* DW_LKIND*    */
238*4d9fdb46SRobert Mustacchi     Dwarf_Small      ll_kind;
239*4d9fdb46SRobert Mustacchi     Dwarf_Debug      ll_dbg;
240*4d9fdb46SRobert Mustacchi 
241*4d9fdb46SRobert Mustacchi     /*  If ll_kind == DW_LKIND_loclists the following
242*4d9fdb46SRobert Mustacchi         pointer is non-null and index is the index of the localcontext */
243*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ll_index;
244*4d9fdb46SRobert Mustacchi     Dwarf_Loclists_Context ll_localcontext;
245*4d9fdb46SRobert Mustacchi 
246*4d9fdb46SRobert Mustacchi     /*  rh_last and rh_first used during build-up.
247*4d9fdb46SRobert Mustacchi         Zero when array rh_loclists built. */
248*4d9fdb46SRobert Mustacchi     Dwarf_Locdesc_c  ll_first;
249*4d9fdb46SRobert Mustacchi     Dwarf_Locdesc_c  ll_last;
250*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ll_bytes_total;
251*4d9fdb46SRobert Mustacchi     unsigned         ll_segment_selector_size;
252*4d9fdb46SRobert Mustacchi 
253*4d9fdb46SRobert Mustacchi     /*  DW_AT_loclists_base */
254*4d9fdb46SRobert Mustacchi     Dwarf_Bool       ll_at_loclists_base_present;
255*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ll_at_loclists_base;
256*4d9fdb46SRobert Mustacchi 
257*4d9fdb46SRobert Mustacchi     /* DW_AT_low_pc of CU or zero if none. */
258*4d9fdb46SRobert Mustacchi     Dwarf_Bool       ll_cu_base_address_present;
259*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ll_cu_base_address;
260*4d9fdb46SRobert Mustacchi 
261*4d9fdb46SRobert Mustacchi     /*  DW_AT_addr_base, so we can use .debug_addr
262*4d9fdb46SRobert Mustacchi         if such is needed. */
263*4d9fdb46SRobert Mustacchi     Dwarf_Bool       ll_cu_addr_base_present;
264*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ll_cu_addr_base;
265*4d9fdb46SRobert Mustacchi 
266*4d9fdb46SRobert Mustacchi     Dwarf_Small    * ll_llepointer;
267*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned   ll_llearea_offset;
268*4d9fdb46SRobert Mustacchi     Dwarf_Small    * ll_end_data_area;
269*4d9fdb46SRobert Mustacchi };
270*4d9fdb46SRobert Mustacchi 
271*4d9fdb46SRobert Mustacchi int _dwarf_fill_in_locdesc_op_c(Dwarf_Debug dbg,
272*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned locdesc_index,
273*4d9fdb46SRobert Mustacchi     Dwarf_Loc_Head_c loc_head,
274*4d9fdb46SRobert Mustacchi     Dwarf_Block_c * loc_block,
275*4d9fdb46SRobert Mustacchi     Dwarf_Half address_size,
276*4d9fdb46SRobert Mustacchi     Dwarf_Half offset_size,
277*4d9fdb46SRobert Mustacchi     Dwarf_Small version_stamp,
278*4d9fdb46SRobert Mustacchi     Dwarf_Addr lowpc,
279*4d9fdb46SRobert Mustacchi     Dwarf_Addr highpc,
280*4d9fdb46SRobert Mustacchi     Dwarf_Half lle_op,
281*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
282*4d9fdb46SRobert Mustacchi 
283*4d9fdb46SRobert Mustacchi int _dwarf_loc_block_sanity_check(Dwarf_Debug dbg,
284*4d9fdb46SRobert Mustacchi     Dwarf_Block_c *loc_block,Dwarf_Error*error);
285*4d9fdb46SRobert Mustacchi 
286*4d9fdb46SRobert Mustacchi void _dwarf_loclists_head_destructor(void *l);
287*4d9fdb46SRobert Mustacchi 
288*4d9fdb46SRobert Mustacchi int _dwarf_loclists_fill_in_lle_head(Dwarf_Debug dbg,
289*4d9fdb46SRobert Mustacchi     Dwarf_Attribute attr,
290*4d9fdb46SRobert Mustacchi     Dwarf_Loc_Head_c llhead,
291*4d9fdb46SRobert Mustacchi     Dwarf_Error *error);
292*4d9fdb46SRobert Mustacchi 
293*4d9fdb46SRobert Mustacchi int _dwarf_loclists_expression_build(Dwarf_Debug dbg,
294*4d9fdb46SRobert Mustacchi     Dwarf_Attribute attr,
295*4d9fdb46SRobert Mustacchi     Dwarf_Loc_Head_c* llhead,
296*4d9fdb46SRobert Mustacchi     Dwarf_Error *error);
297*4d9fdb46SRobert Mustacchi 
298*4d9fdb46SRobert Mustacchi int _dwarf_read_loc_expr_op(Dwarf_Debug dbg,
299*4d9fdb46SRobert Mustacchi     Dwarf_Block_c * loc_block,
300*4d9fdb46SRobert Mustacchi     /* Caller: Start numbering at 0. */
301*4d9fdb46SRobert Mustacchi     Dwarf_Signed opnumber,
302*4d9fdb46SRobert Mustacchi 
303*4d9fdb46SRobert Mustacchi     /* 2 for DWARF 2 etc. */
304*4d9fdb46SRobert Mustacchi     Dwarf_Half version_stamp,
305*4d9fdb46SRobert Mustacchi     Dwarf_Half offset_size, /* 4 or 8 */
306*4d9fdb46SRobert Mustacchi     Dwarf_Half address_size, /* 2,4, 8  */
307*4d9fdb46SRobert Mustacchi     Dwarf_Signed startoffset_in, /* offset in block,
308*4d9fdb46SRobert Mustacchi         not section offset */
309*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end,
310*4d9fdb46SRobert Mustacchi 
311*4d9fdb46SRobert Mustacchi     /* nextoffset_out so caller knows next entry startoffset */
312*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *nextoffset_out,
313*4d9fdb46SRobert Mustacchi 
314*4d9fdb46SRobert Mustacchi     /*  The values picked up. */
315*4d9fdb46SRobert Mustacchi     Dwarf_Loc_Expr_Op curr_loc,
316*4d9fdb46SRobert Mustacchi     Dwarf_Error * error);
317*4d9fdb46SRobert Mustacchi void _dwarf_free_loclists_head(Dwarf_Loc_Head_c head);
318*4d9fdb46SRobert Mustacchi 
319*4d9fdb46SRobert Mustacchi #ifdef __cplusplus
320*4d9fdb46SRobert Mustacchi }
321*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */
322*4d9fdb46SRobert Mustacchi #endif /* DWARF_LOC_H */
323