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