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