Branch data Line data Source code
1 : : /* Release debugging handling context.
2 : : Copyright (C) 2002-2011, 2014, 2018 Red Hat, Inc.
3 : : This file is part of elfutils.
4 : : Written by Ulrich Drepper <drepper@redhat.com>, 2002.
5 : :
6 : : This file is free software; you can redistribute it and/or modify
7 : : it under the terms of either
8 : :
9 : : * the GNU Lesser General Public License as published by the Free
10 : : Software Foundation; either version 3 of the License, or (at
11 : : your option) any later version
12 : :
13 : : or
14 : :
15 : : * the GNU General Public License as published by the Free
16 : : Software Foundation; either version 2 of the License, or (at
17 : : your option) any later version
18 : :
19 : : or both in parallel, as here.
20 : :
21 : : elfutils is distributed in the hope that it will be useful, but
22 : : WITHOUT ANY WARRANTY; without even the implied warranty of
23 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
24 : : General Public License for more details.
25 : :
26 : : You should have received copies of the GNU General Public License and
27 : : the GNU Lesser General Public License along with this program. If
28 : : not, see <http://www.gnu.org/licenses/>. */
29 : :
30 : : #ifdef HAVE_CONFIG_H
31 : : # include <config.h>
32 : : #endif
33 : :
34 : : #include <search.h>
35 : : #include <stdlib.h>
36 : : #include <assert.h>
37 : : #include <string.h>
38 : :
39 : : #include "libdwP.h"
40 : : #include "cfi.h"
41 : :
42 : :
43 : : static void
44 : 24156 : dwarf_package_index_free (Dwarf_Package_Index *index)
45 : : {
46 [ + + ]: 24156 : if (index != NULL)
47 : : {
48 : 52 : free (index->debug_info_offsets);
49 : 52 : free (index);
50 : : }
51 : 24156 : }
52 : :
53 : :
54 : : static void
55 : 1226956 : noop_free (void *arg __attribute__ ((unused)))
56 : : {
57 : 1226956 : }
58 : :
59 : :
60 : : static void
61 : 95106 : cu_free (void *arg)
62 : : {
63 : 95106 : struct Dwarf_CU *p = (struct Dwarf_CU *) arg;
64 : :
65 : 95106 : eu_search_tree_fini (&p->locs_tree, noop_free);
66 : 95106 : rwlock_fini (p->abbrev_lock);
67 : 95106 : rwlock_fini (p->split_lock);
68 : 95106 : mutex_fini (p->src_lock);
69 : 95106 : mutex_fini (p->str_off_base_lock);
70 : 95106 : mutex_fini (p->intern_lock);
71 : :
72 : : /* Only free the CU internals if its not a fake CU. */
73 [ + + + + ]: 95106 : if (p != p->dbg->fake_loc_cu && p != p->dbg->fake_loclists_cu
74 [ + + ]: 84330 : && p != p->dbg->fake_addr_cu)
75 : : {
76 : 84198 : Dwarf_Abbrev_Hash_free (&p->abbrev_hash);
77 : :
78 : : /* Free split dwarf one way (from skeleton to split). */
79 [ + + ]: 84198 : if (p->unit_type == DW_UT_skeleton
80 [ + + + + ]: 244 : && p->split != NULL && p->split != (void *)-1)
81 : : {
82 : : /* The fake_addr_cu might be shared, only release one. */
83 [ + + ]: 170 : if (p->dbg->fake_addr_cu == p->split->dbg->fake_addr_cu)
84 : 126 : p->split->dbg->fake_addr_cu = NULL;
85 : : /* There is only one DWP file. We free it later. */
86 [ + + ]: 170 : if (p->split->dbg != p->dbg->dwp_dwarf)
87 : 104 : INTUSE(dwarf_end) (p->split->dbg);
88 : : }
89 : : }
90 : 95106 : }
91 : :
92 : :
93 : : int
94 : 12098 : dwarf_end (Dwarf *dwarf)
95 : : {
96 [ + + ]: 12098 : if (dwarf != NULL)
97 : : {
98 : 12078 : dwarf_package_index_free (dwarf->tu_index);
99 : 12078 : dwarf_package_index_free (dwarf->cu_index);
100 : :
101 [ + + ]: 12078 : if (dwarf->cfi != NULL)
102 : : /* Clean up the CFI cache. */
103 : 36 : __libdw_destroy_frame_cache (dwarf->cfi);
104 : :
105 : 12078 : Dwarf_Sig8_Hash_free (&dwarf->sig8_hash);
106 : :
107 : : /* The search tree for the CUs. NB: the CU data itself is
108 : : allocated separately, but the abbreviation hash tables need
109 : : to be handled. */
110 : 12078 : eu_search_tree_fini (&dwarf->cu_tree, cu_free);
111 : 12078 : eu_search_tree_fini (&dwarf->tu_tree, cu_free);
112 : :
113 : : /* Search tree for macro opcode tables. */
114 : 12078 : eu_search_tree_fini (&dwarf->macro_ops_tree, noop_free);
115 : :
116 : : /* Search tree for decoded .debug_lines units. */
117 : 12078 : eu_search_tree_fini (&dwarf->files_lines_tree, noop_free);
118 : :
119 : : /* And the split Dwarf. */
120 : 12078 : eu_search_tree_fini (&dwarf->split_tree, noop_free);
121 : :
122 : : /* Free the internally allocated memory. */
123 [ + + ]: 14262 : for (size_t i = 0; i < dwarf->mem_stacks; i++)
124 : : {
125 : 2184 : struct libdw_memblock *memp = dwarf->mem_tails[i];
126 [ + + ]: 60604 : while (memp != NULL)
127 : : {
128 : 58420 : struct libdw_memblock *prevp = memp->prev;
129 : 58420 : free (memp);
130 : 58420 : memp = prevp;
131 : : }
132 : : }
133 [ + + ]: 12078 : if (dwarf->mem_tails != NULL)
134 : 1780 : free (dwarf->mem_tails);
135 : 12078 : pthread_rwlock_destroy (&dwarf->mem_rwl);
136 : 12078 : mutex_fini (dwarf->dwarf_lock);
137 : 12078 : mutex_fini (dwarf->macro_lock);
138 : :
139 : : /* Free the pubnames helper structure. */
140 : 12078 : free (dwarf->pubnames_sets);
141 : :
142 : : /* Free the ELF descriptor if necessary. */
143 [ + + ]: 12078 : if (dwarf->free_elf)
144 : 682 : elf_end (dwarf->elf);
145 : :
146 : : /* Free the fake location list CU. */
147 [ + + ]: 12078 : if (dwarf->fake_loc_cu != NULL)
148 : : {
149 : 326 : cu_free (dwarf->fake_loc_cu);
150 : 326 : free (dwarf->fake_loc_cu);
151 : : }
152 [ + + ]: 12078 : if (dwarf->fake_loclists_cu != NULL)
153 : : {
154 : 10450 : cu_free (dwarf->fake_loclists_cu);
155 : 10450 : free (dwarf->fake_loclists_cu);
156 : : }
157 [ + + ]: 12078 : if (dwarf->fake_addr_cu != NULL)
158 : : {
159 : 132 : cu_free (dwarf->fake_addr_cu);
160 : 132 : free (dwarf->fake_addr_cu);
161 : : }
162 : :
163 : : /* Did we find and allocate the alt Dwarf ourselves? */
164 [ + + ]: 12078 : if (dwarf->alt_fd != -1)
165 : : {
166 : 4 : INTUSE(dwarf_end) (dwarf->alt_dwarf);
167 : 4 : close (dwarf->alt_fd);
168 : : }
169 : :
170 [ + + ]: 12078 : if (dwarf->dwp_fd != -1)
171 : : {
172 : 22 : INTUSE(dwarf_end) (dwarf->dwp_dwarf);
173 : 22 : close (dwarf->dwp_fd);
174 : : }
175 : :
176 : : /* The cached path and dir we found the Dwarf ELF file in. */
177 : 12078 : free (dwarf->elfpath);
178 : 12078 : free (dwarf->debugdir);
179 : :
180 : : /* Free the context descriptor. */
181 : 12078 : free (dwarf);
182 : : }
183 : :
184 : 12098 : return 0;
185 : : }
186 : : INTDEF(dwarf_end)
|