1*4d9fdb46SRobert Mustacchi /*
2*4d9fdb46SRobert Mustacchi   Copyright (C) 2000-2004 Silicon Graphics, Inc.  All Rights Reserved.
3*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2007-2018 David Anderson. All Rights Reserved.
4*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2010-2012 SN Systems Ltd. All Rights Reserved.
5*4d9fdb46SRobert Mustacchi 
6*4d9fdb46SRobert Mustacchi   This program is free software; you can redistribute it
7*4d9fdb46SRobert Mustacchi   and/or modify it under the terms of version 2.1 of the
8*4d9fdb46SRobert Mustacchi   GNU Lesser General Public License as published by the Free
9*4d9fdb46SRobert Mustacchi   Software Foundation.
10*4d9fdb46SRobert Mustacchi 
11*4d9fdb46SRobert Mustacchi   This program is distributed in the hope that it would be
12*4d9fdb46SRobert Mustacchi   useful, but WITHOUT ANY WARRANTY; without even the implied
13*4d9fdb46SRobert Mustacchi   warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14*4d9fdb46SRobert Mustacchi   PURPOSE.
15*4d9fdb46SRobert Mustacchi 
16*4d9fdb46SRobert Mustacchi   Further, this software is distributed without any warranty
17*4d9fdb46SRobert Mustacchi   that it is free of the rightful claim of any third person
18*4d9fdb46SRobert Mustacchi   regarding infringement or the like.  Any license provided
19*4d9fdb46SRobert Mustacchi   herein, whether implied or otherwise, applies only to this
20*4d9fdb46SRobert Mustacchi   software file.  Patent licenses, if any, provided herein
21*4d9fdb46SRobert Mustacchi   do not apply to combinations of this program with other
22*4d9fdb46SRobert Mustacchi   software, or any other product whatsoever.
23*4d9fdb46SRobert Mustacchi 
24*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General
25*4d9fdb46SRobert Mustacchi   Public License along with this program; if not, write the
26*4d9fdb46SRobert Mustacchi   Free Software Foundation, Inc., 51 Franklin Street - Fifth
27*4d9fdb46SRobert Mustacchi   Floor, Boston MA 02110-1301, USA.
28*4d9fdb46SRobert Mustacchi 
29*4d9fdb46SRobert Mustacchi */
30*4d9fdb46SRobert Mustacchi 
31*4d9fdb46SRobert Mustacchi #include "config.h"
32*4d9fdb46SRobert Mustacchi #include <stdio.h> /* for debugging only. */
33*4d9fdb46SRobert Mustacchi #ifdef HAVE_STDINT_H
34*4d9fdb46SRobert Mustacchi #include <stdint.h> /* For uintptr_t */
35*4d9fdb46SRobert Mustacchi #endif /* HAVE_STDINT_H */
36*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
37*4d9fdb46SRobert Mustacchi #include "dwarf_alloc.h"
38*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
39*4d9fdb46SRobert Mustacchi #include "dwarf_util.h"
40*4d9fdb46SRobert Mustacchi #include "dwarf_loc.h"
41*4d9fdb46SRobert Mustacchi #include "dwarfstring.h"
42*4d9fdb46SRobert Mustacchi 
43*4d9fdb46SRobert Mustacchi #define TRUE 1
44*4d9fdb46SRobert Mustacchi #define FALSE 0
45*4d9fdb46SRobert Mustacchi 
46*4d9fdb46SRobert Mustacchi 
47*4d9fdb46SRobert Mustacchi /*  Richard Henderson, on DW_OP_GNU_encoded_addr:
48*4d9fdb46SRobert Mustacchi     The operand is an absolute
49*4d9fdb46SRobert Mustacchi     address.  The first byte of the value
50*4d9fdb46SRobert Mustacchi     is an encoding length: 0 2 4 or 8.  If zero
51*4d9fdb46SRobert Mustacchi     it means the following is address-size.
52*4d9fdb46SRobert Mustacchi     The address then follows immediately for
53*4d9fdb46SRobert Mustacchi     that number of bytes. */
54*4d9fdb46SRobert Mustacchi static int
read_encoded_addr(Dwarf_Small * loc_ptr,Dwarf_Debug dbg,Dwarf_Small * section_end_ptr,Dwarf_Unsigned * val_out,int * len_out,Dwarf_Error * error)55*4d9fdb46SRobert Mustacchi read_encoded_addr(Dwarf_Small *loc_ptr,
56*4d9fdb46SRobert Mustacchi    Dwarf_Debug dbg,
57*4d9fdb46SRobert Mustacchi    Dwarf_Small *section_end_ptr,
58*4d9fdb46SRobert Mustacchi    Dwarf_Unsigned * val_out,
59*4d9fdb46SRobert Mustacchi    int * len_out,
60*4d9fdb46SRobert Mustacchi    Dwarf_Error *error)
61*4d9fdb46SRobert Mustacchi {
62*4d9fdb46SRobert Mustacchi     int len = 0;
63*4d9fdb46SRobert Mustacchi     Dwarf_Small op = *loc_ptr;
64*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned operand = 0;
65*4d9fdb46SRobert Mustacchi     len++;
66*4d9fdb46SRobert Mustacchi     if (op == 0) {
67*4d9fdb46SRobert Mustacchi         /* FIXME: should be CU specific. */
68*4d9fdb46SRobert Mustacchi         op = dbg->de_pointer_size;
69*4d9fdb46SRobert Mustacchi     }
70*4d9fdb46SRobert Mustacchi     switch (op) {
71*4d9fdb46SRobert Mustacchi     case 1:
72*4d9fdb46SRobert Mustacchi         *val_out = *loc_ptr;
73*4d9fdb46SRobert Mustacchi         len++;
74*4d9fdb46SRobert Mustacchi         break;
75*4d9fdb46SRobert Mustacchi 
76*4d9fdb46SRobert Mustacchi     case 2:
77*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand, Dwarf_Unsigned, loc_ptr, 2,
78*4d9fdb46SRobert Mustacchi             error,section_end_ptr);
79*4d9fdb46SRobert Mustacchi         *val_out = operand;
80*4d9fdb46SRobert Mustacchi         len +=2;
81*4d9fdb46SRobert Mustacchi         break;
82*4d9fdb46SRobert Mustacchi     case 4:
83*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand, Dwarf_Unsigned, loc_ptr, 4,
84*4d9fdb46SRobert Mustacchi             error,section_end_ptr);
85*4d9fdb46SRobert Mustacchi         *val_out = operand;
86*4d9fdb46SRobert Mustacchi         len +=4;
87*4d9fdb46SRobert Mustacchi         break;
88*4d9fdb46SRobert Mustacchi     case 8:
89*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand, Dwarf_Unsigned, loc_ptr, 8,
90*4d9fdb46SRobert Mustacchi             error,section_end_ptr);
91*4d9fdb46SRobert Mustacchi         *val_out = operand;
92*4d9fdb46SRobert Mustacchi         len +=8;
93*4d9fdb46SRobert Mustacchi         break;
94*4d9fdb46SRobert Mustacchi     default:
95*4d9fdb46SRobert Mustacchi         /* We do not know how much to read. */
96*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_GNU_OPCODE_ERROR);
97*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
98*4d9fdb46SRobert Mustacchi     };
99*4d9fdb46SRobert Mustacchi     *len_out = len;
100*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
101*4d9fdb46SRobert Mustacchi }
102*4d9fdb46SRobert Mustacchi 
103*4d9fdb46SRobert Mustacchi 
104*4d9fdb46SRobert Mustacchi /*  Return DW_DLV_NO_ENTRY when at the end of
105*4d9fdb46SRobert Mustacchi     the ops for this block (a single Dwarf_Loccesc
106*4d9fdb46SRobert Mustacchi     and multiple Dwarf_Locs will eventually result
107*4d9fdb46SRobert Mustacchi     from calling this till DW_DLV_NO_ENTRY).
108*4d9fdb46SRobert Mustacchi 
109*4d9fdb46SRobert Mustacchi     All op reader code should call this to
110*4d9fdb46SRobert Mustacchi     extract operator fields. For any
111*4d9fdb46SRobert Mustacchi     DWARF version.
112*4d9fdb46SRobert Mustacchi */
113*4d9fdb46SRobert Mustacchi int
_dwarf_read_loc_expr_op(Dwarf_Debug dbg,Dwarf_Block_c * loc_block,Dwarf_Signed opnumber,Dwarf_Half version_stamp,Dwarf_Half offset_size,Dwarf_Half address_size,Dwarf_Signed startoffset_in,Dwarf_Small * section_end,Dwarf_Unsigned * nextoffset_out,Dwarf_Loc_Expr_Op curr_loc,Dwarf_Error * error)114*4d9fdb46SRobert Mustacchi _dwarf_read_loc_expr_op(Dwarf_Debug dbg,
115*4d9fdb46SRobert Mustacchi     Dwarf_Block_c * loc_block,
116*4d9fdb46SRobert Mustacchi     /* Caller: Start numbering at 0. */
117*4d9fdb46SRobert Mustacchi     Dwarf_Signed opnumber,
118*4d9fdb46SRobert Mustacchi 
119*4d9fdb46SRobert Mustacchi     /* 2 for DWARF 2 etc. */
120*4d9fdb46SRobert Mustacchi     Dwarf_Half version_stamp,
121*4d9fdb46SRobert Mustacchi     Dwarf_Half offset_size, /* 4 or 8 */
122*4d9fdb46SRobert Mustacchi     Dwarf_Half address_size, /* 2,4, 8  */
123*4d9fdb46SRobert Mustacchi     Dwarf_Signed startoffset_in, /* offset in block,
124*4d9fdb46SRobert Mustacchi         not section offset */
125*4d9fdb46SRobert Mustacchi     Dwarf_Small *section_end,
126*4d9fdb46SRobert Mustacchi 
127*4d9fdb46SRobert Mustacchi     /* nextoffset_out so caller knows next entry startoffset */
128*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned *nextoffset_out,
129*4d9fdb46SRobert Mustacchi 
130*4d9fdb46SRobert Mustacchi     /*  The values picked up. */
131*4d9fdb46SRobert Mustacchi     Dwarf_Loc_Expr_Op curr_loc,
132*4d9fdb46SRobert Mustacchi     Dwarf_Error * error)
133*4d9fdb46SRobert Mustacchi {
134*4d9fdb46SRobert Mustacchi     Dwarf_Small *loc_ptr = 0;
135*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned loc_len = 0;
136*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned offset = startoffset_in;
137*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned operand1 = 0;
138*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned operand2 = 0;
139*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned operand3 = 0;
140*4d9fdb46SRobert Mustacchi     Dwarf_Small atom = 0;
141*4d9fdb46SRobert Mustacchi     Dwarf_Unsigned leb128_length = 0;
142*4d9fdb46SRobert Mustacchi 
143*4d9fdb46SRobert Mustacchi     if (offset > loc_block->bl_len) {
144*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
145*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
146*4d9fdb46SRobert Mustacchi     }
147*4d9fdb46SRobert Mustacchi     loc_len = loc_block->bl_len;
148*4d9fdb46SRobert Mustacchi     if (offset == loc_len) {
149*4d9fdb46SRobert Mustacchi         return DW_DLV_NO_ENTRY;
150*4d9fdb46SRobert Mustacchi     }
151*4d9fdb46SRobert Mustacchi 
152*4d9fdb46SRobert Mustacchi     loc_ptr = (Dwarf_Small*)loc_block->bl_data + offset;
153*4d9fdb46SRobert Mustacchi     if ((loc_ptr+1) > section_end) {
154*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
155*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
156*4d9fdb46SRobert Mustacchi     }
157*4d9fdb46SRobert Mustacchi     memset(curr_loc,0,sizeof(*curr_loc));
158*4d9fdb46SRobert Mustacchi 
159*4d9fdb46SRobert Mustacchi     curr_loc->lr_opnumber = opnumber;
160*4d9fdb46SRobert Mustacchi     curr_loc->lr_offset = offset;
161*4d9fdb46SRobert Mustacchi 
162*4d9fdb46SRobert Mustacchi     /*  loc_ptr is ok to deref, see loc_ptr+1 test just above. */
163*4d9fdb46SRobert Mustacchi     atom = *(Dwarf_Small *) loc_ptr;
164*4d9fdb46SRobert Mustacchi     loc_ptr++;
165*4d9fdb46SRobert Mustacchi     offset++;
166*4d9fdb46SRobert Mustacchi     curr_loc->lr_atom = atom;
167*4d9fdb46SRobert Mustacchi     switch (atom) {
168*4d9fdb46SRobert Mustacchi 
169*4d9fdb46SRobert Mustacchi     case DW_OP_reg0:
170*4d9fdb46SRobert Mustacchi     case DW_OP_reg1:
171*4d9fdb46SRobert Mustacchi     case DW_OP_reg2:
172*4d9fdb46SRobert Mustacchi     case DW_OP_reg3:
173*4d9fdb46SRobert Mustacchi     case DW_OP_reg4:
174*4d9fdb46SRobert Mustacchi     case DW_OP_reg5:
175*4d9fdb46SRobert Mustacchi     case DW_OP_reg6:
176*4d9fdb46SRobert Mustacchi     case DW_OP_reg7:
177*4d9fdb46SRobert Mustacchi     case DW_OP_reg8:
178*4d9fdb46SRobert Mustacchi     case DW_OP_reg9:
179*4d9fdb46SRobert Mustacchi     case DW_OP_reg10:
180*4d9fdb46SRobert Mustacchi     case DW_OP_reg11:
181*4d9fdb46SRobert Mustacchi     case DW_OP_reg12:
182*4d9fdb46SRobert Mustacchi     case DW_OP_reg13:
183*4d9fdb46SRobert Mustacchi     case DW_OP_reg14:
184*4d9fdb46SRobert Mustacchi     case DW_OP_reg15:
185*4d9fdb46SRobert Mustacchi     case DW_OP_reg16:
186*4d9fdb46SRobert Mustacchi     case DW_OP_reg17:
187*4d9fdb46SRobert Mustacchi     case DW_OP_reg18:
188*4d9fdb46SRobert Mustacchi     case DW_OP_reg19:
189*4d9fdb46SRobert Mustacchi     case DW_OP_reg20:
190*4d9fdb46SRobert Mustacchi     case DW_OP_reg21:
191*4d9fdb46SRobert Mustacchi     case DW_OP_reg22:
192*4d9fdb46SRobert Mustacchi     case DW_OP_reg23:
193*4d9fdb46SRobert Mustacchi     case DW_OP_reg24:
194*4d9fdb46SRobert Mustacchi     case DW_OP_reg25:
195*4d9fdb46SRobert Mustacchi     case DW_OP_reg26:
196*4d9fdb46SRobert Mustacchi     case DW_OP_reg27:
197*4d9fdb46SRobert Mustacchi     case DW_OP_reg28:
198*4d9fdb46SRobert Mustacchi     case DW_OP_reg29:
199*4d9fdb46SRobert Mustacchi     case DW_OP_reg30:
200*4d9fdb46SRobert Mustacchi     case DW_OP_reg31:
201*4d9fdb46SRobert Mustacchi         break;
202*4d9fdb46SRobert Mustacchi 
203*4d9fdb46SRobert Mustacchi     case DW_OP_regx:
204*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
205*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
206*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
207*4d9fdb46SRobert Mustacchi         break;
208*4d9fdb46SRobert Mustacchi 
209*4d9fdb46SRobert Mustacchi     case DW_OP_lit0:
210*4d9fdb46SRobert Mustacchi     case DW_OP_lit1:
211*4d9fdb46SRobert Mustacchi     case DW_OP_lit2:
212*4d9fdb46SRobert Mustacchi     case DW_OP_lit3:
213*4d9fdb46SRobert Mustacchi     case DW_OP_lit4:
214*4d9fdb46SRobert Mustacchi     case DW_OP_lit5:
215*4d9fdb46SRobert Mustacchi     case DW_OP_lit6:
216*4d9fdb46SRobert Mustacchi     case DW_OP_lit7:
217*4d9fdb46SRobert Mustacchi     case DW_OP_lit8:
218*4d9fdb46SRobert Mustacchi     case DW_OP_lit9:
219*4d9fdb46SRobert Mustacchi     case DW_OP_lit10:
220*4d9fdb46SRobert Mustacchi     case DW_OP_lit11:
221*4d9fdb46SRobert Mustacchi     case DW_OP_lit12:
222*4d9fdb46SRobert Mustacchi     case DW_OP_lit13:
223*4d9fdb46SRobert Mustacchi     case DW_OP_lit14:
224*4d9fdb46SRobert Mustacchi     case DW_OP_lit15:
225*4d9fdb46SRobert Mustacchi     case DW_OP_lit16:
226*4d9fdb46SRobert Mustacchi     case DW_OP_lit17:
227*4d9fdb46SRobert Mustacchi     case DW_OP_lit18:
228*4d9fdb46SRobert Mustacchi     case DW_OP_lit19:
229*4d9fdb46SRobert Mustacchi     case DW_OP_lit20:
230*4d9fdb46SRobert Mustacchi     case DW_OP_lit21:
231*4d9fdb46SRobert Mustacchi     case DW_OP_lit22:
232*4d9fdb46SRobert Mustacchi     case DW_OP_lit23:
233*4d9fdb46SRobert Mustacchi     case DW_OP_lit24:
234*4d9fdb46SRobert Mustacchi     case DW_OP_lit25:
235*4d9fdb46SRobert Mustacchi     case DW_OP_lit26:
236*4d9fdb46SRobert Mustacchi     case DW_OP_lit27:
237*4d9fdb46SRobert Mustacchi     case DW_OP_lit28:
238*4d9fdb46SRobert Mustacchi     case DW_OP_lit29:
239*4d9fdb46SRobert Mustacchi     case DW_OP_lit30:
240*4d9fdb46SRobert Mustacchi     case DW_OP_lit31:
241*4d9fdb46SRobert Mustacchi         operand1 = atom - DW_OP_lit0;
242*4d9fdb46SRobert Mustacchi         break;
243*4d9fdb46SRobert Mustacchi 
244*4d9fdb46SRobert Mustacchi     case DW_OP_addr:
245*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned,
246*4d9fdb46SRobert Mustacchi             loc_ptr, address_size,
247*4d9fdb46SRobert Mustacchi             error,section_end);
248*4d9fdb46SRobert Mustacchi         loc_ptr += address_size;
249*4d9fdb46SRobert Mustacchi         offset += address_size;
250*4d9fdb46SRobert Mustacchi         break;
251*4d9fdb46SRobert Mustacchi 
252*4d9fdb46SRobert Mustacchi     case DW_OP_const1u:
253*4d9fdb46SRobert Mustacchi         if (loc_ptr >= section_end) {
254*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
255*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
256*4d9fdb46SRobert Mustacchi         }
257*4d9fdb46SRobert Mustacchi         operand1 = *(Dwarf_Small *) loc_ptr;
258*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 1;
259*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
260*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
261*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
262*4d9fdb46SRobert Mustacchi         }
263*4d9fdb46SRobert Mustacchi         offset = offset + 1;
264*4d9fdb46SRobert Mustacchi         break;
265*4d9fdb46SRobert Mustacchi 
266*4d9fdb46SRobert Mustacchi     case DW_OP_const1s:
267*4d9fdb46SRobert Mustacchi         if (loc_ptr >= section_end) {
268*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
269*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
270*4d9fdb46SRobert Mustacchi         }
271*4d9fdb46SRobert Mustacchi         operand1 = *(Dwarf_Sbyte *) loc_ptr;
272*4d9fdb46SRobert Mustacchi         SIGN_EXTEND(operand1,1);
273*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 1;
274*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
275*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
276*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
277*4d9fdb46SRobert Mustacchi         }
278*4d9fdb46SRobert Mustacchi         offset = offset + 1;
279*4d9fdb46SRobert Mustacchi         break;
280*4d9fdb46SRobert Mustacchi 
281*4d9fdb46SRobert Mustacchi     case DW_OP_const2u:
282*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr, 2,
283*4d9fdb46SRobert Mustacchi             error,section_end);
284*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 2;
285*4d9fdb46SRobert Mustacchi         offset = offset + 2;
286*4d9fdb46SRobert Mustacchi         break;
287*4d9fdb46SRobert Mustacchi 
288*4d9fdb46SRobert Mustacchi     case DW_OP_const2s:
289*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr, 2,
290*4d9fdb46SRobert Mustacchi             error, section_end);
291*4d9fdb46SRobert Mustacchi         SIGN_EXTEND(operand1,2);
292*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 2;
293*4d9fdb46SRobert Mustacchi         offset = offset + 2;
294*4d9fdb46SRobert Mustacchi         break;
295*4d9fdb46SRobert Mustacchi 
296*4d9fdb46SRobert Mustacchi     case DW_OP_const4u:
297*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr, 4,
298*4d9fdb46SRobert Mustacchi             error, section_end);
299*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 4;
300*4d9fdb46SRobert Mustacchi         offset = offset + 4;
301*4d9fdb46SRobert Mustacchi         break;
302*4d9fdb46SRobert Mustacchi 
303*4d9fdb46SRobert Mustacchi     case DW_OP_const4s:
304*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr, 4,
305*4d9fdb46SRobert Mustacchi             error, section_end);
306*4d9fdb46SRobert Mustacchi         SIGN_EXTEND(operand1,4);
307*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 4;
308*4d9fdb46SRobert Mustacchi         offset = offset + 4;
309*4d9fdb46SRobert Mustacchi         break;
310*4d9fdb46SRobert Mustacchi 
311*4d9fdb46SRobert Mustacchi     case DW_OP_const8u:
312*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr, 8,
313*4d9fdb46SRobert Mustacchi             error, section_end);
314*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 8;
315*4d9fdb46SRobert Mustacchi         offset = offset + 8;
316*4d9fdb46SRobert Mustacchi         break;
317*4d9fdb46SRobert Mustacchi 
318*4d9fdb46SRobert Mustacchi     case DW_OP_const8s:
319*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr, 8,
320*4d9fdb46SRobert Mustacchi             error, section_end);
321*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 8;
322*4d9fdb46SRobert Mustacchi         offset = offset + 8;
323*4d9fdb46SRobert Mustacchi         break;
324*4d9fdb46SRobert Mustacchi 
325*4d9fdb46SRobert Mustacchi     case DW_OP_constu:
326*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
327*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
328*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
329*4d9fdb46SRobert Mustacchi         break;
330*4d9fdb46SRobert Mustacchi 
331*4d9fdb46SRobert Mustacchi     case DW_OP_consts:
332*4d9fdb46SRobert Mustacchi         DECODE_LEB128_SWORD_LEN_CK(loc_ptr, operand1,leb128_length,
333*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
334*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
335*4d9fdb46SRobert Mustacchi         break;
336*4d9fdb46SRobert Mustacchi 
337*4d9fdb46SRobert Mustacchi     case DW_OP_fbreg:
338*4d9fdb46SRobert Mustacchi         DECODE_LEB128_SWORD_LEN_CK(loc_ptr, operand1,leb128_length,
339*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
340*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
341*4d9fdb46SRobert Mustacchi         break;
342*4d9fdb46SRobert Mustacchi 
343*4d9fdb46SRobert Mustacchi     case DW_OP_breg0:
344*4d9fdb46SRobert Mustacchi     case DW_OP_breg1:
345*4d9fdb46SRobert Mustacchi     case DW_OP_breg2:
346*4d9fdb46SRobert Mustacchi     case DW_OP_breg3:
347*4d9fdb46SRobert Mustacchi     case DW_OP_breg4:
348*4d9fdb46SRobert Mustacchi     case DW_OP_breg5:
349*4d9fdb46SRobert Mustacchi     case DW_OP_breg6:
350*4d9fdb46SRobert Mustacchi     case DW_OP_breg7:
351*4d9fdb46SRobert Mustacchi     case DW_OP_breg8:
352*4d9fdb46SRobert Mustacchi     case DW_OP_breg9:
353*4d9fdb46SRobert Mustacchi     case DW_OP_breg10:
354*4d9fdb46SRobert Mustacchi     case DW_OP_breg11:
355*4d9fdb46SRobert Mustacchi     case DW_OP_breg12:
356*4d9fdb46SRobert Mustacchi     case DW_OP_breg13:
357*4d9fdb46SRobert Mustacchi     case DW_OP_breg14:
358*4d9fdb46SRobert Mustacchi     case DW_OP_breg15:
359*4d9fdb46SRobert Mustacchi     case DW_OP_breg16:
360*4d9fdb46SRobert Mustacchi     case DW_OP_breg17:
361*4d9fdb46SRobert Mustacchi     case DW_OP_breg18:
362*4d9fdb46SRobert Mustacchi     case DW_OP_breg19:
363*4d9fdb46SRobert Mustacchi     case DW_OP_breg20:
364*4d9fdb46SRobert Mustacchi     case DW_OP_breg21:
365*4d9fdb46SRobert Mustacchi     case DW_OP_breg22:
366*4d9fdb46SRobert Mustacchi     case DW_OP_breg23:
367*4d9fdb46SRobert Mustacchi     case DW_OP_breg24:
368*4d9fdb46SRobert Mustacchi     case DW_OP_breg25:
369*4d9fdb46SRobert Mustacchi     case DW_OP_breg26:
370*4d9fdb46SRobert Mustacchi     case DW_OP_breg27:
371*4d9fdb46SRobert Mustacchi     case DW_OP_breg28:
372*4d9fdb46SRobert Mustacchi     case DW_OP_breg29:
373*4d9fdb46SRobert Mustacchi     case DW_OP_breg30:
374*4d9fdb46SRobert Mustacchi     case DW_OP_breg31:
375*4d9fdb46SRobert Mustacchi         DECODE_LEB128_SWORD_LEN_CK(loc_ptr, operand1,leb128_length,
376*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
377*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
378*4d9fdb46SRobert Mustacchi         break;
379*4d9fdb46SRobert Mustacchi 
380*4d9fdb46SRobert Mustacchi     case DW_OP_bregx:
381*4d9fdb46SRobert Mustacchi         /* uleb reg num followed by sleb offset */
382*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
383*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
384*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
385*4d9fdb46SRobert Mustacchi 
386*4d9fdb46SRobert Mustacchi         DECODE_LEB128_SWORD_LEN_CK(loc_ptr, operand2,leb128_length,
387*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
388*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
389*4d9fdb46SRobert Mustacchi         break;
390*4d9fdb46SRobert Mustacchi 
391*4d9fdb46SRobert Mustacchi     case DW_OP_dup:
392*4d9fdb46SRobert Mustacchi     case DW_OP_drop:
393*4d9fdb46SRobert Mustacchi         break;
394*4d9fdb46SRobert Mustacchi 
395*4d9fdb46SRobert Mustacchi     case DW_OP_pick:
396*4d9fdb46SRobert Mustacchi         if (loc_ptr >= section_end) {
397*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
398*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
399*4d9fdb46SRobert Mustacchi         }
400*4d9fdb46SRobert Mustacchi         operand1 = *(Dwarf_Small *) loc_ptr;
401*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 1;
402*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
403*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
404*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
405*4d9fdb46SRobert Mustacchi         }
406*4d9fdb46SRobert Mustacchi         offset = offset + 1;
407*4d9fdb46SRobert Mustacchi         break;
408*4d9fdb46SRobert Mustacchi 
409*4d9fdb46SRobert Mustacchi     case DW_OP_over:
410*4d9fdb46SRobert Mustacchi     case DW_OP_swap:
411*4d9fdb46SRobert Mustacchi     case DW_OP_rot:
412*4d9fdb46SRobert Mustacchi     case DW_OP_deref:
413*4d9fdb46SRobert Mustacchi         break;
414*4d9fdb46SRobert Mustacchi 
415*4d9fdb46SRobert Mustacchi     case DW_OP_deref_size:
416*4d9fdb46SRobert Mustacchi         if (loc_ptr >= section_end) {
417*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
418*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
419*4d9fdb46SRobert Mustacchi         }
420*4d9fdb46SRobert Mustacchi         operand1 = *(Dwarf_Small *) loc_ptr;
421*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 1;
422*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
423*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
424*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
425*4d9fdb46SRobert Mustacchi         }
426*4d9fdb46SRobert Mustacchi         offset = offset + 1;
427*4d9fdb46SRobert Mustacchi         break;
428*4d9fdb46SRobert Mustacchi 
429*4d9fdb46SRobert Mustacchi     case DW_OP_xderef:
430*4d9fdb46SRobert Mustacchi         break;
431*4d9fdb46SRobert Mustacchi 
432*4d9fdb46SRobert Mustacchi     case DW_OP_xderef_type:        /* DWARF5 */
433*4d9fdb46SRobert Mustacchi         if (loc_ptr >= section_end) {
434*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
435*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
436*4d9fdb46SRobert Mustacchi         }
437*4d9fdb46SRobert Mustacchi         operand1 = *(Dwarf_Small *) loc_ptr;
438*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 1;
439*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
440*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
441*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
442*4d9fdb46SRobert Mustacchi         }
443*4d9fdb46SRobert Mustacchi         offset = offset + 1;
444*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand2,leb128_length,
445*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
446*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
447*4d9fdb46SRobert Mustacchi 
448*4d9fdb46SRobert Mustacchi         break;
449*4d9fdb46SRobert Mustacchi 
450*4d9fdb46SRobert Mustacchi     case DW_OP_xderef_size:
451*4d9fdb46SRobert Mustacchi         if (loc_ptr >= section_end) {
452*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
453*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
454*4d9fdb46SRobert Mustacchi         }
455*4d9fdb46SRobert Mustacchi         operand1 = *(Dwarf_Small *) loc_ptr;
456*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 1;
457*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
458*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
459*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
460*4d9fdb46SRobert Mustacchi         }
461*4d9fdb46SRobert Mustacchi         offset = offset + 1;
462*4d9fdb46SRobert Mustacchi         break;
463*4d9fdb46SRobert Mustacchi 
464*4d9fdb46SRobert Mustacchi     case DW_OP_abs:
465*4d9fdb46SRobert Mustacchi     case DW_OP_and:
466*4d9fdb46SRobert Mustacchi     case DW_OP_div:
467*4d9fdb46SRobert Mustacchi     case DW_OP_minus:
468*4d9fdb46SRobert Mustacchi     case DW_OP_mod:
469*4d9fdb46SRobert Mustacchi     case DW_OP_mul:
470*4d9fdb46SRobert Mustacchi     case DW_OP_neg:
471*4d9fdb46SRobert Mustacchi     case DW_OP_not:
472*4d9fdb46SRobert Mustacchi     case DW_OP_or:
473*4d9fdb46SRobert Mustacchi     case DW_OP_plus:
474*4d9fdb46SRobert Mustacchi         break;
475*4d9fdb46SRobert Mustacchi 
476*4d9fdb46SRobert Mustacchi     case DW_OP_plus_uconst:
477*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
478*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
479*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
480*4d9fdb46SRobert Mustacchi         break;
481*4d9fdb46SRobert Mustacchi 
482*4d9fdb46SRobert Mustacchi     case DW_OP_shl:
483*4d9fdb46SRobert Mustacchi     case DW_OP_shr:
484*4d9fdb46SRobert Mustacchi     case DW_OP_shra:
485*4d9fdb46SRobert Mustacchi     case DW_OP_xor:
486*4d9fdb46SRobert Mustacchi         break;
487*4d9fdb46SRobert Mustacchi 
488*4d9fdb46SRobert Mustacchi     case DW_OP_le:
489*4d9fdb46SRobert Mustacchi     case DW_OP_ge:
490*4d9fdb46SRobert Mustacchi     case DW_OP_eq:
491*4d9fdb46SRobert Mustacchi     case DW_OP_lt:
492*4d9fdb46SRobert Mustacchi     case DW_OP_gt:
493*4d9fdb46SRobert Mustacchi     case DW_OP_ne:
494*4d9fdb46SRobert Mustacchi         break;
495*4d9fdb46SRobert Mustacchi 
496*4d9fdb46SRobert Mustacchi     case DW_OP_skip:
497*4d9fdb46SRobert Mustacchi     case DW_OP_bra:
498*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr, 2,
499*4d9fdb46SRobert Mustacchi             error,section_end);
500*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 2;
501*4d9fdb46SRobert Mustacchi         offset = offset + 2;
502*4d9fdb46SRobert Mustacchi         break;
503*4d9fdb46SRobert Mustacchi 
504*4d9fdb46SRobert Mustacchi     case DW_OP_piece:
505*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
506*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
507*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
508*4d9fdb46SRobert Mustacchi         break;
509*4d9fdb46SRobert Mustacchi 
510*4d9fdb46SRobert Mustacchi     case DW_OP_nop:
511*4d9fdb46SRobert Mustacchi         break;
512*4d9fdb46SRobert Mustacchi     case DW_OP_push_object_address: /* DWARF3 */
513*4d9fdb46SRobert Mustacchi         break;
514*4d9fdb46SRobert Mustacchi     case DW_OP_call2:       /* DWARF3 */
515*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr, 2,
516*4d9fdb46SRobert Mustacchi             error,section_end);
517*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 2;
518*4d9fdb46SRobert Mustacchi         offset = offset + 2;
519*4d9fdb46SRobert Mustacchi         break;
520*4d9fdb46SRobert Mustacchi 
521*4d9fdb46SRobert Mustacchi     case DW_OP_call4:       /* DWARF3 */
522*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr, 4,
523*4d9fdb46SRobert Mustacchi             error,section_end);
524*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 4;
525*4d9fdb46SRobert Mustacchi         offset = offset + 4;
526*4d9fdb46SRobert Mustacchi         break;
527*4d9fdb46SRobert Mustacchi     case DW_OP_call_ref:    /* DWARF3 */
528*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr,
529*4d9fdb46SRobert Mustacchi             offset_size,
530*4d9fdb46SRobert Mustacchi             error,section_end);
531*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + offset_size;
532*4d9fdb46SRobert Mustacchi         offset = offset + offset_size;
533*4d9fdb46SRobert Mustacchi         break;
534*4d9fdb46SRobert Mustacchi 
535*4d9fdb46SRobert Mustacchi     case DW_OP_form_tls_address:    /* DWARF3f */
536*4d9fdb46SRobert Mustacchi         break;
537*4d9fdb46SRobert Mustacchi     case DW_OP_call_frame_cfa:      /* DWARF3f */
538*4d9fdb46SRobert Mustacchi         break;
539*4d9fdb46SRobert Mustacchi     case DW_OP_bit_piece:   /* DWARF3f */
540*4d9fdb46SRobert Mustacchi         /* uleb size in bits followed by uleb offset in bits */
541*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
542*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
543*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
544*4d9fdb46SRobert Mustacchi 
545*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand2,leb128_length,
546*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
547*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
548*4d9fdb46SRobert Mustacchi         break;
549*4d9fdb46SRobert Mustacchi 
550*4d9fdb46SRobert Mustacchi         /*  The operator means: push the currently computed
551*4d9fdb46SRobert Mustacchi             (by the operations encountered so far in this
552*4d9fdb46SRobert Mustacchi             expression) onto the expression stack as the offset
553*4d9fdb46SRobert Mustacchi             in thread-local-storage of the variable. */
554*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_push_tls_address: /* 0xe0  */
555*4d9fdb46SRobert Mustacchi         /* Believed to have no operands. */
556*4d9fdb46SRobert Mustacchi         /* Unimplemented in gdb 7.5.1 ? */
557*4d9fdb46SRobert Mustacchi         break;
558*4d9fdb46SRobert Mustacchi     case DW_OP_deref_type:     /* DWARF5 */
559*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_deref_type: /* 0xf6 */
560*4d9fdb46SRobert Mustacchi         if (loc_ptr >= section_end) {
561*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
562*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
563*4d9fdb46SRobert Mustacchi         }
564*4d9fdb46SRobert Mustacchi         operand1 = *(Dwarf_Small *) loc_ptr;
565*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 1;
566*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
567*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
568*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
569*4d9fdb46SRobert Mustacchi         }
570*4d9fdb46SRobert Mustacchi         offset = offset + 1;
571*4d9fdb46SRobert Mustacchi 
572*4d9fdb46SRobert Mustacchi         /* die offset (uleb128). */
573*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand2,leb128_length,
574*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
575*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
576*4d9fdb46SRobert Mustacchi         break;
577*4d9fdb46SRobert Mustacchi 
578*4d9fdb46SRobert Mustacchi     case DW_OP_implicit_value: /* DWARF4 0xa0 */
579*4d9fdb46SRobert Mustacchi         /*  uleb length of value bytes followed by that
580*4d9fdb46SRobert Mustacchi             number of bytes of the value. */
581*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
582*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
583*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
584*4d9fdb46SRobert Mustacchi 
585*4d9fdb46SRobert Mustacchi         /*  Second operand is block of 'operand1' bytes of stuff. */
586*4d9fdb46SRobert Mustacchi         /*  This using the second operand as a pointer
587*4d9fdb46SRobert Mustacchi             is quite ugly. */
588*4d9fdb46SRobert Mustacchi         /*  This gets an ugly compiler warning. Sorry. */
589*4d9fdb46SRobert Mustacchi         operand2 = (Dwarf_Unsigned)(uintptr_t)loc_ptr;
590*4d9fdb46SRobert Mustacchi         offset = offset + operand1;
591*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + operand1;
592*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
593*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
594*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
595*4d9fdb46SRobert Mustacchi         }
596*4d9fdb46SRobert Mustacchi         break;
597*4d9fdb46SRobert Mustacchi     case DW_OP_stack_value:  /* DWARF4 */
598*4d9fdb46SRobert Mustacchi         break;
599*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_uninit:            /* 0xf0 */
600*4d9fdb46SRobert Mustacchi         /*  Unimplemented in gdb 7.5.1  */
601*4d9fdb46SRobert Mustacchi         /*  Carolyn Tice: Follws a DW_OP_reg or DW_OP_regx
602*4d9fdb46SRobert Mustacchi             and marks the reg as being uninitialized. */
603*4d9fdb46SRobert Mustacchi         break;
604*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_encoded_addr: {      /*  0xf1 */
605*4d9fdb46SRobert Mustacchi         /*  Richard Henderson: The operand is an absolute
606*4d9fdb46SRobert Mustacchi             address.  The first byte of the value
607*4d9fdb46SRobert Mustacchi             is an encoding length: 0 2 4 or 8.  If zero
608*4d9fdb46SRobert Mustacchi             it means the following is address-size.
609*4d9fdb46SRobert Mustacchi             The address then follows immediately for
610*4d9fdb46SRobert Mustacchi             that number of bytes. */
611*4d9fdb46SRobert Mustacchi         int length = 0;
612*4d9fdb46SRobert Mustacchi             int reares = read_encoded_addr(loc_ptr,dbg,
613*4d9fdb46SRobert Mustacchi                 section_end,
614*4d9fdb46SRobert Mustacchi                 &operand1, &length,error);
615*4d9fdb46SRobert Mustacchi             if (reares != DW_DLV_OK) {
616*4d9fdb46SRobert Mustacchi                 return reares;
617*4d9fdb46SRobert Mustacchi             }
618*4d9fdb46SRobert Mustacchi             loc_ptr += length;
619*4d9fdb46SRobert Mustacchi             if (loc_ptr > section_end) {
620*4d9fdb46SRobert Mustacchi                 _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
621*4d9fdb46SRobert Mustacchi                 return DW_DLV_ERROR;
622*4d9fdb46SRobert Mustacchi             }
623*4d9fdb46SRobert Mustacchi             offset  += length;
624*4d9fdb46SRobert Mustacchi         }
625*4d9fdb46SRobert Mustacchi         break;
626*4d9fdb46SRobert Mustacchi     case DW_OP_implicit_pointer:       /* DWARF5 */
627*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_implicit_pointer:{  /* 0xf2 */
628*4d9fdb46SRobert Mustacchi         /*  Jakub Jelinek: The value is an optimized-out
629*4d9fdb46SRobert Mustacchi             pointer value. Represented as
630*4d9fdb46SRobert Mustacchi             an offset_size DIE offset
631*4d9fdb46SRobert Mustacchi             (a simple unsigned integer) in DWARF3,4
632*4d9fdb46SRobert Mustacchi             followed by a signed leb128 offset.
633*4d9fdb46SRobert Mustacchi             For DWARF2, it is actually pointer size
634*4d9fdb46SRobert Mustacchi             (address size).
635*4d9fdb46SRobert Mustacchi             http://www.dwarfstd.org/ShowIssue.php?issue=100831.1 */
636*4d9fdb46SRobert Mustacchi         Dwarf_Small iplen = offset_size;
637*4d9fdb46SRobert Mustacchi         if (version_stamp == DW_CU_VERSION2 /* 2 */ ) {
638*4d9fdb46SRobert Mustacchi             iplen = address_size;
639*4d9fdb46SRobert Mustacchi         }
640*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr,
641*4d9fdb46SRobert Mustacchi             iplen,error,section_end);
642*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + iplen;
643*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
644*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
645*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
646*4d9fdb46SRobert Mustacchi         }
647*4d9fdb46SRobert Mustacchi         offset = offset + iplen;
648*4d9fdb46SRobert Mustacchi 
649*4d9fdb46SRobert Mustacchi         DECODE_LEB128_SWORD_LEN_CK(loc_ptr, operand2,leb128_length,
650*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
651*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
652*4d9fdb46SRobert Mustacchi         }
653*4d9fdb46SRobert Mustacchi 
654*4d9fdb46SRobert Mustacchi         break;
655*4d9fdb46SRobert Mustacchi     case DW_OP_entry_value:       /* DWARF5 */
656*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_entry_value:       /* 0xf3 */
657*4d9fdb46SRobert Mustacchi         /*  Jakub Jelinek: A register reused really soon,
658*4d9fdb46SRobert Mustacchi             but the value is unchanged.  So to represent
659*4d9fdb46SRobert Mustacchi             that value we have a uleb128 size followed
660*4d9fdb46SRobert Mustacchi             by a DWARF expression block that size.
661*4d9fdb46SRobert Mustacchi             http://www.dwarfstd.org/ShowIssue.php?issue=100909.1 */
662*4d9fdb46SRobert Mustacchi 
663*4d9fdb46SRobert Mustacchi         /*  uleb length of value bytes followed by that
664*4d9fdb46SRobert Mustacchi             number of bytes of the value. */
665*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
666*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
667*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
668*4d9fdb46SRobert Mustacchi 
669*4d9fdb46SRobert Mustacchi         /*  Second operand is block of 'operand1' bytes of stuff. */
670*4d9fdb46SRobert Mustacchi         /*  This using the second operand as a pointer
671*4d9fdb46SRobert Mustacchi             is quite ugly. */
672*4d9fdb46SRobert Mustacchi         /*  This gets an ugly compiler warning. Sorry. */
673*4d9fdb46SRobert Mustacchi         operand2 = (Dwarf_Unsigned)(uintptr_t)loc_ptr;
674*4d9fdb46SRobert Mustacchi         offset = offset + operand1;
675*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + operand1;
676*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
677*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
678*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
679*4d9fdb46SRobert Mustacchi         }
680*4d9fdb46SRobert Mustacchi         break;
681*4d9fdb46SRobert Mustacchi     case DW_OP_const_type:           /* DWARF5 */
682*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_const_type:       /* 0xf4 */
683*4d9fdb46SRobert Mustacchi         {
684*4d9fdb46SRobert Mustacchi         /* die offset as uleb. */
685*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
686*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
687*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
688*4d9fdb46SRobert Mustacchi 
689*4d9fdb46SRobert Mustacchi         /*  Next byte is size of following data block.  */
690*4d9fdb46SRobert Mustacchi         operand2 = *loc_ptr;
691*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 1;
692*4d9fdb46SRobert Mustacchi         offset = offset + 1;
693*4d9fdb46SRobert Mustacchi 
694*4d9fdb46SRobert Mustacchi         /*  Operand 3 points to a value in the block of size
695*4d9fdb46SRobert Mustacchi             just gotten as operand2.
696*4d9fdb46SRobert Mustacchi             It must fit in a Dwarf_Unsigned.
697*4d9fdb46SRobert Mustacchi             Get the type from the die at operand1
698*4d9fdb46SRobert Mustacchi             (a CU relative offset). */
699*4d9fdb46SRobert Mustacchi         /*  FIXME: We should do something very different than
700*4d9fdb46SRobert Mustacchi             what we do here! */
701*4d9fdb46SRobert Mustacchi         operand3 = (Dwarf_Unsigned)(uintptr_t)loc_ptr;
702*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + operand2;
703*4d9fdb46SRobert Mustacchi         if (loc_ptr > section_end) {
704*4d9fdb46SRobert Mustacchi             _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
705*4d9fdb46SRobert Mustacchi             return DW_DLV_ERROR;
706*4d9fdb46SRobert Mustacchi         }
707*4d9fdb46SRobert Mustacchi         offset = offset + operand2;
708*4d9fdb46SRobert Mustacchi         }
709*4d9fdb46SRobert Mustacchi         break;
710*4d9fdb46SRobert Mustacchi 
711*4d9fdb46SRobert Mustacchi     case DW_OP_regval_type:           /* DWARF5 */
712*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_regval_type:       /* 0xf5 */
713*4d9fdb46SRobert Mustacchi         /* reg num uleb*/
714*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
715*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
716*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
717*4d9fdb46SRobert Mustacchi         /* cu die off uleb*/
718*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand2,leb128_length,
719*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
720*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
721*4d9fdb46SRobert Mustacchi         break;
722*4d9fdb46SRobert Mustacchi     case DW_OP_convert:           /* DWARF5 */
723*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_convert:       /* 0xf7 */
724*4d9fdb46SRobert Mustacchi     case DW_OP_reinterpret:       /* DWARF5 */
725*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_reinterpret:       /* 0xf9 */
726*4d9fdb46SRobert Mustacchi         /* die offset  or zero */
727*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
728*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
729*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
730*4d9fdb46SRobert Mustacchi         break;
731*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_parameter_ref :       /* 0xfa */
732*4d9fdb46SRobert Mustacchi         /* 4 byte unsigned int */
733*4d9fdb46SRobert Mustacchi         READ_UNALIGNED_CK(dbg, operand1, Dwarf_Unsigned, loc_ptr, 4,
734*4d9fdb46SRobert Mustacchi             error,section_end);;
735*4d9fdb46SRobert Mustacchi         loc_ptr = loc_ptr + 4;
736*4d9fdb46SRobert Mustacchi         offset = offset + 4;
737*4d9fdb46SRobert Mustacchi         break;
738*4d9fdb46SRobert Mustacchi     case DW_OP_addrx :           /* DWARF5 */
739*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_addr_index :  /* 0xfb DebugFission */
740*4d9fdb46SRobert Mustacchi         /*  Index into .debug_addr. The value in .debug_addr
741*4d9fdb46SRobert Mustacchi             is an address. */
742*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
743*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
744*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
745*4d9fdb46SRobert Mustacchi         break;
746*4d9fdb46SRobert Mustacchi     case DW_OP_constx :          /* DWARF5 */
747*4d9fdb46SRobert Mustacchi     case DW_OP_GNU_const_index : /* 0xfc DebugFission */
748*4d9fdb46SRobert Mustacchi         /*  Index into .debug_addr. The value in .debug_addr
749*4d9fdb46SRobert Mustacchi             is a constant that fits in an address. */
750*4d9fdb46SRobert Mustacchi         DECODE_LEB128_UWORD_LEN_CK(loc_ptr, operand1,leb128_length,
751*4d9fdb46SRobert Mustacchi             dbg,error,section_end);
752*4d9fdb46SRobert Mustacchi         offset = offset + leb128_length;
753*4d9fdb46SRobert Mustacchi         break;
754*4d9fdb46SRobert Mustacchi     default:
755*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_LOC_EXPR_BAD);
756*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
757*4d9fdb46SRobert Mustacchi     }
758*4d9fdb46SRobert Mustacchi     if (loc_ptr > section_end) {
759*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg,error,DW_DLE_LOCEXPR_OFF_SECTION_END);
760*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
761*4d9fdb46SRobert Mustacchi     }
762*4d9fdb46SRobert Mustacchi     /* If offset == loc_len this would be normal end-of-expression. */
763*4d9fdb46SRobert Mustacchi     if (offset > loc_len) {
764*4d9fdb46SRobert Mustacchi         /*  We stepped past the end of the expression.
765*4d9fdb46SRobert Mustacchi             This has to be a compiler bug.
766*4d9fdb46SRobert Mustacchi             Operators missing their values cannot be detected
767*4d9fdb46SRobert Mustacchi             as such except at the end of an expression (like this).
768*4d9fdb46SRobert Mustacchi             The results would be wrong if returned.
769*4d9fdb46SRobert Mustacchi         */
770*4d9fdb46SRobert Mustacchi         _dwarf_error(dbg, error, DW_DLE_LOC_BAD_TERMINATION);
771*4d9fdb46SRobert Mustacchi         return DW_DLV_ERROR;
772*4d9fdb46SRobert Mustacchi     }
773*4d9fdb46SRobert Mustacchi     curr_loc->lr_atom = atom;
774*4d9fdb46SRobert Mustacchi     curr_loc->lr_raw1 =  operand1;
775*4d9fdb46SRobert Mustacchi     curr_loc->lr_number =  operand1;
776*4d9fdb46SRobert Mustacchi     curr_loc->lr_raw2 =  operand2;
777*4d9fdb46SRobert Mustacchi     curr_loc->lr_number2 = operand2;
778*4d9fdb46SRobert Mustacchi     /*  lr_number 3 is a pointer to a value iff DW_OP_const or
779*4d9fdb46SRobert Mustacchi         DW_OP_GNU_const_type */
780*4d9fdb46SRobert Mustacchi     curr_loc->lr_raw3 = operand3;
781*4d9fdb46SRobert Mustacchi     curr_loc->lr_number3 = operand3;
782*4d9fdb46SRobert Mustacchi     *nextoffset_out = offset;
783*4d9fdb46SRobert Mustacchi     return DW_DLV_OK;
784*4d9fdb46SRobert Mustacchi }
785