1da0c48c4Sopenharmony_ci/* Copyright (C) 2002, 2004 Red Hat, Inc. 2da0c48c4Sopenharmony_ci This file is part of elfutils. 3da0c48c4Sopenharmony_ci Written by Ulrich Drepper <drepper@redhat.com>, 2002. 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 <fcntl.h> 23da0c48c4Sopenharmony_ci#include <inttypes.h> 24da0c48c4Sopenharmony_ci#include <libelf.h> 25da0c48c4Sopenharmony_ci#include ELFUTILS_HEADER(dw) 26da0c48c4Sopenharmony_ci#include <stdio.h> 27da0c48c4Sopenharmony_ci#include <string.h> 28da0c48c4Sopenharmony_ci#include <unistd.h> 29da0c48c4Sopenharmony_ci 30da0c48c4Sopenharmony_ci 31da0c48c4Sopenharmony_ciint 32da0c48c4Sopenharmony_cimain (int argc, char *argv[]) 33da0c48c4Sopenharmony_ci{ 34da0c48c4Sopenharmony_ci int result = 0; 35da0c48c4Sopenharmony_ci int cnt; 36da0c48c4Sopenharmony_ci 37da0c48c4Sopenharmony_ci for (cnt = 1; cnt < argc; ++cnt) 38da0c48c4Sopenharmony_ci { 39da0c48c4Sopenharmony_ci int fd = open (argv[cnt], O_RDONLY); 40da0c48c4Sopenharmony_ci 41da0c48c4Sopenharmony_ci Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ); 42da0c48c4Sopenharmony_ci if (dbg == NULL) 43da0c48c4Sopenharmony_ci { 44da0c48c4Sopenharmony_ci printf ("%s not usable: %s\n", argv[cnt], dwarf_errmsg (-1)); 45da0c48c4Sopenharmony_ci close (fd); 46da0c48c4Sopenharmony_ci continue; 47da0c48c4Sopenharmony_ci } 48da0c48c4Sopenharmony_ci 49da0c48c4Sopenharmony_ci Dwarf_Off cuoff = 0; 50da0c48c4Sopenharmony_ci Dwarf_Off old_cuoff = 0; 51da0c48c4Sopenharmony_ci size_t hsize; 52da0c48c4Sopenharmony_ci Dwarf_Off ao; 53da0c48c4Sopenharmony_ci uint8_t asz; 54da0c48c4Sopenharmony_ci uint8_t osz; 55da0c48c4Sopenharmony_ci while (dwarf_nextcu (dbg, cuoff, &cuoff, &hsize, &ao, &asz, &osz) == 0) 56da0c48c4Sopenharmony_ci { 57da0c48c4Sopenharmony_ci printf ("cuhl = %zu, o = %llu, asz = %hhu, osz = %hhu, ncu = %llu\n", 58da0c48c4Sopenharmony_ci hsize, (unsigned long long int) ao, 59da0c48c4Sopenharmony_ci asz, osz, (unsigned long long int) cuoff); 60da0c48c4Sopenharmony_ci 61da0c48c4Sopenharmony_ci /* Get the DIE for the CU. */ 62da0c48c4Sopenharmony_ci Dwarf_Die die; 63da0c48c4Sopenharmony_ci if (dwarf_offdie (dbg, old_cuoff + hsize, &die) == NULL) 64da0c48c4Sopenharmony_ci { 65da0c48c4Sopenharmony_ci /* Something went wrong. */ 66da0c48c4Sopenharmony_ci printf ("%s: cannot get CU die\n", argv[cnt]); 67da0c48c4Sopenharmony_ci result = 1; 68da0c48c4Sopenharmony_ci break; 69da0c48c4Sopenharmony_ci } 70da0c48c4Sopenharmony_ci old_cuoff = cuoff; 71da0c48c4Sopenharmony_ci 72da0c48c4Sopenharmony_ci Dwarf_Lines *lb; 73da0c48c4Sopenharmony_ci size_t nlb; 74da0c48c4Sopenharmony_ci if (dwarf_getsrclines (&die, &lb, &nlb) != 0) 75da0c48c4Sopenharmony_ci { 76da0c48c4Sopenharmony_ci printf ("%s: cannot get lines\n", argv[cnt]); 77da0c48c4Sopenharmony_ci result = 1; 78da0c48c4Sopenharmony_ci break; 79da0c48c4Sopenharmony_ci } 80da0c48c4Sopenharmony_ci 81da0c48c4Sopenharmony_ci printf (" %zu lines\n", nlb); 82da0c48c4Sopenharmony_ci 83da0c48c4Sopenharmony_ci for (size_t i = 0; i < nlb; ++i) 84da0c48c4Sopenharmony_ci { 85da0c48c4Sopenharmony_ci Dwarf_Line *l = dwarf_onesrcline (lb, i); 86da0c48c4Sopenharmony_ci if (l == NULL) 87da0c48c4Sopenharmony_ci { 88da0c48c4Sopenharmony_ci printf ("%s: cannot get individual line\n", argv[cnt]); 89da0c48c4Sopenharmony_ci result = 1; 90da0c48c4Sopenharmony_ci break; 91da0c48c4Sopenharmony_ci } 92da0c48c4Sopenharmony_ci 93da0c48c4Sopenharmony_ci Dwarf_Addr addr; 94da0c48c4Sopenharmony_ci if (dwarf_lineaddr (l, &addr) != 0) 95da0c48c4Sopenharmony_ci addr = 0; 96da0c48c4Sopenharmony_ci const char *file = dwarf_linesrc (l, NULL, NULL); 97da0c48c4Sopenharmony_ci int line; 98da0c48c4Sopenharmony_ci if (dwarf_lineno (l, &line) != 0) 99da0c48c4Sopenharmony_ci line = 0; 100da0c48c4Sopenharmony_ci 101da0c48c4Sopenharmony_ci printf ("%" PRIx64 ": %s:%d:", (uint64_t) addr, 102da0c48c4Sopenharmony_ci file ?: "???", line); 103da0c48c4Sopenharmony_ci 104da0c48c4Sopenharmony_ci /* Getting the file path through the Dwarf_Files should 105da0c48c4Sopenharmony_ci result in the same path. */ 106da0c48c4Sopenharmony_ci Dwarf_Files *files; 107da0c48c4Sopenharmony_ci size_t idx; 108da0c48c4Sopenharmony_ci if (dwarf_line_file (l, &files, &idx) != 0) 109da0c48c4Sopenharmony_ci { 110da0c48c4Sopenharmony_ci printf ("%s: cannot get file from line (%zd): %s\n", 111da0c48c4Sopenharmony_ci argv[cnt], i, dwarf_errmsg (-1)); 112da0c48c4Sopenharmony_ci result = 1; 113da0c48c4Sopenharmony_ci break; 114da0c48c4Sopenharmony_ci } 115da0c48c4Sopenharmony_ci const char *path = dwarf_filesrc (files, idx, NULL, NULL); 116da0c48c4Sopenharmony_ci if ((path == NULL && file != NULL) 117da0c48c4Sopenharmony_ci || (path != NULL && file == NULL) 118da0c48c4Sopenharmony_ci || (strcmp (file, path) != 0)) 119da0c48c4Sopenharmony_ci { 120da0c48c4Sopenharmony_ci printf ("%s: line %zd srcline (%s) != file srcline (%s)\n", 121da0c48c4Sopenharmony_ci argv[cnt], i, file ?: "???", path ?: "???"); 122da0c48c4Sopenharmony_ci result = 1; 123da0c48c4Sopenharmony_ci break; 124da0c48c4Sopenharmony_ci } 125da0c48c4Sopenharmony_ci 126da0c48c4Sopenharmony_ci int column; 127da0c48c4Sopenharmony_ci if (dwarf_linecol (l, &column) != 0) 128da0c48c4Sopenharmony_ci column = 0; 129da0c48c4Sopenharmony_ci if (column >= 0) 130da0c48c4Sopenharmony_ci printf ("%d:", column); 131da0c48c4Sopenharmony_ci 132da0c48c4Sopenharmony_ci bool is_stmt; 133da0c48c4Sopenharmony_ci if (dwarf_linebeginstatement (l, &is_stmt) != 0) 134da0c48c4Sopenharmony_ci is_stmt = false; 135da0c48c4Sopenharmony_ci bool end_sequence; 136da0c48c4Sopenharmony_ci if (dwarf_lineendsequence (l, &end_sequence) != 0) 137da0c48c4Sopenharmony_ci end_sequence = false; 138da0c48c4Sopenharmony_ci bool basic_block; 139da0c48c4Sopenharmony_ci if (dwarf_lineblock (l, &basic_block) != 0) 140da0c48c4Sopenharmony_ci basic_block = false; 141da0c48c4Sopenharmony_ci bool prologue_end; 142da0c48c4Sopenharmony_ci if (dwarf_lineprologueend (l, &prologue_end) != 0) 143da0c48c4Sopenharmony_ci prologue_end = false; 144da0c48c4Sopenharmony_ci bool epilogue_begin; 145da0c48c4Sopenharmony_ci if (dwarf_lineepiloguebegin (l, &epilogue_begin) != 0) 146da0c48c4Sopenharmony_ci epilogue_begin = false; 147da0c48c4Sopenharmony_ci 148da0c48c4Sopenharmony_ci printf (" is_stmt:%s, end_seq:%s, bb:%s, prologue:%s, epilogue:%s\n", 149da0c48c4Sopenharmony_ci is_stmt ? "yes" : "no", end_sequence ? "yes" : "no", 150da0c48c4Sopenharmony_ci basic_block ? "yes" : "no", prologue_end ? "yes" : "no", 151da0c48c4Sopenharmony_ci epilogue_begin ? "yes" : "no"); 152da0c48c4Sopenharmony_ci } 153da0c48c4Sopenharmony_ci } 154da0c48c4Sopenharmony_ci 155da0c48c4Sopenharmony_ci dwarf_end (dbg); 156da0c48c4Sopenharmony_ci close (fd); 157da0c48c4Sopenharmony_ci } 158da0c48c4Sopenharmony_ci 159da0c48c4Sopenharmony_ci return result; 160da0c48c4Sopenharmony_ci} 161