mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 14:49:38 +08:00
gdb
PR gdb/12617: * value.h (value_from_contents): Declare. * value.c (value_from_contents): New function. * dwarf2read.c (dwarf_stack_op_name): Add new values. (dwarf2_get_die_type): New function. * dwarf2loc.c (dwarf_expr_get_base_type): New function. (allocate_piece_closure): Acquire reference to values. (read_pieced_value): Update for value-based expressions. (write_pieced_value): Likewise. (free_pieced_value_closure): Call value_free as needed. (dwarf2_evaluate_loc_desc_full): Set get_base_type field. Update for value-based expressions. * dwarf2loc.h (dwarf2_get_die_type): Declare. * dwarf2expr.h (struct dwarf_stack_value) <value>: Change type. <get_base_type>: New field. (struct dwarf_expr_piece) <v.value>: Change type. <v.regno>: New field. (struct dwarf_expr_context) <mark>: New field. (dwarf_expr_piece, dwarf_expr_fetch): Update. (dwarf_expr_pop, dwarf_expr_push): Remove. (dwarf_expr_push_address): Declare. * dwarf2expr.c (dwarf_arch_cookie): New global. (struct dwarf_gdbarch_types): New. (dwarf_gdbarch_types_init, dwarf_expr_address_type): New functions. (dwarf_expr_push): Change type of 'value' argument. Update. Now static. (dwarf_expr_push_address): New function. (dwarf_expr_pop): Now static. (dwarf_expr_fetch): Change return type. (dwarf_require_integral): New function. (dwarf_expr_fetch): Simplify. (add_piece): Update. (base_types_equal_p, dwarf_get_base_type, get_unsigned_type): New functions. (execute_stack_op) <sign_ext>: Remove. Use values for DWARF stack. <DW_OP_GNU_const_type, DW_OP_GNU_deref_type, DW_OP_GNU_regval_type, DW_OP_GNU_convert, DW_OP_GNU_reinterpret>: New cases. (_initialize_dwarf2expr): New function. (add_piece): Update. (new_dwarf_expr_context): Set new field. (free_dwarf_expr_context): Call value_free_to_mark. * dwarf2-frame.c (no_base_type): New function. (execute_stack_op): Set get_base_type field. Update. gdb/testsuite * gdb.dwarf2/typeddwarf.S: New file. * gdb.dwarf2/typeddwarf.c: New file. * gdb.dwarf2/typeddwarf.exp: New file.
This commit is contained in:
@ -51,7 +51,7 @@ enum dwarf_value_location
|
||||
|
||||
struct dwarf_stack_value
|
||||
{
|
||||
ULONGEST value;
|
||||
struct value *value;
|
||||
|
||||
/* Non-zero if the piece is in memory and is known to be
|
||||
on the program's stack. It is always ok to set this to zero.
|
||||
@ -81,6 +81,10 @@ struct dwarf_expr_context
|
||||
/* Offset used to relocate DW_OP_addr argument. */
|
||||
CORE_ADDR offset;
|
||||
|
||||
/* The evaluator is value-based, and frees values up to this point
|
||||
when the expression context is destroyed. */
|
||||
struct value *mark;
|
||||
|
||||
/* An opaque argument provided by the caller, which will be passed
|
||||
to all of the callback functions. */
|
||||
void *baton;
|
||||
@ -111,6 +115,13 @@ struct dwarf_expr_context
|
||||
being passed to and returned from the called DWARF subroutine. */
|
||||
void (*dwarf_call) (struct dwarf_expr_context *ctx, size_t die_offset);
|
||||
|
||||
/* Return the base type given by the indicated DIE. This can throw
|
||||
an exception if the DIE is invalid or does not represent a base
|
||||
type. If can also be NULL in the special case where the
|
||||
callbacks are not performing evaluation, and thus it is
|
||||
meaningful to substitute a stub type of the correct size. */
|
||||
struct type *(*get_base_type) (struct dwarf_expr_context *ctx, size_t die);
|
||||
|
||||
#if 0
|
||||
/* Not yet implemented. */
|
||||
|
||||
@ -180,9 +191,11 @@ struct dwarf_expr_piece
|
||||
int in_stack_memory;
|
||||
} mem;
|
||||
|
||||
/* The piece's register number or literal value, for
|
||||
DWARF_VALUE_REGISTER or DWARF_VALUE_STACK pieces. */
|
||||
ULONGEST value;
|
||||
/* The piece's register number, for DWARF_VALUE_REGISTER pieces. */
|
||||
int regno;
|
||||
|
||||
/* The piece's literal value, for DWARF_VALUE_STACK pieces. */
|
||||
struct value *value;
|
||||
|
||||
struct
|
||||
{
|
||||
@ -214,12 +227,12 @@ void free_dwarf_expr_context (struct dwarf_expr_context *ctx);
|
||||
struct cleanup *
|
||||
make_cleanup_free_dwarf_expr_context (struct dwarf_expr_context *ctx);
|
||||
|
||||
void dwarf_expr_push (struct dwarf_expr_context *ctx, ULONGEST value,
|
||||
int in_stack_memory);
|
||||
void dwarf_expr_pop (struct dwarf_expr_context *ctx);
|
||||
void dwarf_expr_push_address (struct dwarf_expr_context *ctx,
|
||||
CORE_ADDR value,
|
||||
int in_stack_memory);
|
||||
void dwarf_expr_eval (struct dwarf_expr_context *ctx, const gdb_byte *addr,
|
||||
size_t len);
|
||||
ULONGEST dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n);
|
||||
struct value *dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n);
|
||||
CORE_ADDR dwarf_expr_fetch_address (struct dwarf_expr_context *ctx, int n);
|
||||
int dwarf_expr_fetch_in_stack_memory (struct dwarf_expr_context *ctx, int n);
|
||||
|
||||
|
Reference in New Issue
Block a user