1 2 /*--------------------------------------------------------------------*/ 3 /*--- Basic definitions and helper functions for DWARF3. ---*/ 4 /*--- priv_d3basics.h ---*/ 5 /*--------------------------------------------------------------------*/ 6 7 /* 8 This file is part of Valgrind, a dynamic binary instrumentation 9 framework. 10 11 Copyright (C) 2008-2010 OpenWorks LLP and others; see below 12 info@open-works.co.uk 13 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. 18 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. 23 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 27 02111-1307, USA. 28 29 The GNU General Public License is contained in the file COPYING. 30 31 ------------- 32 33 Some of this code (DWARF3 enumerations) is taken from FSF's 34 gdb-6.6/include/elf/dwarf2.h, which is Copyright (C) 1992 to 2006 35 Free Software Foundation, Inc and is also GPL-2-or-later. 36 */ 37 38 #ifndef __PRIV_D3BASICS_H 39 #define __PRIV_D3BASICS_H 40 41 42 /* This stuff is taken from gdb-6.6/include/elf/dwarf2.h, which is 43 GPL2+. 44 */ 45 /* Tag names and codes. */ 46 typedef enum 47 { 48 DW_TAG_padding = 0x00, 49 DW_TAG_array_type = 0x01, 50 DW_TAG_class_type = 0x02, 51 DW_TAG_entry_point = 0x03, 52 DW_TAG_enumeration_type = 0x04, 53 DW_TAG_formal_parameter = 0x05, 54 DW_TAG_imported_declaration = 0x08, 55 DW_TAG_label = 0x0a, 56 DW_TAG_lexical_block = 0x0b, 57 DW_TAG_member = 0x0d, 58 DW_TAG_pointer_type = 0x0f, 59 DW_TAG_reference_type = 0x10, 60 DW_TAG_compile_unit = 0x11, 61 DW_TAG_string_type = 0x12, 62 DW_TAG_structure_type = 0x13, 63 DW_TAG_subroutine_type = 0x15, 64 DW_TAG_typedef = 0x16, 65 DW_TAG_union_type = 0x17, 66 DW_TAG_unspecified_parameters = 0x18, 67 DW_TAG_variant = 0x19, 68 DW_TAG_common_block = 0x1a, 69 DW_TAG_common_inclusion = 0x1b, 70 DW_TAG_inheritance = 0x1c, 71 DW_TAG_inlined_subroutine = 0x1d, 72 DW_TAG_module = 0x1e, 73 DW_TAG_ptr_to_member_type = 0x1f, 74 DW_TAG_set_type = 0x20, 75 DW_TAG_subrange_type = 0x21, 76 DW_TAG_with_stmt = 0x22, 77 DW_TAG_access_declaration = 0x23, 78 DW_TAG_base_type = 0x24, 79 DW_TAG_catch_block = 0x25, 80 DW_TAG_const_type = 0x26, 81 DW_TAG_constant = 0x27, 82 DW_TAG_enumerator = 0x28, 83 DW_TAG_file_type = 0x29, 84 DW_TAG_friend = 0x2a, 85 DW_TAG_namelist = 0x2b, 86 DW_TAG_namelist_item = 0x2c, 87 DW_TAG_packed_type = 0x2d, 88 DW_TAG_subprogram = 0x2e, 89 DW_TAG_template_type_param = 0x2f, 90 DW_TAG_template_value_param = 0x30, 91 DW_TAG_thrown_type = 0x31, 92 DW_TAG_try_block = 0x32, 93 DW_TAG_variant_part = 0x33, 94 DW_TAG_variable = 0x34, 95 DW_TAG_volatile_type = 0x35, 96 /* DWARF 3. */ 97 DW_TAG_dwarf_procedure = 0x36, 98 DW_TAG_restrict_type = 0x37, 99 DW_TAG_interface_type = 0x38, 100 DW_TAG_namespace = 0x39, 101 DW_TAG_imported_module = 0x3a, 102 DW_TAG_unspecified_type = 0x3b, 103 DW_TAG_partial_unit = 0x3c, 104 DW_TAG_imported_unit = 0x3d, 105 DW_TAG_condition = 0x3f, 106 DW_TAG_shared_type = 0x40, 107 /* DWARF 4. */ 108 DW_TAG_type_unit = 0x41, 109 DW_TAG_rvalue_reference_type = 0x42, 110 DW_TAG_template_alias = 0x43, 111 /* SGI/MIPS Extensions. */ 112 DW_TAG_MIPS_loop = 0x4081, 113 /* HP extensions. See: ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz . */ 114 DW_TAG_HP_array_descriptor = 0x4090, 115 /* GNU extensions. */ 116 DW_TAG_format_label = 0x4101, /* For FORTRAN 77 and Fortran 90. */ 117 DW_TAG_function_template = 0x4102, /* For C++. */ 118 DW_TAG_class_template = 0x4103, /* For C++. */ 119 DW_TAG_GNU_BINCL = 0x4104, 120 DW_TAG_GNU_EINCL = 0x4105, 121 /* Extensions for UPC. See: http://upc.gwu.edu/~upc. */ 122 DW_TAG_upc_shared_type = 0x8765, 123 DW_TAG_upc_strict_type = 0x8766, 124 DW_TAG_upc_relaxed_type = 0x8767, 125 /* PGI (STMicroelectronics) extensions. No documentation available. */ 126 DW_TAG_PGI_kanji_type = 0xA000, 127 DW_TAG_PGI_interface_block = 0xA020 128 } 129 DW_TAG; 130 131 #define DW_TAG_lo_user 0x4080 132 #define DW_TAG_hi_user 0xffff 133 134 /* Flag that tells whether entry has a child or not. */ 135 typedef enum 136 { 137 DW_children_no = 0, 138 DW_children_yes = 1 139 } 140 DW_children; 141 142 /* Source language names and codes. */ 143 typedef enum dwarf_source_language 144 { 145 DW_LANG_C89 = 0x0001, 146 DW_LANG_C = 0x0002, 147 DW_LANG_Ada83 = 0x0003, 148 DW_LANG_C_plus_plus = 0x0004, 149 DW_LANG_Cobol74 = 0x0005, 150 DW_LANG_Cobol85 = 0x0006, 151 DW_LANG_Fortran77 = 0x0007, 152 DW_LANG_Fortran90 = 0x0008, 153 DW_LANG_Pascal83 = 0x0009, 154 DW_LANG_Modula2 = 0x000a, 155 /* DWARF 3. */ 156 DW_LANG_Java = 0x000b, 157 DW_LANG_C99 = 0x000c, 158 DW_LANG_Ada95 = 0x000d, 159 DW_LANG_Fortran95 = 0x000e, 160 DW_LANG_PLI = 0x000f, 161 DW_LANG_ObjC = 0x0010, 162 DW_LANG_ObjC_plus_plus = 0x0011, 163 DW_LANG_UPC = 0x0012, 164 DW_LANG_D = 0x0013, 165 /* DWARF 4. */ 166 DW_LANG_Python = 0x0014, 167 /* MIPS. */ 168 DW_LANG_Mips_Assembler = 0x8001, 169 /* UPC. */ 170 DW_LANG_Upc = 0x8765 171 } 172 DW_LANG; 173 174 /* Form names and codes. */ 175 typedef enum 176 { 177 DW_FORM_addr = 0x01, 178 DW_FORM_block2 = 0x03, 179 DW_FORM_block4 = 0x04, 180 DW_FORM_data2 = 0x05, 181 DW_FORM_data4 = 0x06, 182 DW_FORM_data8 = 0x07, 183 DW_FORM_string = 0x08, 184 DW_FORM_block = 0x09, 185 DW_FORM_block1 = 0x0a, 186 DW_FORM_data1 = 0x0b, 187 DW_FORM_flag = 0x0c, 188 DW_FORM_sdata = 0x0d, 189 DW_FORM_strp = 0x0e, 190 DW_FORM_udata = 0x0f, 191 DW_FORM_ref_addr = 0x10, 192 DW_FORM_ref1 = 0x11, 193 DW_FORM_ref2 = 0x12, 194 DW_FORM_ref4 = 0x13, 195 DW_FORM_ref8 = 0x14, 196 DW_FORM_ref_udata = 0x15, 197 DW_FORM_indirect = 0x16, 198 /* DWARF 4 values. */ 199 DW_FORM_sec_offset = 0x17, 200 DW_FORM_exprloc = 0x18, 201 DW_FORM_flag_present = 0x19, 202 DW_FORM_ref_sig8 = 0x20 203 } 204 DW_FORM; 205 206 /* Attribute names and codes. */ 207 typedef enum 208 { 209 DW_AT_sibling = 0x01, 210 DW_AT_location = 0x02, 211 DW_AT_name = 0x03, 212 DW_AT_ordering = 0x09, 213 DW_AT_subscr_data = 0x0a, 214 DW_AT_byte_size = 0x0b, 215 DW_AT_bit_offset = 0x0c, 216 DW_AT_bit_size = 0x0d, 217 DW_AT_element_list = 0x0f, 218 DW_AT_stmt_list = 0x10, 219 DW_AT_low_pc = 0x11, 220 DW_AT_high_pc = 0x12, 221 DW_AT_language = 0x13, 222 DW_AT_member = 0x14, 223 DW_AT_discr = 0x15, 224 DW_AT_discr_value = 0x16, 225 DW_AT_visibility = 0x17, 226 DW_AT_import = 0x18, 227 DW_AT_string_length = 0x19, 228 DW_AT_common_reference = 0x1a, 229 DW_AT_comp_dir = 0x1b, 230 DW_AT_const_value = 0x1c, 231 DW_AT_containing_type = 0x1d, 232 DW_AT_default_value = 0x1e, 233 DW_AT_inline = 0x20, 234 DW_AT_is_optional = 0x21, 235 DW_AT_lower_bound = 0x22, 236 DW_AT_producer = 0x25, 237 DW_AT_prototyped = 0x27, 238 DW_AT_return_addr = 0x2a, 239 DW_AT_start_scope = 0x2c, 240 DW_AT_stride_size = 0x2e, 241 DW_AT_upper_bound = 0x2f, 242 DW_AT_abstract_origin = 0x31, 243 DW_AT_accessibility = 0x32, 244 DW_AT_address_class = 0x33, 245 DW_AT_artificial = 0x34, 246 DW_AT_base_types = 0x35, 247 DW_AT_calling_convention = 0x36, 248 DW_AT_count = 0x37, 249 DW_AT_data_member_location = 0x38, 250 DW_AT_decl_column = 0x39, 251 DW_AT_decl_file = 0x3a, 252 DW_AT_decl_line = 0x3b, 253 DW_AT_declaration = 0x3c, 254 DW_AT_discr_list = 0x3d, 255 DW_AT_encoding = 0x3e, 256 DW_AT_external = 0x3f, 257 DW_AT_frame_base = 0x40, 258 DW_AT_friend = 0x41, 259 DW_AT_identifier_case = 0x42, 260 DW_AT_macro_info = 0x43, 261 DW_AT_namelist_items = 0x44, 262 DW_AT_priority = 0x45, 263 DW_AT_segment = 0x46, 264 DW_AT_specification = 0x47, 265 DW_AT_static_link = 0x48, 266 DW_AT_type = 0x49, 267 DW_AT_use_location = 0x4a, 268 DW_AT_variable_parameter = 0x4b, 269 DW_AT_virtuality = 0x4c, 270 DW_AT_vtable_elem_location = 0x4d, 271 /* DWARF 3 values. */ 272 DW_AT_allocated = 0x4e, 273 DW_AT_associated = 0x4f, 274 DW_AT_data_location = 0x50, 275 DW_AT_stride = 0x51, 276 DW_AT_entry_pc = 0x52, 277 DW_AT_use_UTF8 = 0x53, 278 DW_AT_extension = 0x54, 279 DW_AT_ranges = 0x55, 280 DW_AT_trampoline = 0x56, 281 DW_AT_call_column = 0x57, 282 DW_AT_call_file = 0x58, 283 DW_AT_call_line = 0x59, 284 DW_AT_description = 0x5a, 285 DW_AT_binary_scale = 0x5b, 286 DW_AT_decimal_scale = 0x5c, 287 DW_AT_small = 0x5d, 288 DW_AT_decimal_sign = 0x5e, 289 DW_AT_digit_count = 0x5f, 290 DW_AT_picture_string = 0x60, 291 DW_AT_mutable = 0x61, 292 DW_AT_threads_scaled = 0x62, 293 DW_AT_explicit = 0x63, 294 DW_AT_object_pointer = 0x64, 295 DW_AT_endianity = 0x65, 296 DW_AT_elemental = 0x66, 297 DW_AT_pure = 0x67, 298 DW_AT_recursive = 0x68, 299 /* DWARF 4 values. */ 300 DW_AT_signature = 0x69, 301 DW_AT_main_subprogram = 0x6a, 302 DW_AT_data_bit_offset = 0x6b, 303 DW_AT_const_expr = 0x6c, 304 DW_AT_enum_class = 0x6d, 305 DW_AT_linkage_name = 0x6e, 306 /* SGI/MIPS extensions. */ 307 DW_AT_MIPS_fde = 0x2001, 308 DW_AT_MIPS_loop_begin = 0x2002, 309 DW_AT_MIPS_tail_loop_begin = 0x2003, 310 DW_AT_MIPS_epilog_begin = 0x2004, 311 DW_AT_MIPS_loop_unroll_factor = 0x2005, 312 DW_AT_MIPS_software_pipeline_depth = 0x2006, 313 DW_AT_MIPS_linkage_name = 0x2007, 314 DW_AT_MIPS_stride = 0x2008, 315 DW_AT_MIPS_abstract_name = 0x2009, 316 DW_AT_MIPS_clone_origin = 0x200a, 317 DW_AT_MIPS_has_inlines = 0x200b, 318 /* HP extensions. */ 319 DW_AT_HP_block_index = 0x2000, 320 DW_AT_HP_unmodifiable = 0x2001, /* Same as DW_AT_MIPS_fde. */ 321 DW_AT_HP_actuals_stmt_list = 0x2010, 322 DW_AT_HP_proc_per_section = 0x2011, 323 DW_AT_HP_raw_data_ptr = 0x2012, 324 DW_AT_HP_pass_by_reference = 0x2013, 325 DW_AT_HP_opt_level = 0x2014, 326 DW_AT_HP_prof_version_id = 0x2015, 327 DW_AT_HP_opt_flags = 0x2016, 328 DW_AT_HP_cold_region_low_pc = 0x2017, 329 DW_AT_HP_cold_region_high_pc = 0x2018, 330 DW_AT_HP_all_variables_modifiable = 0x2019, 331 DW_AT_HP_linkage_name = 0x201a, 332 DW_AT_HP_prof_flags = 0x201b, /* In comp unit of procs_info for -g. */ 333 /* GNU extensions. */ 334 DW_AT_sf_names = 0x2101, 335 DW_AT_src_info = 0x2102, 336 DW_AT_mac_info = 0x2103, 337 DW_AT_src_coords = 0x2104, 338 DW_AT_body_begin = 0x2105, 339 DW_AT_body_end = 0x2106, 340 DW_AT_GNU_vector = 0x2107, 341 /* VMS extensions. */ 342 DW_AT_VMS_rtnbeg_pd_address = 0x2201, 343 /* UPC extension. */ 344 DW_AT_upc_threads_scaled = 0x3210, 345 /* PGI (STMicroelectronics) extensions. */ 346 DW_AT_PGI_lbase = 0x3a00, 347 DW_AT_PGI_soffset = 0x3a01, 348 DW_AT_PGI_lstride = 0x3a02 349 } 350 DW_AT; 351 352 #define DW_AT_lo_user 0x2000 /* Implementation-defined range start. */ 353 #define DW_AT_hi_user 0x3ff0 /* Implementation-defined range end. */ 354 355 /* Type encodings. */ 356 typedef enum 357 { 358 DW_ATE_void = 0x0, 359 DW_ATE_address = 0x1, 360 DW_ATE_boolean = 0x2, 361 DW_ATE_complex_float = 0x3, 362 DW_ATE_float = 0x4, 363 DW_ATE_signed = 0x5, 364 DW_ATE_signed_char = 0x6, 365 DW_ATE_unsigned = 0x7, 366 DW_ATE_unsigned_char = 0x8, 367 /* DWARF 3. */ 368 DW_ATE_imaginary_float = 0x9, 369 DW_ATE_packed_decimal = 0xa, 370 DW_ATE_numeric_string = 0xb, 371 DW_ATE_edited = 0xc, 372 DW_ATE_signed_fixed = 0xd, 373 DW_ATE_unsigned_fixed = 0xe, 374 DW_ATE_decimal_float = 0xf, 375 /* DWARF 4. */ 376 DW_ATE_UTF = 0x10, 377 /* HP extensions. */ 378 DW_ATE_HP_float80 = 0x80, /* Floating-point (80 bit). */ 379 DW_ATE_HP_complex_float80 = 0x81, /* Complex floating-point (80 bit). */ 380 DW_ATE_HP_float128 = 0x82, /* Floating-point (128 bit). */ 381 DW_ATE_HP_complex_float128 = 0x83, /* Complex floating-point (128 bit). */ 382 DW_ATE_HP_floathpintel = 0x84, /* Floating-point (82 bit IA64). */ 383 DW_ATE_HP_imaginary_float80 = 0x85, 384 DW_ATE_HP_imaginary_float128 = 0x86 385 } 386 DW_ATE; 387 388 389 /* Expression operations. */ 390 typedef enum 391 { 392 DW_OP_addr = 0x03, 393 DW_OP_deref = 0x06, 394 DW_OP_const1u = 0x08, 395 DW_OP_const1s = 0x09, 396 DW_OP_const2u = 0x0a, 397 DW_OP_const2s = 0x0b, 398 DW_OP_const4u = 0x0c, 399 DW_OP_const4s = 0x0d, 400 DW_OP_const8u = 0x0e, 401 DW_OP_const8s = 0x0f, 402 DW_OP_constu = 0x10, 403 DW_OP_consts = 0x11, 404 DW_OP_dup = 0x12, 405 DW_OP_drop = 0x13, 406 DW_OP_over = 0x14, 407 DW_OP_pick = 0x15, 408 DW_OP_swap = 0x16, 409 DW_OP_rot = 0x17, 410 DW_OP_xderef = 0x18, 411 DW_OP_abs = 0x19, 412 DW_OP_and = 0x1a, 413 DW_OP_div = 0x1b, 414 DW_OP_minus = 0x1c, 415 DW_OP_mod = 0x1d, 416 DW_OP_mul = 0x1e, 417 DW_OP_neg = 0x1f, 418 DW_OP_not = 0x20, 419 DW_OP_or = 0x21, 420 DW_OP_plus = 0x22, 421 DW_OP_plus_uconst = 0x23, 422 DW_OP_shl = 0x24, 423 DW_OP_shr = 0x25, 424 DW_OP_shra = 0x26, 425 DW_OP_xor = 0x27, 426 DW_OP_bra = 0x28, 427 DW_OP_eq = 0x29, 428 DW_OP_ge = 0x2a, 429 DW_OP_gt = 0x2b, 430 DW_OP_le = 0x2c, 431 DW_OP_lt = 0x2d, 432 DW_OP_ne = 0x2e, 433 DW_OP_skip = 0x2f, 434 DW_OP_lit0 = 0x30, 435 DW_OP_lit1 = 0x31, 436 DW_OP_lit2 = 0x32, 437 DW_OP_lit3 = 0x33, 438 DW_OP_lit4 = 0x34, 439 DW_OP_lit5 = 0x35, 440 DW_OP_lit6 = 0x36, 441 DW_OP_lit7 = 0x37, 442 DW_OP_lit8 = 0x38, 443 DW_OP_lit9 = 0x39, 444 DW_OP_lit10 = 0x3a, 445 DW_OP_lit11 = 0x3b, 446 DW_OP_lit12 = 0x3c, 447 DW_OP_lit13 = 0x3d, 448 DW_OP_lit14 = 0x3e, 449 DW_OP_lit15 = 0x3f, 450 DW_OP_lit16 = 0x40, 451 DW_OP_lit17 = 0x41, 452 DW_OP_lit18 = 0x42, 453 DW_OP_lit19 = 0x43, 454 DW_OP_lit20 = 0x44, 455 DW_OP_lit21 = 0x45, 456 DW_OP_lit22 = 0x46, 457 DW_OP_lit23 = 0x47, 458 DW_OP_lit24 = 0x48, 459 DW_OP_lit25 = 0x49, 460 DW_OP_lit26 = 0x4a, 461 DW_OP_lit27 = 0x4b, 462 DW_OP_lit28 = 0x4c, 463 DW_OP_lit29 = 0x4d, 464 DW_OP_lit30 = 0x4e, 465 DW_OP_lit31 = 0x4f, 466 DW_OP_reg0 = 0x50, 467 DW_OP_reg1 = 0x51, 468 DW_OP_reg2 = 0x52, 469 DW_OP_reg3 = 0x53, 470 DW_OP_reg4 = 0x54, 471 DW_OP_reg5 = 0x55, 472 DW_OP_reg6 = 0x56, 473 DW_OP_reg7 = 0x57, 474 DW_OP_reg8 = 0x58, 475 DW_OP_reg9 = 0x59, 476 DW_OP_reg10 = 0x5a, 477 DW_OP_reg11 = 0x5b, 478 DW_OP_reg12 = 0x5c, 479 DW_OP_reg13 = 0x5d, 480 DW_OP_reg14 = 0x5e, 481 DW_OP_reg15 = 0x5f, 482 DW_OP_reg16 = 0x60, 483 DW_OP_reg17 = 0x61, 484 DW_OP_reg18 = 0x62, 485 DW_OP_reg19 = 0x63, 486 DW_OP_reg20 = 0x64, 487 DW_OP_reg21 = 0x65, 488 DW_OP_reg22 = 0x66, 489 DW_OP_reg23 = 0x67, 490 DW_OP_reg24 = 0x68, 491 DW_OP_reg25 = 0x69, 492 DW_OP_reg26 = 0x6a, 493 DW_OP_reg27 = 0x6b, 494 DW_OP_reg28 = 0x6c, 495 DW_OP_reg29 = 0x6d, 496 DW_OP_reg30 = 0x6e, 497 DW_OP_reg31 = 0x6f, 498 DW_OP_breg0 = 0x70, 499 DW_OP_breg1 = 0x71, 500 DW_OP_breg2 = 0x72, 501 DW_OP_breg3 = 0x73, 502 DW_OP_breg4 = 0x74, 503 DW_OP_breg5 = 0x75, 504 DW_OP_breg6 = 0x76, 505 DW_OP_breg7 = 0x77, 506 DW_OP_breg8 = 0x78, 507 DW_OP_breg9 = 0x79, 508 DW_OP_breg10 = 0x7a, 509 DW_OP_breg11 = 0x7b, 510 DW_OP_breg12 = 0x7c, 511 DW_OP_breg13 = 0x7d, 512 DW_OP_breg14 = 0x7e, 513 DW_OP_breg15 = 0x7f, 514 DW_OP_breg16 = 0x80, 515 DW_OP_breg17 = 0x81, 516 DW_OP_breg18 = 0x82, 517 DW_OP_breg19 = 0x83, 518 DW_OP_breg20 = 0x84, 519 DW_OP_breg21 = 0x85, 520 DW_OP_breg22 = 0x86, 521 DW_OP_breg23 = 0x87, 522 DW_OP_breg24 = 0x88, 523 DW_OP_breg25 = 0x89, 524 DW_OP_breg26 = 0x8a, 525 DW_OP_breg27 = 0x8b, 526 DW_OP_breg28 = 0x8c, 527 DW_OP_breg29 = 0x8d, 528 DW_OP_breg30 = 0x8e, 529 DW_OP_breg31 = 0x8f, 530 DW_OP_regx = 0x90, 531 DW_OP_fbreg = 0x91, 532 DW_OP_bregx = 0x92, 533 DW_OP_piece = 0x93, 534 DW_OP_deref_size = 0x94, 535 DW_OP_xderef_size = 0x95, 536 DW_OP_nop = 0x96, 537 /* DWARF 3 extensions. */ 538 DW_OP_push_object_address = 0x97, 539 DW_OP_call2 = 0x98, 540 DW_OP_call4 = 0x99, 541 DW_OP_call_ref = 0x9a, 542 DW_OP_form_tls_address = 0x9b, 543 DW_OP_call_frame_cfa = 0x9c, 544 DW_OP_bit_piece = 0x9d, 545 /* DWARF 4 extensions. */ 546 DW_OP_implicit_value = 0x9e, 547 DW_OP_stack_value = 0x9f, 548 /* GNU extensions. */ 549 DW_OP_GNU_push_tls_address = 0xe0, 550 /* HP extensions. */ 551 DW_OP_HP_unknown = 0xe0, /* Ouch, the same as GNU_push_tls_address. */ 552 DW_OP_HP_is_value = 0xe1, 553 DW_OP_HP_fltconst4 = 0xe2, 554 DW_OP_HP_fltconst8 = 0xe3, 555 DW_OP_HP_mod_range = 0xe4, 556 DW_OP_HP_unmod_range = 0xe5, 557 DW_OP_HP_tls = 0xe6 558 } 559 DW_OP; 560 561 HChar* ML_(pp_DW_children) ( DW_children hashch ); 562 HChar* ML_(pp_DW_TAG) ( DW_TAG tag ); 563 HChar* ML_(pp_DW_FORM) ( DW_FORM form ); 564 HChar* ML_(pp_DW_AT) ( DW_AT attr ); 565 566 567 /* --- To do with evaluation of Dwarf expressions --- */ 568 569 /* Guarded Dwarf3 expressions, which can be linked together to form a 570 list. The payload field contains a variable length array of bytes 571 which hold the guarded expressions. The length can be inferred by 572 inspecting the payload bytes and so does not need to be stored 573 explicitly. 574 575 Guarded-Expression format is similar but not identical to the 576 DWARF3 location-list format. The format of each returned block is: 577 578 UChar biasMe; 579 UChar isEnd; 580 followed by zero or more of 581 582 (Addr aMin; Addr aMax; UShort nbytes; ..bytes..; UChar isEnd) 583 584 '..bytes..' is an standard DWARF3 location expression which is 585 valid when aMin <= pc <= aMax (possibly after suitable biasing). 586 587 The number of bytes in '..bytes..' is nbytes. 588 589 The end of the sequence is marked by an isEnd == 1 value. All 590 previous isEnd values must be zero. 591 592 biasMe is 1 if the aMin/aMax fields need this DebugInfo's text_bias 593 added before use, and 0 if the GX is this is not necessary (is 594 ready to go). 595 596 Hence the block can be quickly parsed and is self-describing. Note 597 that aMax is 1 less than the corresponding value in a DWARF3 598 location list. Zero length ranges, with aMax == aMin-1, are not 599 allowed. 600 */ 601 typedef 602 struct _GExpr { 603 UChar payload[0]; 604 } 605 GExpr; 606 607 /* Show a so-called guarded expression */ 608 void ML_(pp_GX) ( GExpr* gx ); 609 610 /* Evaluation of a DWARF3 expression (and hence of a GExpr) may 611 require knowing a suitably contextualising set of values for the 612 instruction, frame and stack pointers (and, in general, all 613 registers, though we punt on such generality here). Here's a 614 struct to carry the bare essentials. ip, fp and sp are expected to 615 be provided for all platforms. */ 616 typedef 617 struct { Addr ip; Addr sp; Addr fp; } 618 RegSummary; 619 620 /* This describes the result of evaluating a DWARF3 expression. 621 GXR_Failure: failed; .word is an asciiz string summarising why 622 GXR_Addr: evaluated to an address of the object, in .word 623 GXR_Value: evaluated to a value, in .word 624 GXR_RegNo: evaluated to a DWARF3 register number, in .word 625 */ 626 typedef 627 struct { 628 enum { GXR_Failure, GXR_Addr, GXR_Value, GXR_RegNo } kind; 629 UWord word; 630 } 631 GXResult; 632 633 void ML_(pp_GXResult) ( GXResult res ); 634 635 /* Evaluate a guarded expression. If regs is NULL, then gx is assumed 636 (and checked) to contain just a single guarded expression, with a 637 guard which covers the entire address space and so always evaluates 638 to True (iow, gx is a single unconditional expression). If regs is 639 non-NULL then its .ip value is used to select which of the 640 embedded DWARF3 location expressions to use, and that is duly 641 evaluated. 642 643 If as part of the evaluation, a frame base value needs to be 644 computed, then fbGX can provide an expression for it. If fbGX is 645 NULL but the frame base is still needed, then evaluation of gx as a 646 whole will fail. */ 647 GXResult ML_(evaluate_GX)( GExpr* gx, GExpr* fbGX, 648 RegSummary* regs, const DebugInfo* di ); 649 650 /* This is a subsidiary of ML_(evaluate_GX), which just evaluates a 651 single standard DWARF3 expression. Conventions w.r.t regs and fbGX 652 are as for ML_(evaluate_GX). If push_initial_zero is True, then an 653 initial zero word is pushed on the evaluation stack at the start. 654 This is needed for computing structure field offsets. Note that 655 ML_(evaluate_GX) and ML_(evaluate_Dwarf3_Expr) are mutually 656 recursive. */ 657 GXResult ML_(evaluate_Dwarf3_Expr) ( UChar* expr, UWord exprszB, 658 GExpr* fbGX, RegSummary* regs, 659 const DebugInfo* di, 660 Bool push_initial_zero ); 661 662 /* Evaluate a very simple Guarded (DWARF3) expression. The expression 663 is expected to denote a constant, with no reference to any 664 registers nor to any frame base expression. GXR_Failure is 665 returned if there is more than one guard, or none, a register 666 location is denoted, a frame base expression is required, or the 667 expression is not manifestly a constant. The range of addresses 668 covered by the guard is also ignored. */ 669 GXResult ML_(evaluate_trivial_GX)( GExpr* gx, const DebugInfo* di ); 670 671 /* Compute call frame address (CFA) for IP/SP/FP. */ 672 Addr ML_(get_CFA) ( Addr ip, Addr sp, Addr fp, 673 Addr min_accessible, Addr max_accessible ); 674 675 #endif /* ndef __PRIV_D3BASICS_H */ 676 677 /*--------------------------------------------------------------------*/ 678 /*--- end priv_d3basics.h ---*/ 679 /*--------------------------------------------------------------------*/ 680