1da0c48c4Sopenharmony_ci/* Test cudie and subdie properties. 2da0c48c4Sopenharmony_ci Copyright (C) 2018 Red Hat, Inc. 3da0c48c4Sopenharmony_ci This file is part of elfutils. 4da0c48c4Sopenharmony_ci 5da0c48c4Sopenharmony_ci This file is free software; you can redistribute it and/or modify 6da0c48c4Sopenharmony_ci it under the terms of the GNU General Public License as published by 7da0c48c4Sopenharmony_ci the Free Software Foundation; either version 3 of the License, or 8da0c48c4Sopenharmony_ci (at your option) any later version. 9da0c48c4Sopenharmony_ci 10da0c48c4Sopenharmony_ci elfutils is distributed in the hope that it will be useful, but 11da0c48c4Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 12da0c48c4Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13da0c48c4Sopenharmony_ci GNU General Public License for more details. 14da0c48c4Sopenharmony_ci 15da0c48c4Sopenharmony_ci You should have received a copy of the GNU General Public License 16da0c48c4Sopenharmony_ci along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17da0c48c4Sopenharmony_ci 18da0c48c4Sopenharmony_ci#ifdef HAVE_CONFIG_H 19da0c48c4Sopenharmony_ci# include <config.h> 20da0c48c4Sopenharmony_ci#endif 21da0c48c4Sopenharmony_ci 22da0c48c4Sopenharmony_ci#include <dwarf.h> 23da0c48c4Sopenharmony_ci#include ELFUTILS_HEADER(dw) 24da0c48c4Sopenharmony_ci#include <stdio.h> 25da0c48c4Sopenharmony_ci#include <inttypes.h> 26da0c48c4Sopenharmony_ci#include <sys/types.h> 27da0c48c4Sopenharmony_ci#include <sys/stat.h> 28da0c48c4Sopenharmony_ci#include <fcntl.h> 29da0c48c4Sopenharmony_ci#include <unistd.h> 30da0c48c4Sopenharmony_ci 31da0c48c4Sopenharmony_ci 32da0c48c4Sopenharmony_ciint 33da0c48c4Sopenharmony_cimain (int argc, char *argv[]) 34da0c48c4Sopenharmony_ci{ 35da0c48c4Sopenharmony_ci for (int i = 1; i < argc; i++) 36da0c48c4Sopenharmony_ci { 37da0c48c4Sopenharmony_ci printf ("file: %s\n", argv[i]); 38da0c48c4Sopenharmony_ci int fd = open (argv[i], O_RDONLY); 39da0c48c4Sopenharmony_ci Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ); 40da0c48c4Sopenharmony_ci if (dbg == NULL) 41da0c48c4Sopenharmony_ci { 42da0c48c4Sopenharmony_ci printf ("%s not usable: %s\n", argv[i], dwarf_errmsg (-1)); 43da0c48c4Sopenharmony_ci return -1; 44da0c48c4Sopenharmony_ci } 45da0c48c4Sopenharmony_ci 46da0c48c4Sopenharmony_ci Dwarf_CU *cu = NULL; 47da0c48c4Sopenharmony_ci Dwarf_Die cudie, subdie; 48da0c48c4Sopenharmony_ci uint8_t unit_type; 49da0c48c4Sopenharmony_ci while (dwarf_get_units (dbg, cu, &cu, NULL, 50da0c48c4Sopenharmony_ci &unit_type, &cudie, &subdie) == 0) 51da0c48c4Sopenharmony_ci { 52da0c48c4Sopenharmony_ci printf ("Got cudie: %s, unit_type: %" PRIx8 "\n", 53da0c48c4Sopenharmony_ci dwarf_diename (&cudie), unit_type); 54da0c48c4Sopenharmony_ci 55da0c48c4Sopenharmony_ci int tag = dwarf_tag (&subdie); 56da0c48c4Sopenharmony_ci if (unit_type == DW_UT_compile) 57da0c48c4Sopenharmony_ci { 58da0c48c4Sopenharmony_ci if (tag != DW_TAG_invalid) 59da0c48c4Sopenharmony_ci { 60da0c48c4Sopenharmony_ci printf ("Not invalid: %x\n", dwarf_tag (&subdie)); 61da0c48c4Sopenharmony_ci return -1; 62da0c48c4Sopenharmony_ci } 63da0c48c4Sopenharmony_ci if (dwarf_diename (&subdie) != NULL) 64da0c48c4Sopenharmony_ci { 65da0c48c4Sopenharmony_ci printf ("Should have NULL name: %s\n", 66da0c48c4Sopenharmony_ci dwarf_diename (&subdie)); 67da0c48c4Sopenharmony_ci return -1; 68da0c48c4Sopenharmony_ci } 69da0c48c4Sopenharmony_ci Dwarf_Die result; 70da0c48c4Sopenharmony_ci if (dwarf_siblingof (&subdie, &result) != -1) 71da0c48c4Sopenharmony_ci { 72da0c48c4Sopenharmony_ci printf ("Should NOT have a valid sibling: %s\n", 73da0c48c4Sopenharmony_ci dwarf_diename (&result)); 74da0c48c4Sopenharmony_ci return -1; 75da0c48c4Sopenharmony_ci } 76da0c48c4Sopenharmony_ci if (dwarf_child (&subdie, &result) != -1) 77da0c48c4Sopenharmony_ci { 78da0c48c4Sopenharmony_ci printf ("Should NOT have a valid child: %s\n", 79da0c48c4Sopenharmony_ci dwarf_diename (&result)); 80da0c48c4Sopenharmony_ci return -1; 81da0c48c4Sopenharmony_ci } 82da0c48c4Sopenharmony_ci Dwarf_Addr base, start, end; 83da0c48c4Sopenharmony_ci if (dwarf_ranges (&subdie, 0, &base, &start, &end) != -1) 84da0c48c4Sopenharmony_ci { 85da0c48c4Sopenharmony_ci printf ("Should NOT have a ranges: %s\n", 86da0c48c4Sopenharmony_ci dwarf_diename (&subdie)); 87da0c48c4Sopenharmony_ci return -1; 88da0c48c4Sopenharmony_ci } 89da0c48c4Sopenharmony_ci if (dwarf_cuoffset (&subdie) != (Dwarf_Off) -1) 90da0c48c4Sopenharmony_ci { 91da0c48c4Sopenharmony_ci printf ("Should NOT have a cuoffset: %s\n", 92da0c48c4Sopenharmony_ci dwarf_diename (&subdie)); 93da0c48c4Sopenharmony_ci return -1; 94da0c48c4Sopenharmony_ci } 95da0c48c4Sopenharmony_ci if (dwarf_dieoffset (&subdie) != (Dwarf_Off) -1) 96da0c48c4Sopenharmony_ci { 97da0c48c4Sopenharmony_ci printf ("Should NOT have a die offset: %s\n", 98da0c48c4Sopenharmony_ci dwarf_diename (&subdie)); 99da0c48c4Sopenharmony_ci return -1; 100da0c48c4Sopenharmony_ci } 101da0c48c4Sopenharmony_ci if (dwarf_getabbrev (&subdie, 0, NULL) != NULL) 102da0c48c4Sopenharmony_ci { 103da0c48c4Sopenharmony_ci printf ("Should NOT have an abbrev: %s\n", 104da0c48c4Sopenharmony_ci dwarf_diename (&subdie)); 105da0c48c4Sopenharmony_ci return -1; 106da0c48c4Sopenharmony_ci } 107da0c48c4Sopenharmony_ci } 108da0c48c4Sopenharmony_ci else if (unit_type == DW_UT_type) 109da0c48c4Sopenharmony_ci printf ("subdie: %s\n", dwarf_diename (&subdie)); 110da0c48c4Sopenharmony_ci else 111da0c48c4Sopenharmony_ci printf ("subdie tag: %x\n", dwarf_tag (&subdie)); 112da0c48c4Sopenharmony_ci } 113da0c48c4Sopenharmony_ci 114da0c48c4Sopenharmony_ci dwarf_end (dbg); 115da0c48c4Sopenharmony_ci close (fd); 116da0c48c4Sopenharmony_ci 117da0c48c4Sopenharmony_ci printf ("\n"); 118da0c48c4Sopenharmony_ci } 119da0c48c4Sopenharmony_ci 120da0c48c4Sopenharmony_ci return 0; 121da0c48c4Sopenharmony_ci} 122