X-Git-Url: https://gitweb.dragonflybsd.org/~tuxillo/dragonfly.git/blobdiff_plain/6b445a628d016cb98daa614ade67aed0ed1d4ec0..ef5ccd6c41237a870dd7242b72b006d6bd42cd07:/contrib/gdb-7/gdb/dwarf2expr.h diff --git a/contrib/gdb-7/gdb/dwarf2expr.h b/contrib/gdb-7/gdb/dwarf2expr.h index fd70bf98a3..e85486a500 100644 --- a/contrib/gdb-7/gdb/dwarf2expr.h +++ b/contrib/gdb-7/gdb/dwarf2expr.h @@ -1,7 +1,6 @@ /* DWARF 2 Expression Evaluator. - Copyright (C) 2001-2003, 2005, 2007-2012 Free Software Foundation, - Inc. + Copyright (C) 2001-2013 Free Software Foundation, Inc. Contributed by Daniel Berlin . @@ -23,6 +22,9 @@ #if !defined (DWARF2EXPR_H) #define DWARF2EXPR_H +#include "leb128.h" +#include "gdbtypes.h" + struct dwarf_expr_context; /* Virtual method table for struct dwarf_expr_context below. */ @@ -53,26 +55,28 @@ struct dwarf_expr_context_funcs /* Execute DW_AT_location expression for the DWARF expression subroutine in the DIE at DIE_OFFSET in the CU from CTX. Do not touch STACK while it being passed to and returned from the called DWARF subroutine. */ - void (*dwarf_call) (struct dwarf_expr_context *ctx, size_t die_offset); + void (*dwarf_call) (struct dwarf_expr_context *ctx, cu_offset 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); + struct type *(*get_base_type) (struct dwarf_expr_context *ctx, cu_offset die); /* Push on DWARF stack an entry evaluated for DW_TAG_GNU_call_site's - DWARF_REG/FB_OFFSET at the caller of specified BATON. If DWARF register - number DWARF_REG specifying the push_dwarf_reg_entry_value parameter is - not -1 FB_OFFSET is ignored. Otherwise FB_OFFSET specifies stack - parameter offset against caller's stack pointer (which equals the callee's - frame base). If DEREF_SIZE is not -1 then use - DW_AT_GNU_call_site_data_value instead of DW_AT_GNU_call_site_value. */ + parameter matching KIND and KIND_U at the caller of specified BATON. + If DEREF_SIZE is not -1 then use DW_AT_GNU_call_site_data_value instead of + DW_AT_GNU_call_site_value. */ void (*push_dwarf_reg_entry_value) (struct dwarf_expr_context *ctx, - int dwarf_reg, CORE_ADDR fb_offset, + enum call_site_parameter_kind kind, + union call_site_parameter_u kind_u, int deref_size); + /* Return the address indexed by DW_OP_GNU_addr_index. + This can throw an exception if the index is out of range. */ + CORE_ADDR (*get_addr_index) (void *baton, unsigned int index); + #if 0 /* Not yet implemented. */ @@ -140,7 +144,7 @@ struct dwarf_expr_context context and operations depending on DW_FORM_ref_addr are not allowed. */ int ref_addr_size; - /* Offset used to relocate DW_OP_addr argument. */ + /* Offset used to relocate DW_OP_addr and DW_OP_GNU_addr_index arguments. */ CORE_ADDR offset; /* An opaque argument provided by the caller, which will be passed @@ -160,7 +164,7 @@ struct dwarf_expr_context /* For DWARF_VALUE_LITERAL, the current literal value's length and data. For DWARF_VALUE_IMPLICIT_POINTER, LEN is the offset of the - target DIE. */ + target DIE of sect_offset kind. */ ULONGEST len; const gdb_byte *data; @@ -231,7 +235,7 @@ struct dwarf_expr_piece struct { /* The referent DIE from DW_OP_GNU_implicit_pointer. */ - ULONGEST die; + sect_offset die; /* The byte offset into the resulting data. */ LONGEST offset; } ptr; @@ -257,14 +261,6 @@ 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); - -const gdb_byte *read_uleb128 (const gdb_byte *buf, const gdb_byte *buf_end, - ULONGEST * r); -const gdb_byte *read_sleb128 (const gdb_byte *buf, const gdb_byte *buf_end, - LONGEST * r); - -const char *dwarf_stack_op_name (unsigned int); - void dwarf_expr_require_composition (const gdb_byte *, const gdb_byte *, const char *); @@ -275,11 +271,14 @@ void ctx_no_get_frame_base (void *baton, const gdb_byte **start, CORE_ADDR ctx_no_get_frame_cfa (void *baton); CORE_ADDR ctx_no_get_frame_pc (void *baton); CORE_ADDR ctx_no_get_tls_address (void *baton, CORE_ADDR offset); -void ctx_no_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset); -struct type *ctx_no_get_base_type (struct dwarf_expr_context *ctx, size_t die); +void ctx_no_dwarf_call (struct dwarf_expr_context *ctx, cu_offset die_offset); +struct type *ctx_no_get_base_type (struct dwarf_expr_context *ctx, + cu_offset die); void ctx_no_push_dwarf_reg_entry_value (struct dwarf_expr_context *ctx, - int dwarf_reg, CORE_ADDR fb_offset, + enum call_site_parameter_kind kind, + union call_site_parameter_u kind_u, int deref_size); +CORE_ADDR ctx_no_get_addr_index (void *baton, unsigned int index); int dwarf_block_to_dwarf_reg (const gdb_byte *buf, const gdb_byte *buf_end); @@ -294,4 +293,50 @@ int dwarf_block_to_sp_offset (struct gdbarch *gdbarch, const gdb_byte *buf, const gdb_byte *buf_end, CORE_ADDR *sp_offset_return); +/* Wrappers around the leb128 reader routines to simplify them for our + purposes. */ + +static inline const gdb_byte * +gdb_read_uleb128 (const gdb_byte *buf, const gdb_byte *buf_end, + uint64_t *r) +{ + size_t bytes_read = read_uleb128_to_uint64 (buf, buf_end, r); + + if (bytes_read == 0) + return NULL; + return buf + bytes_read; +} + +static inline const gdb_byte * +gdb_read_sleb128 (const gdb_byte *buf, const gdb_byte *buf_end, + int64_t *r) +{ + size_t bytes_read = read_sleb128_to_int64 (buf, buf_end, r); + + if (bytes_read == 0) + return NULL; + return buf + bytes_read; +} + +static inline const gdb_byte * +gdb_skip_leb128 (const gdb_byte *buf, const gdb_byte *buf_end) +{ + size_t bytes_read = skip_leb128 (buf, buf_end); + + if (bytes_read == 0) + return NULL; + return buf + bytes_read; +} + +extern const gdb_byte *safe_read_uleb128 (const gdb_byte *buf, + const gdb_byte *buf_end, + uint64_t *r); + +extern const gdb_byte *safe_read_sleb128 (const gdb_byte *buf, + const gdb_byte *buf_end, + int64_t *r); + +extern const gdb_byte *safe_skip_leb128 (const gdb_byte *buf, + const gdb_byte *buf_end); + #endif /* dwarf2expr.h */