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 |