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