1/* Copyright (C) 2012, 2013 Red Hat, Inc.
2   This file is part of elfutils.
3
4   This file is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; either version 3 of the License, or
7   (at your option) any later version.
8
9   elfutils is distributed in the hope that it will be useful, but
10   WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13
14   You should have received a copy of the GNU General Public License
15   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
16
17#ifdef HAVE_CONFIG_H
18# include <config.h>
19#endif
20
21#include <fcntl.h>
22#include ELFUTILS_HEADER(dw)
23#include <stdio.h>
24#include <unistd.h>
25#include <dwarf.h>
26
27int
28main (int argc, char *argv[])
29{
30  for (int i = 1; i < argc; ++i)
31    {
32      int fd = open (argv[i], O_RDONLY);
33
34      Dwarf *dbg = dwarf_begin (fd, DWARF_C_READ);
35      if (dbg != NULL)
36	{
37	  Dwarf_Off off = 0;
38	  size_t cuhl;
39	  Dwarf_Off noff;
40	  uint64_t type_sig;
41
42	  while (dwarf_next_unit (dbg, off, &noff, &cuhl, NULL, NULL, NULL,
43				  NULL, &type_sig, NULL) == 0)
44	    {
45	      Dwarf_Die die_mem;
46	      dwarf_offdie_types (dbg, off + cuhl, &die_mem);
47	      off = noff;
48	    }
49
50	  off = 0;
51
52	  while (dwarf_nextcu (dbg, off, &noff, &cuhl, NULL, NULL, NULL) == 0)
53	    {
54	      Dwarf_Die die_mem;
55	      Dwarf_Die *die = dwarf_offdie (dbg, off + cuhl, &die_mem);
56
57	      Dwarf_Die iter_mem;
58	      Dwarf_Die *iter = &iter_mem;
59	      dwarf_child (die, &iter_mem);
60
61	      while (1)
62		{
63		  if (dwarf_tag (iter) == DW_TAG_variable)
64		    {
65		      Dwarf_Attribute attr_mem;
66		      Dwarf_Die form_mem, *form;
67		      form = dwarf_formref_die (dwarf_attr (iter, DW_AT_type,
68							    &attr_mem),
69						&form_mem);
70
71		      if (form == NULL)
72			printf ("fail\n");
73		      else
74			printf ("ok\n");
75		    }
76
77		  if (dwarf_siblingof (iter, &iter_mem) != 0)
78		    break;
79		}
80
81	      off = noff;
82	    }
83
84	  dwarf_end (dbg);
85	}
86
87      close (fd);
88    }
89}
90