0ce854f6a911123263459491ac5b5c55ffda6d03
[platform/upstream/elfutils.git] / src / addr2line.c
1 /* Locate source files and line information for given addresses
2    Copyright (C) 2005-2010, 2012, 2013, 2015 Red Hat, Inc.
3    This file is part of elfutils.
4    Written by Ulrich Drepper <drepper@redhat.com>, 2005.
5
6    This file is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10
11    elfutils is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
18
19 #ifdef HAVE_CONFIG_H
20 # include <config.h>
21 #endif
22
23 #include <argp.h>
24 #include <assert.h>
25 #include <errno.h>
26 #include <error.h>
27 #include <fcntl.h>
28 #include <inttypes.h>
29 #include <libdwfl.h>
30 #include <dwarf.h>
31 #include <libintl.h>
32 #include <locale.h>
33 #include <stdbool.h>
34 #include <stdio.h>
35 #include <stdio_ext.h>
36 #include <stdlib.h>
37 #include <string.h>
38 #include <unistd.h>
39
40 #include <system.h>
41
42
43 /* Name and version of program.  */
44 static void print_version (FILE *stream, struct argp_state *state);
45 ARGP_PROGRAM_VERSION_HOOK_DEF = print_version;
46
47 /* Bug report address.  */
48 ARGP_PROGRAM_BUG_ADDRESS_DEF = PACKAGE_BUGREPORT;
49
50
51 /* Values for the parameters which have no short form.  */
52 #define OPT_DEMANGLER 0x100
53 #define OPT_PRETTY 0x101  /* 'p' is already used to select the process.  */
54
55 /* Definitions of arguments for argp functions.  */
56 static const struct argp_option options[] =
57 {
58   { NULL, 0, NULL, 0, N_("Input format options:"), 2 },
59   { "section", 'j', "NAME", 0,
60     N_("Treat addresses as offsets relative to NAME section."), 0 },
61
62   { NULL, 0, NULL, 0, N_("Output format options:"), 3 },
63   { "addresses", 'a', NULL, 0, N_("Print address before each entry"), 0 },
64   { "basenames", 's', NULL, 0, N_("Show only base names of source files"), 0 },
65   { "absolute", 'A', NULL, 0,
66     N_("Show absolute file names using compilation directory"), 0 },
67   { "functions", 'f', NULL, 0, N_("Also show function names"), 0 },
68   { "symbols", 'S', NULL, 0, N_("Also show symbol or section names"), 0 },
69   { "symbols-sections", 'x', NULL, 0, N_("Also show symbol and the section names"), 0 },
70   { "flags", 'F', NULL, 0, N_("Also show line table flags"), 0 },
71   { "inlines", 'i', NULL, 0,
72     N_("Show all source locations that caused inline expansion of subroutines at the address."),
73     0 },
74   { "demangle", 'C', "ARG", OPTION_ARG_OPTIONAL,
75     N_("Show demangled symbols (ARG is always ignored)"), 0 },
76   { "pretty-print", OPT_PRETTY, NULL, 0,
77     N_("Print all information on one line, and indent inlines"), 0 },
78
79   { NULL, 0, NULL, 0, N_("Miscellaneous:"), 0 },
80   /* Unsupported options.  */
81   { "target", 'b', "ARG", OPTION_HIDDEN, NULL, 0 },
82   { "demangler", OPT_DEMANGLER, "ARG", OPTION_HIDDEN, NULL, 0 },
83   { NULL, 0, NULL, 0, NULL, 0 }
84 };
85
86 /* Short description of program.  */
87 static const char doc[] = N_("\
88 Locate source files and line information for ADDRs (in a.out by default).");
89
90 /* Strings for arguments in help texts.  */
91 static const char args_doc[] = N_("[ADDR...]");
92
93 /* Prototype for option handler.  */
94 static error_t parse_opt (int key, char *arg, struct argp_state *state);
95
96 static struct argp_child argp_children[2]; /* [0] is set in main.  */
97
98 /* Data structure to communicate with argp functions.  */
99 static const struct argp argp =
100 {
101   options, parse_opt, args_doc, doc, argp_children, NULL, NULL
102 };
103
104
105 /* Handle ADDR.  */
106 static int handle_address (const char *addr, Dwfl *dwfl);
107
108 /* True when we should print the address for each entry.  */
109 static bool print_addresses;
110
111 /* True if only base names of files should be shown.  */
112 static bool only_basenames;
113
114 /* True if absolute file names based on DW_AT_comp_dir should be shown.  */
115 static bool use_comp_dir;
116
117 /* True if line flags should be shown.  */
118 static bool show_flags;
119
120 /* True if function names should be shown.  */
121 static bool show_functions;
122
123 /* True if ELF symbol or section info should be shown.  */
124 static bool show_symbols;
125
126 /* True if section associated with a symbol address should be shown.  */
127 static bool show_symbol_sections;
128
129 /* If non-null, take address parameters as relative to named section.  */
130 static const char *just_section;
131
132 /* True if all inlined subroutines of the current address should be shown.  */
133 static bool show_inlines;
134
135 /* True if all names need to be demangled.  */
136 static bool demangle;
137
138 /* True if all information should be printed on one line.  */
139 static bool pretty;
140
141 #ifdef USE_DEMANGLE
142 static size_t demangle_buffer_len = 0;
143 static char *demangle_buffer = NULL;
144 #endif
145
146 int
147 main (int argc, char *argv[])
148 {
149   int remaining;
150   int result = 0;
151
152   /* We use no threads here which can interfere with handling a stream.  */
153   (void) __fsetlocking (stdout, FSETLOCKING_BYCALLER);
154
155   /* Set locale.  */
156   (void) setlocale (LC_ALL, "");
157
158   /* Make sure the message catalog can be found.  */
159   (void) bindtextdomain (PACKAGE_TARNAME, LOCALEDIR);
160
161   /* Initialize the message catalog.  */
162   (void) textdomain (PACKAGE_TARNAME);
163
164   /* Parse and process arguments.  This includes opening the modules.  */
165   argp_children[0].argp = dwfl_standard_argp ();
166   argp_children[0].group = 1;
167   Dwfl *dwfl = NULL;
168   (void) argp_parse (&argp, argc, argv, 0, &remaining, &dwfl);
169   assert (dwfl != NULL);
170
171   /* Now handle the addresses.  In case none are given on the command
172      line, read from stdin.  */
173   if (remaining == argc)
174     {
175       /* We use no threads here which can interfere with handling a stream.  */
176       (void) __fsetlocking (stdin, FSETLOCKING_BYCALLER);
177
178       char *buf = NULL;
179       size_t len = 0;
180       ssize_t chars;
181       while (!feof_unlocked (stdin))
182         {
183           if ((chars = getline (&buf, &len, stdin)) < 0)
184             break;
185
186           if (buf[chars - 1] == '\n')
187             buf[chars - 1] = '\0';
188
189           result = handle_address (buf, dwfl);
190         }
191
192       free (buf);
193     }
194   else
195     {
196       do
197         result = handle_address (argv[remaining], dwfl);
198       while (++remaining < argc);
199     }
200
201   dwfl_end (dwfl);
202
203 #ifdef USE_DEMANGLE
204   free (demangle_buffer);
205 #endif
206
207   return result;
208 }
209
210
211 /* Print the version information.  */
212 static void
213 print_version (FILE *stream, struct argp_state *state __attribute__ ((unused)))
214 {
215   fprintf (stream, "addr2line (%s) %s\n", PACKAGE_NAME, PACKAGE_VERSION);
216   fprintf (stream, gettext ("\
217 Copyright (C) %s Red Hat, Inc.\n\
218 This is free software; see the source for copying conditions.  There is NO\n\
219 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
220 "), "2012");
221   fprintf (stream, gettext ("Written by %s.\n"), "Ulrich Drepper");
222 }
223
224
225 /* Handle program arguments.  */
226 static error_t
227 parse_opt (int key, char *arg, struct argp_state *state)
228 {
229   switch (key)
230     {
231     case ARGP_KEY_INIT:
232       state->child_inputs[0] = state->input;
233       break;
234
235     case 'a':
236       print_addresses = true;
237       break;
238
239     case 'b':
240     case 'C':
241     case OPT_DEMANGLER:
242       demangle = true;
243       break;
244
245     case 's':
246       only_basenames = true;
247       break;
248
249     case 'A':
250       use_comp_dir = true;
251       break;
252
253     case 'f':
254       show_functions = true;
255       break;
256
257     case 'F':
258       show_flags = true;
259       break;
260
261     case 'S':
262       show_symbols = true;
263       break;
264
265     case 'x':
266       show_symbols = true;
267       show_symbol_sections = true;
268       break;
269
270     case 'j':
271       just_section = arg;
272       break;
273
274     case 'i':
275       show_inlines = true;
276       break;
277
278     case OPT_PRETTY:
279       pretty = true;
280       break;
281
282     default:
283       return ARGP_ERR_UNKNOWN;
284     }
285   return 0;
286 }
287
288 static const char *
289 symname (const char *name)
290 {
291 #ifdef USE_DEMANGLE
292   // Require GNU v3 ABI by the "_Z" prefix.
293   if (demangle && name[0] == '_' && name[1] == 'Z')
294     {
295       int status = -1;
296       char *dsymname = __cxa_demangle (name, demangle_buffer,
297                                        &demangle_buffer_len, &status);
298       if (status == 0)
299         name = demangle_buffer = dsymname;
300     }
301 #endif
302   return name;
303 }
304
305 static const char *
306 get_diename (Dwarf_Die *die)
307 {
308   Dwarf_Attribute attr;
309   const char *name;
310
311   name = dwarf_formstring (dwarf_attr_integrate (die, DW_AT_MIPS_linkage_name,
312                                                  &attr)
313                            ?: dwarf_attr_integrate (die, DW_AT_linkage_name,
314                                                     &attr));
315
316   if (name == NULL)
317     name = dwarf_diename (die) ?: "??";
318
319   return name;
320 }
321
322 static bool
323 print_dwarf_function (Dwfl_Module *mod, Dwarf_Addr addr)
324 {
325   Dwarf_Addr bias = 0;
326   Dwarf_Die *cudie = dwfl_module_addrdie (mod, addr, &bias);
327
328   Dwarf_Die *scopes;
329   int nscopes = dwarf_getscopes (cudie, addr - bias, &scopes);
330   if (nscopes <= 0)
331     return false;
332
333   bool res = false;
334   for (int i = 0; i < nscopes; ++i)
335     switch (dwarf_tag (&scopes[i]))
336       {
337       case DW_TAG_subprogram:
338         {
339           const char *name = get_diename (&scopes[i]);
340           if (name == NULL)
341             goto done;
342           printf ("%s%c", symname (name), pretty ? ' ' : '\n');
343           res = true;
344           goto done;
345         }
346
347       case DW_TAG_inlined_subroutine:
348         {
349           const char *name = get_diename (&scopes[i]);
350           if (name == NULL)
351             goto done;
352
353           /* When using --pretty-print we only show inlines on their
354              own line.  Just print the first subroutine name.  */
355           if (pretty)
356             {
357               printf ("%s ", symname (name));
358               res = true;
359               goto done;
360             }
361           else
362             printf ("%s inlined", symname (name));
363
364           Dwarf_Files *files;
365           if (dwarf_getsrcfiles (cudie, &files, NULL) == 0)
366             {
367               Dwarf_Attribute attr_mem;
368               Dwarf_Word val;
369               if (dwarf_formudata (dwarf_attr (&scopes[i],
370                                                DW_AT_call_file,
371                                                &attr_mem), &val) == 0)
372                 {
373                   const char *file = dwarf_filesrc (files, val, NULL, NULL);
374                   unsigned int lineno = 0;
375                   unsigned int colno = 0;
376                   if (dwarf_formudata (dwarf_attr (&scopes[i],
377                                                    DW_AT_call_line,
378                                                    &attr_mem), &val) == 0)
379                     lineno = val;
380                   if (dwarf_formudata (dwarf_attr (&scopes[i],
381                                                    DW_AT_call_column,
382                                                    &attr_mem), &val) == 0)
383                     colno = val;
384
385                   const char *comp_dir = "";
386                   const char *comp_dir_sep = "";
387
388                   if (file == NULL)
389                     file = "???";
390                   else if (only_basenames)
391                     file = basename (file);
392                   else if (use_comp_dir && file[0] != '/')
393                     {
394                       const char *const *dirs;
395                       size_t ndirs;
396                       if (dwarf_getsrcdirs (files, &dirs, &ndirs) == 0
397                           && dirs[0] != NULL)
398                         {
399                           comp_dir = dirs[0];
400                           comp_dir_sep = "/";
401                         }
402                     }
403
404                   if (lineno == 0)
405                     printf (" from %s%s%s",
406                             comp_dir, comp_dir_sep, file);
407                   else if (colno == 0)
408                     printf (" at %s%s%s:%u",
409                             comp_dir, comp_dir_sep, file, lineno);
410                   else
411                     printf (" at %s%s%s:%u:%u",
412                             comp_dir, comp_dir_sep, file, lineno, colno);
413                 }
414             }
415           printf (" in ");
416           continue;
417         }
418       }
419
420 done:
421   free (scopes);
422   return res;
423 }
424
425 static void
426 print_addrsym (Dwfl_Module *mod, GElf_Addr addr)
427 {
428   GElf_Sym s;
429   GElf_Off off;
430   const char *name = dwfl_module_addrinfo (mod, addr, &off, &s,
431                                            NULL, NULL, NULL);
432   if (name == NULL)
433     {
434       /* No symbol name.  Get a section name instead.  */
435       int i = dwfl_module_relocate_address (mod, &addr);
436       if (i >= 0)
437         name = dwfl_module_relocation_info (mod, i, NULL);
438       if (name == NULL)
439         printf ("??%c", pretty ? ' ': '\n');
440       else
441         printf ("(%s)+%#" PRIx64 "%c", name, addr, pretty ? ' ' : '\n');
442     }
443   else
444     {
445       name = symname (name);
446       if (off == 0)
447         printf ("%s", name);
448       else
449         printf ("%s+%#" PRIx64 "", name, off);
450
451       // Also show section name for address.
452       if (show_symbol_sections)
453         {
454           Dwarf_Addr ebias;
455           Elf_Scn *scn = dwfl_module_address_section (mod, &addr, &ebias);
456           if (scn != NULL)
457             {
458               GElf_Shdr shdr_mem;
459               GElf_Shdr *shdr = gelf_getshdr (scn, &shdr_mem);
460               if (shdr != NULL)
461                 {
462                   Elf *elf = dwfl_module_getelf (mod, &ebias);
463                   GElf_Ehdr ehdr;
464                   if (gelf_getehdr (elf, &ehdr) != NULL)
465                     printf (" (%s)", elf_strptr (elf, ehdr.e_shstrndx,
466                                                  shdr->sh_name));
467                 }
468             }
469         }
470       printf ("%c", pretty ? ' ' : '\n');
471     }
472 }
473
474 static int
475 see_one_module (Dwfl_Module *mod,
476                 void **userdata __attribute__ ((unused)),
477                 const char *name __attribute__ ((unused)),
478                 Dwarf_Addr start __attribute__ ((unused)),
479                 void *arg)
480 {
481   Dwfl_Module **result = arg;
482   if (*result != NULL)
483     return DWARF_CB_ABORT;
484   *result = mod;
485   return DWARF_CB_OK;
486 }
487
488 static int
489 find_symbol (Dwfl_Module *mod,
490              void **userdata __attribute__ ((unused)),
491              const char *name __attribute__ ((unused)),
492              Dwarf_Addr start __attribute__ ((unused)),
493              void *arg)
494 {
495   const char *looking_for = ((void **) arg)[0];
496   GElf_Sym *symbol = ((void **) arg)[1];
497   GElf_Addr *value = ((void **) arg)[2];
498
499   int n = dwfl_module_getsymtab (mod);
500   for (int i = 1; i < n; ++i)
501     {
502       const char *symbol_name = dwfl_module_getsym_info (mod, i, symbol,
503                                                          value, NULL, NULL,
504                                                          NULL);
505       if (symbol_name == NULL || symbol_name[0] == '\0')
506         continue;
507       switch (GELF_ST_TYPE (symbol->st_info))
508         {
509         case STT_SECTION:
510         case STT_FILE:
511         case STT_TLS:
512           break;
513         default:
514           if (!strcmp (symbol_name, looking_for))
515             {
516               ((void **) arg)[0] = NULL;
517               return DWARF_CB_ABORT;
518             }
519         }
520     }
521
522   return DWARF_CB_OK;
523 }
524
525 static bool
526 adjust_to_section (const char *name, uintmax_t *addr, Dwfl *dwfl)
527 {
528   /* It was (section)+offset.  This makes sense if there is
529      only one module to look in for a section.  */
530   Dwfl_Module *mod = NULL;
531   if (dwfl_getmodules (dwfl, &see_one_module, &mod, 0) != 0
532       || mod == NULL)
533     error (EXIT_FAILURE, 0, gettext ("Section syntax requires"
534                                      " exactly one module"));
535
536   int nscn = dwfl_module_relocations (mod);
537   for (int i = 0; i < nscn; ++i)
538     {
539       GElf_Word shndx;
540       const char *scn = dwfl_module_relocation_info (mod, i, &shndx);
541       if (unlikely (scn == NULL))
542         break;
543       if (!strcmp (scn, name))
544         {
545           /* Found the section.  */
546           GElf_Shdr shdr_mem;
547           GElf_Addr shdr_bias;
548           GElf_Shdr *shdr = gelf_getshdr
549             (elf_getscn (dwfl_module_getelf (mod, &shdr_bias), shndx),
550              &shdr_mem);
551           if (unlikely (shdr == NULL))
552             break;
553
554           if (*addr >= shdr->sh_size)
555             error (0, 0,
556                    gettext ("offset %#" PRIxMAX " lies outside"
557                             " section '%s'"),
558                    *addr, scn);
559
560           *addr += shdr->sh_addr + shdr_bias;
561           return true;
562         }
563     }
564
565   return false;
566 }
567
568 static void
569 print_src (const char *src, int lineno, int linecol, Dwarf_Die *cu)
570 {
571   const char *comp_dir = "";
572   const char *comp_dir_sep = "";
573
574   if (only_basenames)
575     src = basename (src);
576   else if (use_comp_dir && src[0] != '/')
577     {
578       Dwarf_Attribute attr;
579       comp_dir = dwarf_formstring (dwarf_attr (cu, DW_AT_comp_dir, &attr));
580       if (comp_dir != NULL)
581         comp_dir_sep = "/";
582     }
583
584   if (linecol != 0)
585     printf ("%s%s%s:%d:%d",
586             comp_dir, comp_dir_sep, src, lineno, linecol);
587   else
588     printf ("%s%s%s:%d",
589             comp_dir, comp_dir_sep, src, lineno);
590 }
591
592 static int
593 get_addr_width (Dwfl_Module *mod)
594 {
595   // Try to find the address width if possible.
596   static int width = 0;
597   if (width == 0 && mod != NULL)
598     {
599       Dwarf_Addr bias;
600       Elf *elf = dwfl_module_getelf (mod, &bias);
601       if (elf != NULL)
602         {
603           GElf_Ehdr ehdr_mem;
604           GElf_Ehdr *ehdr = gelf_getehdr (elf, &ehdr_mem);
605           if (ehdr != NULL)
606             width = ehdr->e_ident[EI_CLASS] == ELFCLASS32 ? 8 : 16;
607         }
608     }
609   if (width == 0)
610     width = 16;
611
612   return width;
613 }
614
615 static int
616 handle_address (const char *string, Dwfl *dwfl)
617 {
618   char *endp;
619   uintmax_t addr = strtoumax (string, &endp, 16);
620   if (endp == string || *endp != '\0')
621     {
622       bool parsed = false;
623       int i, j;
624       char *name = NULL;
625       if (sscanf (string, "(%m[^)])%" PRIiMAX "%n", &name, &addr, &i) == 2
626           && string[i] == '\0')
627         parsed = adjust_to_section (name, &addr, dwfl);
628       switch (sscanf (string, "%m[^-+]%n%" PRIiMAX "%n", &name, &i, &addr, &j))
629         {
630         default:
631           break;
632         case 1:
633           addr = 0;
634           j = i;
635         case 2:
636           if (string[j] != '\0')
637             break;
638
639           /* It was symbol[+offset].  */
640           GElf_Sym sym;
641           GElf_Addr value = 0;
642           void *arg[3] = { name, &sym, &value };
643           (void) dwfl_getmodules (dwfl, &find_symbol, arg, 0);
644           if (arg[0] != NULL)
645             error (0, 0, gettext ("cannot find symbol '%s'"), name);
646           else
647             {
648               if (sym.st_size != 0 && addr >= sym.st_size)
649                 error (0, 0,
650                        gettext ("offset %#" PRIxMAX " lies outside"
651                                 " contents of '%s'"),
652                        addr, name);
653               addr += value;
654               parsed = true;
655             }
656           break;
657         }
658
659       free (name);
660       if (!parsed)
661         return 1;
662     }
663   else if (just_section != NULL
664            && !adjust_to_section (just_section, &addr, dwfl))
665     return 1;
666
667   Dwfl_Module *mod = dwfl_addrmodule (dwfl, addr);
668
669   if (print_addresses)
670     {
671       int width = get_addr_width (mod);
672       printf ("0x%.*" PRIx64 "%s", width, addr, pretty ? ": " : "\n");
673     }
674
675   if (show_functions)
676     {
677       /* First determine the function name.  Use the DWARF information if
678          possible.  */
679       if (! print_dwarf_function (mod, addr) && !show_symbols)
680         {
681           const char *name = dwfl_module_addrname (mod, addr);
682           name = name != NULL ? symname (name) : "??";
683           printf ("%s%c", name, pretty ? ' ' : '\n');
684         }
685     }
686
687   if (show_symbols)
688     print_addrsym (mod, addr);
689
690   if ((show_functions || show_symbols) && pretty)
691     printf ("at ");
692
693   Dwfl_Line *line = dwfl_module_getsrc (mod, addr);
694
695   const char *src;
696   int lineno, linecol;
697
698   if (line != NULL && (src = dwfl_lineinfo (line, &addr, &lineno, &linecol,
699                                             NULL, NULL)) != NULL)
700     {
701       print_src (src, lineno, linecol, dwfl_linecu (line));
702       if (show_flags)
703         {
704           Dwarf_Addr bias;
705           Dwarf_Line *info = dwfl_dwarf_line (line, &bias);
706           assert (info != NULL);
707
708           inline void show (int (*get) (Dwarf_Line *, bool *),
709                             const char *note)
710           {
711             bool flag;
712             if ((*get) (info, &flag) == 0 && flag)
713               fputs (note, stdout);
714           }
715           inline void show_int (int (*get) (Dwarf_Line *, unsigned int *),
716                                 const char *name)
717           {
718             unsigned int val;
719             if ((*get) (info, &val) == 0 && val != 0)
720               printf (" (%s %u)", name, val);
721           }
722
723           show (&dwarf_linebeginstatement, " (is_stmt)");
724           show (&dwarf_lineblock, " (basic_block)");
725           show (&dwarf_lineprologueend, " (prologue_end)");
726           show (&dwarf_lineepiloguebegin, " (epilogue_begin)");
727           show_int (&dwarf_lineisa, "isa");
728           show_int (&dwarf_linediscriminator, "discriminator");
729         }
730       putchar ('\n');
731     }
732   else
733     puts ("??:0");
734
735   if (show_inlines)
736     {
737       Dwarf_Addr bias = 0;
738       Dwarf_Die *cudie = dwfl_module_addrdie (mod, addr, &bias);
739
740       Dwarf_Die *scopes = NULL;
741       int nscopes = dwarf_getscopes (cudie, addr - bias, &scopes);
742       if (nscopes < 0)
743         return 1;
744
745       if (nscopes > 0)
746         {
747           Dwarf_Die subroutine;
748           Dwarf_Off dieoff = dwarf_dieoffset (&scopes[0]);
749           dwarf_offdie (dwfl_module_getdwarf (mod, &bias),
750                         dieoff, &subroutine);
751           free (scopes);
752           scopes = NULL;
753
754           nscopes = dwarf_getscopes_die (&subroutine, &scopes);
755           if (nscopes > 1)
756             {
757               Dwarf_Die cu;
758               Dwarf_Files *files;
759               if (dwarf_diecu (&scopes[0], &cu, NULL, NULL) != NULL
760                   && dwarf_getsrcfiles (cudie, &files, NULL) == 0)
761                 {
762                   for (int i = 0; i < nscopes - 1; i++)
763                     {
764                       Dwarf_Word val;
765                       Dwarf_Attribute attr;
766                       Dwarf_Die *die = &scopes[i];
767                       if (dwarf_tag (die) != DW_TAG_inlined_subroutine)
768                         continue;
769
770                       if (pretty)
771                         printf (" (inlined by) ");
772
773                       if (show_functions)
774                         {
775                           /* Search for the parent inline or function.  It
776                              might not be directly above this inline -- e.g.
777                              there could be a lexical_block in between.  */
778                           for (int j = i + 1; j < nscopes; j++)
779                             {
780                               Dwarf_Die *parent = &scopes[j];
781                               int tag = dwarf_tag (parent);
782                               if (tag == DW_TAG_inlined_subroutine
783                                   || tag == DW_TAG_entry_point
784                                   || tag == DW_TAG_subprogram)
785                                 {
786                                   printf ("%s%s",
787                                           symname (get_diename (parent)),
788                                           pretty ? " at " : "\n");
789                                   break;
790                                 }
791                             }
792                         }
793
794                       src = NULL;
795                       lineno = 0;
796                       linecol = 0;
797                       if (dwarf_formudata (dwarf_attr (die, DW_AT_call_file,
798                                                        &attr), &val) == 0)
799                         src = dwarf_filesrc (files, val, NULL, NULL);
800
801                       if (dwarf_formudata (dwarf_attr (die, DW_AT_call_line,
802                                                        &attr), &val) == 0)
803                         lineno = val;
804
805                       if (dwarf_formudata (dwarf_attr (die, DW_AT_call_column,
806                                                        &attr), &val) == 0)
807                         linecol = val;
808
809                       if (src != NULL)
810                         {
811                           print_src (src, lineno, linecol, &cu);
812                           putchar ('\n');
813                         }
814                       else
815                         puts ("??:0");
816                     }
817                 }
818             }
819         }
820       free (scopes);
821     }
822
823   return 0;
824 }
825
826
827 #include "debugpred.h"