1 /* DWARF 2 Expression Evaluator.
3 Copyright (C) 2001, 2002, 2003, 2005, 2007, 2008
4 Free Software Foundation, Inc.
6 Contributed by Daniel Berlin (dan@dberlin.org)
8 This file is part of GDB.
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
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
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.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
28 #include "elf/dwarf2.h"
29 #include "dwarf2expr.h"
30 #include "gdb_assert.h"
32 /* Local prototypes. */
34 static void execute_stack_op (struct dwarf_expr_context *,
35 gdb_byte *, gdb_byte *);
36 static struct type *unsigned_address_type (int);
38 /* Create a new context for the expression evaluator. */
40 struct dwarf_expr_context *
41 new_dwarf_expr_context (void)
43 struct dwarf_expr_context *retval;
44 retval = xcalloc (1, sizeof (struct dwarf_expr_context));
45 retval->stack_len = 0;
46 retval->stack_allocated = 10;
47 retval->stack = xmalloc (retval->stack_allocated * sizeof (CORE_ADDR));
48 retval->num_pieces = 0;
50 retval->max_recursion_depth = 0x100;
54 /* Release the memory allocated to CTX. */
57 free_dwarf_expr_context (struct dwarf_expr_context *ctx)
64 /* Expand the memory allocated to CTX's stack to contain at least
65 NEED more elements than are currently used. */
68 dwarf_expr_grow_stack (struct dwarf_expr_context *ctx, size_t need)
70 if (ctx->stack_len + need > ctx->stack_allocated)
72 size_t newlen = ctx->stack_len + need + 10;
73 ctx->stack = xrealloc (ctx->stack,
74 newlen * sizeof (CORE_ADDR));
75 ctx->stack_allocated = newlen;
79 /* Push VALUE onto CTX's stack. */
82 dwarf_expr_push (struct dwarf_expr_context *ctx, CORE_ADDR value)
84 dwarf_expr_grow_stack (ctx, 1);
85 ctx->stack[ctx->stack_len++] = value;
88 /* Pop the top item off of CTX's stack. */
91 dwarf_expr_pop (struct dwarf_expr_context *ctx)
93 if (ctx->stack_len <= 0)
94 error (_("dwarf expression stack underflow"));
98 /* Retrieve the N'th item on CTX's stack. */
101 dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n)
103 if (ctx->stack_len <= n)
104 error (_("Asked for position %d of stack, stack only has %d elements on it."),
106 return ctx->stack[ctx->stack_len - (1 + n)];
110 /* Add a new piece to CTX's piece list. */
112 add_piece (struct dwarf_expr_context *ctx,
113 int in_reg, CORE_ADDR value, ULONGEST size)
115 struct dwarf_expr_piece *p;
120 ctx->pieces = xrealloc (ctx->pieces,
122 * sizeof (struct dwarf_expr_piece)));
124 ctx->pieces = xmalloc (ctx->num_pieces
125 * sizeof (struct dwarf_expr_piece));
127 p = &ctx->pieces[ctx->num_pieces - 1];
133 /* Evaluate the expression at ADDR (LEN bytes long) using the context
137 dwarf_expr_eval (struct dwarf_expr_context *ctx, gdb_byte *addr, size_t len)
139 int old_recursion_depth = ctx->recursion_depth;
141 execute_stack_op (ctx, addr, addr + len);
143 /* CTX RECURSION_DEPTH becomes invalid if an exception was thrown here. */
145 gdb_assert (ctx->recursion_depth == old_recursion_depth);
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
153 read_uleb128 (gdb_byte *buf, gdb_byte *buf_end, ULONGEST * r)
162 error (_("read_uleb128: Corrupted DWARF expression."));
165 result |= (byte & 0x7f) << shift;
166 if ((byte & 0x80) == 0)
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
179 read_sleb128 (gdb_byte *buf, gdb_byte *buf_end, LONGEST * r)
188 error (_("read_sleb128: Corrupted DWARF expression."));
191 result |= (byte & 0x7f) << shift;
193 if ((byte & 0x80) == 0)
196 if (shift < (sizeof (*r) * 8) && (byte & 0x40) != 0)
197 result |= -(1 << shift);
203 /* Read an address of size ADDR_SIZE from BUF, and verify that it
204 doesn't extend past BUF_END. */
207 dwarf2_read_address (gdb_byte *buf, gdb_byte *buf_end, int addr_size)
211 if (buf_end - buf < addr_size)
212 error (_("dwarf2_read_address: Corrupted DWARF expression."));
214 /* For most architectures, calling extract_unsigned_integer() alone
215 is sufficient for extracting an address. However, some
216 architectures (e.g. MIPS) use signed addresses and using
217 extract_unsigned_integer() will not produce a correct
218 result. Turning the unsigned integer into a value and then
219 decomposing that value as an address will cause
220 gdbarch_integer_to_address() to be invoked for those
221 architectures which require it. Thus, using value_as_address()
222 will produce the correct result for both types of architectures.
224 One concern regarding the use of values for this purpose is
225 efficiency. Obviously, these extra calls will take more time to
226 execute and creating a value takes more space, space which will
227 have to be garbage collected at a later time. If constructing
228 and then decomposing a value for this purpose proves to be too
229 inefficient, then gdbarch_integer_to_address() can be called
232 The use of `unsigned_address_type' in the code below refers to
233 the type of buf and has no bearing on the signedness of the
234 address being returned. */
236 result = value_as_address (value_from_longest
237 (unsigned_address_type (addr_size),
238 extract_unsigned_integer (buf, addr_size)));
242 /* Return the type of an address of size ADDR_SIZE,
243 for unsigned arithmetic. */
246 unsigned_address_type (int addr_size)
251 return builtin_type_uint16;
253 return builtin_type_uint32;
255 return builtin_type_uint64;
257 internal_error (__FILE__, __LINE__,
258 _("Unsupported address size.\n"));
262 /* Return the type of an address of size ADDR_SIZE,
263 for signed arithmetic. */
266 signed_address_type (int addr_size)
271 return builtin_type_int16;
273 return builtin_type_int32;
275 return builtin_type_int64;
277 internal_error (__FILE__, __LINE__,
278 _("Unsupported address size.\n"));
282 /* The engine for the expression evaluator. Using the context in CTX,
283 evaluate the expression between OP_PTR and OP_END. */
286 execute_stack_op (struct dwarf_expr_context *ctx,
287 gdb_byte *op_ptr, gdb_byte *op_end)
290 ctx->initialized = 1; /* Default is initialized. */
292 if (ctx->recursion_depth > ctx->max_recursion_depth)
293 error (_("DWARF-2 expression error: Loop detected (%d)."),
294 ctx->recursion_depth);
295 ctx->recursion_depth++;
297 while (op_ptr < op_end)
299 enum dwarf_location_atom op = *op_ptr++;
301 ULONGEST uoffset, reg;
338 result = op - DW_OP_lit0;
342 result = dwarf2_read_address (op_ptr, op_end, ctx->addr_size);
343 op_ptr += ctx->addr_size;
347 result = extract_unsigned_integer (op_ptr, 1);
351 result = extract_signed_integer (op_ptr, 1);
355 result = extract_unsigned_integer (op_ptr, 2);
359 result = extract_signed_integer (op_ptr, 2);
363 result = extract_unsigned_integer (op_ptr, 4);
367 result = extract_signed_integer (op_ptr, 4);
371 result = extract_unsigned_integer (op_ptr, 8);
375 result = extract_signed_integer (op_ptr, 8);
379 op_ptr = read_uleb128 (op_ptr, op_end, &uoffset);
383 op_ptr = read_sleb128 (op_ptr, op_end, &offset);
387 /* The DW_OP_reg operations are required to occur alone in
388 location expressions. */
422 && *op_ptr != DW_OP_piece
423 && *op_ptr != DW_OP_GNU_uninit)
424 error (_("DWARF-2 expression error: DW_OP_reg operations must be "
425 "used either alone or in conjuction with DW_OP_piece."));
427 result = op - DW_OP_reg0;
433 op_ptr = read_uleb128 (op_ptr, op_end, ®);
434 if (op_ptr != op_end && *op_ptr != DW_OP_piece)
435 error (_("DWARF-2 expression error: DW_OP_reg operations must be "
436 "used either alone or in conjuction with DW_OP_piece."));
475 op_ptr = read_sleb128 (op_ptr, op_end, &offset);
476 result = (ctx->read_reg) (ctx->baton, op - DW_OP_breg0);
482 op_ptr = read_uleb128 (op_ptr, op_end, ®);
483 op_ptr = read_sleb128 (op_ptr, op_end, &offset);
484 result = (ctx->read_reg) (ctx->baton, reg);
492 unsigned int before_stack_len;
494 op_ptr = read_sleb128 (op_ptr, op_end, &offset);
495 /* Rather than create a whole new context, we simply
496 record the stack length before execution, then reset it
497 afterwards, effectively erasing whatever the recursive
499 before_stack_len = ctx->stack_len;
500 /* FIXME: cagney/2003-03-26: This code should be using
501 get_frame_base_address(), and then implement a dwarf2
502 specific this_base method. */
503 (ctx->get_frame_base) (ctx->baton, &datastart, &datalen);
504 dwarf_expr_eval (ctx, datastart, datalen);
505 result = dwarf_expr_fetch (ctx, 0);
507 result = (ctx->read_reg) (ctx->baton, result);
508 result = result + offset;
509 ctx->stack_len = before_stack_len;
514 result = dwarf_expr_fetch (ctx, 0);
518 dwarf_expr_pop (ctx);
523 result = dwarf_expr_fetch (ctx, offset);
527 result = dwarf_expr_fetch (ctx, 1);
532 CORE_ADDR t1, t2, t3;
534 if (ctx->stack_len < 3)
535 error (_("Not enough elements for DW_OP_rot. Need 3, have %d."),
537 t1 = ctx->stack[ctx->stack_len - 1];
538 t2 = ctx->stack[ctx->stack_len - 2];
539 t3 = ctx->stack[ctx->stack_len - 3];
540 ctx->stack[ctx->stack_len - 1] = t2;
541 ctx->stack[ctx->stack_len - 2] = t3;
542 ctx->stack[ctx->stack_len - 3] = t1;
547 case DW_OP_deref_size:
551 case DW_OP_plus_uconst:
552 /* Unary operations. */
553 result = dwarf_expr_fetch (ctx, 0);
554 dwarf_expr_pop (ctx);
560 gdb_byte *buf = alloca (ctx->addr_size);
561 (ctx->read_mem) (ctx->baton, buf, result, ctx->addr_size);
562 result = dwarf2_read_address (buf, buf + ctx->addr_size,
567 case DW_OP_deref_size:
569 int addr_size = *op_ptr++;
570 gdb_byte *buf = alloca (addr_size);
571 (ctx->read_mem) (ctx->baton, buf, result, addr_size);
572 result = dwarf2_read_address (buf, buf + addr_size,
578 if ((signed int) result < 0)
587 case DW_OP_plus_uconst:
588 op_ptr = read_uleb128 (op_ptr, op_end, ®);
612 /* Binary operations. Use the value engine to do computations in
614 CORE_ADDR first, second;
615 enum exp_opcode binop;
616 struct value *val1, *val2;
618 second = dwarf_expr_fetch (ctx, 0);
619 dwarf_expr_pop (ctx);
621 first = dwarf_expr_fetch (ctx, 0);
622 dwarf_expr_pop (ctx);
624 val1 = value_from_longest
625 (unsigned_address_type (ctx->addr_size), first);
626 val2 = value_from_longest
627 (unsigned_address_type (ctx->addr_size), second);
632 binop = BINOP_BITWISE_AND;
647 binop = BINOP_BITWISE_IOR;
660 val1 = value_from_longest
661 (signed_address_type (ctx->addr_size), first);
664 binop = BINOP_BITWISE_XOR;
682 binop = BINOP_NOTEQUAL;
685 internal_error (__FILE__, __LINE__,
686 _("Can't be reached."));
688 result = value_as_long (value_binop (val1, val2, binop));
692 case DW_OP_GNU_push_tls_address:
693 /* Variable is at a constant offset in the thread-local
694 storage block into the objfile for the current thread and
695 the dynamic linker module containing this expression. Here
696 we return returns the offset from that base. The top of the
697 stack has the offset from the beginning of the thread
698 control block at which the variable is located. Nothing
699 should follow this operator, so the top of stack would be
701 result = dwarf_expr_fetch (ctx, 0);
702 dwarf_expr_pop (ctx);
703 result = (ctx->get_tls_address) (ctx->baton, result);
707 offset = extract_signed_integer (op_ptr, 2);
713 offset = extract_signed_integer (op_ptr, 2);
715 if (dwarf_expr_fetch (ctx, 0) != 0)
717 dwarf_expr_pop (ctx);
726 CORE_ADDR addr_or_regnum;
728 /* Record the piece. */
729 op_ptr = read_uleb128 (op_ptr, op_end, &size);
730 addr_or_regnum = dwarf_expr_fetch (ctx, 0);
731 add_piece (ctx, ctx->in_reg, addr_or_regnum, size);
733 /* Pop off the address/regnum, and clear the in_reg flag. */
734 dwarf_expr_pop (ctx);
739 case DW_OP_GNU_uninit:
740 if (op_ptr != op_end)
741 error (_("DWARF-2 expression error: DW_OP_GNU_unint must always "
742 "be the very last op."));
744 ctx->initialized = 0;
748 error (_("Unhandled dwarf expression opcode 0x%x"), op);
751 /* Most things push a result value. */
752 dwarf_expr_push (ctx, result);
756 ctx->recursion_depth--;
757 gdb_assert (ctx->recursion_depth >= 0);