Line data Source code
1 : /* Return source file information of CU.
2 : Copyright (C) 2004, 2005, 2013, 2015 Red Hat, Inc.
3 : This file is part of elfutils.
4 : Written by Ulrich Drepper <drepper@redhat.com>, 2004.
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 <assert.h>
35 : #include <dwarf.h>
36 : #include "libdwP.h"
37 :
38 :
39 : int
40 3252 : dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files, size_t *nfiles)
41 : {
42 3252 : if (cudie == NULL)
43 : return -1;
44 6504 : if (! is_cudie (cudie))
45 : {
46 0 : __libdw_seterrno (DWARF_E_NOT_CUDIE);
47 0 : return -1;
48 : }
49 :
50 3252 : int res = -1;
51 :
52 : /* Get the information if it is not already known. */
53 3252 : struct Dwarf_CU *const cu = cudie->cu;
54 3252 : if (cu->lines == NULL)
55 : {
56 : Dwarf_Lines *lines;
57 : size_t nlines;
58 :
59 : /* Let the more generic function do the work. It'll create more
60 : data but that will be needed in an real program anyway. */
61 3151 : res = INTUSE(dwarf_getsrclines) (cudie, &lines, &nlines);
62 : }
63 101 : else if (cu->files != (void *) -1l)
64 : /* We already have the information. */
65 101 : res = 0;
66 :
67 3252 : if (likely (res == 0))
68 : {
69 3252 : assert (cu->files != NULL && cu->files != (void *) -1l);
70 3252 : *files = cu->files;
71 3252 : if (nfiles != NULL)
72 3147 : *nfiles = cu->files->nfiles;
73 : }
74 :
75 : // XXX Eventually: unlocking here.
76 :
77 : return res;
78 : }
79 : INTDEF (dwarf_getsrcfiles)
|