xref: /minix3/external/bsd/elftoolchain/dist/libdwarf/libdwarf_init.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /*	$NetBSD: libdwarf_init.c,v 1.2 2014/03/09 16:58:04 christos Exp $	*/
2*0a6a1f1dSLionel Sambuc 
3*0a6a1f1dSLionel Sambuc /*-
4*0a6a1f1dSLionel Sambuc  * Copyright (c) 2009,2011 Kai Wang
5*0a6a1f1dSLionel Sambuc  * All rights reserved.
6*0a6a1f1dSLionel Sambuc  *
7*0a6a1f1dSLionel Sambuc  * Redistribution and use in source and binary forms, with or without
8*0a6a1f1dSLionel Sambuc  * modification, are permitted provided that the following conditions
9*0a6a1f1dSLionel Sambuc  * are met:
10*0a6a1f1dSLionel Sambuc  * 1. Redistributions of source code must retain the above copyright
11*0a6a1f1dSLionel Sambuc  *    notice, this list of conditions and the following disclaimer.
12*0a6a1f1dSLionel Sambuc  * 2. Redistributions in binary form must reproduce the above copyright
13*0a6a1f1dSLionel Sambuc  *    notice, this list of conditions and the following disclaimer in the
14*0a6a1f1dSLionel Sambuc  *    documentation and/or other materials provided with the distribution.
15*0a6a1f1dSLionel Sambuc  *
16*0a6a1f1dSLionel Sambuc  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*0a6a1f1dSLionel Sambuc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*0a6a1f1dSLionel Sambuc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*0a6a1f1dSLionel Sambuc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20*0a6a1f1dSLionel Sambuc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*0a6a1f1dSLionel Sambuc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*0a6a1f1dSLionel Sambuc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*0a6a1f1dSLionel Sambuc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*0a6a1f1dSLionel Sambuc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*0a6a1f1dSLionel Sambuc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*0a6a1f1dSLionel Sambuc  * SUCH DAMAGE.
27*0a6a1f1dSLionel Sambuc  */
28*0a6a1f1dSLionel Sambuc 
29*0a6a1f1dSLionel Sambuc #include "_libdwarf.h"
30*0a6a1f1dSLionel Sambuc 
31*0a6a1f1dSLionel Sambuc __RCSID("$NetBSD: libdwarf_init.c,v 1.2 2014/03/09 16:58:04 christos Exp $");
32*0a6a1f1dSLionel Sambuc ELFTC_VCSID("Id: libdwarf_init.c 2948 2013-05-30 21:25:52Z kaiwang27 ");
33*0a6a1f1dSLionel Sambuc 
34*0a6a1f1dSLionel Sambuc static int
_dwarf_consumer_init(Dwarf_Debug dbg,Dwarf_Error * error)35*0a6a1f1dSLionel Sambuc _dwarf_consumer_init(Dwarf_Debug dbg, Dwarf_Error *error)
36*0a6a1f1dSLionel Sambuc {
37*0a6a1f1dSLionel Sambuc 	const Dwarf_Obj_Access_Methods *m;
38*0a6a1f1dSLionel Sambuc 	Dwarf_Obj_Access_Section sec;
39*0a6a1f1dSLionel Sambuc 	void *obj;
40*0a6a1f1dSLionel Sambuc 	Dwarf_Unsigned cnt;
41*0a6a1f1dSLionel Sambuc 	Dwarf_Half i;
42*0a6a1f1dSLionel Sambuc 	int ret;
43*0a6a1f1dSLionel Sambuc 
44*0a6a1f1dSLionel Sambuc 	assert(dbg != NULL);
45*0a6a1f1dSLionel Sambuc 	assert(dbg->dbg_iface != NULL);
46*0a6a1f1dSLionel Sambuc 
47*0a6a1f1dSLionel Sambuc 	m = dbg->dbg_iface->methods;
48*0a6a1f1dSLionel Sambuc 	obj = dbg->dbg_iface->object;
49*0a6a1f1dSLionel Sambuc 
50*0a6a1f1dSLionel Sambuc 	assert(m != NULL);
51*0a6a1f1dSLionel Sambuc 	assert(obj != NULL);
52*0a6a1f1dSLionel Sambuc 
53*0a6a1f1dSLionel Sambuc 	if (m->get_byte_order(obj) == DW_OBJECT_MSB) {
54*0a6a1f1dSLionel Sambuc 		dbg->read = _dwarf_read_msb;
55*0a6a1f1dSLionel Sambuc 		dbg->write = _dwarf_write_msb;
56*0a6a1f1dSLionel Sambuc 		dbg->decode = _dwarf_decode_msb;
57*0a6a1f1dSLionel Sambuc 	} else {
58*0a6a1f1dSLionel Sambuc 		dbg->read = _dwarf_read_lsb;
59*0a6a1f1dSLionel Sambuc 		dbg->write = _dwarf_write_lsb;
60*0a6a1f1dSLionel Sambuc 		dbg->decode = _dwarf_decode_lsb;
61*0a6a1f1dSLionel Sambuc 	}
62*0a6a1f1dSLionel Sambuc 
63*0a6a1f1dSLionel Sambuc 	dbg->dbg_pointer_size = m->get_pointer_size(obj);
64*0a6a1f1dSLionel Sambuc 	dbg->dbg_offset_size = m->get_length_size(obj);
65*0a6a1f1dSLionel Sambuc 
66*0a6a1f1dSLionel Sambuc 	cnt = m->get_section_count(obj);
67*0a6a1f1dSLionel Sambuc 
68*0a6a1f1dSLionel Sambuc 	if (cnt == 0) {
69*0a6a1f1dSLionel Sambuc 		DWARF_SET_ERROR(dbg, error, DW_DLE_DEBUG_INFO_NULL);
70*0a6a1f1dSLionel Sambuc 		return (DW_DLE_DEBUG_INFO_NULL);
71*0a6a1f1dSLionel Sambuc 	}
72*0a6a1f1dSLionel Sambuc 
73*0a6a1f1dSLionel Sambuc 	dbg->dbg_seccnt = cnt;
74*0a6a1f1dSLionel Sambuc 
75*0a6a1f1dSLionel Sambuc 	if ((dbg->dbg_section = calloc(cnt, sizeof(Dwarf_Section))) == NULL) {
76*0a6a1f1dSLionel Sambuc 		DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY);
77*0a6a1f1dSLionel Sambuc 		return (DW_DLE_MEMORY);
78*0a6a1f1dSLionel Sambuc 	}
79*0a6a1f1dSLionel Sambuc 
80*0a6a1f1dSLionel Sambuc 	for (i = 0; i < cnt; i++) {
81*0a6a1f1dSLionel Sambuc 		if (m->get_section_info(obj, i, &sec, &ret) != DW_DLV_OK) {
82*0a6a1f1dSLionel Sambuc 			DWARF_SET_ERROR(dbg, error, ret);
83*0a6a1f1dSLionel Sambuc 			return (ret);
84*0a6a1f1dSLionel Sambuc 		}
85*0a6a1f1dSLionel Sambuc 
86*0a6a1f1dSLionel Sambuc 		dbg->dbg_section[i].ds_addr = sec.addr;
87*0a6a1f1dSLionel Sambuc 		dbg->dbg_section[i].ds_size = sec.size;
88*0a6a1f1dSLionel Sambuc 		dbg->dbg_section[i].ds_name = sec.name;
89*0a6a1f1dSLionel Sambuc 
90*0a6a1f1dSLionel Sambuc 		if (m->load_section(obj, i, &dbg->dbg_section[i].ds_data, &ret)
91*0a6a1f1dSLionel Sambuc 		    != DW_DLV_OK) {
92*0a6a1f1dSLionel Sambuc 			DWARF_SET_ERROR(dbg, error, ret);
93*0a6a1f1dSLionel Sambuc 			return (ret);
94*0a6a1f1dSLionel Sambuc 		}
95*0a6a1f1dSLionel Sambuc 	}
96*0a6a1f1dSLionel Sambuc 
97*0a6a1f1dSLionel Sambuc 	if (_dwarf_find_section(dbg, ".debug_abbrev") == NULL ||
98*0a6a1f1dSLionel Sambuc 	    ((dbg->dbg_info_sec = _dwarf_find_section(dbg, ".debug_info")) ==
99*0a6a1f1dSLionel Sambuc 	     NULL)) {
100*0a6a1f1dSLionel Sambuc 		DWARF_SET_ERROR(dbg, error, DW_DLE_DEBUG_INFO_NULL);
101*0a6a1f1dSLionel Sambuc 		return (DW_DLE_DEBUG_INFO_NULL);
102*0a6a1f1dSLionel Sambuc 	}
103*0a6a1f1dSLionel Sambuc 
104*0a6a1f1dSLionel Sambuc 	/* Initialise call frame API related parameters. */
105*0a6a1f1dSLionel Sambuc 	_dwarf_frame_params_init(dbg);
106*0a6a1f1dSLionel Sambuc 
107*0a6a1f1dSLionel Sambuc 	return (DW_DLV_OK);
108*0a6a1f1dSLionel Sambuc }
109*0a6a1f1dSLionel Sambuc 
110*0a6a1f1dSLionel Sambuc static int
_dwarf_producer_init(Dwarf_Debug dbg,Dwarf_Unsigned pf,Dwarf_Error * error)111*0a6a1f1dSLionel Sambuc _dwarf_producer_init(Dwarf_Debug dbg, Dwarf_Unsigned pf, Dwarf_Error *error)
112*0a6a1f1dSLionel Sambuc {
113*0a6a1f1dSLionel Sambuc 
114*0a6a1f1dSLionel Sambuc 	/* Producer only support DWARF2 which has fixed 32bit offset. */
115*0a6a1f1dSLionel Sambuc 	dbg->dbg_offset_size = 4;
116*0a6a1f1dSLionel Sambuc 
117*0a6a1f1dSLionel Sambuc 	if (pf & DW_DLC_SIZE_32 && pf & DW_DLC_SIZE_64) {
118*0a6a1f1dSLionel Sambuc 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
119*0a6a1f1dSLionel Sambuc 		return (DW_DLE_ARGUMENT);
120*0a6a1f1dSLionel Sambuc 	}
121*0a6a1f1dSLionel Sambuc 
122*0a6a1f1dSLionel Sambuc 	if ((pf & DW_DLC_SIZE_32) == 0 && (pf & DW_DLC_SIZE_64) == 0)
123*0a6a1f1dSLionel Sambuc 		pf |= DW_DLC_SIZE_32;
124*0a6a1f1dSLionel Sambuc 
125*0a6a1f1dSLionel Sambuc 	if (pf & DW_DLC_SIZE_64)
126*0a6a1f1dSLionel Sambuc 		dbg->dbg_pointer_size = 8;
127*0a6a1f1dSLionel Sambuc 	else
128*0a6a1f1dSLionel Sambuc 		dbg->dbg_pointer_size = 4;
129*0a6a1f1dSLionel Sambuc 
130*0a6a1f1dSLionel Sambuc 	if (pf & DW_DLC_ISA_IA64 && pf & DW_DLC_ISA_MIPS) {
131*0a6a1f1dSLionel Sambuc 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
132*0a6a1f1dSLionel Sambuc 		return (DW_DLE_ARGUMENT);
133*0a6a1f1dSLionel Sambuc 	}
134*0a6a1f1dSLionel Sambuc 
135*0a6a1f1dSLionel Sambuc 	if (pf & DW_DLC_ISA_IA64)
136*0a6a1f1dSLionel Sambuc 		dbg->dbgp_isa = DW_ISA_IA64;
137*0a6a1f1dSLionel Sambuc 	else
138*0a6a1f1dSLionel Sambuc 		dbg->dbgp_isa = DW_ISA_MIPS;
139*0a6a1f1dSLionel Sambuc 
140*0a6a1f1dSLionel Sambuc 	if (pf & DW_DLC_TARGET_BIGENDIAN && pf & DW_DLC_TARGET_LITTLEENDIAN) {
141*0a6a1f1dSLionel Sambuc 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
142*0a6a1f1dSLionel Sambuc 		return (DW_DLE_ARGUMENT);
143*0a6a1f1dSLionel Sambuc 	}
144*0a6a1f1dSLionel Sambuc 
145*0a6a1f1dSLionel Sambuc 	if ((pf & DW_DLC_TARGET_BIGENDIAN) == 0 &&
146*0a6a1f1dSLionel Sambuc 	    (pf & DW_DLC_TARGET_LITTLEENDIAN) == 0) {
147*0a6a1f1dSLionel Sambuc #if ELFTC_BYTE_ORDER == ELFTC_BYTE_ORDER_BIG_ENDIAN
148*0a6a1f1dSLionel Sambuc 		pf |= DW_DLC_TARGET_BIGENDIAN;
149*0a6a1f1dSLionel Sambuc #else
150*0a6a1f1dSLionel Sambuc 		pf |= DW_DLC_TARGET_LITTLEENDIAN;
151*0a6a1f1dSLionel Sambuc #endif
152*0a6a1f1dSLionel Sambuc 	}
153*0a6a1f1dSLionel Sambuc 
154*0a6a1f1dSLionel Sambuc 	if (pf & DW_DLC_TARGET_BIGENDIAN) {
155*0a6a1f1dSLionel Sambuc 		dbg->write = _dwarf_write_msb;
156*0a6a1f1dSLionel Sambuc 		dbg->write_alloc = _dwarf_write_msb_alloc;
157*0a6a1f1dSLionel Sambuc 	} else if (pf & DW_DLC_TARGET_LITTLEENDIAN) {
158*0a6a1f1dSLionel Sambuc 		dbg->write = _dwarf_write_lsb;
159*0a6a1f1dSLionel Sambuc 		dbg->write_alloc = _dwarf_write_lsb_alloc;
160*0a6a1f1dSLionel Sambuc 	} else
161*0a6a1f1dSLionel Sambuc 		assert(0);
162*0a6a1f1dSLionel Sambuc 
163*0a6a1f1dSLionel Sambuc 	if (pf & DW_DLC_STREAM_RELOCATIONS &&
164*0a6a1f1dSLionel Sambuc 	    pf & DW_DLC_SYMBOLIC_RELOCATIONS) {
165*0a6a1f1dSLionel Sambuc 		DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT);
166*0a6a1f1dSLionel Sambuc 		return (DW_DLE_ARGUMENT);
167*0a6a1f1dSLionel Sambuc 	}
168*0a6a1f1dSLionel Sambuc 
169*0a6a1f1dSLionel Sambuc 	if ((pf & DW_DLC_STREAM_RELOCATIONS) == 0 &&
170*0a6a1f1dSLionel Sambuc 	    (pf & DW_DLC_SYMBOLIC_RELOCATIONS) == 0)
171*0a6a1f1dSLionel Sambuc 		pf |= DW_DLC_STREAM_RELOCATIONS;
172*0a6a1f1dSLionel Sambuc 
173*0a6a1f1dSLionel Sambuc 	dbg->dbgp_flags = pf;
174*0a6a1f1dSLionel Sambuc 
175*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbgp_dielist);
176*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbgp_pelist);
177*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbgp_seclist);
178*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbgp_drslist);
179*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbgp_cielist);
180*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbgp_fdelist);
181*0a6a1f1dSLionel Sambuc 
182*0a6a1f1dSLionel Sambuc 	if ((dbg->dbgp_lineinfo = calloc(1, sizeof(struct _Dwarf_LineInfo))) ==
183*0a6a1f1dSLionel Sambuc 	    NULL) {
184*0a6a1f1dSLionel Sambuc 		DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY);
185*0a6a1f1dSLionel Sambuc 		return (DW_DLE_MEMORY);
186*0a6a1f1dSLionel Sambuc 	}
187*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbgp_lineinfo->li_lflist);
188*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbgp_lineinfo->li_lnlist);
189*0a6a1f1dSLionel Sambuc 
190*0a6a1f1dSLionel Sambuc 	if ((dbg->dbgp_as = calloc(1, sizeof(struct _Dwarf_ArangeSet))) ==
191*0a6a1f1dSLionel Sambuc 	    NULL) {
192*0a6a1f1dSLionel Sambuc 		DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY);
193*0a6a1f1dSLionel Sambuc 		return (DW_DLE_MEMORY);
194*0a6a1f1dSLionel Sambuc 	}
195*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbgp_as->as_arlist);
196*0a6a1f1dSLionel Sambuc 
197*0a6a1f1dSLionel Sambuc 	return (DW_DLE_NONE);
198*0a6a1f1dSLionel Sambuc }
199*0a6a1f1dSLionel Sambuc 
200*0a6a1f1dSLionel Sambuc int
_dwarf_init(Dwarf_Debug dbg,Dwarf_Unsigned pro_flags,Dwarf_Handler errhand,Dwarf_Ptr errarg,Dwarf_Error * error)201*0a6a1f1dSLionel Sambuc _dwarf_init(Dwarf_Debug dbg, Dwarf_Unsigned pro_flags, Dwarf_Handler errhand,
202*0a6a1f1dSLionel Sambuc     Dwarf_Ptr errarg, Dwarf_Error *error)
203*0a6a1f1dSLionel Sambuc {
204*0a6a1f1dSLionel Sambuc 	int ret;
205*0a6a1f1dSLionel Sambuc 
206*0a6a1f1dSLionel Sambuc 	ret = DW_DLE_NONE;
207*0a6a1f1dSLionel Sambuc 
208*0a6a1f1dSLionel Sambuc 	/*
209*0a6a1f1dSLionel Sambuc 	 * Set the error handler fields early, so that the application
210*0a6a1f1dSLionel Sambuc 	 * is notified of initialization errors.
211*0a6a1f1dSLionel Sambuc 	 */
212*0a6a1f1dSLionel Sambuc 	dbg->dbg_errhand = errhand;
213*0a6a1f1dSLionel Sambuc 	dbg->dbg_errarg = errarg;
214*0a6a1f1dSLionel Sambuc 
215*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbg_cu);
216*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbg_rllist);
217*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbg_aslist);
218*0a6a1f1dSLionel Sambuc 	STAILQ_INIT(&dbg->dbg_mslist);
219*0a6a1f1dSLionel Sambuc 	TAILQ_INIT(&dbg->dbg_loclist);
220*0a6a1f1dSLionel Sambuc 
221*0a6a1f1dSLionel Sambuc 	if (dbg->dbg_mode == DW_DLC_READ || dbg->dbg_mode == DW_DLC_RDWR) {
222*0a6a1f1dSLionel Sambuc 		ret = _dwarf_consumer_init(dbg, error);
223*0a6a1f1dSLionel Sambuc 		if (ret != DW_DLE_NONE) {
224*0a6a1f1dSLionel Sambuc 			_dwarf_deinit(dbg);
225*0a6a1f1dSLionel Sambuc 			return (ret);
226*0a6a1f1dSLionel Sambuc 		}
227*0a6a1f1dSLionel Sambuc 	}
228*0a6a1f1dSLionel Sambuc 
229*0a6a1f1dSLionel Sambuc 	if (dbg->dbg_mode == DW_DLC_WRITE) {
230*0a6a1f1dSLionel Sambuc 		ret = _dwarf_producer_init(dbg, pro_flags, error);
231*0a6a1f1dSLionel Sambuc 		if (ret != DW_DLE_NONE) {
232*0a6a1f1dSLionel Sambuc 			_dwarf_deinit(dbg);
233*0a6a1f1dSLionel Sambuc 			return (ret);
234*0a6a1f1dSLionel Sambuc 		}
235*0a6a1f1dSLionel Sambuc 	}
236*0a6a1f1dSLionel Sambuc 
237*0a6a1f1dSLionel Sambuc 	/*
238*0a6a1f1dSLionel Sambuc 	 * Initialise internal string table.
239*0a6a1f1dSLionel Sambuc 	 */
240*0a6a1f1dSLionel Sambuc 	if ((ret = _dwarf_strtab_init(dbg, error)) != DW_DLE_NONE)
241*0a6a1f1dSLionel Sambuc 		return (ret);
242*0a6a1f1dSLionel Sambuc 
243*0a6a1f1dSLionel Sambuc 	return (DW_DLE_NONE);
244*0a6a1f1dSLionel Sambuc }
245*0a6a1f1dSLionel Sambuc 
246*0a6a1f1dSLionel Sambuc static void
_dwarf_producer_deinit(Dwarf_P_Debug dbg)247*0a6a1f1dSLionel Sambuc _dwarf_producer_deinit(Dwarf_P_Debug dbg)
248*0a6a1f1dSLionel Sambuc {
249*0a6a1f1dSLionel Sambuc 
250*0a6a1f1dSLionel Sambuc 	assert(dbg != NULL && dbg->dbg_mode == DW_DLC_WRITE);
251*0a6a1f1dSLionel Sambuc 
252*0a6a1f1dSLionel Sambuc 	_dwarf_info_pro_cleanup(dbg);
253*0a6a1f1dSLionel Sambuc 	_dwarf_die_pro_cleanup(dbg);
254*0a6a1f1dSLionel Sambuc 	_dwarf_expr_cleanup(dbg);
255*0a6a1f1dSLionel Sambuc 	_dwarf_lineno_pro_cleanup(dbg);
256*0a6a1f1dSLionel Sambuc 	_dwarf_frame_pro_cleanup(dbg);
257*0a6a1f1dSLionel Sambuc 	_dwarf_arange_pro_cleanup(dbg);
258*0a6a1f1dSLionel Sambuc 	_dwarf_macinfo_pro_cleanup(dbg);
259*0a6a1f1dSLionel Sambuc 	_dwarf_strtab_cleanup(dbg);
260*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_pro_cleanup(&dbg->dbgp_pubs);
261*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_pro_cleanup(&dbg->dbgp_weaks);
262*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_pro_cleanup(&dbg->dbgp_funcs);
263*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_pro_cleanup(&dbg->dbgp_types);
264*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_pro_cleanup(&dbg->dbgp_vars);
265*0a6a1f1dSLionel Sambuc 	_dwarf_section_cleanup(dbg);
266*0a6a1f1dSLionel Sambuc 	_dwarf_reloc_cleanup(dbg);
267*0a6a1f1dSLionel Sambuc }
268*0a6a1f1dSLionel Sambuc 
269*0a6a1f1dSLionel Sambuc static void
_dwarf_consumer_deinit(Dwarf_Debug dbg)270*0a6a1f1dSLionel Sambuc _dwarf_consumer_deinit(Dwarf_Debug dbg)
271*0a6a1f1dSLionel Sambuc {
272*0a6a1f1dSLionel Sambuc 
273*0a6a1f1dSLionel Sambuc 	assert(dbg != NULL && dbg->dbg_mode == DW_DLC_READ);
274*0a6a1f1dSLionel Sambuc 
275*0a6a1f1dSLionel Sambuc 	_dwarf_info_cleanup(dbg);
276*0a6a1f1dSLionel Sambuc 	_dwarf_loclist_cleanup(dbg);
277*0a6a1f1dSLionel Sambuc 	_dwarf_ranges_cleanup(dbg);
278*0a6a1f1dSLionel Sambuc 	_dwarf_frame_cleanup(dbg);
279*0a6a1f1dSLionel Sambuc 	_dwarf_arange_cleanup(dbg);
280*0a6a1f1dSLionel Sambuc 	_dwarf_macinfo_cleanup(dbg);
281*0a6a1f1dSLionel Sambuc 	_dwarf_strtab_cleanup(dbg);
282*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_cleanup(&dbg->dbg_globals);
283*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_cleanup(&dbg->dbg_pubtypes);
284*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_cleanup(&dbg->dbg_weaks);
285*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_cleanup(&dbg->dbg_funcs);
286*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_cleanup(&dbg->dbg_vars);
287*0a6a1f1dSLionel Sambuc 	_dwarf_nametbl_cleanup(&dbg->dbg_types);
288*0a6a1f1dSLionel Sambuc 
289*0a6a1f1dSLionel Sambuc 	free(dbg->dbg_section);
290*0a6a1f1dSLionel Sambuc }
291*0a6a1f1dSLionel Sambuc 
292*0a6a1f1dSLionel Sambuc void
_dwarf_deinit(Dwarf_Debug dbg)293*0a6a1f1dSLionel Sambuc _dwarf_deinit(Dwarf_Debug dbg)
294*0a6a1f1dSLionel Sambuc {
295*0a6a1f1dSLionel Sambuc 
296*0a6a1f1dSLionel Sambuc 	assert(dbg != NULL);
297*0a6a1f1dSLionel Sambuc 
298*0a6a1f1dSLionel Sambuc 	if (dbg->dbg_mode == DW_DLC_READ)
299*0a6a1f1dSLionel Sambuc 		_dwarf_consumer_deinit(dbg);
300*0a6a1f1dSLionel Sambuc 	else if (dbg->dbg_mode == DW_DLC_WRITE)
301*0a6a1f1dSLionel Sambuc 		_dwarf_producer_deinit(dbg);
302*0a6a1f1dSLionel Sambuc }
303*0a6a1f1dSLionel Sambuc 
304*0a6a1f1dSLionel Sambuc int
_dwarf_alloc(Dwarf_Debug * ret_dbg,int mode,Dwarf_Error * error)305*0a6a1f1dSLionel Sambuc _dwarf_alloc(Dwarf_Debug *ret_dbg, int mode, Dwarf_Error *error)
306*0a6a1f1dSLionel Sambuc {
307*0a6a1f1dSLionel Sambuc 	Dwarf_Debug dbg;
308*0a6a1f1dSLionel Sambuc 
309*0a6a1f1dSLionel Sambuc 	if ((dbg = calloc(sizeof(struct _Dwarf_Debug), 1)) == NULL) {
310*0a6a1f1dSLionel Sambuc 		DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY);
311*0a6a1f1dSLionel Sambuc 		return (DW_DLE_MEMORY);
312*0a6a1f1dSLionel Sambuc 	}
313*0a6a1f1dSLionel Sambuc 
314*0a6a1f1dSLionel Sambuc 	dbg->dbg_mode = mode;
315*0a6a1f1dSLionel Sambuc 
316*0a6a1f1dSLionel Sambuc 	*ret_dbg = dbg;
317*0a6a1f1dSLionel Sambuc 
318*0a6a1f1dSLionel Sambuc 	return (DW_DLE_NONE);
319*0a6a1f1dSLionel Sambuc }
320