* disasm.h (gdb_disassembly): Add GDBARCH parameter.
[deliverable/binutils-gdb.git] / gdb / dwarf2expr.c
CommitLineData
852483bc
MK
1/* DWARF 2 Expression Evaluator.
2
0fb0cc75 3 Copyright (C) 2001, 2002, 2003, 2005, 2007, 2008, 2009
9b254dd1 4 Free Software Foundation, Inc.
852483bc 5
4c2df51b
DJ
6 Contributed by Daniel Berlin (dan@dberlin.org)
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
4c2df51b
DJ
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
4c2df51b
DJ
22
23#include "defs.h"
24#include "symtab.h"
25#include "gdbtypes.h"
26#include "value.h"
27#include "gdbcore.h"
28#include "elf/dwarf2.h"
29#include "dwarf2expr.h"
1e3a102a 30#include "gdb_assert.h"
4c2df51b
DJ
31
32/* Local prototypes. */
33
34static void execute_stack_op (struct dwarf_expr_context *,
852483bc 35 gdb_byte *, gdb_byte *);
df4df182 36static struct type *unsigned_address_type (struct gdbarch *, int);
4c2df51b
DJ
37
38/* Create a new context for the expression evaluator. */
39
40struct dwarf_expr_context *
e4adbba9 41new_dwarf_expr_context (void)
4c2df51b
DJ
42{
43 struct dwarf_expr_context *retval;
44 retval = xcalloc (1, sizeof (struct dwarf_expr_context));
18ec9831
KB
45 retval->stack_len = 0;
46 retval->stack_allocated = 10;
47 retval->stack = xmalloc (retval->stack_allocated * sizeof (CORE_ADDR));
87808bd6
JB
48 retval->num_pieces = 0;
49 retval->pieces = 0;
1e3a102a 50 retval->max_recursion_depth = 0x100;
4c2df51b
DJ
51 return retval;
52}
53
54/* Release the memory allocated to CTX. */
55
56void
57free_dwarf_expr_context (struct dwarf_expr_context *ctx)
58{
59 xfree (ctx->stack);
87808bd6 60 xfree (ctx->pieces);
4c2df51b
DJ
61 xfree (ctx);
62}
63
64/* Expand the memory allocated to CTX's stack to contain at least
65 NEED more elements than are currently used. */
66
67static void
68dwarf_expr_grow_stack (struct dwarf_expr_context *ctx, size_t need)
69{
70 if (ctx->stack_len + need > ctx->stack_allocated)
71 {
18ec9831 72 size_t newlen = ctx->stack_len + need + 10;
4c2df51b 73 ctx->stack = xrealloc (ctx->stack,
18ec9831
KB
74 newlen * sizeof (CORE_ADDR));
75 ctx->stack_allocated = newlen;
4c2df51b
DJ
76 }
77}
78
79/* Push VALUE onto CTX's stack. */
80
81void
82dwarf_expr_push (struct dwarf_expr_context *ctx, CORE_ADDR value)
83{
84 dwarf_expr_grow_stack (ctx, 1);
85 ctx->stack[ctx->stack_len++] = value;
86}
87
88/* Pop the top item off of CTX's stack. */
89
90void
91dwarf_expr_pop (struct dwarf_expr_context *ctx)
92{
93 if (ctx->stack_len <= 0)
8a3fe4f8 94 error (_("dwarf expression stack underflow"));
4c2df51b
DJ
95 ctx->stack_len--;
96}
97
98/* Retrieve the N'th item on CTX's stack. */
99
100CORE_ADDR
101dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n)
102{
ef0fdf07 103 if (ctx->stack_len <= n)
8a3fe4f8 104 error (_("Asked for position %d of stack, stack only has %d elements on it."),
4c2df51b
DJ
105 n, ctx->stack_len);
106 return ctx->stack[ctx->stack_len - (1 + n)];
107
108}
109
87808bd6
JB
110/* Add a new piece to CTX's piece list. */
111static void
112add_piece (struct dwarf_expr_context *ctx,
113 int in_reg, CORE_ADDR value, ULONGEST size)
114{
115 struct dwarf_expr_piece *p;
116
117 ctx->num_pieces++;
118
119 if (ctx->pieces)
120 ctx->pieces = xrealloc (ctx->pieces,
121 (ctx->num_pieces
122 * sizeof (struct dwarf_expr_piece)));
123 else
124 ctx->pieces = xmalloc (ctx->num_pieces
125 * sizeof (struct dwarf_expr_piece));
126
127 p = &ctx->pieces[ctx->num_pieces - 1];
128 p->in_reg = in_reg;
129 p->value = value;
130 p->size = size;
131}
132
4c2df51b
DJ
133/* Evaluate the expression at ADDR (LEN bytes long) using the context
134 CTX. */
135
136void
852483bc 137dwarf_expr_eval (struct dwarf_expr_context *ctx, gdb_byte *addr, size_t len)
4c2df51b 138{
1e3a102a
JK
139 int old_recursion_depth = ctx->recursion_depth;
140
4c2df51b 141 execute_stack_op (ctx, addr, addr + len);
1e3a102a
JK
142
143 /* CTX RECURSION_DEPTH becomes invalid if an exception was thrown here. */
144
145 gdb_assert (ctx->recursion_depth == old_recursion_depth);
4c2df51b
DJ
146}
147
148/* Decode the unsigned LEB128 constant at BUF into the variable pointed to
149 by R, and return the new value of BUF. Verify that it doesn't extend
150 past BUF_END. */
151
852483bc
MK
152gdb_byte *
153read_uleb128 (gdb_byte *buf, gdb_byte *buf_end, ULONGEST * r)
4c2df51b
DJ
154{
155 unsigned shift = 0;
156 ULONGEST result = 0;
852483bc 157 gdb_byte byte;
4c2df51b
DJ
158
159 while (1)
160 {
161 if (buf >= buf_end)
8a3fe4f8 162 error (_("read_uleb128: Corrupted DWARF expression."));
4c2df51b
DJ
163
164 byte = *buf++;
165 result |= (byte & 0x7f) << shift;
166 if ((byte & 0x80) == 0)
167 break;
168 shift += 7;
169 }
170 *r = result;
171 return buf;
172}
173
174/* Decode the signed LEB128 constant at BUF into the variable pointed to
175 by R, and return the new value of BUF. Verify that it doesn't extend
176 past BUF_END. */
177
852483bc
MK
178gdb_byte *
179read_sleb128 (gdb_byte *buf, gdb_byte *buf_end, LONGEST * r)
4c2df51b
DJ
180{
181 unsigned shift = 0;
182 LONGEST result = 0;
852483bc 183 gdb_byte byte;
4c2df51b
DJ
184
185 while (1)
186 {
187 if (buf >= buf_end)
8a3fe4f8 188 error (_("read_sleb128: Corrupted DWARF expression."));
4c2df51b
DJ
189
190 byte = *buf++;
191 result |= (byte & 0x7f) << shift;
192 shift += 7;
193 if ((byte & 0x80) == 0)
194 break;
195 }
196 if (shift < (sizeof (*r) * 8) && (byte & 0x40) != 0)
197 result |= -(1 << shift);
198
199 *r = result;
200 return buf;
201}
202
ae0d2f24
UW
203/* Read an address of size ADDR_SIZE from BUF, and verify that it
204 doesn't extend past BUF_END. */
4c2df51b 205
0d53c4c4 206CORE_ADDR
f7fd4728
UW
207dwarf2_read_address (struct gdbarch *gdbarch, gdb_byte *buf,
208 gdb_byte *buf_end, int addr_size)
4c2df51b
DJ
209{
210 CORE_ADDR result;
211
ae0d2f24 212 if (buf_end - buf < addr_size)
8a3fe4f8 213 error (_("dwarf2_read_address: Corrupted DWARF expression."));
4c2df51b 214
ace186d4
KB
215 /* For most architectures, calling extract_unsigned_integer() alone
216 is sufficient for extracting an address. However, some
217 architectures (e.g. MIPS) use signed addresses and using
218 extract_unsigned_integer() will not produce a correct
f7fd4728
UW
219 result. Make sure we invoke gdbarch_integer_to_address()
220 for those architectures which require it.
ace186d4
KB
221
222 The use of `unsigned_address_type' in the code below refers to
223 the type of buf and has no bearing on the signedness of the
224 address being returned. */
225
f7fd4728
UW
226 if (gdbarch_integer_to_address_p (gdbarch))
227 return gdbarch_integer_to_address
df4df182 228 (gdbarch, unsigned_address_type (gdbarch, addr_size), buf);
f7fd4728
UW
229
230 return extract_unsigned_integer (buf, addr_size);
4c2df51b
DJ
231}
232
ae0d2f24
UW
233/* Return the type of an address of size ADDR_SIZE,
234 for unsigned arithmetic. */
4c2df51b
DJ
235
236static struct type *
df4df182 237unsigned_address_type (struct gdbarch *gdbarch, int addr_size)
4c2df51b 238{
ae0d2f24 239 switch (addr_size)
4c2df51b
DJ
240 {
241 case 2:
df4df182 242 return builtin_type (gdbarch)->builtin_uint16;
4c2df51b 243 case 4:
df4df182 244 return builtin_type (gdbarch)->builtin_uint32;
4c2df51b 245 case 8:
df4df182 246 return builtin_type (gdbarch)->builtin_uint64;
4c2df51b
DJ
247 default:
248 internal_error (__FILE__, __LINE__,
e2e0b3e5 249 _("Unsupported address size.\n"));
4c2df51b
DJ
250 }
251}
252
ae0d2f24
UW
253/* Return the type of an address of size ADDR_SIZE,
254 for signed arithmetic. */
4c2df51b
DJ
255
256static struct type *
df4df182 257signed_address_type (struct gdbarch *gdbarch, int addr_size)
4c2df51b 258{
ae0d2f24 259 switch (addr_size)
4c2df51b
DJ
260 {
261 case 2:
df4df182 262 return builtin_type (gdbarch)->builtin_int16;
4c2df51b 263 case 4:
df4df182 264 return builtin_type (gdbarch)->builtin_int32;
4c2df51b 265 case 8:
df4df182 266 return builtin_type (gdbarch)->builtin_int64;
4c2df51b
DJ
267 default:
268 internal_error (__FILE__, __LINE__,
e2e0b3e5 269 _("Unsupported address size.\n"));
4c2df51b
DJ
270 }
271}
272\f
273/* The engine for the expression evaluator. Using the context in CTX,
274 evaluate the expression between OP_PTR and OP_END. */
275
276static void
852483bc
MK
277execute_stack_op (struct dwarf_expr_context *ctx,
278 gdb_byte *op_ptr, gdb_byte *op_end)
4c2df51b 279{
18ec9831 280 ctx->in_reg = 0;
42be36b3 281 ctx->initialized = 1; /* Default is initialized. */
18ec9831 282
1e3a102a
JK
283 if (ctx->recursion_depth > ctx->max_recursion_depth)
284 error (_("DWARF-2 expression error: Loop detected (%d)."),
285 ctx->recursion_depth);
286 ctx->recursion_depth++;
287
4c2df51b
DJ
288 while (op_ptr < op_end)
289 {
290 enum dwarf_location_atom op = *op_ptr++;
61fbb938 291 CORE_ADDR result;
4c2df51b
DJ
292 ULONGEST uoffset, reg;
293 LONGEST offset;
4c2df51b 294
4c2df51b
DJ
295 switch (op)
296 {
297 case DW_OP_lit0:
298 case DW_OP_lit1:
299 case DW_OP_lit2:
300 case DW_OP_lit3:
301 case DW_OP_lit4:
302 case DW_OP_lit5:
303 case DW_OP_lit6:
304 case DW_OP_lit7:
305 case DW_OP_lit8:
306 case DW_OP_lit9:
307 case DW_OP_lit10:
308 case DW_OP_lit11:
309 case DW_OP_lit12:
310 case DW_OP_lit13:
311 case DW_OP_lit14:
312 case DW_OP_lit15:
313 case DW_OP_lit16:
314 case DW_OP_lit17:
315 case DW_OP_lit18:
316 case DW_OP_lit19:
317 case DW_OP_lit20:
318 case DW_OP_lit21:
319 case DW_OP_lit22:
320 case DW_OP_lit23:
321 case DW_OP_lit24:
322 case DW_OP_lit25:
323 case DW_OP_lit26:
324 case DW_OP_lit27:
325 case DW_OP_lit28:
326 case DW_OP_lit29:
327 case DW_OP_lit30:
328 case DW_OP_lit31:
329 result = op - DW_OP_lit0;
330 break;
331
332 case DW_OP_addr:
f7fd4728
UW
333 result = dwarf2_read_address (ctx->gdbarch,
334 op_ptr, op_end, ctx->addr_size);
ae0d2f24 335 op_ptr += ctx->addr_size;
4c2df51b
DJ
336 break;
337
338 case DW_OP_const1u:
339 result = extract_unsigned_integer (op_ptr, 1);
340 op_ptr += 1;
341 break;
342 case DW_OP_const1s:
343 result = extract_signed_integer (op_ptr, 1);
344 op_ptr += 1;
345 break;
346 case DW_OP_const2u:
347 result = extract_unsigned_integer (op_ptr, 2);
348 op_ptr += 2;
349 break;
350 case DW_OP_const2s:
351 result = extract_signed_integer (op_ptr, 2);
352 op_ptr += 2;
353 break;
354 case DW_OP_const4u:
355 result = extract_unsigned_integer (op_ptr, 4);
356 op_ptr += 4;
357 break;
358 case DW_OP_const4s:
359 result = extract_signed_integer (op_ptr, 4);
360 op_ptr += 4;
361 break;
362 case DW_OP_const8u:
363 result = extract_unsigned_integer (op_ptr, 8);
364 op_ptr += 8;
365 break;
366 case DW_OP_const8s:
367 result = extract_signed_integer (op_ptr, 8);
368 op_ptr += 8;
369 break;
370 case DW_OP_constu:
371 op_ptr = read_uleb128 (op_ptr, op_end, &uoffset);
372 result = uoffset;
373 break;
374 case DW_OP_consts:
375 op_ptr = read_sleb128 (op_ptr, op_end, &offset);
376 result = offset;
377 break;
378
379 /* The DW_OP_reg operations are required to occur alone in
380 location expressions. */
381 case DW_OP_reg0:
382 case DW_OP_reg1:
383 case DW_OP_reg2:
384 case DW_OP_reg3:
385 case DW_OP_reg4:
386 case DW_OP_reg5:
387 case DW_OP_reg6:
388 case DW_OP_reg7:
389 case DW_OP_reg8:
390 case DW_OP_reg9:
391 case DW_OP_reg10:
392 case DW_OP_reg11:
393 case DW_OP_reg12:
394 case DW_OP_reg13:
395 case DW_OP_reg14:
396 case DW_OP_reg15:
397 case DW_OP_reg16:
398 case DW_OP_reg17:
399 case DW_OP_reg18:
400 case DW_OP_reg19:
401 case DW_OP_reg20:
402 case DW_OP_reg21:
403 case DW_OP_reg22:
404 case DW_OP_reg23:
405 case DW_OP_reg24:
406 case DW_OP_reg25:
407 case DW_OP_reg26:
408 case DW_OP_reg27:
409 case DW_OP_reg28:
410 case DW_OP_reg29:
411 case DW_OP_reg30:
412 case DW_OP_reg31:
42be36b3
CT
413 if (op_ptr != op_end
414 && *op_ptr != DW_OP_piece
415 && *op_ptr != DW_OP_GNU_uninit)
8a3fe4f8
AC
416 error (_("DWARF-2 expression error: DW_OP_reg operations must be "
417 "used either alone or in conjuction with DW_OP_piece."));
4c2df51b 418
61fbb938
DJ
419 result = op - DW_OP_reg0;
420 ctx->in_reg = 1;
4c2df51b
DJ
421
422 break;
423
424 case DW_OP_regx:
425 op_ptr = read_uleb128 (op_ptr, op_end, &reg);
18ec9831 426 if (op_ptr != op_end && *op_ptr != DW_OP_piece)
8a3fe4f8
AC
427 error (_("DWARF-2 expression error: DW_OP_reg operations must be "
428 "used either alone or in conjuction with DW_OP_piece."));
4c2df51b 429
61fbb938
DJ
430 result = reg;
431 ctx->in_reg = 1;
4c2df51b
DJ
432 break;
433
434 case DW_OP_breg0:
435 case DW_OP_breg1:
436 case DW_OP_breg2:
437 case DW_OP_breg3:
438 case DW_OP_breg4:
439 case DW_OP_breg5:
440 case DW_OP_breg6:
441 case DW_OP_breg7:
442 case DW_OP_breg8:
443 case DW_OP_breg9:
444 case DW_OP_breg10:
445 case DW_OP_breg11:
446 case DW_OP_breg12:
447 case DW_OP_breg13:
448 case DW_OP_breg14:
449 case DW_OP_breg15:
450 case DW_OP_breg16:
451 case DW_OP_breg17:
452 case DW_OP_breg18:
453 case DW_OP_breg19:
454 case DW_OP_breg20:
455 case DW_OP_breg21:
456 case DW_OP_breg22:
457 case DW_OP_breg23:
458 case DW_OP_breg24:
459 case DW_OP_breg25:
460 case DW_OP_breg26:
461 case DW_OP_breg27:
462 case DW_OP_breg28:
463 case DW_OP_breg29:
464 case DW_OP_breg30:
465 case DW_OP_breg31:
466 {
467 op_ptr = read_sleb128 (op_ptr, op_end, &offset);
61fbb938 468 result = (ctx->read_reg) (ctx->baton, op - DW_OP_breg0);
4c2df51b
DJ
469 result += offset;
470 }
471 break;
472 case DW_OP_bregx:
473 {
474 op_ptr = read_uleb128 (op_ptr, op_end, &reg);
475 op_ptr = read_sleb128 (op_ptr, op_end, &offset);
61fbb938 476 result = (ctx->read_reg) (ctx->baton, reg);
4c2df51b
DJ
477 result += offset;
478 }
479 break;
480 case DW_OP_fbreg:
481 {
852483bc 482 gdb_byte *datastart;
4c2df51b
DJ
483 size_t datalen;
484 unsigned int before_stack_len;
485
486 op_ptr = read_sleb128 (op_ptr, op_end, &offset);
487 /* Rather than create a whole new context, we simply
488 record the stack length before execution, then reset it
489 afterwards, effectively erasing whatever the recursive
490 call put there. */
491 before_stack_len = ctx->stack_len;
da62e633
AC
492 /* FIXME: cagney/2003-03-26: This code should be using
493 get_frame_base_address(), and then implement a dwarf2
494 specific this_base method. */
4c2df51b
DJ
495 (ctx->get_frame_base) (ctx->baton, &datastart, &datalen);
496 dwarf_expr_eval (ctx, datastart, datalen);
497 result = dwarf_expr_fetch (ctx, 0);
61fbb938
DJ
498 if (ctx->in_reg)
499 result = (ctx->read_reg) (ctx->baton, result);
4c2df51b
DJ
500 result = result + offset;
501 ctx->stack_len = before_stack_len;
502 ctx->in_reg = 0;
503 }
504 break;
505 case DW_OP_dup:
506 result = dwarf_expr_fetch (ctx, 0);
507 break;
508
509 case DW_OP_drop:
510 dwarf_expr_pop (ctx);
511 goto no_push;
512
513 case DW_OP_pick:
514 offset = *op_ptr++;
515 result = dwarf_expr_fetch (ctx, offset);
516 break;
9f3fe11c
TG
517
518 case DW_OP_swap:
519 {
520 CORE_ADDR t1, t2;
521
522 if (ctx->stack_len < 2)
523 error (_("Not enough elements for DW_OP_swap. Need 2, have %d."),
524 ctx->stack_len);
525 t1 = ctx->stack[ctx->stack_len - 1];
526 t2 = ctx->stack[ctx->stack_len - 2];
527 ctx->stack[ctx->stack_len - 1] = t2;
528 ctx->stack[ctx->stack_len - 2] = t1;
529 goto no_push;
530 }
4c2df51b
DJ
531
532 case DW_OP_over:
533 result = dwarf_expr_fetch (ctx, 1);
534 break;
535
536 case DW_OP_rot:
537 {
538 CORE_ADDR t1, t2, t3;
539
540 if (ctx->stack_len < 3)
8a3fe4f8 541 error (_("Not enough elements for DW_OP_rot. Need 3, have %d."),
4c2df51b
DJ
542 ctx->stack_len);
543 t1 = ctx->stack[ctx->stack_len - 1];
544 t2 = ctx->stack[ctx->stack_len - 2];
545 t3 = ctx->stack[ctx->stack_len - 3];
546 ctx->stack[ctx->stack_len - 1] = t2;
547 ctx->stack[ctx->stack_len - 2] = t3;
548 ctx->stack[ctx->stack_len - 3] = t1;
549 goto no_push;
550 }
551
552 case DW_OP_deref:
553 case DW_OP_deref_size:
554 case DW_OP_abs:
555 case DW_OP_neg:
556 case DW_OP_not:
557 case DW_OP_plus_uconst:
558 /* Unary operations. */
559 result = dwarf_expr_fetch (ctx, 0);
560 dwarf_expr_pop (ctx);
561
562 switch (op)
563 {
564 case DW_OP_deref:
565 {
ae0d2f24
UW
566 gdb_byte *buf = alloca (ctx->addr_size);
567 (ctx->read_mem) (ctx->baton, buf, result, ctx->addr_size);
f7fd4728
UW
568 result = dwarf2_read_address (ctx->gdbarch,
569 buf, buf + ctx->addr_size,
ae0d2f24 570 ctx->addr_size);
4c2df51b
DJ
571 }
572 break;
573
574 case DW_OP_deref_size:
575 {
ae0d2f24
UW
576 int addr_size = *op_ptr++;
577 gdb_byte *buf = alloca (addr_size);
578 (ctx->read_mem) (ctx->baton, buf, result, addr_size);
f7fd4728
UW
579 result = dwarf2_read_address (ctx->gdbarch,
580 buf, buf + addr_size,
ae0d2f24 581 addr_size);
4c2df51b
DJ
582 }
583 break;
584
585 case DW_OP_abs:
586 if ((signed int) result < 0)
587 result = -result;
588 break;
589 case DW_OP_neg:
590 result = -result;
591 break;
592 case DW_OP_not:
593 result = ~result;
594 break;
595 case DW_OP_plus_uconst:
596 op_ptr = read_uleb128 (op_ptr, op_end, &reg);
597 result += reg;
598 break;
599 }
600 break;
601
602 case DW_OP_and:
603 case DW_OP_div:
604 case DW_OP_minus:
605 case DW_OP_mod:
606 case DW_OP_mul:
607 case DW_OP_or:
608 case DW_OP_plus:
609 case DW_OP_shl:
610 case DW_OP_shr:
611 case DW_OP_shra:
612 case DW_OP_xor:
613 case DW_OP_le:
614 case DW_OP_ge:
615 case DW_OP_eq:
616 case DW_OP_lt:
617 case DW_OP_gt:
618 case DW_OP_ne:
619 {
620 /* Binary operations. Use the value engine to do computations in
621 the right width. */
622 CORE_ADDR first, second;
623 enum exp_opcode binop;
624 struct value *val1, *val2;
df4df182 625 struct type *stype, *utype;
4c2df51b
DJ
626
627 second = dwarf_expr_fetch (ctx, 0);
628 dwarf_expr_pop (ctx);
629
b263358a 630 first = dwarf_expr_fetch (ctx, 0);
4c2df51b
DJ
631 dwarf_expr_pop (ctx);
632
df4df182
UW
633 utype = unsigned_address_type (ctx->gdbarch, ctx->addr_size);
634 stype = signed_address_type (ctx->gdbarch, ctx->addr_size);
635 val1 = value_from_longest (utype, first);
636 val2 = value_from_longest (utype, second);
4c2df51b
DJ
637
638 switch (op)
639 {
640 case DW_OP_and:
641 binop = BINOP_BITWISE_AND;
642 break;
643 case DW_OP_div:
644 binop = BINOP_DIV;
99c87dab 645 break;
4c2df51b
DJ
646 case DW_OP_minus:
647 binop = BINOP_SUB;
648 break;
649 case DW_OP_mod:
650 binop = BINOP_MOD;
651 break;
652 case DW_OP_mul:
653 binop = BINOP_MUL;
654 break;
655 case DW_OP_or:
656 binop = BINOP_BITWISE_IOR;
657 break;
658 case DW_OP_plus:
659 binop = BINOP_ADD;
660 break;
661 case DW_OP_shl:
662 binop = BINOP_LSH;
663 break;
664 case DW_OP_shr:
665 binop = BINOP_RSH;
99c87dab 666 break;
4c2df51b
DJ
667 case DW_OP_shra:
668 binop = BINOP_RSH;
df4df182 669 val1 = value_from_longest (stype, first);
4c2df51b
DJ
670 break;
671 case DW_OP_xor:
672 binop = BINOP_BITWISE_XOR;
673 break;
674 case DW_OP_le:
675 binop = BINOP_LEQ;
676 break;
677 case DW_OP_ge:
678 binop = BINOP_GEQ;
679 break;
680 case DW_OP_eq:
681 binop = BINOP_EQUAL;
682 break;
683 case DW_OP_lt:
684 binop = BINOP_LESS;
685 break;
686 case DW_OP_gt:
687 binop = BINOP_GTR;
688 break;
689 case DW_OP_ne:
690 binop = BINOP_NOTEQUAL;
691 break;
692 default:
693 internal_error (__FILE__, __LINE__,
e2e0b3e5 694 _("Can't be reached."));
4c2df51b
DJ
695 }
696 result = value_as_long (value_binop (val1, val2, binop));
697 }
698 break;
699
700 case DW_OP_GNU_push_tls_address:
c3228f12
EZ
701 /* Variable is at a constant offset in the thread-local
702 storage block into the objfile for the current thread and
703 the dynamic linker module containing this expression. Here
704 we return returns the offset from that base. The top of the
705 stack has the offset from the beginning of the thread
706 control block at which the variable is located. Nothing
707 should follow this operator, so the top of stack would be
708 returned. */
4c2df51b
DJ
709 result = dwarf_expr_fetch (ctx, 0);
710 dwarf_expr_pop (ctx);
711 result = (ctx->get_tls_address) (ctx->baton, result);
712 break;
713
714 case DW_OP_skip:
715 offset = extract_signed_integer (op_ptr, 2);
716 op_ptr += 2;
717 op_ptr += offset;
718 goto no_push;
719
720 case DW_OP_bra:
721 offset = extract_signed_integer (op_ptr, 2);
722 op_ptr += 2;
723 if (dwarf_expr_fetch (ctx, 0) != 0)
724 op_ptr += offset;
725 dwarf_expr_pop (ctx);
726 goto no_push;
727
728 case DW_OP_nop:
729 goto no_push;
730
87808bd6
JB
731 case DW_OP_piece:
732 {
733 ULONGEST size;
734 CORE_ADDR addr_or_regnum;
735
736 /* Record the piece. */
737 op_ptr = read_uleb128 (op_ptr, op_end, &size);
738 addr_or_regnum = dwarf_expr_fetch (ctx, 0);
739 add_piece (ctx, ctx->in_reg, addr_or_regnum, size);
740
741 /* Pop off the address/regnum, and clear the in_reg flag. */
742 dwarf_expr_pop (ctx);
743 ctx->in_reg = 0;
744 }
745 goto no_push;
746
42be36b3
CT
747 case DW_OP_GNU_uninit:
748 if (op_ptr != op_end)
9c482037 749 error (_("DWARF-2 expression error: DW_OP_GNU_uninit must always "
42be36b3
CT
750 "be the very last op."));
751
752 ctx->initialized = 0;
753 goto no_push;
754
4c2df51b 755 default:
8a3fe4f8 756 error (_("Unhandled dwarf expression opcode 0x%x"), op);
4c2df51b
DJ
757 }
758
759 /* Most things push a result value. */
760 dwarf_expr_push (ctx, result);
761 no_push:;
762 }
1e3a102a
JK
763
764 ctx->recursion_depth--;
765 gdb_assert (ctx->recursion_depth >= 0);
4c2df51b 766}
This page took 0.446135 seconds and 4 git commands to generate.