Imported Upstream version 0.155
[platform/upstream/elfutils.git] / libdw / dwarf_end.c
1 /* Release debugging handling context.
2    Copyright (C) 2002-2011 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 noop_free (void *arg __attribute__ ((unused)))
45 {
46 }
47
48
49 static void
50 cu_free (void *arg)
51 {
52   struct Dwarf_CU *p = (struct Dwarf_CU *) arg;
53
54   Dwarf_Abbrev_Hash_free (&p->abbrev_hash);
55
56   tdestroy (p->locs, noop_free);
57 }
58
59
60 #if USE_ZLIB
61 void
62 internal_function
63 __libdw_free_zdata (Dwarf *dwarf)
64 {
65   unsigned int gzip_mask = dwarf->sectiondata_gzip_mask;
66   while (gzip_mask != 0)
67     {
68       int i = ffs (gzip_mask);
69       assert (i > 0);
70       --i;
71       assert (i < IDX_last);
72       free (dwarf->sectiondata[i]);
73       gzip_mask &= ~(1U << i);
74     }
75 }
76 #endif
77
78 int
79 dwarf_end (dwarf)
80      Dwarf *dwarf;
81 {
82   if (dwarf != NULL)
83     {
84       if (dwarf->cfi != NULL)
85         /* Clean up the CFI cache.  */
86         __libdw_destroy_frame_cache (dwarf->cfi);
87
88       Dwarf_Sig8_Hash_free (&dwarf->sig8_hash);
89
90       /* The search tree for the CUs.  NB: the CU data itself is
91          allocated separately, but the abbreviation hash tables need
92          to be handled.  */
93       tdestroy (dwarf->cu_tree, cu_free);
94       tdestroy (dwarf->tu_tree, cu_free);
95
96       struct libdw_memblock *memp = dwarf->mem_tail;
97       /* The first block is allocated together with the Dwarf object.  */
98       while (memp->prev != NULL)
99         {
100           struct libdw_memblock *prevp = memp->prev;
101           free (memp);
102           memp = prevp;
103         }
104
105       /* Free the pubnames helper structure.  */
106       free (dwarf->pubnames_sets);
107
108       __libdw_free_zdata (dwarf);
109
110       /* Free the ELF descriptor if necessary.  */
111       if (dwarf->free_elf)
112         elf_end (dwarf->elf);
113
114       /* Free the alternative Dwarf descriptor if necessary.  */
115       if (dwarf->free_alt)
116         INTUSE (dwarf_end) (dwarf->alt_dwarf);
117
118       /* Free the context descriptor.  */
119       free (dwarf);
120     }
121
122   return 0;
123 }
124 INTDEF(dwarf_end)