852483bc79
(struct dwarf_expr_context): Use `gdb_byte *' in read_mem and get_frame_base function pointers. (read_uleb128, read_sleb128): Change return type and types of first two arguments to `gdb_byte *'. (dwarf2_read_address): Change types of first two arguments to `gdb_byte *'. * dwarf2expr.c: Tweak comment. (dwarf_expr_eval): Change type of second argument to `gdb_byte *'. (read_uleb128, read_sleb128): Change return type and types of first two arguments to `gdb_byte *'. (dwarf2_read_address): Change types of first two arguments to `gdb_byte *'. (execute_stack_op): Change types of last two arguments to `gdb_byte *'. Use `gdb_byte *' for byte buffers. * dwarf2loc.h: Tweak comment. (struct dwarf2_locexpr_baton, struct dwarf2_loclist_baton): Use `gdb_byte *' for byte buffers. * dwarf2loc.c (find_location_expression): Change return type to `gdb_byte *'. Use `gdb_byte *' for byte buffers. Change length to `unsigned int'. (dwarf_expr_read_reg): Use `gdb_byte *' for byte buffer. Remove bogus cast. (dwarf_expr_read_mem): Change type of second argument to `gdb_byte *'. (dwarf_expr_frame_base): Change type of second argument to `gdb_byte **'. (dwarf2_evaluate_loc_desc): Change type of third argument to `gdb_byte *'. (needs_frame_read_mem): Change type of second argument to `gdb_byte *'. (needs_frame_frame_base): Change type of second argument `gdb_byte **'. Use gdb_byte for lit0. (dwarf2_tracepoint_var_ref): Change type of fourth argument to `gdb_byte *'. Use `gdb_byte *' for byte buffer. (loclist_read_variable, loclist_tracepoint_var_ref): Use `gdb_byte *' for byte buffer. * dwarf2-frame.c (struct dwarf2_cie, struct dwarf2_fde) (struct dwarf2_frame_state): Use gdb_byte instead of `unsigned char'. (read_reg): Use `gdb_byte *' for byte buffers. Remove redundant cast. (read_mem): Change second argument to `gdb_byte *'. (no_get_frame_base): Change second argument to `gdb_byte **'. (execute_stack_op): Change first argument to `gdb_byte *'. (execute_cfa_program): Change first two arguments to `gdb_byte *'. Use gdb_byte instead of `unsigned int'. Use temprorary variable to store result of read_uleb128. (struct comp_unit): Use `gdb_byte *' for byte buffers. (read_1_byte, read_4_bytes, read_8_bytes): Change last argument to `gdb_byte *'. (read_unsigned_leb128, read_signed_leb128): Change second argument to `gdb_byte *'. Use gdb_byte instead of `unsigned char'. (read_initial_length): Change second argument to `gdb_byte *'. Remove redundant casts. (read_encoded_value): Use gdb_byte instead of `unsigned char'. Remove bogus casts. (decode_frame_entry_1): Change return type and second argument to `gdb_byte *'. Use `gdb_byte *' for byte buffers. Use gdb_byte instead of `unsigned char'. (decode_frame_entry): Change return type and second argument to `gdb_byte *'. Use `gdb_byte *' for byte buffers. (dwarf2_build_frame_info): Use `gdb_byte *' for byte buffers.
139 lines
5.2 KiB
C
139 lines
5.2 KiB
C
/* DWARF 2 Expression Evaluator.
|
|
|
|
Copyright 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
|
|
|
|
Contributed by Daniel Berlin <dan@dberlin.org>.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Boston, MA 02111-1307, USA. */
|
|
|
|
#if !defined (DWARF2EXPR_H)
|
|
#define DWARF2EXPR_H
|
|
|
|
/* The expression evaluator works with a dwarf_expr_context, describing
|
|
its current state and its callbacks. */
|
|
struct dwarf_expr_context
|
|
{
|
|
/* The stack of values, allocated with xmalloc. */
|
|
CORE_ADDR *stack;
|
|
|
|
/* The number of values currently pushed on the stack, and the
|
|
number of elements allocated to the stack. */
|
|
int stack_len, stack_allocated;
|
|
|
|
/* An opaque argument provided by the caller, which will be passed
|
|
to all of the callback functions. */
|
|
void *baton;
|
|
|
|
/* Return the value of register number REGNUM. */
|
|
CORE_ADDR (*read_reg) (void *baton, int regnum);
|
|
|
|
/* Read LENGTH bytes at ADDR into BUF. */
|
|
void (*read_mem) (void *baton, gdb_byte *buf, CORE_ADDR addr, size_t length);
|
|
|
|
/* Return the location expression for the frame base attribute, in
|
|
START and LENGTH. The result must be live until the current
|
|
expression evaluation is complete. */
|
|
void (*get_frame_base) (void *baton, gdb_byte **start, size_t *length);
|
|
|
|
/* Return the thread-local storage address for
|
|
DW_OP_GNU_push_tls_address. */
|
|
CORE_ADDR (*get_tls_address) (void *baton, CORE_ADDR offset);
|
|
|
|
#if 0
|
|
/* Not yet implemented. */
|
|
|
|
/* Return the location expression for the dwarf expression
|
|
subroutine in the die at OFFSET in the current compilation unit.
|
|
The result must be live until the current expression evaluation
|
|
is complete. */
|
|
unsigned char *(*get_subr) (void *baton, off_t offset, size_t *length);
|
|
|
|
/* Return the `object address' for DW_OP_push_object_address. */
|
|
CORE_ADDR (*get_object_address) (void *baton);
|
|
#endif
|
|
|
|
/* The current depth of dwarf expression recursion, via DW_OP_call*,
|
|
DW_OP_fbreg, DW_OP_push_object_address, etc., and the maximum
|
|
depth we'll tolerate before raising an error. */
|
|
int recursion_depth, max_recursion_depth;
|
|
|
|
/* Non-zero if the result is in a register. The register number
|
|
will be on the expression stack. */
|
|
int in_reg;
|
|
|
|
/* An array of pieces. PIECES points to its first element;
|
|
NUM_PIECES is its length.
|
|
|
|
Each time DW_OP_piece is executed, we add a new element to the
|
|
end of this array, recording the current top of the stack, the
|
|
current in_reg flag, and the size given as the operand to
|
|
DW_OP_piece. We then pop the top value from the stack, clear the
|
|
in_reg flag, and resume evaluation.
|
|
|
|
The Dwarf spec doesn't say whether DW_OP_piece pops the top value
|
|
from the stack. We do, ensuring that clients of this interface
|
|
expecting to see a value left on the top of the stack (say, code
|
|
evaluating frame base expressions or CFA's specified with
|
|
DW_CFA_def_cfa_expression) will get an error if the expression
|
|
actually marks all the values it computes as pieces.
|
|
|
|
If an expression never uses DW_OP_piece, num_pieces will be zero.
|
|
(It would be nice to present these cases as expressions yielding
|
|
a single piece, with in_reg clear, so that callers need not
|
|
distinguish between the no-DW_OP_piece and one-DW_OP_piece cases.
|
|
But expressions with no DW_OP_piece operations have no value to
|
|
place in a piece's 'size' field; the size comes from the
|
|
surrounding data. So the two cases need to be handled
|
|
separately.) */
|
|
int num_pieces;
|
|
struct dwarf_expr_piece *pieces;
|
|
};
|
|
|
|
|
|
/* A piece of an object, as recorded by DW_OP_piece. */
|
|
struct dwarf_expr_piece
|
|
{
|
|
/* If IN_REG is zero, then the piece is in memory, and VALUE is its address.
|
|
If IN_REG is non-zero, then the piece is in a register, and VALUE
|
|
is the register number. */
|
|
int in_reg;
|
|
|
|
/* This piece's address or register number. */
|
|
CORE_ADDR value;
|
|
|
|
/* The length of the piece, in bytes. */
|
|
ULONGEST size;
|
|
};
|
|
|
|
struct dwarf_expr_context *new_dwarf_expr_context (void);
|
|
void free_dwarf_expr_context (struct dwarf_expr_context *ctx);
|
|
|
|
void dwarf_expr_push (struct dwarf_expr_context *ctx, CORE_ADDR value);
|
|
void dwarf_expr_pop (struct dwarf_expr_context *ctx);
|
|
void dwarf_expr_eval (struct dwarf_expr_context *ctx, unsigned char *addr,
|
|
size_t len);
|
|
CORE_ADDR dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n);
|
|
|
|
|
|
gdb_byte *read_uleb128 (gdb_byte *buf, gdb_byte *buf_end, ULONGEST * r);
|
|
gdb_byte *read_sleb128 (gdb_byte *buf, gdb_byte *buf_end, LONGEST * r);
|
|
CORE_ADDR dwarf2_read_address (gdb_byte *buf, gdb_byte *buf_end,
|
|
int *bytes_read);
|
|
|
|
#endif /* dwarf2expr.h */
|