1fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata/* Find line information for a given macro. 2fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata Copyright (C) 2014 Red Hat, Inc. 3fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata This file is part of elfutils. 4fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 5fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata This file is free software; you can redistribute it and/or modify 6fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata it under the terms of either 7fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 8fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata * the GNU Lesser General Public License as published by the Free 9fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata Software Foundation; either version 3 of the License, or (at 10fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata your option) any later version 11fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 12fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata or 13fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 14fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata * the GNU General Public License as published by the Free 15fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata Software Foundation; either version 2 of the License, or (at 16fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata your option) any later version 17fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 18fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata or both in parallel, as here. 19fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 20fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata elfutils is distributed in the hope that it will be useful, but 21fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata WITHOUT ANY WARRANTY; without even the implied warranty of 22fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 23fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata General Public License for more details. 24fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 25fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata You should have received copies of the GNU General Public License and 26fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata the GNU Lesser General Public License along with this program. If 27fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata not, see <http://www.gnu.org/licenses/>. */ 28fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 29fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata#ifdef HAVE_CONFIG_H 30fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata# include <config.h> 31fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata#endif 32fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 33fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata#include "libdwP.h" 34fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 35fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machataint 36fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machatadwarf_macro_getsrcfiles (Dwarf *dbg, Dwarf_Macro *macro, 37fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata Dwarf_Files **files, size_t *nfiles) 38fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata{ 392d982861e5e23d38653df7d8dce1d2282cda8ce1Chih-Hung Hsieh /* macro is declared NN */ 40fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata Dwarf_Macro_Op_Table *const table = macro->table; 41fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata if (table->files == NULL) 42fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata { 43fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata Dwarf_Off line_offset = table->line_offset; 44fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata if (line_offset == (Dwarf_Off) -1) 45fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata { 46fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata *files = NULL; 47fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata *nfiles = 0; 48fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata return 0; 49fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata } 50fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 51fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata /* If TABLE->comp_dir is NULL that could mean any of the 52fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata following: 53fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 54fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata - The macro unit is not bound to a CU. It's an auxiliary 55fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata unit used purely for import from other units. In that case 56fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata there's actually no COMP_DIR value that we could use. 57fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 58fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata - The macro unit is bound to a CU, but there's no 59fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata DW_AT_comp_dir attribute at the CU DIE. 60fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 61fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata - The macro unit is bound to a CU, but we don't know that, 62fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata likely because its iteration was requested through 63fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata dwarf_getmacros_off interface. This might be legitimate if 64fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata one macro unit imports another CU's macro unit, but that is 65fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata unlikely to happen in practice. Most probably this is not 66fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata legitimate use of the interfaces. 67fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 68fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata So when the interfaces are used correctly, COMP_DIR value is 69fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata always right. That means that we can cache the parsed 70fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata .debug_line unit without fear that later on someone requests 71fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata the same unit through dwarf_getsrcfiles, and the file names 72fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata will be broken. */ 73fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 74fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata if (__libdw_getsrclines (dbg, line_offset, table->comp_dir, 75fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata table->is_64bit ? 8 : 4, 76fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata NULL, &table->files) < 0) 77fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata table->files = (void *) -1; 78fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata } 79fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 80fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata if (table->files == (void *) -1) 81fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata return -1; 82fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata 83fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata *files = table->files; 84fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata *nfiles = table->files->nfiles; 85fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata return 0; 86fb90bf3f84b5683bbc1f234ee05008ff26250e5cPetr Machata} 87