149d3bc91SRichard Lowe /*
207dc1947SRichard Lowe   Copyright (C) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
3*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2009-2011 David Anderson. All Rights Reserved.
449d3bc91SRichard Lowe 
549d3bc91SRichard Lowe   This program is free software; you can redistribute it and/or modify it
6*4d9fdb46SRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
749d3bc91SRichard Lowe   as published by the Free Software Foundation.
849d3bc91SRichard Lowe 
949d3bc91SRichard Lowe   This program is distributed in the hope that it would be useful, but
1049d3bc91SRichard Lowe   WITHOUT ANY WARRANTY; without even the implied warranty of
11*4d9fdb46SRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1249d3bc91SRichard Lowe 
1349d3bc91SRichard Lowe   Further, this software is distributed without any warranty that it is
14*4d9fdb46SRobert Mustacchi   free of the rightful claim of any third person regarding infringement
15*4d9fdb46SRobert Mustacchi   or the like.  Any license provided herein, whether implied or
1649d3bc91SRichard Lowe   otherwise, applies only to this software file.  Patent licenses, if
17*4d9fdb46SRobert Mustacchi   any, provided herein do not apply to combinations of this program with
18*4d9fdb46SRobert Mustacchi   other software, or any other product whatsoever.
1949d3bc91SRichard Lowe 
20*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
21*4d9fdb46SRobert Mustacchi   License along with this program; if not, write the Free Software
2207dc1947SRichard Lowe   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
2349d3bc91SRichard Lowe   USA.
2449d3bc91SRichard Lowe 
2549d3bc91SRichard Lowe */
2649d3bc91SRichard Lowe 
2749d3bc91SRichard Lowe #include "config.h"
2849d3bc91SRichard Lowe #include <stdio.h>
29*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
30*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
3149d3bc91SRichard Lowe #include "dwarf_types.h"
3249d3bc91SRichard Lowe #include "dwarf_global.h"
3349d3bc91SRichard Lowe 
3449d3bc91SRichard Lowe int
dwarf_get_types(Dwarf_Debug dbg,Dwarf_Type ** types,Dwarf_Signed * ret_type_count,Dwarf_Error * error)3549d3bc91SRichard Lowe dwarf_get_types(Dwarf_Debug dbg,
3607dc1947SRichard Lowe     Dwarf_Type ** types,
3707dc1947SRichard Lowe     Dwarf_Signed * ret_type_count, Dwarf_Error * error)
3849d3bc91SRichard Lowe {
3907dc1947SRichard Lowe     int res = _dwarf_load_section(dbg, &dbg->de_debug_typenames,error);
4049d3bc91SRichard Lowe     if (res != DW_DLV_OK) {
4107dc1947SRichard Lowe         return res;
4249d3bc91SRichard Lowe     }
43*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_typenames.dss_size) {
44*4d9fdb46SRobert Mustacchi         return (DW_DLV_NO_ENTRY);
45*4d9fdb46SRobert Mustacchi     }
4649d3bc91SRichard Lowe 
47*4d9fdb46SRobert Mustacchi 
48*4d9fdb46SRobert Mustacchi     return _dwarf_internal_get_pubnames_like_data(dbg,
49*4d9fdb46SRobert Mustacchi         dbg->de_debug_typenames.dss_data,
50*4d9fdb46SRobert Mustacchi         dbg->de_debug_typenames.dss_size,
51*4d9fdb46SRobert Mustacchi         (Dwarf_Global **) types,  /* type punning, Dwarf_Type is
52*4d9fdb46SRobert Mustacchi             never a completed type */
53*4d9fdb46SRobert Mustacchi         ret_type_count,
54*4d9fdb46SRobert Mustacchi         error,
55*4d9fdb46SRobert Mustacchi         DW_DLA_TYPENAME_CONTEXT,
56*4d9fdb46SRobert Mustacchi         DW_DLA_TYPENAME,
57*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_TYPENAMES_LENGTH_BAD,
58*4d9fdb46SRobert Mustacchi         DW_DLE_DEBUG_TYPENAMES_VERSION_ERROR);
5907dc1947SRichard Lowe }
6007dc1947SRichard Lowe 
61*4d9fdb46SRobert Mustacchi /*  Deallocating fully requires deallocating the list
62*4d9fdb46SRobert Mustacchi     and all entries.  But some internal data is
63*4d9fdb46SRobert Mustacchi     not exposed, so we need a function with internal knowledge.  */
6449d3bc91SRichard Lowe 
6507dc1947SRichard Lowe void
dwarf_types_dealloc(Dwarf_Debug dbg,Dwarf_Type * dwgl,Dwarf_Signed count)6607dc1947SRichard Lowe dwarf_types_dealloc(Dwarf_Debug dbg, Dwarf_Type * dwgl,
6707dc1947SRichard Lowe     Dwarf_Signed count)
6807dc1947SRichard Lowe {
6907dc1947SRichard Lowe     _dwarf_internal_globals_dealloc(dbg, (Dwarf_Global *) dwgl,
7007dc1947SRichard Lowe         count,
7107dc1947SRichard Lowe         DW_DLA_TYPENAME_CONTEXT,
7207dc1947SRichard Lowe         DW_DLA_TYPENAME, DW_DLA_LIST);
7307dc1947SRichard Lowe     return;
7449d3bc91SRichard Lowe }
7549d3bc91SRichard Lowe 
7649d3bc91SRichard Lowe 
7749d3bc91SRichard Lowe int
dwarf_typename(Dwarf_Type type_in,char ** ret_name,Dwarf_Error * error)7849d3bc91SRichard Lowe dwarf_typename(Dwarf_Type type_in, char **ret_name, Dwarf_Error * error)
7949d3bc91SRichard Lowe {
8049d3bc91SRichard Lowe     Dwarf_Global type = (Dwarf_Global) type_in;
8149d3bc91SRichard Lowe 
8249d3bc91SRichard Lowe     if (type == NULL) {
8307dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_TYPE_NULL);
8407dc1947SRichard Lowe         return (DW_DLV_ERROR);
8549d3bc91SRichard Lowe     }
8649d3bc91SRichard Lowe 
8749d3bc91SRichard Lowe     *ret_name = (char *) (type->gl_name);
8849d3bc91SRichard Lowe     return DW_DLV_OK;
8949d3bc91SRichard Lowe }
9049d3bc91SRichard Lowe 
9149d3bc91SRichard Lowe 
9249d3bc91SRichard Lowe int
dwarf_type_die_offset(Dwarf_Type type_in,Dwarf_Off * ret_offset,Dwarf_Error * error)9349d3bc91SRichard Lowe dwarf_type_die_offset(Dwarf_Type type_in,
94*4d9fdb46SRobert Mustacchi     Dwarf_Off * ret_offset, Dwarf_Error * error)
9549d3bc91SRichard Lowe {
9649d3bc91SRichard Lowe     Dwarf_Global type = (Dwarf_Global) type_in;
9749d3bc91SRichard Lowe 
9849d3bc91SRichard Lowe     return dwarf_global_die_offset(type, ret_offset, error);
9949d3bc91SRichard Lowe }
10049d3bc91SRichard Lowe 
10149d3bc91SRichard Lowe 
10249d3bc91SRichard Lowe int
dwarf_type_cu_offset(Dwarf_Type type_in,Dwarf_Off * ret_offset,Dwarf_Error * error)10349d3bc91SRichard Lowe dwarf_type_cu_offset(Dwarf_Type type_in,
104*4d9fdb46SRobert Mustacchi     Dwarf_Off * ret_offset, Dwarf_Error * error)
10549d3bc91SRichard Lowe {
10649d3bc91SRichard Lowe     Dwarf_Global type = (Dwarf_Global) type_in;
10749d3bc91SRichard Lowe 
10849d3bc91SRichard Lowe     return dwarf_global_cu_offset(type, ret_offset, error);
10949d3bc91SRichard Lowe }
11049d3bc91SRichard Lowe 
11149d3bc91SRichard Lowe 
11249d3bc91SRichard Lowe int
dwarf_type_name_offsets(Dwarf_Type type_in,char ** returned_name,Dwarf_Off * die_offset,Dwarf_Off * cu_die_offset,Dwarf_Error * error)11349d3bc91SRichard Lowe dwarf_type_name_offsets(Dwarf_Type type_in,
11407dc1947SRichard Lowe     char **returned_name,
11507dc1947SRichard Lowe     Dwarf_Off * die_offset,
11607dc1947SRichard Lowe     Dwarf_Off * cu_die_offset, Dwarf_Error * error)
11749d3bc91SRichard Lowe {
11849d3bc91SRichard Lowe     Dwarf_Global type = (Dwarf_Global) type_in;
11949d3bc91SRichard Lowe     return dwarf_global_name_offsets(type,
12007dc1947SRichard Lowe         returned_name,
12107dc1947SRichard Lowe         die_offset, cu_die_offset, error);
12249d3bc91SRichard Lowe }
123