17f617347794f7d57f69d08f38c00f3f6ad221a56Petr Machata/* Copyright (C) 1998-2002, 2004, 2006, 2012, 2015 Red Hat, Inc.
2de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is part of elfutils.
3b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper   Written by Ulrich Drepper <drepper@redhat.com>, 1998.
4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
5de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   This file is free software; you can redistribute it and/or modify
6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   it under the terms of the GNU General Public License as published by
7de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   the Free Software Foundation; either version 3 of the License, or
8de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   (at your option) any later version.
9b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   elfutils is distributed in the hope that it will be useful, but
11361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper   WITHOUT ANY WARRANTY; without even the implied warranty of
12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   GNU General Public License for more details.
14361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper
15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   You should have received a copy of the GNU General Public License
16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
18b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <config.h>
19b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
20b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <dwarf.h>
21b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <inttypes.h>
22b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <libelf.h>
23d7f8d0caa7a357f9f4765e5dc93255f5057eba2eRoland McGrath#include ELFUTILS_HEADER(dw)
24b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <fcntl.h>
25b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <stdio.h>
26b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <string.h>
27b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <unistd.h>
28b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
29f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard#include "../libdw/known-dwarf.h"
30b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
31f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaardstatic const char *
32f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaarddwarf_tag_string (unsigned int tag)
33b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
34f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard  switch (tag)
35f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard    {
367f617347794f7d57f69d08f38c00f3f6ad221a56Petr Machata#define DWARF_ONE_KNOWN_DW_TAG(NAME, CODE) case CODE: return #NAME;
377f617347794f7d57f69d08f38c00f3f6ad221a56Petr Machata      DWARF_ALL_KNOWN_DW_TAG
387f617347794f7d57f69d08f38c00f3f6ad221a56Petr Machata#undef DWARF_ONE_KNOWN_DW_TAG
39f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard    default:
40f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard      return NULL;
41f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard    }
42f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard}
43b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
44f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaardstatic const char *
45f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaarddwarf_attr_string (unsigned int attrnum)
46b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
47f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard  switch (attrnum)
48f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard    {
497f617347794f7d57f69d08f38c00f3f6ad221a56Petr Machata#define DWARF_ONE_KNOWN_DW_AT(NAME, CODE) case CODE: return #NAME;
507f617347794f7d57f69d08f38c00f3f6ad221a56Petr Machata      DWARF_ALL_KNOWN_DW_AT
517f617347794f7d57f69d08f38c00f3f6ad221a56Petr Machata#undef DWARF_ONE_KNOWN_DW_AT
52f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard    default:
53f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard      return NULL;
54f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard    }
55f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard}
56b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
57b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppervoid
59b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperhandle (Dwarf *dbg, Dwarf_Die *die, int n)
60b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
61b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Die child;
62b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  unsigned int tag;
63b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  const char *str;
64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  char buf[30];
65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  const char *name;
66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Off off;
67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Off cuoff;
68b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  size_t cnt;
69b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  Dwarf_Addr addr;
70b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  int i;
71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  tag = dwarf_tag (die);
73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (tag != DW_TAG_invalid)
74b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
75f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard      str = dwarf_tag_string (tag);
76f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard      if (str == NULL)
77b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
78b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  snprintf (buf, sizeof buf, "%#x", tag);
79b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  str = buf;
80b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
81b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
82b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  else
83b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    str = "* NO TAG *";
84b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
85b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  name = dwarf_diename (die);
86b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (name == 0)
87b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    name = "* NO NAME *";
88b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
89b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  off = dwarf_dieoffset (die);
90b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  cuoff = dwarf_cuoffset (die);
91b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
92f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard  printf ("%*sDW_TAG_%s\n", n * 5, "", str);
93b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  printf ("%*s Name      : %s\n", n * 5, "", name);
94b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  printf ("%*s Offset    : %lld\n", n * 5, "", (long long int) off);
95b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  printf ("%*s CU offset : %lld\n", n * 5, "", (long long int) cuoff);
96b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
97b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  printf ("%*s Attrs     :", n * 5, "");
98f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard  for (cnt = 0; cnt < 0xffff; ++cnt)
99f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard    if (dwarf_hasattr (die, cnt))
100f31c4418be5bce6f0dd448cf07fc1092e5a7e1d2Mark Wielaard      printf (" %s", dwarf_attr_string (cnt));
101b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  puts ("");
102b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
103b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_hasattr (die, DW_AT_low_pc) && dwarf_lowpc (die, &addr) == 0)
104b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
105b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Attribute attr;
106b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Addr addr2;
107b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("%*s low PC    : %#llx\n",
108b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      n * 5, "", (unsigned long long int) addr);
109b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
110b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (dwarf_attr (die, DW_AT_low_pc, &attr) == NULL
111b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || dwarf_formaddr (&attr, &addr2) != 0
112b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || addr != addr2)
113b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_low_pc verify failed ************");
114b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (! dwarf_hasform (&attr, DW_FORM_addr))
115b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_low_pc form failed ************");
116b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (dwarf_whatform (&attr) != DW_FORM_addr)
117b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_low_pc form (2) failed ************");
118b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (dwarf_whatattr (&attr) != DW_AT_low_pc)
119b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_low_pc attr failed ************");
120b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
121b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_hasattr (die, DW_AT_high_pc) && dwarf_highpc (die, &addr) == 0)
122b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
123b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Attribute attr;
124b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Addr addr2;
125b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("%*s high PC   : %#llx\n",
126b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	      n * 5, "", (unsigned long long int) addr);
127b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (dwarf_attr (die, DW_AT_high_pc, &attr) == NULL
128b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || dwarf_formaddr (&attr, &addr2) != 0
129b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || addr != addr2)
130b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_high_pc verify failed ************");
131b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (! dwarf_hasform (&attr, DW_FORM_addr))
132b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_high_pc form failed ************");
133b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (dwarf_whatform (&attr) != DW_FORM_addr)
134b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_high_pc form (2) failed ************");
135b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (dwarf_whatattr (&attr) != DW_AT_high_pc)
136b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_high_pc attr failed ************");
137b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
138b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
139b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_hasattr (die, DW_AT_byte_size) && (i = dwarf_bytesize (die)) != -1)
140b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
141b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Attribute attr;
142b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Word u2;
143b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int u;
144b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("%*s byte size : %d\n", n * 5, "", i);
145b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (dwarf_attr (die, DW_AT_byte_size, &attr) == NULL
146b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || dwarf_formudata (&attr, &u2) != 0
147b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || i != (int) u2)
148b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_byte_size verify failed ************");
149b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (! dwarf_hasform (&attr, DW_FORM_data1)
150b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data2)
151b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data4)
152b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data8)
153b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_sdata)
154b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_udata))
155b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_byte_size form failed ************");
156b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if ((u = dwarf_whatform (&attr)) == 0
157b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       || (u != DW_FORM_data1
158b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data2
159b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data4
160b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data8
161b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_sdata
162b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_udata))
163b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_byte_size form (2) failed ************");
164b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (dwarf_whatattr (&attr) != DW_AT_byte_size)
165b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_byte_size attr failed ************");
166b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
167b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_hasattr (die, DW_AT_bit_size) && (i = dwarf_bitsize (die)) != -1)
168b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
169b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Attribute attr;
170b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Word u2;
171b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int u;
172b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("%*s bit size  : %d\n", n * 5, "", i);
173b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (dwarf_attr (die, DW_AT_bit_size, &attr) == NULL
174b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || dwarf_formudata (&attr, &u2) != 0
175b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || i != (int) u2)
176b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_bit_size test failed ************");
177b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (! dwarf_hasform (&attr, DW_FORM_data1)
178b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data2)
179b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data4)
180b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data8)
181b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_sdata)
182b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_udata))
183b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_bit_size form failed ************");
184b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if ((u = dwarf_whatform (&attr)) == 0
185b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       || (u != DW_FORM_data1
186b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data2
187b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data4
188b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data8
189b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_sdata
190b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_udata))
191b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_bit_size form (2) failed ************");
192b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (dwarf_whatattr (&attr) != DW_AT_bit_size)
193b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_bit_size attr failed ************");
194b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
195b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_hasattr (die, DW_AT_bit_offset)
196b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      && (i = dwarf_bitoffset (die)) != -1)
197b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
198b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Attribute attr;
199b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Word u2;
200b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int u;
201b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("%*s bit offset: %d\n", n * 5, "", i);
202b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (dwarf_attr (die, DW_AT_bit_offset, &attr) == NULL
203b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || dwarf_formudata (&attr, &u2) != 0
204b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || i != (int) u2)
205b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_bit_offset test failed ************");
206b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (! dwarf_hasform (&attr, DW_FORM_data1)
207b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data2)
208b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data4)
209b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data8)
210b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_sdata)
211b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_udata))
212b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_bit_offset form failed ************");
213b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if ((u = dwarf_whatform (&attr)) == 0
214b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       || (u != DW_FORM_data1
215b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data2
216b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data4
217b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data8
218b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_sdata
219b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_udata))
220b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_bit_offset form (2) failed ************");
221b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (dwarf_whatattr (&attr) != DW_AT_bit_offset)
222b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_bit_offset attr failed ************");
223b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
224b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
225b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_hasattr (die, DW_AT_language) && (i = dwarf_srclang (die)) != -1)
226b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
227b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Attribute attr;
228b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Word u2;
229b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int u;
230b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("%*s language  : %d\n", n * 5, "", i);
231b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (dwarf_attr (die, DW_AT_language, &attr) == NULL
232b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || dwarf_formudata (&attr, &u2) != 0
233b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || i != (int) u2)
234b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_language test failed ************");
235b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (! dwarf_hasform (&attr, DW_FORM_data1)
236b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data2)
237b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data4)
238b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data8)
239b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_sdata)
240b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_udata))
241b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_language form failed ************");
242b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if ((u = dwarf_whatform (&attr)) == 0
243b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       || (u != DW_FORM_data1
244b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data2
245b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data4
246b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data8
247b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_sdata
248b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_udata))
249b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_language form (2) failed ************");
250b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (dwarf_whatattr (&attr) != DW_AT_language)
251b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_language attr failed ************");
252b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
253b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
254b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_hasattr (die, DW_AT_ordering)
255b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      && (i = dwarf_arrayorder (die)) != -1)
256b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
257b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Attribute attr;
258b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Word u2;
259b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      unsigned int u;
260b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("%*s ordering  : %d\n", n * 5, "", i);
261b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (dwarf_attr (die, DW_AT_ordering, &attr) == NULL
262b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || dwarf_formudata (&attr, &u2) != 0
263b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || i != (int) u2)
264b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_ordering test failed ************");
265b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (! dwarf_hasform (&attr, DW_FORM_data1)
266b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data2)
267b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data4)
268b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_data8)
269b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_sdata)
270b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       && ! dwarf_hasform (&attr, DW_FORM_udata))
271b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_ordering failed ************");
272b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if ((u = dwarf_whatform (&attr)) == 0
273b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	       || (u != DW_FORM_data1
274b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data2
275b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data4
276b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_data8
277b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_sdata
278b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		   && u != DW_FORM_udata))
279b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_ordering form (2) failed ************");
280b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else if (dwarf_whatattr (&attr) != DW_AT_ordering)
281b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_ordering attr failed ************");
282b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
283b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
284b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_hasattr (die, DW_AT_comp_dir))
285b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
286b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Attribute attr;
287b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (dwarf_attr (die, DW_AT_comp_dir, &attr) == NULL
288b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || (name = dwarf_formstring (&attr)) == NULL)
289b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_comp_dir attr failed ************");
290b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else
291b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	printf ("%*s directory : %s\n", n * 5, "", name);
292b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
293b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
294b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_hasattr (die, DW_AT_producer))
295b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
296b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Attribute attr;
297b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (dwarf_attr (die, DW_AT_producer, &attr) == NULL
298b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  || (name = dwarf_formstring (&attr)) == NULL)
299b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	puts ("************* DW_AT_comp_dir attr failed ************");
300b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      else
301b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	printf ("%*s producer  : %s\n", n * 5, "", name);
302b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
303b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
304b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_haschildren (die) != 0 && dwarf_child (die, &child) == 0)
305b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    handle (dbg, &child, n + 1);
306b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  if (dwarf_siblingof (die, die) == 0)
307b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    handle (dbg, die, n);
308b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
309b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
310b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
311b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperint
312b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppermain (int argc, char *argv[])
313b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper{
314b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper int cnt;
315b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
316b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  for (cnt = 1; cnt < argc; ++cnt)
317b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    {
318b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      int fd = open (argv[cnt], O_RDONLY);
319b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf *dbg;
320b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
321b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      printf ("file: %s\n", basename (argv[cnt]));
322b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
323b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      dbg = dwarf_begin (fd, DWARF_C_READ);
324b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      if (dbg == NULL)
325b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
326b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  printf ("%s not usable\n", argv[cnt]);
327b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  close (fd);
328b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  continue;
329b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
330b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
331b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Off off = 0;
332b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Off old_off = 0;
333b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      size_t hsize;
334b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      Dwarf_Off abbrev;
335b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      uint8_t addresssize;
336b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      uint8_t offsetsize;
337b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      while (dwarf_nextcu (dbg, off, &off, &hsize, &abbrev, &addresssize,
338b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper			   &offsetsize) == 0)
339b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	{
340b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  printf ("New CU: off = %llu, hsize = %zu, ab = %llu, as = %" PRIu8
341b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  ", os = %" PRIu8 "\n",
342b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  (unsigned long long int) old_off, hsize,
343b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  (unsigned long long int) abbrev, addresssize,
344b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper		  offsetsize);
345b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
346b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  Dwarf_Die die;
347b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  if (dwarf_offdie (dbg, old_off + hsize, &die) != NULL)
348b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	    handle (dbg, &die, 1);
349b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
350b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	  old_off = off;
351b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper	}
352b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
353b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      dwarf_end (dbg);
354b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper      close (fd);
355b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper    }
356b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper
357b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper  return 0;
358b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper}
359