Branch data Line data Source code
1 : : /* Return source file information of CU. 2 : : Copyright (C) 2004, 2005, 2013, 2015, 2018 Red Hat, Inc. 3 : : This file is part of elfutils. 4 : : 5 : : This file is free software; you can redistribute it and/or modify 6 : : it under the terms of either 7 : : 8 : : * the GNU Lesser General Public License as published by the Free 9 : : Software Foundation; either version 3 of the License, or (at 10 : : your option) any later version 11 : : 12 : : or 13 : : 14 : : * the GNU General Public License as published by the Free 15 : : Software Foundation; either version 2 of the License, or (at 16 : : your option) any later version 17 : : 18 : : or both in parallel, as here. 19 : : 20 : : elfutils is distributed in the hope that it will be useful, but 21 : : WITHOUT ANY WARRANTY; without even the implied warranty of 22 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23 : : General Public License for more details. 24 : : 25 : : You should have received copies of the GNU General Public License and 26 : : the GNU Lesser General Public License along with this program. If 27 : : not, see <http://www.gnu.org/licenses/>. */ 28 : : 29 : : #ifdef HAVE_CONFIG_H 30 : : # include <config.h> 31 : : #endif 32 : : 33 : : #include <assert.h> 34 : : #include <dwarf.h> 35 : : #include "libdwP.h" 36 : : 37 : : 38 : : int 39 : 944582 : dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files, size_t *nfiles) 40 : : { 41 [ - + ]: 944582 : if (cudie == NULL) 42 : : return -1; 43 [ - + ]: 944582 : if (! is_cudie (cudie)) 44 : : { 45 : 0 : __libdw_seterrno (DWARF_E_NOT_CUDIE); 46 : 0 : return -1; 47 : : } 48 : : 49 : 944582 : int res = -1; 50 : : 51 : : /* Get the information if it is not already known. */ 52 : 944582 : struct Dwarf_CU *const cu = cudie->cu; 53 [ + + ]: 944582 : if (cu->files == NULL) 54 : : { 55 : : /* For split units there might be a simple file table (without lines). 56 : : If not, use the one from the skeleton. */ 57 : 38136 : if (cu->unit_type == DW_UT_split_compile 58 [ + + ]: 38136 : || cu->unit_type == DW_UT_split_type) 59 : : { 60 : : /* We tried, assume we fail... */ 61 : 12 : cu->files = (void *) -1; 62 : : 63 : : /* See if there is a .debug_line section, for split CUs 64 : : the table is at offset zero. */ 65 [ + - ]: 12 : if (cu->dbg->sectiondata[IDX_debug_line] != NULL) 66 : : { 67 : : /* We are only interested in the files, the lines will 68 : : always come from the skeleton. */ 69 : 12 : res = __libdw_getsrclines (cu->dbg, 0, 70 : : __libdw_getcompdir (cudie), 71 : 12 : cu->address_size, NULL, 72 : : &cu->files); 73 : : } 74 : : else 75 : : { 76 : 0 : Dwarf_CU *skel = __libdw_find_split_unit (cu); 77 [ # # ]: 0 : if (skel != NULL) 78 : : { 79 : 0 : Dwarf_Die skeldie = CUDIE (skel); 80 : 0 : res = INTUSE(dwarf_getsrcfiles) (&skeldie, files, nfiles); 81 : 0 : cu->files = skel->files; 82 : : } 83 : : } 84 : : } 85 : : else 86 : : { 87 : 38124 : Dwarf_Lines *lines; 88 : 38124 : size_t nlines; 89 : : 90 : : /* Let the more generic function do the work. It'll create more 91 : : data but that will be needed in an real program anyway. */ 92 : 38124 : res = INTUSE(dwarf_getsrclines) (cudie, &lines, &nlines); 93 : : } 94 : : } 95 [ - + ]: 906446 : else if (cu->files != (void *) -1l) 96 : : /* We already have the information. */ 97 : 944582 : res = 0; 98 : : 99 [ + - ]: 944582 : if (likely (res == 0)) 100 : : { 101 [ - + ]: 944582 : assert (cu->files != NULL && cu->files != (void *) -1l); 102 : 944582 : *files = cu->files; 103 [ + + ]: 944582 : if (nfiles != NULL) 104 : 944302 : *nfiles = cu->files->nfiles; 105 : : } 106 : : 107 : : // XXX Eventually: unlocking here. 108 : : 109 : : return res; 110 : : } 111 : : INTDEF (dwarf_getsrcfiles)