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 : 982016 : dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files, size_t *nfiles) 40 : : { 41 [ + - ]: 982016 : if (cudie == NULL) 42 : : return -1; 43 [ - + ]: 982016 : if (! is_cudie (cudie)) 44 : : { 45 : 0 : __libdw_seterrno (DWARF_E_NOT_CUDIE); 46 : 0 : return -1; 47 : : } 48 : : 49 : 982016 : int res = -1; 50 : : 51 : : /* Get the information if it is not already known. */ 52 : 982016 : struct Dwarf_CU *const cu = cudie->cu; 53 [ + + ]: 982016 : 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 : 47738 : if (cu->unit_type == DW_UT_split_compile 58 [ + + ]: 47738 : || cu->unit_type == DW_UT_split_type) 59 : : { 60 : : /* We tried, assume we fail... */ 61 : 48 : 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 [ + - ]: 48 : if (cu->dbg->sectiondata[IDX_debug_line] != NULL) 66 : : { 67 : 48 : Dwarf_Off dwp_off; 68 [ + - ]: 48 : if (INTUSE(dwarf_cu_dwp_section_info) (cu, DW_SECT_LINE, 69 : : &dwp_off, NULL) == 0) 70 : : { 71 : : /* We are only interested in the files, the lines will 72 : : always come from the skeleton. */ 73 : 48 : res = __libdw_getsrclines (cu->dbg, dwp_off, 74 : : __libdw_getcompdir (cudie), 75 : 48 : cu->address_size, NULL, 76 : : &cu->files); 77 : : } 78 : : } 79 : : else 80 : : { 81 : 0 : Dwarf_CU *skel = __libdw_find_split_unit (cu); 82 [ # # ]: 0 : if (skel != NULL) 83 : : { 84 : 0 : Dwarf_Die skeldie = CUDIE (skel); 85 : 0 : res = INTUSE(dwarf_getsrcfiles) (&skeldie, files, nfiles); 86 : 0 : cu->files = skel->files; 87 : : } 88 : : } 89 : : } 90 : : else 91 : : { 92 : 47690 : Dwarf_Lines *lines; 93 : 47690 : size_t nlines; 94 : : 95 : : /* Let the more generic function do the work. It'll create more 96 : : data but that will be needed in an real program anyway. */ 97 : 47690 : res = INTUSE(dwarf_getsrclines) (cudie, &lines, &nlines); 98 : : } 99 : : } 100 [ - + ]: 934278 : else if (cu->files != (void *) -1l) 101 : : /* We already have the information. */ 102 : 982016 : res = 0; 103 : : 104 [ + - ]: 982016 : if (likely (res == 0)) 105 : : { 106 [ - + ]: 982016 : assert (cu->files != NULL && cu->files != (void *) -1l); 107 : 982016 : *files = cu->files; 108 [ + + ]: 982016 : if (nfiles != NULL) 109 : 981736 : *nfiles = cu->files->nfiles; 110 : : } 111 : : 112 : : // XXX Eventually: unlocking here. 113 : : 114 : : return res; 115 : : } 116 : : INTDEF (dwarf_getsrcfiles)