die.c revision 1.1 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 /* See die.h. */
39 1.1 christos
40 1.1 christos hashval_t
41 1.1 christos die_info::hash (const void *item)
42 1.1 christos {
43 1.1 christos const struct die_info *die = (const struct die_info *) item;
44 1.1 christos
45 1.1 christos return to_underlying (die->sect_off);
46 1.1 christos }
47 1.1 christos
48 1.1 christos /* See die.h. */
49 1.1 christos
50 1.1 christos int
51 1.1 christos die_info::eq (const void *item_lhs, const void *item_rhs)
52 1.1 christos {
53 1.1 christos const struct die_info *die_lhs = (const struct die_info *) item_lhs;
54 1.1 christos const struct die_info *die_rhs = (const struct die_info *) item_rhs;
55 1.1 christos
56 1.1 christos return die_lhs->sect_off == die_rhs->sect_off;
57 1.1 christos }
58 1.1 christos
59 1.1 christos static void
60 1.1 christos dump_die_shallow (struct ui_file *f, int indent, struct die_info *die)
61 1.1 christos {
62 1.1 christos unsigned int i;
63 1.1 christos
64 1.1 christos gdb_printf (f, "%*sDie: %s (abbrev %d, offset %s)\n",
65 1.1 christos indent, "",
66 1.1 christos dwarf_tag_name (die->tag), die->abbrev,
67 1.1 christos sect_offset_str (die->sect_off));
68 1.1 christos
69 1.1 christos if (die->parent != NULL)
70 1.1 christos gdb_printf (f, "%*s parent at offset: %s\n",
71 1.1 christos indent, "",
72 1.1 christos sect_offset_str (die->parent->sect_off));
73 1.1 christos
74 1.1 christos gdb_printf (f, "%*s has children: %s\n",
75 1.1 christos indent, "",
76 1.1 christos dwarf_bool_name (die->child != NULL));
77 1.1 christos
78 1.1 christos gdb_printf (f, "%*s attributes:\n", indent, "");
79 1.1 christos
80 1.1 christos for (i = 0; i < die->num_attrs; ++i)
81 1.1 christos {
82 1.1 christos gdb_printf (f, "%*s %s (%s) ",
83 1.1 christos indent, "",
84 1.1 christos dwarf_attr_name (die->attrs[i].name),
85 1.1 christos dwarf_form_name (die->attrs[i].form));
86 1.1 christos
87 1.1 christos switch (die->attrs[i].form)
88 1.1 christos {
89 1.1 christos case DW_FORM_addr:
90 1.1 christos case DW_FORM_addrx:
91 1.1 christos case DW_FORM_GNU_addr_index:
92 1.1 christos gdb_printf (f, "address: ");
93 1.1 christos gdb_puts (hex_string ((CORE_ADDR) die->attrs[i].as_address ()), f);
94 1.1 christos break;
95 1.1 christos case DW_FORM_block2:
96 1.1 christos case DW_FORM_block4:
97 1.1 christos case DW_FORM_block:
98 1.1 christos case DW_FORM_block1:
99 1.1 christos gdb_printf (f, "block: size %s",
100 1.1 christos pulongest (die->attrs[i].as_block ()->size));
101 1.1 christos break;
102 1.1 christos case DW_FORM_exprloc:
103 1.1 christos gdb_printf (f, "expression: size %s",
104 1.1 christos pulongest (die->attrs[i].as_block ()->size));
105 1.1 christos break;
106 1.1 christos case DW_FORM_data16:
107 1.1 christos gdb_printf (f, "constant of 16 bytes");
108 1.1 christos break;
109 1.1 christos case DW_FORM_ref_addr:
110 1.1 christos gdb_printf (f, "ref address: ");
111 1.1 christos gdb_puts (hex_string (die->attrs[i].as_unsigned ()), f);
112 1.1 christos break;
113 1.1 christos case DW_FORM_GNU_ref_alt:
114 1.1 christos gdb_printf (f, "alt ref address: ");
115 1.1 christos gdb_puts (hex_string (die->attrs[i].as_unsigned ()), f);
116 1.1 christos break;
117 1.1 christos case DW_FORM_ref1:
118 1.1 christos case DW_FORM_ref2:
119 1.1 christos case DW_FORM_ref4:
120 1.1 christos case DW_FORM_ref8:
121 1.1 christos case DW_FORM_ref_udata:
122 1.1 christos gdb_printf (f, "constant ref: 0x%lx (adjusted)",
123 1.1 christos (long) (die->attrs[i].as_unsigned ()));
124 1.1 christos break;
125 1.1 christos case DW_FORM_data1:
126 1.1 christos case DW_FORM_data2:
127 1.1 christos case DW_FORM_data4:
128 1.1 christos case DW_FORM_data8:
129 1.1 christos case DW_FORM_udata:
130 1.1 christos gdb_printf (f, "constant: %s",
131 1.1 christos pulongest (die->attrs[i].as_unsigned ()));
132 1.1 christos break;
133 1.1 christos case DW_FORM_sec_offset:
134 1.1 christos gdb_printf (f, "section offset: %s",
135 1.1 christos pulongest (die->attrs[i].as_unsigned ()));
136 1.1 christos break;
137 1.1 christos case DW_FORM_ref_sig8:
138 1.1 christos gdb_printf (f, "signature: %s",
139 1.1 christos hex_string (die->attrs[i].as_signature ()));
140 1.1 christos break;
141 1.1 christos case DW_FORM_string:
142 1.1 christos case DW_FORM_strp:
143 1.1 christos case DW_FORM_line_strp:
144 1.1 christos case DW_FORM_strx:
145 1.1 christos case DW_FORM_GNU_str_index:
146 1.1 christos case DW_FORM_GNU_strp_alt:
147 1.1 christos gdb_printf (f, "string: \"%s\" (%s canonicalized)",
148 1.1 christos die->attrs[i].as_string ()
149 1.1 christos ? die->attrs[i].as_string () : "",
150 1.1 christos die->attrs[i].canonical_string_p () ? "is" : "not");
151 1.1 christos break;
152 1.1 christos case DW_FORM_flag:
153 1.1 christos if (die->attrs[i].as_boolean ())
154 1.1 christos gdb_printf (f, "flag: TRUE");
155 1.1 christos else
156 1.1 christos gdb_printf (f, "flag: FALSE");
157 1.1 christos break;
158 1.1 christos case DW_FORM_flag_present:
159 1.1 christos gdb_printf (f, "flag: TRUE");
160 1.1 christos break;
161 1.1 christos case DW_FORM_indirect:
162 1.1 christos /* The reader will have reduced the indirect form to
163 1.1 christos the "base form" so this form should not occur. */
164 1.1 christos gdb_printf (f,
165 1.1 christos "unexpected attribute form: DW_FORM_indirect");
166 1.1 christos break;
167 1.1 christos case DW_FORM_sdata:
168 1.1 christos case DW_FORM_implicit_const:
169 1.1 christos gdb_printf (f, "constant: %s",
170 1.1 christos plongest (die->attrs[i].as_signed ()));
171 1.1 christos break;
172 1.1 christos default:
173 1.1 christos gdb_printf (f, "unsupported attribute form: %d.",
174 1.1 christos die->attrs[i].form);
175 1.1 christos break;
176 1.1 christos }
177 1.1 christos gdb_printf (f, "\n");
178 1.1 christos }
179 1.1 christos }
180 1.1 christos
181 1.1 christos static void
182 1.1 christos dump_die_1 (struct ui_file *f, int level, int max_level, struct die_info *die)
183 1.1 christos {
184 1.1 christos int indent = level * 4;
185 1.1 christos
186 1.1 christos gdb_assert (die != NULL);
187 1.1 christos
188 1.1 christos if (level >= max_level)
189 1.1 christos return;
190 1.1 christos
191 1.1 christos dump_die_shallow (f, indent, die);
192 1.1 christos
193 1.1 christos if (die->child != NULL)
194 1.1 christos {
195 1.1 christos gdb_printf (f, "%*s Children:", indent, "");
196 1.1 christos if (level + 1 < max_level)
197 1.1 christos {
198 1.1 christos gdb_printf (f, "\n");
199 1.1 christos dump_die_1 (f, level + 1, max_level, die->child);
200 1.1 christos }
201 1.1 christos else
202 1.1 christos {
203 1.1 christos gdb_printf (f,
204 1.1 christos " [not printed, max nesting level reached]\n");
205 1.1 christos }
206 1.1 christos }
207 1.1 christos
208 1.1 christos if (die->sibling != NULL && level > 0)
209 1.1 christos {
210 1.1 christos dump_die_1 (f, level, max_level, die->sibling);
211 1.1 christos }
212 1.1 christos }
213 1.1 christos
214 1.1 christos /* See die.h. */
215 1.1 christos
216 1.1 christos void
217 1.1 christos die_info::dump (int max_level)
218 1.1 christos {
219 1.1 christos dump_die_1 (gdb_stdlog, 0, max_level, this);
220 1.1 christos }
221 1.1 christos
222 1.1 christos /* See die.h. */
223 1.1 christos
224 1.1 christos void
225 1.1 christos die_info::error_dump ()
226 1.1 christos {
227 1.1 christos dump_die_shallow (gdb_stderr, 0, this);
228 1.1 christos }
229