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