1/* 2 3 Copyright (C) 2000,2002,2004,2005 Silicon Graphics, Inc. All Rights Reserved. 4 5 This program is free software; you can redistribute it and/or modify it 6 under the terms of version 2.1 of the GNU Lesser General Public License 7 as published by the Free Software Foundation. 8 9 This program is distributed in the hope that it would be useful, but 10 WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 13 Further, this software is distributed without any warranty that it is 14 free of the rightful claim of any third person regarding infringement 15 or the like. Any license provided herein, whether implied or 16 otherwise, applies only to this software file. Patent licenses, if 17 any, provided herein do not apply to combinations of this program with 18 other software, or any other product whatsoever. 19 20 You should have received a copy of the GNU Lesser General Public 21 License along with this program; if not, write the Free Software 22 Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, 23 USA. 24 25 Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane, 26 Mountain View, CA 94043, or: 27 28 http://www.sgi.com 29 30 For further information regarding this notice, see: 31 32 http://oss.sgi.com/projects/GenInfo/NoticeExplan 33 34*/ 35 36/* Reads DWARF3 .debug_pubtypes section. */ 37 38 39#include "config.h" 40#include "dwarf_incl.h" 41#include <stdio.h> 42#include "dwarf_types.h" 43#include "dwarf_global.h" 44 45int 46dwarf_get_pubtypes(Dwarf_Debug dbg, 47 Dwarf_Type ** types, 48 Dwarf_Signed * ret_type_count, Dwarf_Error * error) 49{ 50 int res; 51 52 res = 53 _dwarf_load_section(dbg, 54 dbg->de_debug_pubtypes_index, 55 &dbg->de_debug_pubtypes, error); 56 if (res != DW_DLV_OK) { 57 return res; 58 } 59 60 return _dwarf_internal_get_pubnames_like_data(dbg, dbg->de_debug_pubtypes, dbg->de_debug_pubtypes_size, (Dwarf_Global **) types, /* type 61 punning, 62 Dwarf_Type 63 is never 64 a 65 completed 66 type */ 67 ret_type_count, error, DW_DLA_PUBTYPES_CONTEXT, DW_DLA_GLOBAL, /* We 68 don't 69 have 70 DW_DLA_PUBTYPES, 71 so use 72 DW_DLA_GLOBAL. */ 73 DW_DLE_DEBUG_PUBTYPES_LENGTH_BAD, 74 DW_DLE_DEBUG_PUBTYPES_VERSION_ERROR); 75} 76 77/* Deallocating fully requires deallocating the list 78 and all entries. But some internal data is 79 not exposed, so we need a function with internal knowledge. 80*/ 81 82void 83dwarf_pubtypes_dealloc(Dwarf_Debug dbg, Dwarf_Type * dwgl, 84 Dwarf_Signed count) 85{ 86 _dwarf_internal_globals_dealloc(dbg, (Dwarf_Global *) dwgl, count, DW_DLA_PUBTYPES_CONTEXT, DW_DLA_GLOBAL, /* We 87 don't 88 have 89 DW_DLA_PUBTYPES, 90 so use 91 DW_DLA_GLOBAL. */ 92 DW_DLA_LIST); 93 return; 94} 95 96 97 98int 99dwarf_pubtypename(Dwarf_Type type_in, char **ret_name, 100 Dwarf_Error * error) 101{ 102 Dwarf_Global type = (Dwarf_Global) type_in; 103 104 if (type == NULL) { 105 _dwarf_error(NULL, error, DW_DLE_TYPE_NULL); 106 return (DW_DLV_ERROR); 107 } 108 109 *ret_name = (char *) (type->gl_name); 110 return DW_DLV_OK; 111} 112 113 114int 115dwarf_pubtype_type_die_offset(Dwarf_Type type_in, 116 Dwarf_Off * ret_offset, 117 Dwarf_Error * error) 118{ 119 Dwarf_Global type = (Dwarf_Global) type_in; 120 121 return dwarf_global_die_offset(type, ret_offset, error); 122} 123 124 125int 126dwarf_pubtype_cu_offset(Dwarf_Type type_in, 127 Dwarf_Off * ret_offset, Dwarf_Error * error) 128{ 129 Dwarf_Global type = (Dwarf_Global) type_in; 130 131 return dwarf_global_cu_offset(type, ret_offset, error); 132 133} 134 135 136int 137dwarf_pubtype_name_offsets(Dwarf_Type type_in, 138 char **returned_name, 139 Dwarf_Off * die_offset, 140 Dwarf_Off * cu_die_offset, 141 Dwarf_Error * error) 142{ 143 Dwarf_Global type = (Dwarf_Global) type_in; 144 145 return dwarf_global_name_offsets(type, 146 returned_name, 147 die_offset, cu_die_offset, error); 148} 149