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