2 /*--------------------------------------------------------------------*/
3 /*--- Basic definitions and helper functions for DWARF3. ---*/
5 /*--------------------------------------------------------------------*/
8 This file is part of Valgrind, a dynamic binary instrumentation
11 Copyright (C) 2008-2010 OpenWorks LLP
14 This program is free software; you can redistribute it and/or
15 modify it under the terms of the GNU General Public License as
16 published by the Free Software Foundation; either version 2 of the
17 License, or (at your option) any later version.
19 This program is distributed in the hope that it will be useful, but
20 WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
29 The GNU General Public License is contained in the file COPYING.
31 Neither the names of the U.S. Department of Energy nor the
32 University of California nor the names of its contributors may be
33 used to endorse or promote products derived from this software
34 without prior written permission.
37 #include "pub_core_basics.h"
38 #include "pub_core_debuginfo.h"
39 #include "pub_core_libcassert.h"
40 #include "pub_core_libcprint.h"
41 #include "pub_core_options.h"
42 #include "pub_core_xarray.h"
44 #include "pub_core_vki.h" /* VKI_PROT_READ */
45 #include "pub_core_aspacemgr.h" /* VG_(is_valid_for_client) */
47 #include "priv_misc.h"
48 #include "priv_d3basics.h" /* self */
49 #include "priv_storage.h"
51 HChar* ML_(pp_DW_children) ( DW_children hashch )
54 case DW_children_no: return "no children";
55 case DW_children_yes: return "has children";
56 default: return "DW_children_???";
60 HChar* ML_(pp_DW_TAG) ( DW_TAG tag )
63 case DW_TAG_padding: return "DW_TAG_padding";
64 case DW_TAG_array_type: return "DW_TAG_array_type";
65 case DW_TAG_class_type: return "DW_TAG_class_type";
66 case DW_TAG_entry_point: return "DW_TAG_entry_point";
67 case DW_TAG_enumeration_type: return "DW_TAG_enumeration_type";
68 case DW_TAG_formal_parameter: return "DW_TAG_formal_parameter";
69 case DW_TAG_imported_declaration:
70 return "DW_TAG_imported_declaration";
71 case DW_TAG_label: return "DW_TAG_label";
72 case DW_TAG_lexical_block: return "DW_TAG_lexical_block";
73 case DW_TAG_member: return "DW_TAG_member";
74 case DW_TAG_pointer_type: return "DW_TAG_pointer_type";
75 case DW_TAG_reference_type: return "DW_TAG_reference_type";
76 case DW_TAG_compile_unit: return "DW_TAG_compile_unit";
77 case DW_TAG_string_type: return "DW_TAG_string_type";
78 case DW_TAG_structure_type: return "DW_TAG_structure_type";
79 case DW_TAG_subroutine_type: return "DW_TAG_subroutine_type";
80 case DW_TAG_typedef: return "DW_TAG_typedef";
81 case DW_TAG_union_type: return "DW_TAG_union_type";
82 case DW_TAG_unspecified_parameters:
83 return "DW_TAG_unspecified_parameters";
84 case DW_TAG_variant: return "DW_TAG_variant";
85 case DW_TAG_common_block: return "DW_TAG_common_block";
86 case DW_TAG_common_inclusion: return "DW_TAG_common_inclusion";
87 case DW_TAG_inheritance: return "DW_TAG_inheritance";
88 case DW_TAG_inlined_subroutine:
89 return "DW_TAG_inlined_subroutine";
90 case DW_TAG_module: return "DW_TAG_module";
91 case DW_TAG_ptr_to_member_type: return "DW_TAG_ptr_to_member_type";
92 case DW_TAG_set_type: return "DW_TAG_set_type";
93 case DW_TAG_subrange_type: return "DW_TAG_subrange_type";
94 case DW_TAG_with_stmt: return "DW_TAG_with_stmt";
95 case DW_TAG_access_declaration: return "DW_TAG_access_declaration";
96 case DW_TAG_base_type: return "DW_TAG_base_type";
97 case DW_TAG_catch_block: return "DW_TAG_catch_block";
98 case DW_TAG_const_type: return "DW_TAG_const_type";
99 case DW_TAG_constant: return "DW_TAG_constant";
100 case DW_TAG_enumerator: return "DW_TAG_enumerator";
101 case DW_TAG_file_type: return "DW_TAG_file_type";
102 case DW_TAG_friend: return "DW_TAG_friend";
103 case DW_TAG_namelist: return "DW_TAG_namelist";
104 case DW_TAG_namelist_item: return "DW_TAG_namelist_item";
105 case DW_TAG_packed_type: return "DW_TAG_packed_type";
106 case DW_TAG_subprogram: return "DW_TAG_subprogram";
107 case DW_TAG_template_type_param:
108 return "DW_TAG_template_type_param";
109 case DW_TAG_template_value_param:
110 return "DW_TAG_template_value_param";
111 case DW_TAG_thrown_type: return "DW_TAG_thrown_type";
112 case DW_TAG_try_block: return "DW_TAG_try_block";
113 case DW_TAG_variant_part: return "DW_TAG_variant_part";
114 case DW_TAG_variable: return "DW_TAG_variable";
115 case DW_TAG_volatile_type: return "DW_TAG_volatile_type";
117 case DW_TAG_dwarf_procedure: return "DW_TAG_dwarf_procedure";
118 case DW_TAG_restrict_type: return "DW_TAG_restrict_type";
119 case DW_TAG_interface_type: return "DW_TAG_interface_type";
120 case DW_TAG_namespace: return "DW_TAG_namespace";
121 case DW_TAG_imported_module: return "DW_TAG_imported_module";
122 case DW_TAG_unspecified_type: return "DW_TAG_unspecified_type";
123 case DW_TAG_partial_unit: return "DW_TAG_partial_unit";
124 case DW_TAG_imported_unit: return "DW_TAG_imported_unit";
125 case DW_TAG_condition: return "DW_TAG_condition";
126 case DW_TAG_shared_type: return "DW_TAG_shared_type";
128 case DW_TAG_type_unit: return "DW_TAG_type_unit";
129 case DW_TAG_rvalue_reference_type: return "DW_TAG_rvalue_reference_type";
130 case DW_TAG_template_alias: return "DW_TAG_template_alias";
131 /* SGI/MIPS Extensions. */
132 case DW_TAG_MIPS_loop: return "DW_TAG_MIPS_loop";
133 /* HP extensions. See:
134 ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz . */
135 case DW_TAG_HP_array_descriptor:
136 return "DW_TAG_HP_array_descriptor";
137 /* GNU extensions. */
138 case DW_TAG_format_label: return "DW_TAG_format_label";
139 case DW_TAG_function_template: return "DW_TAG_function_template";
140 case DW_TAG_class_template: return "DW_TAG_class_template";
141 case DW_TAG_GNU_BINCL: return "DW_TAG_GNU_BINCL";
142 case DW_TAG_GNU_EINCL: return "DW_TAG_GNU_EINCL";
143 /* Extensions for UPC. See: http://upc.gwu.edu/~upc. */
144 case DW_TAG_upc_shared_type: return "DW_TAG_upc_shared_type";
145 case DW_TAG_upc_strict_type: return "DW_TAG_upc_strict_type";
146 case DW_TAG_upc_relaxed_type: return "DW_TAG_upc_relaxed_type";
147 /* PGI (STMicroelectronics) extensions. No documentation available. */
148 case DW_TAG_PGI_kanji_type: return "DW_TAG_PGI_kanji_type";
149 case DW_TAG_PGI_interface_block:
150 return "DW_TAG_PGI_interface_block";
151 default: return "DW_TAG_???";
155 HChar* ML_(pp_DW_FORM) ( DW_FORM form )
158 case DW_FORM_addr: return "DW_FORM_addr";
159 case DW_FORM_block2: return "DW_FORM_block2";
160 case DW_FORM_block4: return "DW_FORM_block4";
161 case DW_FORM_data2: return "DW_FORM_data2";
162 case DW_FORM_data4: return "DW_FORM_data4";
163 case DW_FORM_data8: return "DW_FORM_data8";
164 case DW_FORM_string: return "DW_FORM_string";
165 case DW_FORM_block: return "DW_FORM_block";
166 case DW_FORM_block1: return "DW_FORM_block1";
167 case DW_FORM_data1: return "DW_FORM_data1";
168 case DW_FORM_flag: return "DW_FORM_flag";
169 case DW_FORM_sdata: return "DW_FORM_sdata";
170 case DW_FORM_strp: return "DW_FORM_strp";
171 case DW_FORM_udata: return "DW_FORM_udata";
172 case DW_FORM_ref_addr: return "DW_FORM_ref_addr";
173 case DW_FORM_ref1: return "DW_FORM_ref1";
174 case DW_FORM_ref2: return "DW_FORM_ref2";
175 case DW_FORM_ref4: return "DW_FORM_ref4";
176 case DW_FORM_ref8: return "DW_FORM_ref8";
177 case DW_FORM_ref_udata: return "DW_FORM_ref_udata";
178 case DW_FORM_indirect: return "DW_FORM_indirect";
179 case DW_FORM_sec_offset:return "DW_FORM_sec_offset";
180 case DW_FORM_exprloc: return "DW_FORM_exprloc";
181 case DW_FORM_flag_present:return "DW_FORM_flag_present";
182 case DW_FORM_ref_sig8: return "DW_FORM_ref_sig8";
183 default: return "DW_FORM_???";
187 HChar* ML_(pp_DW_AT) ( DW_AT attr )
190 case DW_AT_sibling: return "DW_AT_sibling";
191 case DW_AT_location: return "DW_AT_location";
192 case DW_AT_name: return "DW_AT_name";
193 case DW_AT_ordering: return "DW_AT_ordering";
194 case DW_AT_subscr_data: return "DW_AT_subscr_data";
195 case DW_AT_byte_size: return "DW_AT_byte_size";
196 case DW_AT_bit_offset: return "DW_AT_bit_offset";
197 case DW_AT_bit_size: return "DW_AT_bit_size";
198 case DW_AT_element_list: return "DW_AT_element_list";
199 case DW_AT_stmt_list: return "DW_AT_stmt_list";
200 case DW_AT_low_pc: return "DW_AT_low_pc";
201 case DW_AT_high_pc: return "DW_AT_high_pc";
202 case DW_AT_language: return "DW_AT_language";
203 case DW_AT_member: return "DW_AT_member";
204 case DW_AT_discr: return "DW_AT_discr";
205 case DW_AT_discr_value: return "DW_AT_discr_value";
206 case DW_AT_visibility: return "DW_AT_visibility";
207 case DW_AT_import: return "DW_AT_import";
208 case DW_AT_string_length: return "DW_AT_string_length";
209 case DW_AT_common_reference: return "DW_AT_common_reference";
210 case DW_AT_comp_dir: return "DW_AT_comp_dir";
211 case DW_AT_const_value: return "DW_AT_const_value";
212 case DW_AT_containing_type: return "DW_AT_containing_type";
213 case DW_AT_default_value: return "DW_AT_default_value";
214 case DW_AT_inline: return "DW_AT_inline";
215 case DW_AT_is_optional: return "DW_AT_is_optional";
216 case DW_AT_lower_bound: return "DW_AT_lower_bound";
217 case DW_AT_producer: return "DW_AT_producer";
218 case DW_AT_prototyped: return "DW_AT_prototyped";
219 case DW_AT_return_addr: return "DW_AT_return_addr";
220 case DW_AT_start_scope: return "DW_AT_start_scope";
221 case DW_AT_stride_size: return "DW_AT_stride_size";
222 case DW_AT_upper_bound: return "DW_AT_upper_bound";
223 case DW_AT_abstract_origin: return "DW_AT_abstract_origin";
224 case DW_AT_accessibility: return "DW_AT_accessibility";
225 case DW_AT_address_class: return "DW_AT_address_class";
226 case DW_AT_artificial: return "DW_AT_artificial";
227 case DW_AT_base_types: return "DW_AT_base_types";
228 case DW_AT_calling_convention: return "DW_AT_calling_convention";
229 case DW_AT_count: return "DW_AT_count";
230 case DW_AT_data_member_location: return "DW_AT_data_member_location";
231 case DW_AT_decl_column: return "DW_AT_decl_column";
232 case DW_AT_decl_file: return "DW_AT_decl_file";
233 case DW_AT_decl_line: return "DW_AT_decl_line";
234 case DW_AT_declaration: return "DW_AT_declaration";
235 case DW_AT_discr_list: return "DW_AT_discr_list";
236 case DW_AT_encoding: return "DW_AT_encoding";
237 case DW_AT_external: return "DW_AT_external";
238 case DW_AT_frame_base: return "DW_AT_frame_base";
239 case DW_AT_friend: return "DW_AT_friend";
240 case DW_AT_identifier_case: return "DW_AT_identifier_case";
241 case DW_AT_macro_info: return "DW_AT_macro_info";
242 case DW_AT_namelist_items: return "DW_AT_namelist_items";
243 case DW_AT_priority: return "DW_AT_priority";
244 case DW_AT_segment: return "DW_AT_segment";
245 case DW_AT_specification: return "DW_AT_specification";
246 case DW_AT_static_link: return "DW_AT_static_link";
247 case DW_AT_type: return "DW_AT_type";
248 case DW_AT_use_location: return "DW_AT_use_location";
249 case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
250 case DW_AT_virtuality: return "DW_AT_virtuality";
251 case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
252 /* DWARF 3 values. */
253 case DW_AT_allocated: return "DW_AT_allocated";
254 case DW_AT_associated: return "DW_AT_associated";
255 case DW_AT_data_location: return "DW_AT_data_location";
256 case DW_AT_stride: return "DW_AT_stride";
257 case DW_AT_entry_pc: return "DW_AT_entry_pc";
258 case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
259 case DW_AT_extension: return "DW_AT_extension";
260 case DW_AT_ranges: return "DW_AT_ranges";
261 case DW_AT_trampoline: return "DW_AT_trampoline";
262 case DW_AT_call_column: return "DW_AT_call_column";
263 case DW_AT_call_file: return "DW_AT_call_file";
264 case DW_AT_call_line: return "DW_AT_call_line";
265 case DW_AT_description: return "DW_AT_description";
266 case DW_AT_binary_scale: return "DW_AT_binary_scale";
267 case DW_AT_decimal_scale: return "DW_AT_decimal_scale";
268 case DW_AT_small: return "DW_AT_small";
269 case DW_AT_decimal_sign: return "DW_AT_decimal_sign";
270 case DW_AT_digit_count: return "DW_AT_digit_count";
271 case DW_AT_picture_string: return "DW_AT_picture_string";
272 case DW_AT_mutable: return "DW_AT_mutable";
273 case DW_AT_threads_scaled: return "DW_AT_threads_scaled";
274 case DW_AT_explicit: return "DW_AT_explicit";
275 case DW_AT_object_pointer: return "DW_AT_object_pointer";
276 case DW_AT_endianity: return "DW_AT_endianity";
277 case DW_AT_elemental: return "DW_AT_elemental";
278 case DW_AT_pure: return "DW_AT_pure";
279 case DW_AT_recursive: return "DW_AT_recursive";
280 /* DWARF 4 values. */
281 case DW_AT_signature: return "DW_AT_signature";
282 case DW_AT_main_subprogram: return "DW_AT_main_subprogram";
283 case DW_AT_data_bit_offset: return "DW_AT_data_bit_offset";
284 case DW_AT_const_expr: return "DW_AT_const_expr";
285 case DW_AT_enum_class: return "DW_AT_enum_class";
286 case DW_AT_linkage_name: return "DW_AT_linkage_name";
287 /* SGI/MIPS extensions. */
288 /* case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde"; */
289 /* DW_AT_MIPS_fde == DW_AT_HP_unmodifiable */
290 case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
291 case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
292 case DW_AT_MIPS_epilog_begin: return "DW_AT_MIPS_epilog_begin";
293 case DW_AT_MIPS_loop_unroll_factor: return "DW_AT_MIPS_loop_unroll_factor";
294 case DW_AT_MIPS_software_pipeline_depth: return "DW_AT_MIPS_software_pipeline_depth";
295 case DW_AT_MIPS_linkage_name: return "DW_AT_MIPS_linkage_name";
296 case DW_AT_MIPS_stride: return "DW_AT_MIPS_stride";
297 case DW_AT_MIPS_abstract_name: return "DW_AT_MIPS_abstract_name";
298 case DW_AT_MIPS_clone_origin: return "DW_AT_MIPS_clone_origin";
299 case DW_AT_MIPS_has_inlines: return "DW_AT_MIPS_has_inlines";
301 case DW_AT_HP_block_index: return "DW_AT_HP_block_index";
302 case DW_AT_HP_unmodifiable: return "DW_AT_HP_unmodifiable";
303 case DW_AT_HP_actuals_stmt_list: return "DW_AT_HP_actuals_stmt_list";
304 case DW_AT_HP_proc_per_section: return "DW_AT_HP_proc_per_section";
305 case DW_AT_HP_raw_data_ptr: return "DW_AT_HP_raw_data_ptr";
306 case DW_AT_HP_pass_by_reference: return "DW_AT_HP_pass_by_reference";
307 case DW_AT_HP_opt_level: return "DW_AT_HP_opt_level";
308 case DW_AT_HP_prof_version_id: return "DW_AT_HP_prof_version_id";
309 case DW_AT_HP_opt_flags: return "DW_AT_HP_opt_flags";
310 case DW_AT_HP_cold_region_low_pc: return "DW_AT_HP_cold_region_low_pc";
311 case DW_AT_HP_cold_region_high_pc: return "DW_AT_HP_cold_region_high_pc";
312 case DW_AT_HP_all_variables_modifiable: return "DW_AT_HP_all_variables_modifiable";
313 case DW_AT_HP_linkage_name: return "DW_AT_HP_linkage_name";
314 case DW_AT_HP_prof_flags: return "DW_AT_HP_prof_flags";
315 /* GNU extensions. */
316 case DW_AT_sf_names: return "DW_AT_sf_names";
317 case DW_AT_src_info: return "DW_AT_src_info";
318 case DW_AT_mac_info: return "DW_AT_mac_info";
319 case DW_AT_src_coords: return "DW_AT_src_coords";
320 case DW_AT_body_begin: return "DW_AT_body_begin";
321 case DW_AT_body_end: return "DW_AT_body_end";
322 case DW_AT_GNU_vector: return "DW_AT_GNU_vector";
323 /* VMS extensions. */
324 case DW_AT_VMS_rtnbeg_pd_address: return "DW_AT_VMS_rtnbeg_pd_address";
326 case DW_AT_upc_threads_scaled: return "DW_AT_upc_threads_scaled";
327 /* PGI (STMicroelectronics) extensions. */
328 case DW_AT_PGI_lbase: return "DW_AT_PGI_lbase";
329 case DW_AT_PGI_soffset: return "DW_AT_PGI_soffset";
330 case DW_AT_PGI_lstride: return "DW_AT_PGI_lstride";
331 default: return "DW_AT_???";
336 /* ------ To do with evaluation of Dwarf expressions ------ */
338 /* FIXME: duplicated in readdwarf.c */
340 ULong read_leb128 ( UChar* data, Int* length_return, Int sign )
347 vg_assert(sign == 0 || sign == 1);
354 result |= ((ULong)(byte & 0x7f)) << shift;
361 if (length_return != NULL)
362 * length_return = num_read;
364 if (sign && (shift < 64) && (byte & 0x40))
365 result |= -(1ULL << shift);
370 /* Small helper functions easier to use
371 * value is returned and the given pointer is
372 * moved past end of leb128 data */
373 /* FIXME: duplicated in readdwarf.c */
374 static ULong read_leb128U( UChar **data )
377 ULong val = read_leb128( *data, &len, 0 );
382 /* Same for signed data */
383 /* FIXME: duplicated in readdwarf.c */
384 static Long read_leb128S( UChar **data )
387 ULong val = read_leb128( *data, &len, 1 );
392 /* FIXME: duplicates logic in readdwarf.c: copy_convert_CfiExpr_tree
393 and {FP,SP}_REG decls */
394 static Bool get_Dwarf_Reg( /*OUT*/Addr* a, Word regno, RegSummary* regs )
397 # if defined(VGP_x86_linux) || defined(VGP_x86_darwin) || defined(VGP_x86_l4re)
398 if (regno == 5/*EBP*/) { *a = regs->fp; return True; }
399 if (regno == 4/*ESP*/) { *a = regs->sp; return True; }
400 # elif defined(VGP_amd64_linux) || defined(VGP_amd64_darwin)
401 if (regno == 6/*RBP*/) { *a = regs->fp; return True; }
402 if (regno == 7/*RSP*/) { *a = regs->sp; return True; }
403 # elif defined(VGP_ppc32_linux)
404 if (regno == 1/*SP*/) { *a = regs->sp; return True; }
405 # elif defined(VGP_ppc64_linux)
406 if (regno == 1/*SP*/) { *a = regs->sp; return True; }
407 # elif defined(VGP_arm_linux)
408 if (regno == 13) { *a = regs->sp; return True; }
409 if (regno == 11) { *a = regs->fp; return True; }
410 # elif defined(VGP_ppc32_aix5) || defined(VGP_ppc64_aix5)
411 vg_assert(0); /* this function should never be called */
412 # elif defined(VGP_s390x_linux)
413 if (regno == 15) { *a = regs->sp; return True; }
414 if (regno == 11) { *a = regs->fp; return True; }
416 # error "Unknown platform"
421 /* Convert a stated address to an actual address */
422 static Bool bias_address( Addr* a, const DebugInfo* di )
426 && *a >= di->text_debug_svma && *a < di->text_debug_svma + di->text_size) {
427 *a += di->text_debug_bias;
429 else if (di->data_present
431 && *a >= di->data_debug_svma && *a < di->data_debug_svma + di->data_size) {
432 *a += di->data_debug_bias;
434 else if (di->sdata_present
435 && di->sdata_size > 0
436 && *a >= di->sdata_debug_svma && *a < di->sdata_debug_svma + di->sdata_size) {
437 *a += di->sdata_debug_bias;
439 else if (di->rodata_present
440 && di->rodata_size > 0
441 && *a >= di->rodata_debug_svma && *a < di->rodata_debug_svma + di->rodata_size) {
442 *a += di->rodata_debug_bias;
444 else if (di->bss_present
446 && *a >= di->bss_debug_svma && *a < di->bss_debug_svma + di->bss_size) {
447 *a += di->bss_debug_bias;
449 else if (di->sbss_present
451 && *a >= di->sbss_debug_svma && *a < di->sbss_debug_svma + di->sbss_size) {
452 *a += di->sbss_debug_bias;
462 /* Evaluate a standard DWARF3 expression. See detailed description in
463 priv_d3basics.h. Doesn't handle DW_OP_piece/DW_OP_bit_piece yet. */
464 GXResult ML_(evaluate_Dwarf3_Expr) ( UChar* expr, UWord exprszB,
465 GExpr* fbGX, RegSummary* regs,
467 Bool push_initial_zero )
469 # define N_EXPR_STACK 20
471 # define FAIL(_str) \
473 res.kind = GXR_Failure; \
474 res.word = (UWord)(_str); \
478 # define PUSH(_arg) \
480 vg_assert(sp >= -1 && sp < N_EXPR_STACK); \
481 if (sp == N_EXPR_STACK-1) \
482 FAIL("evaluate_Dwarf3_Expr: stack overflow(1)"); \
484 stack[sp] = (_arg); \
487 # define POP(_lval) \
489 vg_assert(sp >= -1 && sp < N_EXPR_STACK); \
491 FAIL("evaluate_Dwarf3_Expr: stack underflow(1)"); \
498 Int sp; /* # of top element: valid is -1 .. N_EXPR_STACK-1 */
499 Addr stack[N_EXPR_STACK]; /* stack of addresses, as per D3 spec */
508 vg_assert(exprszB >= 0);
509 limit = expr + exprszB;
511 /* Deal with the case where the entire expression is a single
512 Register Name Operation (D3 spec sec 2.6.1). Then the
513 denotation of the expression as a whole is a register name. */
515 && expr[0] >= DW_OP_reg0 && expr[0] <= DW_OP_reg31) {
516 res.kind = GXR_RegNo;
517 res.word = (UWord)(expr[0] - DW_OP_reg0);
521 && expr[0] == DW_OP_regx) {
522 /* JRS: 2008Feb20: I believe the following is correct, but would
523 like to see a test case show up before enabling it. */
525 res.kind = GXR_RegNo;
526 res.word = (UWord)read_leb128U( &expr );
528 FAIL("evaluate_Dwarf3_Expr: DW_OP_regx*: invalid expr size");
534 /* Evidently this expression denotes a value, not a register name.
535 So evaluate it accordingly. */
537 if (push_initial_zero)
542 vg_assert(sp >= -1 && sp < N_EXPR_STACK);
545 /* overrun - something's wrong */
546 FAIL("evaluate_Dwarf3_Expr: ran off end of expr");
549 /* end of expr - return expr on the top of stack. */
551 /* stack empty. Bad. */
552 FAIL("evaluate_Dwarf3_Expr: stack empty at end of expr");
560 /* Presumably what is given in the Dwarf3 is a SVMA (how
561 could it be otherwise?) So we add the appropriate bias
562 on before pushing the result. */
564 if (bias_address(&a1, di)) {
566 expr += sizeof(Addr);
569 FAIL("evaluate_Dwarf3_Expr: DW_OP_addr with address "
570 "in unknown section");
575 FAIL("evaluate_Dwarf3_Expr: DW_OP_fbreg with "
576 "no expr for fbreg present");
577 fbval = ML_(evaluate_GX)(fbGX, NULL, regs, di);
578 /* Convert fbval into something we can use. If we got a
579 Value, no problem. However, as per D3 spec sec 3.3.5
580 (Low Level Information) sec 2, we could also get a
581 RegNo, and that is taken to mean the value in the
582 indicated register. So we have to manually
585 switch (fbval.kind) {
587 return fbval; /* propagate failure */
589 a1 = fbval.word; break; /* use as-is */
591 ok = get_Dwarf_Reg( &a1, fbval.word, regs );
592 if (!ok) return fbval; /* propagate failure */
595 FAIL("evaluate_Dwarf3_Expr: DW_OP_{implicit,stack}_value "
596 "in DW_AT_frame_base");
600 sw1 = (Word)read_leb128S( &expr );
603 /* DW_OP_breg* denotes 'contents of specified register, plus
604 constant offset'. So provided we know what the register's
605 value is, we can evaluate this. Contrast DW_OP_reg*,
606 which indicates that denoted location is in a register
607 itself. If DW_OP_reg* shows up here the expression is
608 malformed, since we are evaluating for value now, and
609 DW_OP_reg* denotes a register location, not a value. See
610 D3 Spec sec 2.6.1 ("Register Name Operations") for
612 case DW_OP_breg0 ... DW_OP_breg31:
614 FAIL("evaluate_Dwarf3_Expr: DW_OP_breg* but no reg info");
616 if (!get_Dwarf_Reg( &a1, opcode - DW_OP_breg0, regs ))
617 FAIL("evaluate_Dwarf3_Expr: unhandled DW_OP_breg*");
618 sw1 = (Word)read_leb128S( &expr );
624 FAIL("evaluate_Dwarf3_Expr: DW_OP_bregx but no reg info");
626 uw1 = (UWord)read_leb128U( &expr );
627 if (!get_Dwarf_Reg( &a1, uw1, regs ))
628 FAIL("evaluate_Dwarf3_Expr: unhandled DW_OP_bregx reg value");
629 sw1 = (Word)read_leb128S( &expr );
633 /* As per comment on DW_OP_breg*, the following denote that
634 the value in question is in a register, not in memory. So
635 we simply return failure. (iow, the expression is
637 case DW_OP_reg0 ... DW_OP_reg31:
639 FAIL("evaluate_Dwarf3_Expr: DW_OP_reg* "
640 "whilst evaluating for a value");
642 case DW_OP_plus_uconst:
644 uw1 += (UWord)read_leb128U( &expr );
647 case DW_OP_GNU_push_tls_address:
648 /* GDB contains the following cryptic comment: */
649 /* Variable is at a constant offset in the thread-local
650 storage block into the objfile for the current thread and
651 the dynamic linker module containing this expression. Here
652 we return returns the offset from that base. The top of the
653 stack has the offset from the beginning of the thread
654 control block at which the variable is located. Nothing
655 should follow this operator, so the top of stack would be
657 /* But no spec resulting from Googling. Punt for now. */
658 FAIL("warning: evaluate_Dwarf3_Expr: unhandled "
659 "DW_OP_GNU_push_tls_address");
663 if (VG_(am_is_valid_for_client)( (Addr)uw1, sizeof(Addr),
668 FAIL("warning: evaluate_Dwarf3_Expr: DW_OP_deref: "
669 "address not valid for client");
672 case DW_OP_deref_size:
675 if (VG_(am_is_valid_for_client)( (Addr)uw1, uw2,
678 case 1: uw1 = *(UChar*)uw1; break;
679 case 2: uw1 = *(UShort*)uw1; break;
680 case 4: uw1 = *(UInt*)uw1; break;
681 case 8: uw1 = *(ULong*)uw1; break;
683 FAIL("warning: evaluate_Dwarf3_Expr: unhandled "
684 "DW_OP_deref_size size");
688 FAIL("warning: evaluate_Dwarf3_Expr: DW_OP_deref_size: "
689 "address not valid for client");
692 case DW_OP_lit0 ... DW_OP_lit31:
693 PUSH(opcode - DW_OP_lit0);
700 uw1 = *(UShort *)expr;
710 uw1 = *(ULong *)expr;
715 uw1 = read_leb128U( &expr );
724 uw1 = *(Short *)expr;
739 uw1 = read_leb128S( &expr );
757 FAIL("evaluate_Dwarf3_Expr: stack underflow");
758 uw1 = stack[sp - uw1];
763 FAIL("evaluate_Dwarf3_Expr: stack underflow");
765 stack[sp] = stack[sp - 1];
770 FAIL("evaluate_Dwarf3_Expr: stack underflow");
772 stack[sp] = stack[sp - 1];
773 stack[sp - 1] = stack[sp - 2];
785 FAIL("evaluate_Dwarf3_Expr: division by zero");
793 FAIL("evaluate_Dwarf3_Expr: division by zero");
798 #define BINARY(name, op, s) \
802 s##w1 = s##w1 op s##w2; \
805 #define UNARY(name, op, s) \
812 BINARY (minus, -, u);
820 BINARY (shra, >>, s);
831 sw1 = *(Short *)expr;
833 if (expr + sw1 < limit - exprszB)
834 FAIL("evaluate_Dwarf3_Expr: DW_OP_skip before start of expr");
835 if (expr + sw1 >= limit)
836 FAIL("evaluate_Dwarf3_Expr: DW_OP_skip after end of expr");
840 sw1 = *(Short *)expr;
842 if (expr + sw1 < limit - exprszB)
843 FAIL("evaluate_Dwarf3_Expr: DW_OP_bra before start of expr");
844 if (expr + sw1 >= limit)
845 FAIL("evaluate_Dwarf3_Expr: DW_OP_bra after end of expr");
852 case DW_OP_call_frame_cfa:
854 FAIL("evaluate_Dwarf3_Expr: "
855 "DW_OP_call_frame_cfa but no reg info");
856 #if defined(VGP_ppc32_linux) || defined(VGP_ppc64_linux)
857 /* Valgrind on ppc32/ppc64 currently doesn't use unwind info. */
858 uw1 = *(Addr *)(regs->sp);
860 uw1 = ML_(get_CFA)(regs->ip, regs->sp, regs->fp, 0, ~(UWord) 0);
862 /* we expect this to fail on arm-linux, since ML_(get_CFA)
863 always returns zero at present. */
865 FAIL("evaluate_Dwarf3_Expr: Could not resolve "
866 "DW_OP_call_frame_cfa");
869 case DW_OP_implicit_value:
870 sw1 = (Word)read_leb128S( &expr );
874 uw1 = *(UChar *)expr;
878 uw1 = *(UShort *)expr;
886 uw1 = *(ULong *)expr;
890 FAIL("evaluate_Dwarf3_Expr: Unhandled "
891 "DW_OP_implicit_value size");
894 FAIL("evaluate_Dwarf3_Expr: DW_OP_implicit_value "
895 "does not terminate expression");
897 res.kind = GXR_Value;
899 case DW_OP_stack_value:
902 res.kind = GXR_Value;
904 FAIL("evaluate_Dwarf3_Expr: DW_OP_stack_value "
905 "does not terminate expression");
909 VG_(message)(Vg_DebugMsg,
910 "warning: evaluate_Dwarf3_Expr: unhandled "
911 "DW_OP_ 0x%x\n", (Int)opcode);
912 FAIL("evaluate_Dwarf3_Expr: unhandled DW_OP_");
918 vg_assert(sp >= 0 && sp < N_EXPR_STACK);
919 res.word = stack[sp];
930 /* Evaluate a so-called Guarded (DWARF3) expression. See detailed
931 description in priv_d3basics.h. */
932 GXResult ML_(evaluate_GX)( GExpr* gx, GExpr* fbGX,
933 RegSummary* regs, const DebugInfo* di )
940 UChar* p = &gx->payload[0];
941 uc = *p++; /*biasMe*/
942 vg_assert(uc == 0 || uc == 1);
943 /* in fact it's senseless to evaluate if the guards need biasing.
948 if (uc == 1) { /*isEnd*/
949 /* didn't find any matching range. */
950 res.kind = GXR_Failure;
951 res.word = (UWord)"no matching range";
955 aMin = * (Addr*)p; p += sizeof(Addr);
956 aMax = * (Addr*)p; p += sizeof(Addr);
957 nbytes = * (UShort*)p; p += sizeof(UShort);
959 if (0) VG_(printf)(" guard %d: %#lx %#lx\n",
960 (Int)nGuards, aMin,aMax);
962 vg_assert(aMin == (Addr)0);
963 vg_assert(aMax == ~(Addr)0);
964 /* Assert this is the first guard. */
965 vg_assert(nGuards == 1);
966 res = ML_(evaluate_Dwarf3_Expr)(
967 p, (UWord)nbytes, fbGX, regs, di,
968 False/*push_initial_zero*/ );
969 /* Now check there are no more guards. */
971 vg_assert(*p == 1); /*isEnd*/
974 if (aMin <= regs->ip && regs->ip <= aMax) {
975 /* found a matching range. Evaluate the expression. */
976 return ML_(evaluate_Dwarf3_Expr)(
977 p, (UWord)nbytes, fbGX, regs, di,
978 False/*push_initial_zero*/ );
981 /* else keep searching */
987 /* Evaluate a very simple Guarded (DWARF3) expression. The expression
988 is expected to denote a constant, with no reference to any
989 registers nor to any frame base expression. The expression is
990 expected to have at least one guard. If there is more than one
991 guard, all the sub-expressions are evaluated and compared. The
992 address ranges on the guards are ignored. GXR_Failure is returned
993 in the following circumstances:
995 * any of the subexpressions require a frame base expression
996 * any of the subexpressions denote a register location
997 * any of the subexpressions do not produce a manifest constant
998 * there's more than one subexpression, all of which successfully
999 evaluate to a constant, but they don't all produce the same constant.
1000 JRS 23Jan09: the special-casing in this function is a nasty kludge.
1001 Really it ought to be pulled out and turned into a general
1002 constant- expression evaluator.
1004 GXResult ML_(evaluate_trivial_GX)( GExpr* gx, const DebugInfo* di )
1011 MaybeULong *mul, *mul2;
1013 HChar* badness = NULL;
1014 UChar* p = &gx->payload[0]; /* must remain unsigned */
1015 XArray* results = VG_(newXA)( ML_(dinfo_zalloc), "di.d3basics.etG.1",
1017 sizeof(MaybeULong) );
1019 uc = *p++; /*biasMe*/
1020 vg_assert(uc == 0 || uc == 1);
1021 /* in fact it's senseless to evaluate if the guards need biasing.
1027 MaybeULong thisResult;
1029 if (uc == 1) /*isEnd*/
1032 aMin = * (Addr*)p; p += sizeof(Addr);
1033 aMax = * (Addr*)p; p += sizeof(Addr);
1034 nbytes = * (UShort*)p; p += sizeof(UShort);
1036 if (0) VG_(printf)(" guard %ld: %#lx %#lx\n",
1037 nGuards, aMin,aMax);
1039 thisResult.b = False;
1042 /* Peer at this particular subexpression, to see if it's
1043 obviously a constant. */
1044 if (nbytes == 1 + sizeof(Addr) && *p == DW_OP_addr) {
1046 Addr a = *(Addr*)(p+1);
1047 if (bias_address(&a, di)) {
1048 thisResult.b = True;
1049 thisResult.ul = (ULong)a;
1052 badness = "trivial GExpr denotes constant address "
1053 "in unknown section (1)";
1057 if (nbytes == 1 + sizeof(Addr) + 1 + 1
1058 /* 11 byte block: 3 c0 b6 2b 0 0 0 0 0 23 4
1059 (DW_OP_addr: 2bb6c0; DW_OP_plus_uconst: 4)
1060 This is really a nasty kludge - only matches if the
1061 trailing ULEB denotes a number in the range 0 .. 127
1063 && p[0] == DW_OP_addr
1064 && p[1 + sizeof(Addr)] == DW_OP_plus_uconst
1065 && p[1 + sizeof(Addr) + 1] < 0x80 /*1-byte ULEB*/) {
1066 Addr a = *(Addr*)&p[1];
1067 if (bias_address(&a, di)) {
1068 thisResult.b = True;
1069 thisResult.ul = (ULong)a + (ULong)p[1 + sizeof(Addr) + 1];
1072 badness = "trivial GExpr denotes constant address "
1073 "in unknown section (2)";
1077 if (nbytes == 2 + sizeof(Addr)
1079 && *(p + 1 + sizeof(Addr)) == DW_OP_GNU_push_tls_address) {
1081 badness = "trivial GExpr is DW_OP_addr plus trailing junk";
1083 else if (nbytes >= 1 && *p >= DW_OP_reg0 && *p <= DW_OP_reg31) {
1085 badness = "trivial GExpr denotes register (1)";
1087 else if (nbytes >= 1 && *p == DW_OP_fbreg) {
1089 badness = "trivial GExpr requires fbGX";
1091 else if (nbytes >= 1 && *p >= DW_OP_breg0 && *p <= DW_OP_breg31) {
1093 badness = "trivial GExpr requires register value";
1095 else if (nbytes >= 1 && *p == DW_OP_regx) {
1097 badness = "trivial GExpr denotes register (2)";
1100 VG_(printf)(" ML_(evaluate_trivial_GX): unhandled:\n ");
1107 badness = "non-trivial GExpr";
1109 VG_(addToXA)( results, &thisResult );
1114 res.kind = GXR_Failure;
1116 tl_assert(nGuards == VG_(sizeXA)( results ));
1117 tl_assert(nGuards >= 0);
1119 tl_assert(!badness);
1120 res.word = (UWord)"trivial GExpr has no guards (!)";
1121 VG_(deleteXA)( results );
1125 for (i = 0; i < nGuards; i++) {
1126 mul = VG_(indexXA)( results, i );
1127 if (mul->b == False)
1131 vg_assert(i >= 0 && i <= nGuards);
1133 /* at least one subexpression failed to produce a manifest constant. */
1135 res.word = (UWord)badness;
1136 VG_(deleteXA)( results );
1140 /* All the subexpressions produced a constant, but did they all produce
1142 mul = VG_(indexXA)( results, 0 );
1143 tl_assert(mul->b == True); /* we just established that all exprs are ok */
1145 for (i = 1; i < nGuards; i++) {
1146 mul2 = VG_(indexXA)( results, i );
1147 tl_assert(mul2->b == True);
1148 if (mul2->ul != mul->ul) {
1149 res.word = (UWord)"trivial GExpr: subexpressions disagree";
1150 VG_(deleteXA)( results );
1155 /* Well, we have success. All subexpressions evaluated, and
1156 they all agree. Hurrah. */
1157 res.kind = GXR_Addr;
1158 res.word = (UWord)mul->ul; /* NB: narrowing from ULong */
1159 VG_(deleteXA)( results );
1164 void ML_(pp_GXResult) ( GXResult res )
1168 VG_(printf)("GXR_Failure(%s)", (HChar*)res.word); break;
1170 VG_(printf)("GXR_Addr(0x%lx)", res.word); break;
1172 VG_(printf)("GXR_Value(0x%lx)", res.word); break;
1174 VG_(printf)("GXR_RegNo(%lu)", res.word); break;
1176 VG_(printf)("GXR_???"); break;
1181 void ML_(pp_GX) ( GExpr* gx ) {
1185 UChar* p = &gx->payload[0];
1187 VG_(printf)("GX(%s){", uc == 0 ? "final" : "Breqd" );
1188 vg_assert(uc == 0 || uc == 1);
1194 aMin = * (Addr*)p; p += sizeof(Addr);
1195 aMax = * (Addr*)p; p += sizeof(Addr);
1196 nbytes = * (UShort*)p; p += sizeof(UShort);
1197 VG_(printf)("[%#lx,%#lx]=", aMin, aMax);
1198 while (nbytes > 0) {
1199 VG_(printf)("%02x", (UInt)*p++);
1209 /*--------------------------------------------------------------------*/
1210 /*--- end d3basics.c ---*/
1211 /*--------------------------------------------------------------------*/