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"
31 /* Local prototypes. */
33 static void execute_stack_op (struct dwarf_expr_context
*,
34 gdb_byte
*, gdb_byte
*);
35 static struct type
*unsigned_address_type (void);
37 /* Create a new context for the expression evaluator. */
39 struct dwarf_expr_context
*
40 new_dwarf_expr_context (void)
42 struct dwarf_expr_context
*retval
;
43 retval
= xcalloc (1, sizeof (struct dwarf_expr_context
));
44 retval
->stack_len
= 0;
45 retval
->stack_allocated
= 10;
46 retval
->stack
= xmalloc (retval
->stack_allocated
* sizeof (CORE_ADDR
));
47 retval
->num_pieces
= 0;
52 /* Release the memory allocated to CTX. */
55 free_dwarf_expr_context (struct dwarf_expr_context
*ctx
)
62 /* Expand the memory allocated to CTX's stack to contain at least
63 NEED more elements than are currently used. */
66 dwarf_expr_grow_stack (struct dwarf_expr_context
*ctx
, size_t need
)
68 if (ctx
->stack_len
+ need
> ctx
->stack_allocated
)
70 size_t newlen
= ctx
->stack_len
+ need
+ 10;
71 ctx
->stack
= xrealloc (ctx
->stack
,
72 newlen
* sizeof (CORE_ADDR
));
73 ctx
->stack_allocated
= newlen
;
77 /* Push VALUE onto CTX's stack. */
80 dwarf_expr_push (struct dwarf_expr_context
*ctx
, CORE_ADDR value
)
82 dwarf_expr_grow_stack (ctx
, 1);
83 ctx
->stack
[ctx
->stack_len
++] = value
;
86 /* Pop the top item off of CTX's stack. */
89 dwarf_expr_pop (struct dwarf_expr_context
*ctx
)
91 if (ctx
->stack_len
<= 0)
92 error (_("dwarf expression stack underflow"));
96 /* Retrieve the N'th item on CTX's stack. */
99 dwarf_expr_fetch (struct dwarf_expr_context
*ctx
, int n
)
101 if (ctx
->stack_len
<= n
)
102 error (_("Asked for position %d of stack, stack only has %d elements on it."),
104 return ctx
->stack
[ctx
->stack_len
- (1 + n
)];
108 /* Add a new piece to CTX's piece list. */
110 add_piece (struct dwarf_expr_context
*ctx
,
111 int in_reg
, CORE_ADDR value
, ULONGEST size
)
113 struct dwarf_expr_piece
*p
;
118 ctx
->pieces
= xrealloc (ctx
->pieces
,
120 * sizeof (struct dwarf_expr_piece
)));
122 ctx
->pieces
= xmalloc (ctx
->num_pieces
123 * sizeof (struct dwarf_expr_piece
));
125 p
= &ctx
->pieces
[ctx
->num_pieces
- 1];
131 /* Evaluate the expression at ADDR (LEN bytes long) using the context
135 dwarf_expr_eval (struct dwarf_expr_context
*ctx
, gdb_byte
*addr
, size_t len
)
137 execute_stack_op (ctx
, addr
, addr
+ len
);
140 /* Decode the unsigned LEB128 constant at BUF into the variable pointed to
141 by R, and return the new value of BUF. Verify that it doesn't extend
145 read_uleb128 (gdb_byte
*buf
, gdb_byte
*buf_end
, ULONGEST
* r
)
154 error (_("read_uleb128: Corrupted DWARF expression."));
157 result
|= (byte
& 0x7f) << shift
;
158 if ((byte
& 0x80) == 0)
166 /* Decode the signed LEB128 constant at BUF into the variable pointed to
167 by R, and return the new value of BUF. Verify that it doesn't extend
171 read_sleb128 (gdb_byte
*buf
, gdb_byte
*buf_end
, LONGEST
* r
)
180 error (_("read_sleb128: Corrupted DWARF expression."));
183 result
|= (byte
& 0x7f) << shift
;
185 if ((byte
& 0x80) == 0)
188 if (shift
< (sizeof (*r
) * 8) && (byte
& 0x40) != 0)
189 result
|= -(1 << shift
);
195 /* Read an address from BUF, and verify that it doesn't extend past
196 BUF_END. The address is returned, and *BYTES_READ is set to the
197 number of bytes read from BUF. */
200 dwarf2_read_address (gdb_byte
*buf
, gdb_byte
*buf_end
, int *bytes_read
)
204 if (buf_end
- buf
< gdbarch_addr_bit (current_gdbarch
) / TARGET_CHAR_BIT
)
205 error (_("dwarf2_read_address: Corrupted DWARF expression."));
207 *bytes_read
= gdbarch_addr_bit (current_gdbarch
) / TARGET_CHAR_BIT
;
209 /* For most architectures, calling extract_unsigned_integer() alone
210 is sufficient for extracting an address. However, some
211 architectures (e.g. MIPS) use signed addresses and using
212 extract_unsigned_integer() will not produce a correct
213 result. Turning the unsigned integer into a value and then
214 decomposing that value as an address will cause
215 gdbarch_integer_to_address() to be invoked for those
216 architectures which require it. Thus, using value_as_address()
217 will produce the correct result for both types of architectures.
219 One concern regarding the use of values for this purpose is
220 efficiency. Obviously, these extra calls will take more time to
221 execute and creating a value takes more space, space which will
222 have to be garbage collected at a later time. If constructing
223 and then decomposing a value for this purpose proves to be too
224 inefficient, then gdbarch_integer_to_address() can be called
227 The use of `unsigned_address_type' in the code below refers to
228 the type of buf and has no bearing on the signedness of the
229 address being returned. */
231 result
= value_as_address (value_from_longest
232 (unsigned_address_type (),
233 extract_unsigned_integer
235 gdbarch_addr_bit (current_gdbarch
)
236 / TARGET_CHAR_BIT
)));
241 /* Return the type of an address, for unsigned arithmetic. */
244 unsigned_address_type (void)
246 switch (gdbarch_addr_bit (current_gdbarch
) / TARGET_CHAR_BIT
)
249 return builtin_type_uint16
;
251 return builtin_type_uint32
;
253 return builtin_type_uint64
;
255 internal_error (__FILE__
, __LINE__
,
256 _("Unsupported address size.\n"));
260 /* Return the type of an address, for signed arithmetic. */
263 signed_address_type (void)
265 switch (gdbarch_addr_bit (current_gdbarch
) / TARGET_CHAR_BIT
)
268 return builtin_type_int16
;
270 return builtin_type_int32
;
272 return builtin_type_int64
;
274 internal_error (__FILE__
, __LINE__
,
275 _("Unsupported address size.\n"));
279 /* The engine for the expression evaluator. Using the context in CTX,
280 evaluate the expression between OP_PTR and OP_END. */
283 execute_stack_op (struct dwarf_expr_context
*ctx
,
284 gdb_byte
*op_ptr
, gdb_byte
*op_end
)
287 ctx
->initialized
= 1; /* Default is initialized. */
289 while (op_ptr
< op_end
)
291 enum dwarf_location_atom op
= *op_ptr
++;
293 ULONGEST uoffset
, reg
;
331 result
= op
- DW_OP_lit0
;
335 result
= dwarf2_read_address (op_ptr
, op_end
, &bytes_read
);
336 op_ptr
+= bytes_read
;
340 result
= extract_unsigned_integer (op_ptr
, 1);
344 result
= extract_signed_integer (op_ptr
, 1);
348 result
= extract_unsigned_integer (op_ptr
, 2);
352 result
= extract_signed_integer (op_ptr
, 2);
356 result
= extract_unsigned_integer (op_ptr
, 4);
360 result
= extract_signed_integer (op_ptr
, 4);
364 result
= extract_unsigned_integer (op_ptr
, 8);
368 result
= extract_signed_integer (op_ptr
, 8);
372 op_ptr
= read_uleb128 (op_ptr
, op_end
, &uoffset
);
376 op_ptr
= read_sleb128 (op_ptr
, op_end
, &offset
);
380 /* The DW_OP_reg operations are required to occur alone in
381 location expressions. */
415 && *op_ptr
!= DW_OP_piece
416 && *op_ptr
!= DW_OP_GNU_uninit
)
417 error (_("DWARF-2 expression error: DW_OP_reg operations must be "
418 "used either alone or in conjuction with DW_OP_piece."));
420 result
= op
- DW_OP_reg0
;
426 op_ptr
= read_uleb128 (op_ptr
, op_end
, ®
);
427 if (op_ptr
!= op_end
&& *op_ptr
!= DW_OP_piece
)
428 error (_("DWARF-2 expression error: DW_OP_reg operations must be "
429 "used either alone or in conjuction with DW_OP_piece."));
468 op_ptr
= read_sleb128 (op_ptr
, op_end
, &offset
);
469 result
= (ctx
->read_reg
) (ctx
->baton
, op
- DW_OP_breg0
);
475 op_ptr
= read_uleb128 (op_ptr
, op_end
, ®
);
476 op_ptr
= read_sleb128 (op_ptr
, op_end
, &offset
);
477 result
= (ctx
->read_reg
) (ctx
->baton
, reg
);
485 unsigned int before_stack_len
;
487 op_ptr
= read_sleb128 (op_ptr
, op_end
, &offset
);
488 /* Rather than create a whole new context, we simply
489 record the stack length before execution, then reset it
490 afterwards, effectively erasing whatever the recursive
492 before_stack_len
= ctx
->stack_len
;
493 /* FIXME: cagney/2003-03-26: This code should be using
494 get_frame_base_address(), and then implement a dwarf2
495 specific this_base method. */
496 (ctx
->get_frame_base
) (ctx
->baton
, &datastart
, &datalen
);
497 dwarf_expr_eval (ctx
, datastart
, datalen
);
498 result
= dwarf_expr_fetch (ctx
, 0);
500 result
= (ctx
->read_reg
) (ctx
->baton
, result
);
501 result
= result
+ offset
;
502 ctx
->stack_len
= before_stack_len
;
507 result
= dwarf_expr_fetch (ctx
, 0);
511 dwarf_expr_pop (ctx
);
516 result
= dwarf_expr_fetch (ctx
, offset
);
520 result
= dwarf_expr_fetch (ctx
, 1);
525 CORE_ADDR t1
, t2
, t3
;
527 if (ctx
->stack_len
< 3)
528 error (_("Not enough elements for DW_OP_rot. Need 3, have %d."),
530 t1
= ctx
->stack
[ctx
->stack_len
- 1];
531 t2
= ctx
->stack
[ctx
->stack_len
- 2];
532 t3
= ctx
->stack
[ctx
->stack_len
- 3];
533 ctx
->stack
[ctx
->stack_len
- 1] = t2
;
534 ctx
->stack
[ctx
->stack_len
- 2] = t3
;
535 ctx
->stack
[ctx
->stack_len
- 3] = t1
;
540 case DW_OP_deref_size
:
544 case DW_OP_plus_uconst
:
545 /* Unary operations. */
546 result
= dwarf_expr_fetch (ctx
, 0);
547 dwarf_expr_pop (ctx
);
553 gdb_byte
*buf
= alloca (gdbarch_addr_bit (current_gdbarch
)
557 (ctx
->read_mem
) (ctx
->baton
, buf
, result
,
558 gdbarch_addr_bit (current_gdbarch
)
560 result
= dwarf2_read_address (buf
,
561 buf
+ (gdbarch_addr_bit
568 case DW_OP_deref_size
:
571 = alloca (gdbarch_addr_bit (current_gdbarch
)
575 (ctx
->read_mem
) (ctx
->baton
, buf
, result
, *op_ptr
++);
576 result
= dwarf2_read_address (buf
,
577 buf
+ (gdbarch_addr_bit
585 if ((signed int) result
< 0)
594 case DW_OP_plus_uconst
:
595 op_ptr
= read_uleb128 (op_ptr
, op_end
, ®
);
619 /* Binary operations. Use the value engine to do computations in
621 CORE_ADDR first
, second
;
622 enum exp_opcode binop
;
623 struct value
*val1
, *val2
;
625 second
= dwarf_expr_fetch (ctx
, 0);
626 dwarf_expr_pop (ctx
);
628 first
= dwarf_expr_fetch (ctx
, 0);
629 dwarf_expr_pop (ctx
);
631 val1
= value_from_longest (unsigned_address_type (), first
);
632 val2
= value_from_longest (unsigned_address_type (), second
);
637 binop
= BINOP_BITWISE_AND
;
652 binop
= BINOP_BITWISE_IOR
;
665 val1
= value_from_longest (signed_address_type (), first
);
668 binop
= BINOP_BITWISE_XOR
;
686 binop
= BINOP_NOTEQUAL
;
689 internal_error (__FILE__
, __LINE__
,
690 _("Can't be reached."));
692 result
= value_as_long (value_binop (val1
, val2
, binop
));
696 case DW_OP_GNU_push_tls_address
:
697 /* Variable is at a constant offset in the thread-local
698 storage block into the objfile for the current thread and
699 the dynamic linker module containing this expression. Here
700 we return returns the offset from that base. The top of the
701 stack has the offset from the beginning of the thread
702 control block at which the variable is located. Nothing
703 should follow this operator, so the top of stack would be
705 result
= dwarf_expr_fetch (ctx
, 0);
706 dwarf_expr_pop (ctx
);
707 result
= (ctx
->get_tls_address
) (ctx
->baton
, result
);
711 offset
= extract_signed_integer (op_ptr
, 2);
717 offset
= extract_signed_integer (op_ptr
, 2);
719 if (dwarf_expr_fetch (ctx
, 0) != 0)
721 dwarf_expr_pop (ctx
);
730 CORE_ADDR addr_or_regnum
;
732 /* Record the piece. */
733 op_ptr
= read_uleb128 (op_ptr
, op_end
, &size
);
734 addr_or_regnum
= dwarf_expr_fetch (ctx
, 0);
735 add_piece (ctx
, ctx
->in_reg
, addr_or_regnum
, size
);
737 /* Pop off the address/regnum, and clear the in_reg flag. */
738 dwarf_expr_pop (ctx
);
743 case DW_OP_GNU_uninit
:
744 if (op_ptr
!= op_end
)
745 error (_("DWARF-2 expression error: DW_OP_GNU_unint must always "
746 "be the very last op."));
748 ctx
->initialized
= 0;
752 error (_("Unhandled dwarf expression opcode 0x%x"), op
);
755 /* Most things push a result value. */
756 dwarf_expr_push (ctx
, result
);