1 1.1 christos /* DWARF DIEs 2 1.1 christos 3 1.1 christos Copyright (C) 1994-2024 Free Software Foundation, Inc. 4 1.1 christos 5 1.1 christos This file is part of GDB. 6 1.1 christos 7 1.1 christos This program is free software; you can redistribute it and/or modify 8 1.1 christos it under the terms of the GNU General Public License as published by 9 1.1 christos the Free Software Foundation; either version 3 of the License, or 10 1.1 christos (at your option) any later version. 11 1.1 christos 12 1.1 christos This program is distributed in the hope that it will be useful, 13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 christos GNU General Public License for more details. 16 1.1 christos 17 1.1 christos You should have received a copy of the GNU General Public License 18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 1.1 christos 20 1.1 christos #include "dwarf2/die.h" 21 1.1 christos #include "dwarf2/stringify.h" 22 1.1 christos 23 1.1 christos /* See die.h. */ 24 1.1 christos 25 1.1 christos struct die_info * 26 1.1 christos die_info::allocate (struct obstack *obstack, int num_attrs) 27 1.1 christos { 28 1.1 christos size_t size = sizeof (struct die_info); 29 1.1 christos 30 1.1 christos if (num_attrs > 1) 31 1.1 christos size += (num_attrs - 1) * sizeof (struct attribute); 32 1.1 christos 33 1.1 christos struct die_info *die = (struct die_info *) obstack_alloc (obstack, size); 34 1.1 christos memset (die, 0, size); 35 1.1 christos return die; 36 1.1 christos } 37 1.1 christos 38 1.1 christos static void 39 1.1 christos dump_die_shallow (struct ui_file *f, int indent, struct die_info *die) 40 1.1 christos { 41 1.1 christos unsigned int i; 42 1.1 christos 43 1.1 christos gdb_printf (f, "%*sDie: %s (abbrev %d, offset %s)\n", 44 1.1 christos indent, "", 45 1.1 christos dwarf_tag_name (die->tag), die->abbrev, 46 1.1 christos sect_offset_str (die->sect_off)); 47 1.1 christos 48 1.1 christos if (die->parent != NULL) 49 1.1 christos gdb_printf (f, "%*s parent at offset: %s\n", 50 1.1 christos indent, "", 51 1.1 christos sect_offset_str (die->parent->sect_off)); 52 1.1 christos 53 1.1 christos gdb_printf (f, "%*s has children: %s\n", 54 1.1 christos indent, "", 55 1.1 christos dwarf_bool_name (die->child != NULL)); 56 1.1 christos 57 1.1 christos gdb_printf (f, "%*s attributes:\n", indent, ""); 58 1.1 christos 59 1.1 christos for (i = 0; i < die->num_attrs; ++i) 60 1.1 christos { 61 1.1 christos gdb_printf (f, "%*s %s (%s) ", 62 1.1 christos indent, "", 63 1.1 christos dwarf_attr_name (die->attrs[i].name), 64 1.1 christos dwarf_form_name (die->attrs[i].form)); 65 1.1 christos 66 1.1 christos switch (die->attrs[i].form) 67 1.1 christos { 68 1.1 christos case DW_FORM_addr: 69 1.1 christos case DW_FORM_addrx: 70 1.1 christos case DW_FORM_GNU_addr_index: 71 1.1 christos gdb_printf (f, "address: "); 72 1.1 christos gdb_puts (hex_string ((CORE_ADDR) die->attrs[i].as_address ()), f); 73 1.1 christos break; 74 1.1 christos case DW_FORM_block2: 75 1.1 christos case DW_FORM_block4: 76 1.1 christos case DW_FORM_block: 77 1.1 christos case DW_FORM_block1: 78 1.1 christos gdb_printf (f, "block: size %s", 79 1.1 christos pulongest (die->attrs[i].as_block ()->size)); 80 1.1 christos break; 81 1.1 christos case DW_FORM_exprloc: 82 1.1 christos gdb_printf (f, "expression: size %s", 83 1.1 christos pulongest (die->attrs[i].as_block ()->size)); 84 1.1 christos break; 85 1.1 christos case DW_FORM_data16: 86 1.1 christos gdb_printf (f, "constant of 16 bytes"); 87 1.1 christos break; 88 1.1 christos case DW_FORM_ref_addr: 89 1.1 christos gdb_printf (f, "ref address: "); 90 1.1 christos gdb_puts (hex_string (die->attrs[i].as_unsigned ()), f); 91 1.1 christos break; 92 1.1 christos case DW_FORM_GNU_ref_alt: 93 1.1 christos gdb_printf (f, "alt ref address: "); 94 1.1 christos gdb_puts (hex_string (die->attrs[i].as_unsigned ()), f); 95 1.1 christos break; 96 1.1 christos case DW_FORM_ref1: 97 1.1 christos case DW_FORM_ref2: 98 1.1 christos case DW_FORM_ref4: 99 1.1 christos case DW_FORM_ref8: 100 1.1 christos case DW_FORM_ref_udata: 101 1.1 christos gdb_printf (f, "constant ref: 0x%lx (adjusted)", 102 1.1 christos (long) (die->attrs[i].as_unsigned ())); 103 1.1 christos break; 104 1.1 christos case DW_FORM_data1: 105 1.1 christos case DW_FORM_data2: 106 1.1 christos case DW_FORM_data4: 107 1.1 christos case DW_FORM_data8: 108 1.1 christos case DW_FORM_udata: 109 1.1 christos gdb_printf (f, "constant: %s", 110 1.1 christos pulongest (die->attrs[i].as_unsigned ())); 111 1.1 christos break; 112 1.1 christos case DW_FORM_sec_offset: 113 1.1 christos gdb_printf (f, "section offset: %s", 114 1.1 christos pulongest (die->attrs[i].as_unsigned ())); 115 1.1 christos break; 116 1.1 christos case DW_FORM_ref_sig8: 117 1.1 christos gdb_printf (f, "signature: %s", 118 1.1 christos hex_string (die->attrs[i].as_signature ())); 119 1.1 christos break; 120 1.1 christos case DW_FORM_string: 121 1.1 christos case DW_FORM_strp: 122 1.1 christos case DW_FORM_line_strp: 123 1.1 christos case DW_FORM_strx: 124 1.1 christos case DW_FORM_GNU_str_index: 125 1.1 christos case DW_FORM_GNU_strp_alt: 126 1.1 christos gdb_printf (f, "string: \"%s\" (%s canonicalized)", 127 1.1 christos die->attrs[i].as_string () 128 1.1 christos ? die->attrs[i].as_string () : "", 129 1.1 christos die->attrs[i].canonical_string_p () ? "is" : "not"); 130 1.1 christos break; 131 1.1 christos case DW_FORM_flag: 132 1.1 christos if (die->attrs[i].as_boolean ()) 133 1.1 christos gdb_printf (f, "flag: TRUE"); 134 1.1 christos else 135 1.1 christos gdb_printf (f, "flag: FALSE"); 136 1.1 christos break; 137 1.1 christos case DW_FORM_flag_present: 138 1.1 christos gdb_printf (f, "flag: TRUE"); 139 1.1 christos break; 140 1.1 christos case DW_FORM_indirect: 141 1.1 christos /* The reader will have reduced the indirect form to 142 1.1 christos the "base form" so this form should not occur. */ 143 1.1 christos gdb_printf (f, 144 1.1 christos "unexpected attribute form: DW_FORM_indirect"); 145 1.1 christos break; 146 1.1 christos case DW_FORM_sdata: 147 1.1 christos case DW_FORM_implicit_const: 148 1.1 christos gdb_printf (f, "constant: %s", 149 1.1 christos plongest (die->attrs[i].as_signed ())); 150 1.1 christos break; 151 1.1 christos default: 152 1.1 christos gdb_printf (f, "unsupported attribute form: %d.", 153 1.1 christos die->attrs[i].form); 154 1.1 christos break; 155 1.1 christos } 156 1.1 christos gdb_printf (f, "\n"); 157 1.1 christos } 158 1.1 christos } 159 1.1 christos 160 1.1 christos static void 161 1.1 christos dump_die_1 (struct ui_file *f, int level, int max_level, struct die_info *die) 162 1.1 christos { 163 1.1 christos int indent = level * 4; 164 1.1 christos 165 1.1 christos gdb_assert (die != NULL); 166 1.1 christos 167 1.1 christos if (level >= max_level) 168 1.1 christos return; 169 1.1 christos 170 1.1 christos dump_die_shallow (f, indent, die); 171 1.1 christos 172 1.1 christos if (die->child != NULL) 173 1.1 christos { 174 1.1 christos gdb_printf (f, "%*s Children:", indent, ""); 175 1.1 christos if (level + 1 < max_level) 176 1.1 christos { 177 1.1 christos gdb_printf (f, "\n"); 178 1.1 christos dump_die_1 (f, level + 1, max_level, die->child); 179 1.1 christos } 180 1.1 christos else 181 1.1 christos { 182 1.1 christos gdb_printf (f, 183 1.1 christos " [not printed, max nesting level reached]\n"); 184 1.1 christos } 185 1.1 christos } 186 1.1 christos 187 1.1 christos if (die->sibling != NULL && level > 0) 188 1.1 christos { 189 1.1 christos dump_die_1 (f, level, max_level, die->sibling); 190 1.1 christos } 191 1.1 christos } 192 1.1 christos 193 1.1 christos /* See die.h. */ 194 1.1 christos 195 1.1 christos void 196 1.1 christos die_info::dump (int max_level) 197 1.1 christos { 198 1.1 christos dump_die_1 (gdb_stdlog, 0, max_level, this); 199 1.1 christos } 200 1.1 christos 201 1.1 christos /* See die.h. */ 202 1.1 christos 203 1.1 christos void 204 1.1 christos die_info::error_dump () 205 1.1 christos { 206 1.1 christos dump_die_shallow (gdb_stderr, 0, this); 207 1.1 christos } 208