13a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard/* Peel type aliases and qualifier tags from a type DIE.
2dd8bd91f39c95947ad14cd43d30c17eb8c2827fcMark Wielaard   Copyright (C) 2014, 2015 Red Hat, Inc.
33a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   This file is part of elfutils.
43a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
53a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   This file is free software; you can redistribute it and/or modify
63a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   it under the terms of either
73a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
83a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard     * the GNU Lesser General Public License as published by the Free
93a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard       Software Foundation; either version 3 of the License, or (at
103a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard       your option) any later version
113a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
123a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   or
133a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
143a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard     * the GNU General Public License as published by the Free
153a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard       Software Foundation; either version 2 of the License, or (at
163a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard       your option) any later version
173a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
183a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   or both in parallel, as here.
193a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
203a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   elfutils is distributed in the hope that it will be useful, but
213a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   WITHOUT ANY WARRANTY; without even the implied warranty of
223a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
233a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   General Public License for more details.
243a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
253a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   You should have received copies of the GNU General Public License and
263a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   the GNU Lesser General Public License along with this program.  If
273a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard   not, see <http://www.gnu.org/licenses/>.  */
283a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
293a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard#ifdef HAVE_CONFIG_H
303a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard# include <config.h>
313a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard#endif
323a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
333a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard#include "libdwP.h"
343a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard#include <dwarf.h>
353a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard#include <string.h>
363a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
373a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
383a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaardint
391ccdfb683ad6c7e59793136c3a657ddf131cafd1Mark Wielaarddwarf_peel_type (Dwarf_Die *die, Dwarf_Die *result)
403a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard{
413a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard  int tag;
423a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
433a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard  /* Ignore previous errors.  */
443a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard  if (die == NULL)
453a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard    return -1;
463a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
473a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard  *result = *die;
483a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard  tag = INTUSE (dwarf_tag) (result);
493a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard  while (tag == DW_TAG_typedef
503a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard	 || tag == DW_TAG_const_type
513a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard	 || tag == DW_TAG_volatile_type
527fb8031aed51ee7c5eb5e5e9c0e072a1367ff7cbMark Wielaard	 || tag == DW_TAG_restrict_type
537fb8031aed51ee7c5eb5e5e9c0e072a1367ff7cbMark Wielaard	 || tag == DW_TAG_atomic_type)
543a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard    {
553a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard      Dwarf_Attribute attr_mem;
563a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard      Dwarf_Attribute *attr = INTUSE (dwarf_attr_integrate) (die, DW_AT_type,
573a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard							     &attr_mem);
583a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard      if (attr == NULL)
593a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard	return 1;
603a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
61dd8bd91f39c95947ad14cd43d30c17eb8c2827fcMark Wielaard      if (INTUSE (dwarf_formref_die) (attr, result) == NULL)
623a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard	return -1;
633a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
643a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard      tag = INTUSE (dwarf_tag) (result);
653a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard    }
663a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
673a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard  if (tag == DW_TAG_invalid)
683a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard    return -1;
693a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard
703a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard  return 0;
713a36e8a26c32103ec2f8edda8bf212d6883970a2Mark Wielaard}
723a36e8a26c32103ec2f8edda8bf212d6883970a2Mark WielaardINTDEF(dwarf_peel_type)
73