xref: /illumos-gate/usr/src/lib/libdwarf/common/dwarf_weaks.c (revision 4d9fdb46b215739778ebc12079842c9905586999)
1bc1f688bSRobert Mustacchi /*
2bc1f688bSRobert Mustacchi 
3bc1f688bSRobert Mustacchi   Copyright (C) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
4bc1f688bSRobert Mustacchi   Portions Copyright (C) 2009-2010 David Anderson. All Rights Reserved.
5bc1f688bSRobert Mustacchi 
6bc1f688bSRobert Mustacchi   This program is free software; you can redistribute it and/or modify it
7bc1f688bSRobert Mustacchi   under the terms of version 2.1 of the GNU Lesser General Public License
8bc1f688bSRobert Mustacchi   as published by the Free Software Foundation.
9bc1f688bSRobert Mustacchi 
10bc1f688bSRobert Mustacchi   This program is distributed in the hope that it would be useful, but
11bc1f688bSRobert Mustacchi   WITHOUT ANY WARRANTY; without even the implied warranty of
12bc1f688bSRobert Mustacchi   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13bc1f688bSRobert Mustacchi 
14bc1f688bSRobert Mustacchi   Further, this software is distributed without any warranty that it is
15bc1f688bSRobert Mustacchi   free of the rightful claim of any third person regarding infringement
16bc1f688bSRobert Mustacchi   or the like.  Any license provided herein, whether implied or
17bc1f688bSRobert Mustacchi   otherwise, applies only to this software file.  Patent licenses, if
18bc1f688bSRobert Mustacchi   any, provided herein do not apply to combinations of this program with
19bc1f688bSRobert Mustacchi   other software, or any other product whatsoever.
20bc1f688bSRobert Mustacchi 
21bc1f688bSRobert Mustacchi   You should have received a copy of the GNU Lesser General Public
22bc1f688bSRobert Mustacchi   License along with this program; if not, write the Free Software
23bc1f688bSRobert Mustacchi   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
24bc1f688bSRobert Mustacchi   USA.
25bc1f688bSRobert Mustacchi 
26bc1f688bSRobert Mustacchi */
27bc1f688bSRobert Mustacchi 
28bc1f688bSRobert Mustacchi #include "config.h"
29bc1f688bSRobert Mustacchi #include <stdio.h>
30*4d9fdb46SRobert Mustacchi #include "dwarf_incl.h"
31*4d9fdb46SRobert Mustacchi #include "dwarf_error.h"
32bc1f688bSRobert Mustacchi #include "dwarf_weaks.h"
33bc1f688bSRobert Mustacchi #include "dwarf_global.h"
34bc1f688bSRobert Mustacchi 
35bc1f688bSRobert Mustacchi int
dwarf_get_weaks(Dwarf_Debug dbg,Dwarf_Weak ** weaks,Dwarf_Signed * ret_weak_count,Dwarf_Error * error)36bc1f688bSRobert Mustacchi dwarf_get_weaks(Dwarf_Debug dbg,
37bc1f688bSRobert Mustacchi     Dwarf_Weak ** weaks,
38bc1f688bSRobert Mustacchi     Dwarf_Signed * ret_weak_count, Dwarf_Error * error)
39bc1f688bSRobert Mustacchi {
40bc1f688bSRobert Mustacchi     int res = _dwarf_load_section(dbg, &dbg->de_debug_weaknames,error);
41bc1f688bSRobert Mustacchi     if (res != DW_DLV_OK) {
42bc1f688bSRobert Mustacchi         return res;
43bc1f688bSRobert Mustacchi     }
44*4d9fdb46SRobert Mustacchi     if (!dbg->de_debug_weaknames.dss_size) {
45*4d9fdb46SRobert Mustacchi         return (DW_DLV_NO_ENTRY);
46*4d9fdb46SRobert Mustacchi     }
47*4d9fdb46SRobert Mustacchi 
48bc1f688bSRobert Mustacchi 
49bc1f688bSRobert Mustacchi     return _dwarf_internal_get_pubnames_like_data(dbg,
50bc1f688bSRobert Mustacchi         dbg->de_debug_weaknames.dss_data,
51bc1f688bSRobert Mustacchi         dbg->de_debug_weaknames.dss_size,
52bc1f688bSRobert Mustacchi         (Dwarf_Global **) weaks, /* Type punning for sections
53bc1f688bSRobert Mustacchi             with identical format. */
54bc1f688bSRobert Mustacchi         ret_weak_count,
55bc1f688bSRobert Mustacchi         error,
56bc1f688bSRobert Mustacchi         DW_DLA_WEAK_CONTEXT,
57bc1f688bSRobert Mustacchi         DW_DLA_WEAK,
58bc1f688bSRobert Mustacchi         DW_DLE_DEBUG_WEAKNAMES_LENGTH_BAD,
59bc1f688bSRobert Mustacchi         DW_DLE_DEBUG_WEAKNAMES_VERSION_ERROR);
60bc1f688bSRobert Mustacchi }
61bc1f688bSRobert Mustacchi 
62bc1f688bSRobert Mustacchi /* Deallocating fully requires deallocating the list
63bc1f688bSRobert Mustacchi    and all entries.  But some internal data is
64bc1f688bSRobert Mustacchi    not exposed, so we need a function with internal knowledge.
65bc1f688bSRobert Mustacchi */
66bc1f688bSRobert Mustacchi 
67bc1f688bSRobert Mustacchi void
dwarf_weaks_dealloc(Dwarf_Debug dbg,Dwarf_Weak * dwgl,Dwarf_Signed count)68bc1f688bSRobert Mustacchi dwarf_weaks_dealloc(Dwarf_Debug dbg, Dwarf_Weak * dwgl,
69bc1f688bSRobert Mustacchi     Dwarf_Signed count)
70bc1f688bSRobert Mustacchi {
71bc1f688bSRobert Mustacchi     _dwarf_internal_globals_dealloc(dbg, (Dwarf_Global *) dwgl,
72bc1f688bSRobert Mustacchi         count,
73bc1f688bSRobert Mustacchi         DW_DLA_WEAK_CONTEXT,
74bc1f688bSRobert Mustacchi         DW_DLA_WEAK, DW_DLA_LIST);
75bc1f688bSRobert Mustacchi     return;
76bc1f688bSRobert Mustacchi }
77bc1f688bSRobert Mustacchi 
78bc1f688bSRobert Mustacchi 
79bc1f688bSRobert Mustacchi 
80bc1f688bSRobert Mustacchi int
dwarf_weakname(Dwarf_Weak weak_in,char ** ret_name,Dwarf_Error * error)81bc1f688bSRobert Mustacchi dwarf_weakname(Dwarf_Weak weak_in, char **ret_name, Dwarf_Error * error)
82bc1f688bSRobert Mustacchi {
83bc1f688bSRobert Mustacchi     Dwarf_Global weak = (Dwarf_Global) weak_in;
84bc1f688bSRobert Mustacchi 
85bc1f688bSRobert Mustacchi     if (weak == NULL) {
86bc1f688bSRobert Mustacchi         _dwarf_error(NULL, error, DW_DLE_WEAK_NULL);
87bc1f688bSRobert Mustacchi         return (DW_DLV_ERROR);
88bc1f688bSRobert Mustacchi     }
89bc1f688bSRobert Mustacchi     *ret_name = (char *) (weak->gl_name);
90bc1f688bSRobert Mustacchi     return DW_DLV_OK;
91bc1f688bSRobert Mustacchi }
92bc1f688bSRobert Mustacchi 
93bc1f688bSRobert Mustacchi 
94bc1f688bSRobert Mustacchi int
dwarf_weak_die_offset(Dwarf_Weak weak_in,Dwarf_Off * weak_off,Dwarf_Error * error)95bc1f688bSRobert Mustacchi dwarf_weak_die_offset(Dwarf_Weak weak_in,
96bc1f688bSRobert Mustacchi     Dwarf_Off * weak_off, Dwarf_Error * error)
97bc1f688bSRobert Mustacchi {
98bc1f688bSRobert Mustacchi     Dwarf_Global weak = (Dwarf_Global) weak_in;
99bc1f688bSRobert Mustacchi 
100bc1f688bSRobert Mustacchi     return dwarf_global_die_offset(weak, weak_off, error);
101bc1f688bSRobert Mustacchi }
102bc1f688bSRobert Mustacchi 
103bc1f688bSRobert Mustacchi 
104bc1f688bSRobert Mustacchi int
dwarf_weak_cu_offset(Dwarf_Weak weak_in,Dwarf_Off * weak_off,Dwarf_Error * error)105bc1f688bSRobert Mustacchi dwarf_weak_cu_offset(Dwarf_Weak weak_in,
106bc1f688bSRobert Mustacchi     Dwarf_Off * weak_off, Dwarf_Error * error)
107bc1f688bSRobert Mustacchi {
108bc1f688bSRobert Mustacchi     Dwarf_Global weak = (Dwarf_Global) weak_in;
109bc1f688bSRobert Mustacchi 
110bc1f688bSRobert Mustacchi     return dwarf_global_cu_offset(weak, weak_off, error);
111bc1f688bSRobert Mustacchi }
112bc1f688bSRobert Mustacchi 
113bc1f688bSRobert Mustacchi 
114bc1f688bSRobert Mustacchi int
dwarf_weak_name_offsets(Dwarf_Weak weak_in,char ** weak_name,Dwarf_Off * die_offset,Dwarf_Off * cu_offset,Dwarf_Error * error)115bc1f688bSRobert Mustacchi dwarf_weak_name_offsets(Dwarf_Weak weak_in,
116bc1f688bSRobert Mustacchi     char **weak_name,
117bc1f688bSRobert Mustacchi     Dwarf_Off * die_offset,
118bc1f688bSRobert Mustacchi     Dwarf_Off * cu_offset, Dwarf_Error * error)
119bc1f688bSRobert Mustacchi {
120bc1f688bSRobert Mustacchi     Dwarf_Global weak = (Dwarf_Global) weak_in;
121bc1f688bSRobert Mustacchi 
122bc1f688bSRobert Mustacchi     return dwarf_global_name_offsets(weak,
123bc1f688bSRobert Mustacchi         weak_name, die_offset, cu_offset, error);
124bc1f688bSRobert Mustacchi }
125