| /* DWARF DIEs |
| |
| Copyright (C) 2003-2021 Free Software Foundation, Inc. |
| |
| This file is part of GDB. |
| |
| This program is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 3 of the License, or |
| (at your option) any later version. |
| |
| This program is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
| |
| #ifndef GDB_DWARF2_DIE_H |
| #define GDB_DWARF2_DIE_H |
| |
| #include "complaints.h" |
| |
| /* This data structure holds a complete die structure. */ |
| struct die_info |
| { |
| /* Return the named attribute or NULL if not there, but do not |
| follow DW_AT_specification, etc. */ |
| struct attribute *attr (dwarf_attribute name) |
| { |
| for (unsigned i = 0; i < num_attrs; ++i) |
| if (attrs[i].name == name) |
| return &attrs[i]; |
| return NULL; |
| } |
| |
| /* Return the address base of the compile unit, which, if exists, is |
| stored either at the attribute DW_AT_GNU_addr_base, or |
| DW_AT_addr_base. */ |
| gdb::optional<ULONGEST> addr_base () |
| { |
| for (unsigned i = 0; i < num_attrs; ++i) |
| if (attrs[i].name == DW_AT_addr_base |
| || attrs[i].name == DW_AT_GNU_addr_base) |
| { |
| if (attrs[i].form_is_unsigned ()) |
| { |
| /* If both exist, just use the first one. */ |
| return attrs[i].as_unsigned (); |
| } |
| complaint (_("address base attribute (offset %s) as wrong form"), |
| sect_offset_str (sect_off)); |
| } |
| return gdb::optional<ULONGEST> (); |
| } |
| |
| /* Return the base address of the compile unit into the .debug_ranges section, |
| which, if exists, is stored in the DW_AT_GNU_ranges_base attribute. This |
| value is only relevant in pre-DWARF 5 split-unit scenarios. */ |
| ULONGEST gnu_ranges_base () |
| { |
| for (unsigned i = 0; i < num_attrs; ++i) |
| if (attrs[i].name == DW_AT_GNU_ranges_base) |
| { |
| if (attrs[i].form_is_unsigned ()) |
| return attrs[i].as_unsigned (); |
| |
| complaint (_("ranges base attribute (offset %s) has wrong form"), |
| sect_offset_str (sect_off)); |
| } |
| |
| return 0; |
| } |
| |
| /* Return the rnglists base of the compile unit, which, if exists, is stored |
| in the DW_AT_rnglists_base attribute. */ |
| ULONGEST rnglists_base () |
| { |
| for (unsigned i = 0; i < num_attrs; ++i) |
| if (attrs[i].name == DW_AT_rnglists_base) |
| { |
| if (attrs[i].form_is_unsigned ()) |
| return attrs[i].as_unsigned (); |
| |
| complaint (_("rnglists base attribute (offset %s) has wrong form"), |
| sect_offset_str (sect_off)); |
| } |
| |
| return 0; |
| } |
| |
| /* DWARF-2 tag for this DIE. */ |
| ENUM_BITFIELD(dwarf_tag) tag : 16; |
| |
| /* Number of attributes */ |
| unsigned char num_attrs; |
| |
| /* True if we're presently building the full type name for the |
| type derived from this DIE. */ |
| unsigned char building_fullname : 1; |
| |
| /* True if this die is in process. PR 16581. */ |
| unsigned char in_process : 1; |
| |
| /* True if this DIE has children. */ |
| unsigned char has_children : 1; |
| |
| /* Abbrev number */ |
| unsigned int abbrev; |
| |
| /* Offset in .debug_info or .debug_types section. */ |
| sect_offset sect_off; |
| |
| /* The dies in a compilation unit form an n-ary tree. PARENT |
| points to this die's parent; CHILD points to the first child of |
| this node; and all the children of a given node are chained |
| together via their SIBLING fields. */ |
| struct die_info *child; /* Its first child, if any. */ |
| struct die_info *sibling; /* Its next sibling, if any. */ |
| struct die_info *parent; /* Its parent, if any. */ |
| |
| /* An array of attributes, with NUM_ATTRS elements. There may be |
| zero, but it's not common and zero-sized arrays are not |
| sufficiently portable C. */ |
| struct attribute attrs[1]; |
| }; |
| |
| #endif /* GDB_DWARF2_DIE_H */ |