149d3bc91SRichard Lowe /*
249d3bc91SRichard Lowe 
307dc1947SRichard Lowe   Copyright (C) 2000,2002,2004,2005 Silicon Graphics, Inc.  All Rights Reserved.
4*4d9fdb46SRobert Mustacchi   Portions Copyright (C) 2009-2011 David Anderson. All Rights Reserved.
549d3bc91SRichard Lowe 
649d3bc91SRichard Lowe   This program is free software; you can redistribute it and/or modify it
7*4d9fdb46SRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
849d3bc91SRichard Lowe   as published by the Free Software Foundation.
949d3bc91SRichard Lowe 
1049d3bc91SRichard Lowe   This program is distributed in the hope that it would be useful, but
1149d3bc91SRichard Lowe   WITHOUT ANY WARRANTY; without even the implied warranty of
12*4d9fdb46SRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1349d3bc91SRichard Lowe 
1449d3bc91SRichard Lowe   Further, this software is distributed without any warranty that it is
15*4d9fdb46SRobert Mustacchi   free of the rightful claim of any third person regarding infringement
16*4d9fdb46SRobert Mustacchi   or the like.  Any license provided herein, whether implied or
1749d3bc91SRichard Lowe   otherwise, applies only to this software file.  Patent licenses, if
18*4d9fdb46SRobert Mustacchi   any, provided herein do not apply to combinations of this program with
19*4d9fdb46SRobert Mustacchi   other software, or any other product whatsoever.
2049d3bc91SRichard Lowe 
21*4d9fdb46SRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
22*4d9fdb46SRobert Mustacchi   License along with this program; if not, write the Free Software
2307dc1947SRichard Lowe   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
2449d3bc91SRichard Lowe   USA.
2549d3bc91SRichard Lowe 
2649d3bc91SRichard Lowe */
2749d3bc91SRichard Lowe 
2849d3bc91SRichard Lowe #include "config.h"
2949d3bc91SRichard Lowe #include <stdio.h>
30*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
31*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
3249d3bc91SRichard Lowe #include "dwarf_vars.h"
3349d3bc91SRichard Lowe #include "dwarf_global.h"
3449d3bc91SRichard Lowe 
3549d3bc91SRichard Lowe int
dwarf_get_vars(Dwarf_Debug dbg,Dwarf_Var ** vars,Dwarf_Signed * ret_var_count,Dwarf_Error * error)3649d3bc91SRichard Lowe dwarf_get_vars(Dwarf_Debug dbg,
3707dc1947SRichard Lowe     Dwarf_Var ** vars,
3807dc1947SRichard Lowe     Dwarf_Signed * ret_var_count, Dwarf_Error * error)
3949d3bc91SRichard Lowe {
4007dc1947SRichard Lowe     int res = _dwarf_load_section(dbg, &dbg->de_debug_varnames,error);
4149d3bc91SRichard Lowe     if (res != DW_DLV_OK) {
4207dc1947SRichard Lowe         return res;
4349d3bc91SRichard Lowe     }
44*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_abbrev.dss_size) {
45*4d9fdb46SRobert Mustacchi         return (DW_DLV_NO_ENTRY);
46*4d9fdb46SRobert Mustacchi     }
4749d3bc91SRichard Lowe 
48*4d9fdb46SRobert Mustacchi     return _dwarf_internal_get_pubnames_like_data(dbg,
49*4d9fdb46SRobert Mustacchi         dbg->de_debug_varnames.dss_data,
50*4d9fdb46SRobert Mustacchi         dbg->de_debug_varnames.dss_size,
51*4d9fdb46SRobert Mustacchi         (Dwarf_Global **) vars, /* Type punning for sections
5207dc1947SRichard Lowe             with identical format. */
5307dc1947SRichard Lowe         ret_var_count,
5407dc1947SRichard Lowe         error,
5507dc1947SRichard Lowe         DW_DLA_VAR_CONTEXT,
5607dc1947SRichard Lowe         DW_DLA_VAR,
5707dc1947SRichard Lowe         DW_DLE_DEBUG_VARNAMES_LENGTH_BAD,
5807dc1947SRichard Lowe         DW_DLE_DEBUG_VARNAMES_VERSION_ERROR);
5907dc1947SRichard Lowe }
6007dc1947SRichard Lowe 
6107dc1947SRichard Lowe /* Deallocating fully requires deallocating the list
6207dc1947SRichard Lowe    and all entries.  But some internal data is
6307dc1947SRichard Lowe    not exposed, so we need a function with internal knowledge.
6407dc1947SRichard Lowe */
6507dc1947SRichard Lowe 
6607dc1947SRichard Lowe void
dwarf_vars_dealloc(Dwarf_Debug dbg,Dwarf_Var * dwgl,Dwarf_Signed count)6707dc1947SRichard Lowe dwarf_vars_dealloc(Dwarf_Debug dbg, Dwarf_Var * dwgl,
68*4d9fdb46SRobert Mustacchi     Dwarf_Signed count)
6907dc1947SRichard Lowe {
7007dc1947SRichard Lowe     _dwarf_internal_globals_dealloc(dbg, (Dwarf_Global *) dwgl,
7107dc1947SRichard Lowe         count,
7207dc1947SRichard Lowe         DW_DLA_VAR_CONTEXT,
7307dc1947SRichard Lowe         DW_DLA_VAR, DW_DLA_LIST);
7407dc1947SRichard Lowe     return;
7549d3bc91SRichard Lowe }
7649d3bc91SRichard Lowe 
7749d3bc91SRichard Lowe 
7849d3bc91SRichard Lowe int
dwarf_varname(Dwarf_Var var_in,char ** ret_varname,Dwarf_Error * error)7949d3bc91SRichard Lowe dwarf_varname(Dwarf_Var var_in, char **ret_varname, Dwarf_Error * error)
8049d3bc91SRichard Lowe {
8149d3bc91SRichard Lowe     Dwarf_Global var = (Dwarf_Global) var_in;
8249d3bc91SRichard Lowe 
8349d3bc91SRichard Lowe     if (var == NULL) {
8407dc1947SRichard Lowe         _dwarf_error(NULL, error, DW_DLE_VAR_NULL);
8507dc1947SRichard Lowe         return (DW_DLV_ERROR);
8649d3bc91SRichard Lowe     }
8749d3bc91SRichard Lowe 
8849d3bc91SRichard Lowe     *ret_varname = (char *) (var->gl_name);
8949d3bc91SRichard Lowe     return DW_DLV_OK;
9049d3bc91SRichard Lowe }
9149d3bc91SRichard Lowe 
9249d3bc91SRichard Lowe 
9349d3bc91SRichard Lowe int
dwarf_var_die_offset(Dwarf_Var var_in,Dwarf_Off * returned_offset,Dwarf_Error * error)9449d3bc91SRichard Lowe dwarf_var_die_offset(Dwarf_Var var_in,
95*4d9fdb46SRobert Mustacchi     Dwarf_Off * returned_offset, Dwarf_Error * error)
9649d3bc91SRichard Lowe {
9749d3bc91SRichard Lowe     Dwarf_Global var = (Dwarf_Global) var_in;
9849d3bc91SRichard Lowe 
9949d3bc91SRichard Lowe     return dwarf_global_die_offset(var, returned_offset, error);
10049d3bc91SRichard Lowe 
10149d3bc91SRichard Lowe }
10249d3bc91SRichard Lowe 
10349d3bc91SRichard Lowe 
10449d3bc91SRichard Lowe int
dwarf_var_cu_offset(Dwarf_Var var_in,Dwarf_Off * returned_offset,Dwarf_Error * error)10549d3bc91SRichard Lowe dwarf_var_cu_offset(Dwarf_Var var_in,
106*4d9fdb46SRobert Mustacchi     Dwarf_Off * returned_offset, Dwarf_Error * error)
10749d3bc91SRichard Lowe {
10849d3bc91SRichard Lowe     Dwarf_Global var = (Dwarf_Global) var_in;
10949d3bc91SRichard Lowe 
11049d3bc91SRichard Lowe     return dwarf_global_cu_offset(var, returned_offset, error);
11149d3bc91SRichard Lowe }
11249d3bc91SRichard Lowe 
11349d3bc91SRichard Lowe 
11449d3bc91SRichard Lowe int
dwarf_var_name_offsets(Dwarf_Var var_in,char ** returned_name,Dwarf_Off * die_offset,Dwarf_Off * cu_offset,Dwarf_Error * error)11549d3bc91SRichard Lowe dwarf_var_name_offsets(Dwarf_Var var_in,
116*4d9fdb46SRobert Mustacchi     char **returned_name,
117*4d9fdb46SRobert Mustacchi     Dwarf_Off * die_offset,
118*4d9fdb46SRobert Mustacchi     Dwarf_Off * cu_offset, Dwarf_Error * error)
11949d3bc91SRichard Lowe {
12049d3bc91SRichard Lowe     Dwarf_Global var = (Dwarf_Global) var_in;
12149d3bc91SRichard Lowe 
12249d3bc91SRichard Lowe     return
12307dc1947SRichard Lowe         dwarf_global_name_offsets(var,
12407dc1947SRichard Lowe             returned_name, die_offset, cu_offset,
12507dc1947SRichard Lowe             error);
12649d3bc91SRichard Lowe }
127