* dwarf2read.c (try_open_dwo_file): Use gdb_bfd_ref and
[deliverable/binutils-gdb.git] / gdb / gdb_bfd.c
1 /* Definitions for BFD wrappers used by GDB.
2
3 Copyright (C) 2011
4 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21 #include "defs.h"
22 #include "gdb_bfd.h"
23 #include "gdb_assert.h"
24
25 /* Close ABFD, and warn if that fails. */
26
27 static int
28 gdb_bfd_close_or_warn (struct bfd *abfd)
29 {
30 int ret;
31 char *name = bfd_get_filename (abfd);
32
33 ret = bfd_close (abfd);
34
35 if (!ret)
36 warning (_("cannot close \"%s\": %s"),
37 name, bfd_errmsg (bfd_get_error ()));
38
39 return ret;
40 }
41
42 /* Add reference to ABFD. Returns ABFD. */
43
44 struct bfd *
45 gdb_bfd_ref (struct bfd *abfd)
46 {
47 int *p_refcount;
48
49 if (abfd == NULL)
50 return NULL;
51
52 p_refcount = bfd_usrdata (abfd);
53
54 if (p_refcount != NULL)
55 {
56 *p_refcount += 1;
57 return abfd;
58 }
59
60 p_refcount = xmalloc (sizeof (*p_refcount));
61 *p_refcount = 1;
62 bfd_usrdata (abfd) = p_refcount;
63
64 return abfd;
65 }
66
67 /* Unreference and possibly close ABFD. */
68
69 void
70 gdb_bfd_unref (struct bfd *abfd)
71 {
72 int *p_refcount;
73 char *name;
74
75 if (abfd == NULL)
76 return;
77
78 p_refcount = bfd_usrdata (abfd);
79 gdb_assert (*p_refcount >= 1);
80
81 *p_refcount -= 1;
82 if (*p_refcount > 0)
83 return;
84
85 xfree (p_refcount);
86 bfd_usrdata (abfd) = NULL; /* Paranoia. */
87
88 name = bfd_get_filename (abfd);
89 gdb_bfd_close_or_warn (abfd);
90 }
This page took 0.03213 seconds and 5 git commands to generate.