Home | History | Annotate | Line # | Download | only in dwarf2
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