Blame tests/show-abbrev.c

Packit Service 97d2fb
/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005 Red Hat, Inc.
Packit Service 97d2fb
   This file is part of elfutils.
Packit Service 97d2fb
   Written by Ulrich Drepper <drepper@redhat.com>, 1998.
Packit Service 97d2fb
Packit Service 97d2fb
   This file is free software; you can redistribute it and/or modify
Packit Service 97d2fb
   it under the terms of the GNU General Public License as published by
Packit Service 97d2fb
   the Free Software Foundation; either version 3 of the License, or
Packit Service 97d2fb
   (at your option) any later version.
Packit Service 97d2fb
Packit Service 97d2fb
   elfutils is distributed in the hope that it will be useful, but
Packit Service 97d2fb
   WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 97d2fb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 97d2fb
   GNU General Public License for more details.
Packit Service 97d2fb
Packit Service 97d2fb
   You should have received a copy of the GNU General Public License
Packit Service 97d2fb
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 97d2fb
Packit Service 97d2fb
#include <config.h>
Packit Service 97d2fb
Packit Service 97d2fb
#include <fcntl.h>
Packit Service 97d2fb
#include <inttypes.h>
Packit Service 97d2fb
#include ELFUTILS_HEADER(dw)
Packit Service 97d2fb
#include <stdio.h>
Packit Service 97d2fb
#include <unistd.h>
Packit Service 97d2fb
Packit Service 97d2fb
Packit Service 97d2fb
int
Packit Service 97d2fb
main (int argc, char *argv[])
Packit Service 97d2fb
{
Packit Service 97d2fb
  int cnt;
Packit Service 97d2fb
Packit Service 97d2fb
  for (cnt = 1; cnt < argc; ++cnt)
Packit Service 97d2fb
    {
Packit Service 97d2fb
      int fd = open (argv[cnt], O_RDONLY);
Packit Service 97d2fb
      Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ);
Packit Service 97d2fb
      if  (dbg == NULL)
Packit Service 97d2fb
	{
Packit Service 97d2fb
	  printf ("%s not usable: %s\n", argv[cnt], dwarf_errmsg (-1));
Packit Service 97d2fb
	  close  (fd);
Packit Service 97d2fb
	  continue;
Packit Service 97d2fb
	}
Packit Service 97d2fb
Packit Service 97d2fb
      Dwarf_Off cuoff = 0;
Packit Service 97d2fb
      Dwarf_Off old_cuoff = 0;
Packit Service 97d2fb
      size_t hsize;
Packit Service 97d2fb
      while (dwarf_nextcu (dbg, cuoff, &cuoff, &hsize, NULL, NULL, NULL) == 0)
Packit Service 97d2fb
	{
Packit Service 97d2fb
	  /* Get the DIE for the CU.  */
Packit Service 97d2fb
	  Dwarf_Die die;
Packit Service 97d2fb
 	  if (dwarf_offdie (dbg, old_cuoff + hsize, &die) == NULL)
Packit Service 97d2fb
	    /* Something went wrong.  */
Packit Service 97d2fb
	    break;
Packit Service 97d2fb
Packit Service 97d2fb
	  /* Test something obviously wrong.  */
Packit Service 97d2fb
	  Dwarf_Abbrev *a = dwarf_getabbrev (&die, (Dwarf_Off) -1, NULL);
Packit Service 97d2fb
	  if (a != NULL)
Packit Service 97d2fb
	    {
Packit Service 97d2fb
	      printf ("dwarf_getabbrev -1 succeeded?\n");
Packit Service 97d2fb
	      break;
Packit Service 97d2fb
	    }
Packit Service 97d2fb
Packit Service 97d2fb
	  Dwarf_Off offset = 0;
Packit Service 97d2fb
Packit Service 97d2fb
	  while (1)
Packit Service 97d2fb
	    {
Packit Service 97d2fb
	      size_t length;
Packit Service 97d2fb
	      Dwarf_Abbrev *abbrev = dwarf_getabbrev (&die, offset, &length);
Packit Service 97d2fb
	      if (abbrev == NULL || abbrev == DWARF_END_ABBREV)
Packit Service 97d2fb
		/* End of the list.  */
Packit Service 97d2fb
		break;
Packit Service 97d2fb
Packit Service 97d2fb
	      unsigned tag = dwarf_getabbrevtag (abbrev);
Packit Service 97d2fb
	      if (tag == 0)
Packit Service 97d2fb
		{
Packit Service 97d2fb
		  printf ("dwarf_getabbrevtag at offset %llu returned error: %s\n",
Packit Service 97d2fb
			  (unsigned long long int) offset,
Packit Service 97d2fb
			  dwarf_errmsg (-1));
Packit Service 97d2fb
		  break;
Packit Service 97d2fb
		}
Packit Service 97d2fb
Packit Service 97d2fb
	      unsigned code = dwarf_getabbrevcode (abbrev);
Packit Service 97d2fb
	      if (code == 0)
Packit Service 97d2fb
		{
Packit Service 97d2fb
		  printf ("dwarf_getabbrevcode at offset %llu returned error: %s\n",
Packit Service 97d2fb
			  (unsigned long long int) offset,
Packit Service 97d2fb
			  dwarf_errmsg (-1));
Packit Service 97d2fb
		  break;
Packit Service 97d2fb
		}
Packit Service 97d2fb
Packit Service 97d2fb
	      int children = dwarf_abbrevhaschildren (abbrev);
Packit Service 97d2fb
	      if (children < 0)
Packit Service 97d2fb
		{
Packit Service 97d2fb
		  printf ("dwarf_abbrevhaschildren at offset %llu returned error: %s\n",
Packit Service 97d2fb
			  (unsigned long long int) offset,
Packit Service 97d2fb
			  dwarf_errmsg (-1));
Packit Service 97d2fb
		  break;
Packit Service 97d2fb
		}
Packit Service 97d2fb
Packit Service 97d2fb
	      printf ("abbrev[%llu]: code = %u, tag = %u, children = %d\n",
Packit Service 97d2fb
		      (unsigned long long int) offset, code, tag, children);
Packit Service 97d2fb
Packit Service 97d2fb
	      size_t attrcnt;
Packit Service 97d2fb
	      if (dwarf_getattrcnt (abbrev, &attrcnt) != 0)
Packit Service 97d2fb
		{
Packit Service 97d2fb
		  printf ("dwarf_getattrcnt at offset %llu returned error: %s\n",
Packit Service 97d2fb
			  (unsigned long long int) offset,
Packit Service 97d2fb
			  dwarf_errmsg (-1));
Packit Service 97d2fb
		  break;
Packit Service 97d2fb
		}
Packit Service 97d2fb
Packit Service 97d2fb
	      unsigned int attr_num;
Packit Service 97d2fb
	      unsigned int attr_form;
Packit Service 97d2fb
	      Dwarf_Off aboffset;
Packit Service 97d2fb
	      size_t j;
Packit Service 97d2fb
	      for (j = 0; j < attrcnt; ++j)
Packit Service 97d2fb
		if (dwarf_getabbrevattr (abbrev, j, &attr_num, &attr_form,
Packit Service 97d2fb
					 &aboffset))
Packit Service 97d2fb
		  printf ("dwarf_getabbrevattr for abbrev[%llu] and index %zu failed\n",
Packit Service 97d2fb
			  (unsigned long long int) offset, j);
Packit Service 97d2fb
		else
Packit Service 97d2fb
		  printf ("abbrev[%llu]: attr[%zu]: code = %u, form = %u, offset = %" PRIu64 "\n",
Packit Service 97d2fb
			  (unsigned long long int) offset, j, attr_num,
Packit Service 97d2fb
			  attr_form, (uint64_t) aboffset);
Packit Service 97d2fb
Packit Service 97d2fb
	      offset += length;
Packit Service 97d2fb
	    }
Packit Service 97d2fb
Packit Service 97d2fb
	  old_cuoff = cuoff;
Packit Service 97d2fb
	}
Packit Service 97d2fb
Packit Service 97d2fb
      if (dwarf_end (dbg) != 0)
Packit Service 97d2fb
	printf ("dwarf_end failed for %s: %s\n", argv[cnt],
Packit Service 97d2fb
		dwarf_errmsg (-1));
Packit Service 97d2fb
Packit Service 97d2fb
      close (fd);
Packit Service 97d2fb
    }
Packit Service 97d2fb
Packit Service 97d2fb
  return 0;
Packit Service 97d2fb
}