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