| OLD | NEW |
| 1 /* DWARF 2 Expression Evaluator. | 1 /* DWARF 2 Expression Evaluator. |
| 2 | 2 |
| 3 Copyright (C) 2001-2003, 2005, 2007-2012 Free Software Foundation, | 3 Copyright (C) 2001-2003, 2005, 2007-2012 Free Software Foundation, |
| 4 Inc. | 4 Inc. |
| 5 | 5 |
| 6 Contributed by Daniel Berlin <dan@dberlin.org>. | 6 Contributed by Daniel Berlin <dan@dberlin.org>. |
| 7 | 7 |
| 8 This file is part of GDB. | 8 This file is part of GDB. |
| 9 | 9 |
| 10 This program is free software; you can redistribute it and/or modify | 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 | 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 | 12 the Free Software Foundation; either version 3 of the License, or |
| 13 (at your option) any later version. | 13 (at your option) any later version. |
| 14 | 14 |
| 15 This program is distributed in the hope that it will be useful, | 15 This program is distributed in the hope that it will be useful, |
| 16 but WITHOUT ANY WARRANTY; without even the implied warranty of | 16 but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 GNU General Public License for more details. | 18 GNU General Public License for more details. |
| 19 | 19 |
| 20 You should have received a copy of the GNU General Public License | 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/>. */ | 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
| 22 | 22 |
| 23 #if !defined (DWARF2EXPR_H) | 23 #if !defined (DWARF2EXPR_H) |
| 24 #define DWARF2EXPR_H | 24 #define DWARF2EXPR_H |
| 25 | 25 |
| 26 #include "leb128.h" |
| 27 #include "gdbtypes.h" |
| 28 |
| 26 struct dwarf_expr_context; | 29 struct dwarf_expr_context; |
| 27 | 30 |
| 28 /* Virtual method table for struct dwarf_expr_context below. */ | 31 /* Virtual method table for struct dwarf_expr_context below. */ |
| 29 | 32 |
| 30 struct dwarf_expr_context_funcs | 33 struct dwarf_expr_context_funcs |
| 31 { | 34 { |
| 32 /* Return the value of register number REGNUM. */ | 35 /* Return the value of register number REGNUM. */ |
| 33 CORE_ADDR (*read_reg) (void *baton, int regnum); | 36 CORE_ADDR (*read_reg) (void *baton, int regnum); |
| 34 | 37 |
| 35 /* Read LENGTH bytes at ADDR into BUF. */ | 38 /* Read LENGTH bytes at ADDR into BUF. */ |
| (...skipping 10 matching lines...) Expand all Loading... |
| 46 /* Return the PC for the frame. */ | 49 /* Return the PC for the frame. */ |
| 47 CORE_ADDR (*get_frame_pc) (void *baton); | 50 CORE_ADDR (*get_frame_pc) (void *baton); |
| 48 | 51 |
| 49 /* Return the thread-local storage address for | 52 /* Return the thread-local storage address for |
| 50 DW_OP_GNU_push_tls_address. */ | 53 DW_OP_GNU_push_tls_address. */ |
| 51 CORE_ADDR (*get_tls_address) (void *baton, CORE_ADDR offset); | 54 CORE_ADDR (*get_tls_address) (void *baton, CORE_ADDR offset); |
| 52 | 55 |
| 53 /* Execute DW_AT_location expression for the DWARF expression subroutine in | 56 /* Execute DW_AT_location expression for the DWARF expression subroutine in |
| 54 the DIE at DIE_OFFSET in the CU from CTX. Do not touch STACK while it | 57 the DIE at DIE_OFFSET in the CU from CTX. Do not touch STACK while it |
| 55 being passed to and returned from the called DWARF subroutine. */ | 58 being passed to and returned from the called DWARF subroutine. */ |
| 56 void (*dwarf_call) (struct dwarf_expr_context *ctx, size_t die_offset); | 59 void (*dwarf_call) (struct dwarf_expr_context *ctx, cu_offset die_offset); |
| 57 | 60 |
| 58 /* Return the base type given by the indicated DIE. This can throw | 61 /* Return the base type given by the indicated DIE. This can throw |
| 59 an exception if the DIE is invalid or does not represent a base | 62 an exception if the DIE is invalid or does not represent a base |
| 60 type. If can also be NULL in the special case where the | 63 type. If can also be NULL in the special case where the |
| 61 callbacks are not performing evaluation, and thus it is | 64 callbacks are not performing evaluation, and thus it is |
| 62 meaningful to substitute a stub type of the correct size. */ | 65 meaningful to substitute a stub type of the correct size. */ |
| 63 struct type *(*get_base_type) (struct dwarf_expr_context *ctx, size_t die); | 66 struct type *(*get_base_type) (struct dwarf_expr_context *ctx, cu_offset die); |
| 64 | 67 |
| 65 /* Push on DWARF stack an entry evaluated for DW_TAG_GNU_call_site's | 68 /* Push on DWARF stack an entry evaluated for DW_TAG_GNU_call_site's |
| 66 DWARF_REG/FB_OFFSET at the caller of specified BATON. If DWARF register | 69 parameter matching KIND and KIND_U at the caller of specified BATON. |
| 67 number DWARF_REG specifying the push_dwarf_reg_entry_value parameter is | 70 If DEREF_SIZE is not -1 then use DW_AT_GNU_call_site_data_value instead of |
| 68 not -1 FB_OFFSET is ignored. Otherwise FB_OFFSET specifies stack | 71 DW_AT_GNU_call_site_value. */ |
| 69 parameter offset against caller's stack pointer (which equals the callee's | |
| 70 frame base). If DEREF_SIZE is not -1 then use | |
| 71 DW_AT_GNU_call_site_data_value instead of DW_AT_GNU_call_site_value. */ | |
| 72 void (*push_dwarf_reg_entry_value) (struct dwarf_expr_context *ctx, | 72 void (*push_dwarf_reg_entry_value) (struct dwarf_expr_context *ctx, |
| 73 » » » » int dwarf_reg, CORE_ADDR fb_offset, | 73 » » » » enum call_site_parameter_kind kind, |
| 74 » » » » union call_site_parameter_u kind_u, |
| 74 int deref_size); | 75 int deref_size); |
| 75 | 76 |
| 77 /* Return the address indexed by DW_OP_GNU_addr_index. |
| 78 This can throw an exception if the index is out of range. */ |
| 79 CORE_ADDR (*get_addr_index) (void *baton, unsigned int index); |
| 80 |
| 76 #if 0 | 81 #if 0 |
| 77 /* Not yet implemented. */ | 82 /* Not yet implemented. */ |
| 78 | 83 |
| 79 /* Return the `object address' for DW_OP_push_object_address. */ | 84 /* Return the `object address' for DW_OP_push_object_address. */ |
| 80 CORE_ADDR (*get_object_address) (void *baton); | 85 CORE_ADDR (*get_object_address) (void *baton); |
| 81 #endif | 86 #endif |
| 82 }; | 87 }; |
| 83 | 88 |
| 84 /* The location of a value. */ | 89 /* The location of a value. */ |
| 85 enum dwarf_value_location | 90 enum dwarf_value_location |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 /* Target architecture to use for address operations. */ | 138 /* Target architecture to use for address operations. */ |
| 134 struct gdbarch *gdbarch; | 139 struct gdbarch *gdbarch; |
| 135 | 140 |
| 136 /* Target address size in bytes. */ | 141 /* Target address size in bytes. */ |
| 137 int addr_size; | 142 int addr_size; |
| 138 | 143 |
| 139 /* DW_FORM_ref_addr size in bytes. If -1 DWARF is executed from a frame | 144 /* DW_FORM_ref_addr size in bytes. If -1 DWARF is executed from a frame |
| 140 context and operations depending on DW_FORM_ref_addr are not allowed. */ | 145 context and operations depending on DW_FORM_ref_addr are not allowed. */ |
| 141 int ref_addr_size; | 146 int ref_addr_size; |
| 142 | 147 |
| 143 /* Offset used to relocate DW_OP_addr argument. */ | 148 /* Offset used to relocate DW_OP_addr and DW_OP_GNU_addr_index arguments. */ |
| 144 CORE_ADDR offset; | 149 CORE_ADDR offset; |
| 145 | 150 |
| 146 /* An opaque argument provided by the caller, which will be passed | 151 /* An opaque argument provided by the caller, which will be passed |
| 147 to all of the callback functions. */ | 152 to all of the callback functions. */ |
| 148 void *baton; | 153 void *baton; |
| 149 | 154 |
| 150 /* Callback functions. */ | 155 /* Callback functions. */ |
| 151 const struct dwarf_expr_context_funcs *funcs; | 156 const struct dwarf_expr_context_funcs *funcs; |
| 152 | 157 |
| 153 /* The current depth of dwarf expression recursion, via DW_OP_call*, | 158 /* The current depth of dwarf expression recursion, via DW_OP_call*, |
| 154 DW_OP_fbreg, DW_OP_push_object_address, etc., and the maximum | 159 DW_OP_fbreg, DW_OP_push_object_address, etc., and the maximum |
| 155 depth we'll tolerate before raising an error. */ | 160 depth we'll tolerate before raising an error. */ |
| 156 int recursion_depth, max_recursion_depth; | 161 int recursion_depth, max_recursion_depth; |
| 157 | 162 |
| 158 /* Location of the value. */ | 163 /* Location of the value. */ |
| 159 enum dwarf_value_location location; | 164 enum dwarf_value_location location; |
| 160 | 165 |
| 161 /* For DWARF_VALUE_LITERAL, the current literal value's length and | 166 /* For DWARF_VALUE_LITERAL, the current literal value's length and |
| 162 data. For DWARF_VALUE_IMPLICIT_POINTER, LEN is the offset of the | 167 data. For DWARF_VALUE_IMPLICIT_POINTER, LEN is the offset of the |
| 163 target DIE. */ | 168 target DIE of cu_offset kind. */ |
| 164 ULONGEST len; | 169 ULONGEST len; |
| 165 const gdb_byte *data; | 170 const gdb_byte *data; |
| 166 | 171 |
| 167 /* Initialization status of variable: Non-zero if variable has been | 172 /* Initialization status of variable: Non-zero if variable has been |
| 168 initialized; zero otherwise. */ | 173 initialized; zero otherwise. */ |
| 169 int initialized; | 174 int initialized; |
| 170 | 175 |
| 171 /* An array of pieces. PIECES points to its first element; | 176 /* An array of pieces. PIECES points to its first element; |
| 172 NUM_PIECES is its length. | 177 NUM_PIECES is its length. |
| 173 | 178 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 for DWARF_VALUE_LITERAL pieces. */ | 229 for DWARF_VALUE_LITERAL pieces. */ |
| 225 const gdb_byte *data; | 230 const gdb_byte *data; |
| 226 /* The length of the available data. */ | 231 /* The length of the available data. */ |
| 227 ULONGEST length; | 232 ULONGEST length; |
| 228 } literal; | 233 } literal; |
| 229 | 234 |
| 230 /* Used for DWARF_VALUE_IMPLICIT_POINTER. */ | 235 /* Used for DWARF_VALUE_IMPLICIT_POINTER. */ |
| 231 struct | 236 struct |
| 232 { | 237 { |
| 233 /* The referent DIE from DW_OP_GNU_implicit_pointer. */ | 238 /* The referent DIE from DW_OP_GNU_implicit_pointer. */ |
| 234 ULONGEST die; | 239 cu_offset die; |
| 235 /* The byte offset into the resulting data. */ | 240 /* The byte offset into the resulting data. */ |
| 236 LONGEST offset; | 241 LONGEST offset; |
| 237 } ptr; | 242 } ptr; |
| 238 } v; | 243 } v; |
| 239 | 244 |
| 240 /* The length of the piece, in bits. */ | 245 /* The length of the piece, in bits. */ |
| 241 ULONGEST size; | 246 ULONGEST size; |
| 242 /* The piece offset, in bits. */ | 247 /* The piece offset, in bits. */ |
| 243 ULONGEST offset; | 248 ULONGEST offset; |
| 244 }; | 249 }; |
| 245 | 250 |
| 246 struct dwarf_expr_context *new_dwarf_expr_context (void); | 251 struct dwarf_expr_context *new_dwarf_expr_context (void); |
| 247 void free_dwarf_expr_context (struct dwarf_expr_context *ctx); | 252 void free_dwarf_expr_context (struct dwarf_expr_context *ctx); |
| 248 struct cleanup * | 253 struct cleanup * |
| 249 make_cleanup_free_dwarf_expr_context (struct dwarf_expr_context *ctx); | 254 make_cleanup_free_dwarf_expr_context (struct dwarf_expr_context *ctx); |
| 250 | 255 |
| 251 void dwarf_expr_push_address (struct dwarf_expr_context *ctx, | 256 void dwarf_expr_push_address (struct dwarf_expr_context *ctx, |
| 252 CORE_ADDR value, | 257 CORE_ADDR value, |
| 253 int in_stack_memory); | 258 int in_stack_memory); |
| 254 void dwarf_expr_eval (struct dwarf_expr_context *ctx, const gdb_byte *addr, | 259 void dwarf_expr_eval (struct dwarf_expr_context *ctx, const gdb_byte *addr, |
| 255 size_t len); | 260 size_t len); |
| 256 struct value *dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n); | 261 struct value *dwarf_expr_fetch (struct dwarf_expr_context *ctx, int n); |
| 257 CORE_ADDR dwarf_expr_fetch_address (struct dwarf_expr_context *ctx, int n); | 262 CORE_ADDR dwarf_expr_fetch_address (struct dwarf_expr_context *ctx, int n); |
| 258 int dwarf_expr_fetch_in_stack_memory (struct dwarf_expr_context *ctx, int n); | 263 int dwarf_expr_fetch_in_stack_memory (struct dwarf_expr_context *ctx, int n); |
| 259 | 264 |
| 260 | |
| 261 const gdb_byte *read_uleb128 (const gdb_byte *buf, const gdb_byte *buf_end, | |
| 262 ULONGEST * r); | |
| 263 const gdb_byte *read_sleb128 (const gdb_byte *buf, const gdb_byte *buf_end, | |
| 264 LONGEST * r); | |
| 265 | |
| 266 const char *dwarf_stack_op_name (unsigned int); | |
| 267 | |
| 268 void dwarf_expr_require_composition (const gdb_byte *, const gdb_byte *, | 265 void dwarf_expr_require_composition (const gdb_byte *, const gdb_byte *, |
| 269 const char *); | 266 const char *); |
| 270 | 267 |
| 271 /* Stub dwarf_expr_context_funcs implementations. */ | 268 /* Stub dwarf_expr_context_funcs implementations. */ |
| 272 | 269 |
| 273 void ctx_no_get_frame_base (void *baton, const gdb_byte **start, | 270 void ctx_no_get_frame_base (void *baton, const gdb_byte **start, |
| 274 size_t *length); | 271 size_t *length); |
| 275 CORE_ADDR ctx_no_get_frame_cfa (void *baton); | 272 CORE_ADDR ctx_no_get_frame_cfa (void *baton); |
| 276 CORE_ADDR ctx_no_get_frame_pc (void *baton); | 273 CORE_ADDR ctx_no_get_frame_pc (void *baton); |
| 277 CORE_ADDR ctx_no_get_tls_address (void *baton, CORE_ADDR offset); | 274 CORE_ADDR ctx_no_get_tls_address (void *baton, CORE_ADDR offset); |
| 278 void ctx_no_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset); | 275 void ctx_no_dwarf_call (struct dwarf_expr_context *ctx, cu_offset die_offset); |
| 279 struct type *ctx_no_get_base_type (struct dwarf_expr_context *ctx, size_t die); | 276 struct type *ctx_no_get_base_type (struct dwarf_expr_context *ctx, |
| 277 » » » » cu_offset die); |
| 280 void ctx_no_push_dwarf_reg_entry_value (struct dwarf_expr_context *ctx, | 278 void ctx_no_push_dwarf_reg_entry_value (struct dwarf_expr_context *ctx, |
| 281 » » » » » int dwarf_reg, CORE_ADDR fb_offset, | 279 » » » » » enum call_site_parameter_kind kind, |
| 280 » » » » » union call_site_parameter_u kind_u, |
| 282 int deref_size); | 281 int deref_size); |
| 282 CORE_ADDR ctx_no_get_addr_index (void *baton, unsigned int index); |
| 283 | 283 |
| 284 int dwarf_block_to_dwarf_reg (const gdb_byte *buf, const gdb_byte *buf_end); | 284 int dwarf_block_to_dwarf_reg (const gdb_byte *buf, const gdb_byte *buf_end); |
| 285 | 285 |
| 286 int dwarf_block_to_dwarf_reg_deref (const gdb_byte *buf, | 286 int dwarf_block_to_dwarf_reg_deref (const gdb_byte *buf, |
| 287 const gdb_byte *buf_end, | 287 const gdb_byte *buf_end, |
| 288 CORE_ADDR *deref_size_return); | 288 CORE_ADDR *deref_size_return); |
| 289 | 289 |
| 290 int dwarf_block_to_fb_offset (const gdb_byte *buf, const gdb_byte *buf_end, | 290 int dwarf_block_to_fb_offset (const gdb_byte *buf, const gdb_byte *buf_end, |
| 291 CORE_ADDR *fb_offset_return); | 291 CORE_ADDR *fb_offset_return); |
| 292 | 292 |
| 293 int dwarf_block_to_sp_offset (struct gdbarch *gdbarch, const gdb_byte *buf, | 293 int dwarf_block_to_sp_offset (struct gdbarch *gdbarch, const gdb_byte *buf, |
| 294 const gdb_byte *buf_end, | 294 const gdb_byte *buf_end, |
| 295 CORE_ADDR *sp_offset_return); | 295 CORE_ADDR *sp_offset_return); |
| 296 | 296 |
| 297 /* Wrappers around the leb128 reader routines to simplify them for our |
| 298 purposes. */ |
| 299 |
| 300 static inline const gdb_byte * |
| 301 gdb_read_uleb128 (const gdb_byte *buf, const gdb_byte *buf_end, |
| 302 uint64_t *r) |
| 303 { |
| 304 size_t bytes_read = read_uleb128_to_uint64 (buf, buf_end, r); |
| 305 |
| 306 if (bytes_read == 0) |
| 307 return NULL; |
| 308 return buf + bytes_read; |
| 309 } |
| 310 |
| 311 static inline const gdb_byte * |
| 312 gdb_read_sleb128 (const gdb_byte *buf, const gdb_byte *buf_end, |
| 313 int64_t *r) |
| 314 { |
| 315 size_t bytes_read = read_sleb128_to_int64 (buf, buf_end, r); |
| 316 |
| 317 if (bytes_read == 0) |
| 318 return NULL; |
| 319 return buf + bytes_read; |
| 320 } |
| 321 |
| 322 static inline const gdb_byte * |
| 323 gdb_skip_leb128 (const gdb_byte *buf, const gdb_byte *buf_end) |
| 324 { |
| 325 size_t bytes_read = skip_leb128 (buf, buf_end); |
| 326 |
| 327 if (bytes_read == 0) |
| 328 return NULL; |
| 329 return buf + bytes_read; |
| 330 } |
| 331 |
| 332 extern const gdb_byte *safe_read_uleb128 (const gdb_byte *buf, |
| 333 const gdb_byte *buf_end, |
| 334 uint64_t *r); |
| 335 |
| 336 extern const gdb_byte *safe_read_sleb128 (const gdb_byte *buf, |
| 337 const gdb_byte *buf_end, |
| 338 int64_t *r); |
| 339 |
| 340 extern const gdb_byte *safe_skip_leb128 (const gdb_byte *buf, |
| 341 const gdb_byte *buf_end); |
| 342 |
| 297 #endif /* dwarf2expr.h */ | 343 #endif /* dwarf2expr.h */ |
| OLD | NEW |