aarch64: rcpc3: Add +rcpc3 architectural feature support flag
[platform/upstream/binutils.git] / libbacktrace / dwarf.c
1 /* dwarf.c -- Get file/line information from DWARF for backtraces.
2    Copyright (C) 2012-2021 Free Software Foundation, Inc.
3    Written by Ian Lance Taylor, Google.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are
7 met:
8
9     (1) Redistributions of source code must retain the above copyright
10     notice, this list of conditions and the following disclaimer.
11
12     (2) Redistributions in binary form must reproduce the above copyright
13     notice, this list of conditions and the following disclaimer in
14     the documentation and/or other materials provided with the
15     distribution.
16
17     (3) The name of the author may not be used to
18     endorse or promote products derived from this software without
19     specific prior written permission.
20
21 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
25 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30 IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 POSSIBILITY OF SUCH DAMAGE.  */
32
33 #include "config.h"
34
35 #include <errno.h>
36 #include <stdlib.h>
37 #include <string.h>
38 #include <sys/types.h>
39
40 #include "dwarf2.h"
41 #include "filenames.h"
42
43 #include "backtrace.h"
44 #include "internal.h"
45
46 #if !defined(HAVE_DECL_STRNLEN) || !HAVE_DECL_STRNLEN
47
48 /* If strnlen is not declared, provide our own version.  */
49
50 static size_t
51 xstrnlen (const char *s, size_t maxlen)
52 {
53   size_t i;
54
55   for (i = 0; i < maxlen; ++i)
56     if (s[i] == '\0')
57       break;
58   return i;
59 }
60
61 #define strnlen xstrnlen
62
63 #endif
64
65 /* A buffer to read DWARF info.  */
66
67 struct dwarf_buf
68 {
69   /* Buffer name for error messages.  */
70   const char *name;
71   /* Start of the buffer.  */
72   const unsigned char *start;
73   /* Next byte to read.  */
74   const unsigned char *buf;
75   /* The number of bytes remaining.  */
76   size_t left;
77   /* Whether the data is big-endian.  */
78   int is_bigendian;
79   /* Error callback routine.  */
80   backtrace_error_callback error_callback;
81   /* Data for error_callback.  */
82   void *data;
83   /* Non-zero if we've reported an underflow error.  */
84   int reported_underflow;
85 };
86
87 /* A single attribute in a DWARF abbreviation.  */
88
89 struct attr
90 {
91   /* The attribute name.  */
92   enum dwarf_attribute name;
93   /* The attribute form.  */
94   enum dwarf_form form;
95   /* The attribute value, for DW_FORM_implicit_const.  */
96   int64_t val;
97 };
98
99 /* A single DWARF abbreviation.  */
100
101 struct abbrev
102 {
103   /* The abbrev code--the number used to refer to the abbrev.  */
104   uint64_t code;
105   /* The entry tag.  */
106   enum dwarf_tag tag;
107   /* Non-zero if this abbrev has child entries.  */
108   int has_children;
109   /* The number of attributes.  */
110   size_t num_attrs;
111   /* The attributes.  */
112   struct attr *attrs;
113 };
114
115 /* The DWARF abbreviations for a compilation unit.  This structure
116    only exists while reading the compilation unit.  Most DWARF readers
117    seem to a hash table to map abbrev ID's to abbrev entries.
118    However, we primarily care about GCC, and GCC simply issues ID's in
119    numerical order starting at 1.  So we simply keep a sorted vector,
120    and try to just look up the code.  */
121
122 struct abbrevs
123 {
124   /* The number of abbrevs in the vector.  */
125   size_t num_abbrevs;
126   /* The abbrevs, sorted by the code field.  */
127   struct abbrev *abbrevs;
128 };
129
130 /* The different kinds of attribute values.  */
131
132 enum attr_val_encoding
133 {
134   /* No attribute value.  */
135   ATTR_VAL_NONE,
136   /* An address.  */
137   ATTR_VAL_ADDRESS,
138   /* An index into the .debug_addr section, whose value is relative to
139    * the DW_AT_addr_base attribute of the compilation unit.  */
140   ATTR_VAL_ADDRESS_INDEX,
141   /* A unsigned integer.  */
142   ATTR_VAL_UINT,
143   /* A sigd integer.  */
144   ATTR_VAL_SINT,
145   /* A string.  */
146   ATTR_VAL_STRING,
147   /* An index into the .debug_str_offsets section.  */
148   ATTR_VAL_STRING_INDEX,
149   /* An offset to other data in the containing unit.  */
150   ATTR_VAL_REF_UNIT,
151   /* An offset to other data within the .debug_info section.  */
152   ATTR_VAL_REF_INFO,
153   /* An offset to other data within the alt .debug_info section.  */
154   ATTR_VAL_REF_ALT_INFO,
155   /* An offset to data in some other section.  */
156   ATTR_VAL_REF_SECTION,
157   /* A type signature.  */
158   ATTR_VAL_REF_TYPE,
159   /* An index into the .debug_rnglists section.  */
160   ATTR_VAL_RNGLISTS_INDEX,
161   /* A block of data (not represented).  */
162   ATTR_VAL_BLOCK,
163   /* An expression (not represented).  */
164   ATTR_VAL_EXPR,
165 };
166
167 /* An attribute value.  */
168
169 struct attr_val
170 {
171   /* How the value is stored in the field u.  */
172   enum attr_val_encoding encoding;
173   union
174   {
175     /* ATTR_VAL_ADDRESS*, ATTR_VAL_UINT, ATTR_VAL_REF*.  */
176     uint64_t uint;
177     /* ATTR_VAL_SINT.  */
178     int64_t sint;
179     /* ATTR_VAL_STRING.  */
180     const char *string;
181     /* ATTR_VAL_BLOCK not stored.  */
182   } u;
183 };
184
185 /* The line number program header.  */
186
187 struct line_header
188 {
189   /* The version of the line number information.  */
190   int version;
191   /* Address size.  */
192   int addrsize;
193   /* The minimum instruction length.  */
194   unsigned int min_insn_len;
195   /* The maximum number of ops per instruction.  */
196   unsigned int max_ops_per_insn;
197   /* The line base for special opcodes.  */
198   int line_base;
199   /* The line range for special opcodes.  */
200   unsigned int line_range;
201   /* The opcode base--the first special opcode.  */
202   unsigned int opcode_base;
203   /* Opcode lengths, indexed by opcode - 1.  */
204   const unsigned char *opcode_lengths;
205   /* The number of directory entries.  */
206   size_t dirs_count;
207   /* The directory entries.  */
208   const char **dirs;
209   /* The number of filenames.  */
210   size_t filenames_count;
211   /* The filenames.  */
212   const char **filenames;
213 };
214
215 /* A format description from a line header.  */
216
217 struct line_header_format
218 {
219   int lnct;             /* LNCT code.  */
220   enum dwarf_form form; /* Form of entry data.  */
221 };
222
223 /* Map a single PC value to a file/line.  We will keep a vector of
224    these sorted by PC value.  Each file/line will be correct from the
225    PC up to the PC of the next entry if there is one.  We allocate one
226    extra entry at the end so that we can use bsearch.  */
227
228 struct line
229 {
230   /* PC.  */
231   uintptr_t pc;
232   /* File name.  Many entries in the array are expected to point to
233      the same file name.  */
234   const char *filename;
235   /* Line number.  */
236   int lineno;
237   /* Index of the object in the original array read from the DWARF
238      section, before it has been sorted.  The index makes it possible
239      to use Quicksort and maintain stability.  */
240   int idx;
241 };
242
243 /* A growable vector of line number information.  This is used while
244    reading the line numbers.  */
245
246 struct line_vector
247 {
248   /* Memory.  This is an array of struct line.  */
249   struct backtrace_vector vec;
250   /* Number of valid mappings.  */
251   size_t count;
252 };
253
254 /* A function described in the debug info.  */
255
256 struct function
257 {
258   /* The name of the function.  */
259   const char *name;
260   /* If this is an inlined function, the filename of the call
261      site.  */
262   const char *caller_filename;
263   /* If this is an inlined function, the line number of the call
264      site.  */
265   int caller_lineno;
266   /* Map PC ranges to inlined functions.  */
267   struct function_addrs *function_addrs;
268   size_t function_addrs_count;
269 };
270
271 /* An address range for a function.  This maps a PC value to a
272    specific function.  */
273
274 struct function_addrs
275 {
276   /* Range is LOW <= PC < HIGH.  */
277   uint64_t low;
278   uint64_t high;
279   /* Function for this address range.  */
280   struct function *function;
281 };
282
283 /* A growable vector of function address ranges.  */
284
285 struct function_vector
286 {
287   /* Memory.  This is an array of struct function_addrs.  */
288   struct backtrace_vector vec;
289   /* Number of address ranges present.  */
290   size_t count;
291 };
292
293 /* A DWARF compilation unit.  This only holds the information we need
294    to map a PC to a file and line.  */
295
296 struct unit
297 {
298   /* The first entry for this compilation unit.  */
299   const unsigned char *unit_data;
300   /* The length of the data for this compilation unit.  */
301   size_t unit_data_len;
302   /* The offset of UNIT_DATA from the start of the information for
303      this compilation unit.  */
304   size_t unit_data_offset;
305   /* Offset of the start of the compilation unit from the start of the
306      .debug_info section.  */
307   size_t low_offset;
308   /* Offset of the end of the compilation unit from the start of the
309      .debug_info section.  */
310   size_t high_offset;
311   /* DWARF version.  */
312   int version;
313   /* Whether unit is DWARF64.  */
314   int is_dwarf64;
315   /* Address size.  */
316   int addrsize;
317   /* Offset into line number information.  */
318   off_t lineoff;
319   /* Offset of compilation unit in .debug_str_offsets.  */
320   uint64_t str_offsets_base;
321   /* Offset of compilation unit in .debug_addr.  */
322   uint64_t addr_base;
323   /* Offset of compilation unit in .debug_rnglists.  */
324   uint64_t rnglists_base;
325   /* Primary source file.  */
326   const char *filename;
327   /* Compilation command working directory.  */
328   const char *comp_dir;
329   /* Absolute file name, only set if needed.  */
330   const char *abs_filename;
331   /* The abbreviations for this unit.  */
332   struct abbrevs abbrevs;
333
334   /* The fields above this point are read in during initialization and
335      may be accessed freely.  The fields below this point are read in
336      as needed, and therefore require care, as different threads may
337      try to initialize them simultaneously.  */
338
339   /* PC to line number mapping.  This is NULL if the values have not
340      been read.  This is (struct line *) -1 if there was an error
341      reading the values.  */
342   struct line *lines;
343   /* Number of entries in lines.  */
344   size_t lines_count;
345   /* PC ranges to function.  */
346   struct function_addrs *function_addrs;
347   size_t function_addrs_count;
348 };
349
350 /* An address range for a compilation unit.  This maps a PC value to a
351    specific compilation unit.  Note that we invert the representation
352    in DWARF: instead of listing the units and attaching a list of
353    ranges, we list the ranges and have each one point to the unit.
354    This lets us do a binary search to find the unit.  */
355
356 struct unit_addrs
357 {
358   /* Range is LOW <= PC < HIGH.  */
359   uint64_t low;
360   uint64_t high;
361   /* Compilation unit for this address range.  */
362   struct unit *u;
363 };
364
365 /* A growable vector of compilation unit address ranges.  */
366
367 struct unit_addrs_vector
368 {
369   /* Memory.  This is an array of struct unit_addrs.  */
370   struct backtrace_vector vec;
371   /* Number of address ranges present.  */
372   size_t count;
373 };
374
375 /* A growable vector of compilation unit pointer.  */
376
377 struct unit_vector
378 {
379   struct backtrace_vector vec;
380   size_t count;
381 };
382
383 /* The information we need to map a PC to a file and line.  */
384
385 struct dwarf_data
386 {
387   /* The data for the next file we know about.  */
388   struct dwarf_data *next;
389   /* The data for .gnu_debugaltlink.  */
390   struct dwarf_data *altlink;
391   /* The base address for this file.  */
392   uintptr_t base_address;
393   /* A sorted list of address ranges.  */
394   struct unit_addrs *addrs;
395   /* Number of address ranges in list.  */
396   size_t addrs_count;
397   /* A sorted list of units.  */
398   struct unit **units;
399   /* Number of units in the list.  */
400   size_t units_count;
401   /* The unparsed DWARF debug data.  */
402   struct dwarf_sections dwarf_sections;
403   /* Whether the data is big-endian or not.  */
404   int is_bigendian;
405   /* A vector used for function addresses.  We keep this here so that
406      we can grow the vector as we read more functions.  */
407   struct function_vector fvec;
408 };
409
410 /* Report an error for a DWARF buffer.  */
411
412 static void
413 dwarf_buf_error (struct dwarf_buf *buf, const char *msg, int errnum)
414 {
415   char b[200];
416
417   snprintf (b, sizeof b, "%s in %s at %d",
418             msg, buf->name, (int) (buf->buf - buf->start));
419   buf->error_callback (buf->data, b, errnum);
420 }
421
422 /* Require at least COUNT bytes in BUF.  Return 1 if all is well, 0 on
423    error.  */
424
425 static int
426 require (struct dwarf_buf *buf, size_t count)
427 {
428   if (buf->left >= count)
429     return 1;
430
431   if (!buf->reported_underflow)
432     {
433       dwarf_buf_error (buf, "DWARF underflow", 0);
434       buf->reported_underflow = 1;
435     }
436
437   return 0;
438 }
439
440 /* Advance COUNT bytes in BUF.  Return 1 if all is well, 0 on
441    error.  */
442
443 static int
444 advance (struct dwarf_buf *buf, size_t count)
445 {
446   if (!require (buf, count))
447     return 0;
448   buf->buf += count;
449   buf->left -= count;
450   return 1;
451 }
452
453 /* Read one zero-terminated string from BUF and advance past the string.  */
454
455 static const char *
456 read_string (struct dwarf_buf *buf)
457 {
458   const char *p = (const char *)buf->buf;
459   size_t len = strnlen (p, buf->left);
460
461   /* - If len == left, we ran out of buffer before finding the zero terminator.
462        Generate an error by advancing len + 1.
463      - If len < left, advance by len + 1 to skip past the zero terminator.  */
464   size_t count = len + 1;
465
466   if (!advance (buf, count))
467     return NULL;
468
469   return p;
470 }
471
472 /* Read one byte from BUF and advance 1 byte.  */
473
474 static unsigned char
475 read_byte (struct dwarf_buf *buf)
476 {
477   const unsigned char *p = buf->buf;
478
479   if (!advance (buf, 1))
480     return 0;
481   return p[0];
482 }
483
484 /* Read a signed char from BUF and advance 1 byte.  */
485
486 static signed char
487 read_sbyte (struct dwarf_buf *buf)
488 {
489   const unsigned char *p = buf->buf;
490
491   if (!advance (buf, 1))
492     return 0;
493   return (*p ^ 0x80) - 0x80;
494 }
495
496 /* Read a uint16 from BUF and advance 2 bytes.  */
497
498 static uint16_t
499 read_uint16 (struct dwarf_buf *buf)
500 {
501   const unsigned char *p = buf->buf;
502
503   if (!advance (buf, 2))
504     return 0;
505   if (buf->is_bigendian)
506     return ((uint16_t) p[0] << 8) | (uint16_t) p[1];
507   else
508     return ((uint16_t) p[1] << 8) | (uint16_t) p[0];
509 }
510
511 /* Read a 24 bit value from BUF and advance 3 bytes.  */
512
513 static uint32_t
514 read_uint24 (struct dwarf_buf *buf)
515 {
516   const unsigned char *p = buf->buf;
517
518   if (!advance (buf, 3))
519     return 0;
520   if (buf->is_bigendian)
521     return (((uint32_t) p[0] << 16) | ((uint32_t) p[1] << 8)
522             | (uint32_t) p[2]);
523   else
524     return (((uint32_t) p[2] << 16) | ((uint32_t) p[1] << 8)
525             | (uint32_t) p[0]);
526 }
527
528 /* Read a uint32 from BUF and advance 4 bytes.  */
529
530 static uint32_t
531 read_uint32 (struct dwarf_buf *buf)
532 {
533   const unsigned char *p = buf->buf;
534
535   if (!advance (buf, 4))
536     return 0;
537   if (buf->is_bigendian)
538     return (((uint32_t) p[0] << 24) | ((uint32_t) p[1] << 16)
539             | ((uint32_t) p[2] << 8) | (uint32_t) p[3]);
540   else
541     return (((uint32_t) p[3] << 24) | ((uint32_t) p[2] << 16)
542             | ((uint32_t) p[1] << 8) | (uint32_t) p[0]);
543 }
544
545 /* Read a uint64 from BUF and advance 8 bytes.  */
546
547 static uint64_t
548 read_uint64 (struct dwarf_buf *buf)
549 {
550   const unsigned char *p = buf->buf;
551
552   if (!advance (buf, 8))
553     return 0;
554   if (buf->is_bigendian)
555     return (((uint64_t) p[0] << 56) | ((uint64_t) p[1] << 48)
556             | ((uint64_t) p[2] << 40) | ((uint64_t) p[3] << 32)
557             | ((uint64_t) p[4] << 24) | ((uint64_t) p[5] << 16)
558             | ((uint64_t) p[6] << 8) | (uint64_t) p[7]);
559   else
560     return (((uint64_t) p[7] << 56) | ((uint64_t) p[6] << 48)
561             | ((uint64_t) p[5] << 40) | ((uint64_t) p[4] << 32)
562             | ((uint64_t) p[3] << 24) | ((uint64_t) p[2] << 16)
563             | ((uint64_t) p[1] << 8) | (uint64_t) p[0]);
564 }
565
566 /* Read an offset from BUF and advance the appropriate number of
567    bytes.  */
568
569 static uint64_t
570 read_offset (struct dwarf_buf *buf, int is_dwarf64)
571 {
572   if (is_dwarf64)
573     return read_uint64 (buf);
574   else
575     return read_uint32 (buf);
576 }
577
578 /* Read an address from BUF and advance the appropriate number of
579    bytes.  */
580
581 static uint64_t
582 read_address (struct dwarf_buf *buf, int addrsize)
583 {
584   switch (addrsize)
585     {
586     case 1:
587       return read_byte (buf);
588     case 2:
589       return read_uint16 (buf);
590     case 4:
591       return read_uint32 (buf);
592     case 8:
593       return read_uint64 (buf);
594     default:
595       dwarf_buf_error (buf, "unrecognized address size", 0);
596       return 0;
597     }
598 }
599
600 /* Return whether a value is the highest possible address, given the
601    address size.  */
602
603 static int
604 is_highest_address (uint64_t address, int addrsize)
605 {
606   switch (addrsize)
607     {
608     case 1:
609       return address == (unsigned char) -1;
610     case 2:
611       return address == (uint16_t) -1;
612     case 4:
613       return address == (uint32_t) -1;
614     case 8:
615       return address == (uint64_t) -1;
616     default:
617       return 0;
618     }
619 }
620
621 /* Read an unsigned LEB128 number.  */
622
623 static uint64_t
624 read_uleb128 (struct dwarf_buf *buf)
625 {
626   uint64_t ret;
627   unsigned int shift;
628   int overflow;
629   unsigned char b;
630
631   ret = 0;
632   shift = 0;
633   overflow = 0;
634   do
635     {
636       const unsigned char *p;
637
638       p = buf->buf;
639       if (!advance (buf, 1))
640         return 0;
641       b = *p;
642       if (shift < 64)
643         ret |= ((uint64_t) (b & 0x7f)) << shift;
644       else if (!overflow)
645         {
646           dwarf_buf_error (buf, "LEB128 overflows uint64_t", 0);
647           overflow = 1;
648         }
649       shift += 7;
650     }
651   while ((b & 0x80) != 0);
652
653   return ret;
654 }
655
656 /* Read a signed LEB128 number.  */
657
658 static int64_t
659 read_sleb128 (struct dwarf_buf *buf)
660 {
661   uint64_t val;
662   unsigned int shift;
663   int overflow;
664   unsigned char b;
665
666   val = 0;
667   shift = 0;
668   overflow = 0;
669   do
670     {
671       const unsigned char *p;
672
673       p = buf->buf;
674       if (!advance (buf, 1))
675         return 0;
676       b = *p;
677       if (shift < 64)
678         val |= ((uint64_t) (b & 0x7f)) << shift;
679       else if (!overflow)
680         {
681           dwarf_buf_error (buf, "signed LEB128 overflows uint64_t", 0);
682           overflow = 1;
683         }
684       shift += 7;
685     }
686   while ((b & 0x80) != 0);
687
688   if ((b & 0x40) != 0 && shift < 64)
689     val |= ((uint64_t) -1) << shift;
690
691   return (int64_t) val;
692 }
693
694 /* Return the length of an LEB128 number.  */
695
696 static size_t
697 leb128_len (const unsigned char *p)
698 {
699   size_t ret;
700
701   ret = 1;
702   while ((*p & 0x80) != 0)
703     {
704       ++p;
705       ++ret;
706     }
707   return ret;
708 }
709
710 /* Read initial_length from BUF and advance the appropriate number of bytes.  */
711
712 static uint64_t
713 read_initial_length (struct dwarf_buf *buf, int *is_dwarf64)
714 {
715   uint64_t len;
716
717   len = read_uint32 (buf);
718   if (len == 0xffffffff)
719     {
720       len = read_uint64 (buf);
721       *is_dwarf64 = 1;
722     }
723   else
724     *is_dwarf64 = 0;
725
726   return len;
727 }
728
729 /* Free an abbreviations structure.  */
730
731 static void
732 free_abbrevs (struct backtrace_state *state, struct abbrevs *abbrevs,
733               backtrace_error_callback error_callback, void *data)
734 {
735   size_t i;
736
737   for (i = 0; i < abbrevs->num_abbrevs; ++i)
738     backtrace_free (state, abbrevs->abbrevs[i].attrs,
739                     abbrevs->abbrevs[i].num_attrs * sizeof (struct attr),
740                     error_callback, data);
741   backtrace_free (state, abbrevs->abbrevs,
742                   abbrevs->num_abbrevs * sizeof (struct abbrev),
743                   error_callback, data);
744   abbrevs->num_abbrevs = 0;
745   abbrevs->abbrevs = NULL;
746 }
747
748 /* Read an attribute value.  Returns 1 on success, 0 on failure.  If
749    the value can be represented as a uint64_t, sets *VAL and sets
750    *IS_VALID to 1.  We don't try to store the value of other attribute
751    forms, because we don't care about them.  */
752
753 static int
754 read_attribute (enum dwarf_form form, uint64_t implicit_val,
755                 struct dwarf_buf *buf, int is_dwarf64, int version,
756                 int addrsize, const struct dwarf_sections *dwarf_sections,
757                 struct dwarf_data *altlink, struct attr_val *val)
758 {
759   /* Avoid warnings about val.u.FIELD may be used uninitialized if
760      this function is inlined.  The warnings aren't valid but can
761      occur because the different fields are set and used
762      conditionally.  */
763   memset (val, 0, sizeof *val);
764
765   switch (form)
766     {
767     case DW_FORM_addr:
768       val->encoding = ATTR_VAL_ADDRESS;
769       val->u.uint = read_address (buf, addrsize);
770       return 1;
771     case DW_FORM_block2:
772       val->encoding = ATTR_VAL_BLOCK;
773       return advance (buf, read_uint16 (buf));
774     case DW_FORM_block4:
775       val->encoding = ATTR_VAL_BLOCK;
776       return advance (buf, read_uint32 (buf));
777     case DW_FORM_data2:
778       val->encoding = ATTR_VAL_UINT;
779       val->u.uint = read_uint16 (buf);
780       return 1;
781     case DW_FORM_data4:
782       val->encoding = ATTR_VAL_UINT;
783       val->u.uint = read_uint32 (buf);
784       return 1;
785     case DW_FORM_data8:
786       val->encoding = ATTR_VAL_UINT;
787       val->u.uint = read_uint64 (buf);
788       return 1;
789     case DW_FORM_data16:
790       val->encoding = ATTR_VAL_BLOCK;
791       return advance (buf, 16);
792     case DW_FORM_string:
793       val->encoding = ATTR_VAL_STRING;
794       val->u.string = read_string (buf);
795       return val->u.string == NULL ? 0 : 1;
796     case DW_FORM_block:
797       val->encoding = ATTR_VAL_BLOCK;
798       return advance (buf, read_uleb128 (buf));
799     case DW_FORM_block1:
800       val->encoding = ATTR_VAL_BLOCK;
801       return advance (buf, read_byte (buf));
802     case DW_FORM_data1:
803       val->encoding = ATTR_VAL_UINT;
804       val->u.uint = read_byte (buf);
805       return 1;
806     case DW_FORM_flag:
807       val->encoding = ATTR_VAL_UINT;
808       val->u.uint = read_byte (buf);
809       return 1;
810     case DW_FORM_sdata:
811       val->encoding = ATTR_VAL_SINT;
812       val->u.sint = read_sleb128 (buf);
813       return 1;
814     case DW_FORM_strp:
815       {
816         uint64_t offset;
817
818         offset = read_offset (buf, is_dwarf64);
819         if (offset >= dwarf_sections->size[DEBUG_STR])
820           {
821             dwarf_buf_error (buf, "DW_FORM_strp out of range", 0);
822             return 0;
823           }
824         val->encoding = ATTR_VAL_STRING;
825         val->u.string =
826           (const char *) dwarf_sections->data[DEBUG_STR] + offset;
827         return 1;
828       }
829     case DW_FORM_line_strp:
830       {
831         uint64_t offset;
832
833         offset = read_offset (buf, is_dwarf64);
834         if (offset >= dwarf_sections->size[DEBUG_LINE_STR])
835           {
836             dwarf_buf_error (buf, "DW_FORM_line_strp out of range", 0);
837             return 0;
838           }
839         val->encoding = ATTR_VAL_STRING;
840         val->u.string =
841           (const char *) dwarf_sections->data[DEBUG_LINE_STR] + offset;
842         return 1;
843       }
844     case DW_FORM_udata:
845       val->encoding = ATTR_VAL_UINT;
846       val->u.uint = read_uleb128 (buf);
847       return 1;
848     case DW_FORM_ref_addr:
849       val->encoding = ATTR_VAL_REF_INFO;
850       if (version == 2)
851         val->u.uint = read_address (buf, addrsize);
852       else
853         val->u.uint = read_offset (buf, is_dwarf64);
854       return 1;
855     case DW_FORM_ref1:
856       val->encoding = ATTR_VAL_REF_UNIT;
857       val->u.uint = read_byte (buf);
858       return 1;
859     case DW_FORM_ref2:
860       val->encoding = ATTR_VAL_REF_UNIT;
861       val->u.uint = read_uint16 (buf);
862       return 1;
863     case DW_FORM_ref4:
864       val->encoding = ATTR_VAL_REF_UNIT;
865       val->u.uint = read_uint32 (buf);
866       return 1;
867     case DW_FORM_ref8:
868       val->encoding = ATTR_VAL_REF_UNIT;
869       val->u.uint = read_uint64 (buf);
870       return 1;
871     case DW_FORM_ref_udata:
872       val->encoding = ATTR_VAL_REF_UNIT;
873       val->u.uint = read_uleb128 (buf);
874       return 1;
875     case DW_FORM_indirect:
876       {
877         uint64_t form;
878
879         form = read_uleb128 (buf);
880         if (form == DW_FORM_implicit_const)
881           {
882             dwarf_buf_error (buf,
883                              "DW_FORM_indirect to DW_FORM_implicit_const",
884                              0);
885             return 0;
886           }
887         return read_attribute ((enum dwarf_form) form, 0, buf, is_dwarf64,
888                                version, addrsize, dwarf_sections, altlink,
889                                val);
890       }
891     case DW_FORM_sec_offset:
892       val->encoding = ATTR_VAL_REF_SECTION;
893       val->u.uint = read_offset (buf, is_dwarf64);
894       return 1;
895     case DW_FORM_exprloc:
896       val->encoding = ATTR_VAL_EXPR;
897       return advance (buf, read_uleb128 (buf));
898     case DW_FORM_flag_present:
899       val->encoding = ATTR_VAL_UINT;
900       val->u.uint = 1;
901       return 1;
902     case DW_FORM_ref_sig8:
903       val->encoding = ATTR_VAL_REF_TYPE;
904       val->u.uint = read_uint64 (buf);
905       return 1;
906     case DW_FORM_strx: case DW_FORM_strx1: case DW_FORM_strx2:
907     case DW_FORM_strx3: case DW_FORM_strx4:
908       {
909         uint64_t offset;
910
911         switch (form)
912           {
913           case DW_FORM_strx:
914             offset = read_uleb128 (buf);
915             break;
916           case DW_FORM_strx1:
917             offset = read_byte (buf);
918             break;
919           case DW_FORM_strx2:
920             offset = read_uint16 (buf);
921             break;
922           case DW_FORM_strx3:
923             offset = read_uint24 (buf);
924             break;
925           case DW_FORM_strx4:
926             offset = read_uint32 (buf);
927             break;
928           default:
929             /* This case can't happen.  */
930             return 0;
931           }
932         val->encoding = ATTR_VAL_STRING_INDEX;
933         val->u.uint = offset;
934         return 1;
935       }
936     case DW_FORM_addrx: case DW_FORM_addrx1: case DW_FORM_addrx2:
937     case DW_FORM_addrx3: case DW_FORM_addrx4:
938       {
939         uint64_t offset;
940
941         switch (form)
942           {
943           case DW_FORM_addrx:
944             offset = read_uleb128 (buf);
945             break;
946           case DW_FORM_addrx1:
947             offset = read_byte (buf);
948             break;
949           case DW_FORM_addrx2:
950             offset = read_uint16 (buf);
951             break;
952           case DW_FORM_addrx3:
953             offset = read_uint24 (buf);
954             break;
955           case DW_FORM_addrx4:
956             offset = read_uint32 (buf);
957             break;
958           default:
959             /* This case can't happen.  */
960             return 0;
961           }
962         val->encoding = ATTR_VAL_ADDRESS_INDEX;
963         val->u.uint = offset;
964         return 1;
965       }
966     case DW_FORM_ref_sup4:
967       val->encoding = ATTR_VAL_REF_SECTION;
968       val->u.uint = read_uint32 (buf);
969       return 1;
970     case DW_FORM_ref_sup8:
971       val->encoding = ATTR_VAL_REF_SECTION;
972       val->u.uint = read_uint64 (buf);
973       return 1;
974     case DW_FORM_implicit_const:
975       val->encoding = ATTR_VAL_UINT;
976       val->u.uint = implicit_val;
977       return 1;
978     case DW_FORM_loclistx:
979       /* We don't distinguish this from DW_FORM_sec_offset.  It
980        * shouldn't matter since we don't care about loclists.  */
981       val->encoding = ATTR_VAL_REF_SECTION;
982       val->u.uint = read_uleb128 (buf);
983       return 1;
984     case DW_FORM_rnglistx:
985       val->encoding = ATTR_VAL_RNGLISTS_INDEX;
986       val->u.uint = read_uleb128 (buf);
987       return 1;
988     case DW_FORM_GNU_addr_index:
989       val->encoding = ATTR_VAL_REF_SECTION;
990       val->u.uint = read_uleb128 (buf);
991       return 1;
992     case DW_FORM_GNU_str_index:
993       val->encoding = ATTR_VAL_REF_SECTION;
994       val->u.uint = read_uleb128 (buf);
995       return 1;
996     case DW_FORM_GNU_ref_alt:
997       val->u.uint = read_offset (buf, is_dwarf64);
998       if (altlink == NULL)
999         {
1000           val->encoding = ATTR_VAL_NONE;
1001           return 1;
1002         }
1003       val->encoding = ATTR_VAL_REF_ALT_INFO;
1004       return 1;
1005     case DW_FORM_strp_sup: case DW_FORM_GNU_strp_alt:
1006       {
1007         uint64_t offset;
1008
1009         offset = read_offset (buf, is_dwarf64);
1010         if (altlink == NULL)
1011           {
1012             val->encoding = ATTR_VAL_NONE;
1013             return 1;
1014           }
1015         if (offset >= altlink->dwarf_sections.size[DEBUG_STR])
1016           {
1017             dwarf_buf_error (buf, "DW_FORM_strp_sup out of range", 0);
1018             return 0;
1019           }
1020         val->encoding = ATTR_VAL_STRING;
1021         val->u.string =
1022           (const char *) altlink->dwarf_sections.data[DEBUG_STR] + offset;
1023         return 1;
1024       }
1025     default:
1026       dwarf_buf_error (buf, "unrecognized DWARF form", -1);
1027       return 0;
1028     }
1029 }
1030
1031 /* If we can determine the value of a string attribute, set *STRING to
1032    point to the string.  Return 1 on success, 0 on error.  If we don't
1033    know the value, we consider that a success, and we don't change
1034    *STRING.  An error is only reported for some sort of out of range
1035    offset.  */
1036
1037 static int
1038 resolve_string (const struct dwarf_sections *dwarf_sections, int is_dwarf64,
1039                 int is_bigendian, uint64_t str_offsets_base,
1040                 const struct attr_val *val,
1041                 backtrace_error_callback error_callback, void *data,
1042                 const char **string)
1043 {
1044   switch (val->encoding)
1045     {
1046     case ATTR_VAL_STRING:
1047       *string = val->u.string;
1048       return 1;
1049
1050     case ATTR_VAL_STRING_INDEX:
1051       {
1052         uint64_t offset;
1053         struct dwarf_buf offset_buf;
1054
1055         offset = val->u.uint * (is_dwarf64 ? 8 : 4) + str_offsets_base;
1056         if (offset + (is_dwarf64 ? 8 : 4)
1057             > dwarf_sections->size[DEBUG_STR_OFFSETS])
1058           {
1059             error_callback (data, "DW_FORM_strx value out of range", 0);
1060             return 0;
1061           }
1062
1063         offset_buf.name = ".debug_str_offsets";
1064         offset_buf.start = dwarf_sections->data[DEBUG_STR_OFFSETS];
1065         offset_buf.buf = dwarf_sections->data[DEBUG_STR_OFFSETS] + offset;
1066         offset_buf.left = dwarf_sections->size[DEBUG_STR_OFFSETS] - offset;
1067         offset_buf.is_bigendian = is_bigendian;
1068         offset_buf.error_callback = error_callback;
1069         offset_buf.data = data;
1070         offset_buf.reported_underflow = 0;
1071
1072         offset = read_offset (&offset_buf, is_dwarf64);
1073         if (offset >= dwarf_sections->size[DEBUG_STR])
1074           {
1075             dwarf_buf_error (&offset_buf,
1076                              "DW_FORM_strx offset out of range",
1077                              0);
1078             return 0;
1079           }
1080         *string = (const char *) dwarf_sections->data[DEBUG_STR] + offset;
1081         return 1;
1082       }
1083
1084     default:
1085       return 1;
1086     }
1087 }
1088
1089 /* Set *ADDRESS to the real address for a ATTR_VAL_ADDRESS_INDEX.
1090    Return 1 on success, 0 on error.  */
1091
1092 static int
1093 resolve_addr_index (const struct dwarf_sections *dwarf_sections,
1094                     uint64_t addr_base, int addrsize, int is_bigendian,
1095                     uint64_t addr_index,
1096                     backtrace_error_callback error_callback, void *data,
1097                     uint64_t *address)
1098 {
1099   uint64_t offset;
1100   struct dwarf_buf addr_buf;
1101
1102   offset = addr_index * addrsize + addr_base;
1103   if (offset + addrsize > dwarf_sections->size[DEBUG_ADDR])
1104     {
1105       error_callback (data, "DW_FORM_addrx value out of range", 0);
1106       return 0;
1107     }
1108
1109   addr_buf.name = ".debug_addr";
1110   addr_buf.start = dwarf_sections->data[DEBUG_ADDR];
1111   addr_buf.buf = dwarf_sections->data[DEBUG_ADDR] + offset;
1112   addr_buf.left = dwarf_sections->size[DEBUG_ADDR] - offset;
1113   addr_buf.is_bigendian = is_bigendian;
1114   addr_buf.error_callback = error_callback;
1115   addr_buf.data = data;
1116   addr_buf.reported_underflow = 0;
1117
1118   *address = read_address (&addr_buf, addrsize);
1119   return 1;
1120 }
1121
1122 /* Compare a unit offset against a unit for bsearch.  */
1123
1124 static int
1125 units_search (const void *vkey, const void *ventry)
1126 {
1127   const size_t *key = (const size_t *) vkey;
1128   const struct unit *entry = *((const struct unit *const *) ventry);
1129   size_t offset;
1130
1131   offset = *key;
1132   if (offset < entry->low_offset)
1133     return -1;
1134   else if (offset >= entry->high_offset)
1135     return 1;
1136   else
1137     return 0;
1138 }
1139
1140 /* Find a unit in PU containing OFFSET.  */
1141
1142 static struct unit *
1143 find_unit (struct unit **pu, size_t units_count, size_t offset)
1144 {
1145   struct unit **u;
1146   u = bsearch (&offset, pu, units_count, sizeof (struct unit *), units_search);
1147   return u == NULL ? NULL : *u;
1148 }
1149
1150 /* Compare function_addrs for qsort.  When ranges are nested, make the
1151    smallest one sort last.  */
1152
1153 static int
1154 function_addrs_compare (const void *v1, const void *v2)
1155 {
1156   const struct function_addrs *a1 = (const struct function_addrs *) v1;
1157   const struct function_addrs *a2 = (const struct function_addrs *) v2;
1158
1159   if (a1->low < a2->low)
1160     return -1;
1161   if (a1->low > a2->low)
1162     return 1;
1163   if (a1->high < a2->high)
1164     return 1;
1165   if (a1->high > a2->high)
1166     return -1;
1167   return strcmp (a1->function->name, a2->function->name);
1168 }
1169
1170 /* Compare a PC against a function_addrs for bsearch.  We always
1171    allocate an entra entry at the end of the vector, so that this
1172    routine can safely look at the next entry.  Note that if there are
1173    multiple ranges containing PC, which one will be returned is
1174    unpredictable.  We compensate for that in dwarf_fileline.  */
1175
1176 static int
1177 function_addrs_search (const void *vkey, const void *ventry)
1178 {
1179   const uintptr_t *key = (const uintptr_t *) vkey;
1180   const struct function_addrs *entry = (const struct function_addrs *) ventry;
1181   uintptr_t pc;
1182
1183   pc = *key;
1184   if (pc < entry->low)
1185     return -1;
1186   else if (pc > (entry + 1)->low)
1187     return 1;
1188   else
1189     return 0;
1190 }
1191
1192 /* Add a new compilation unit address range to a vector.  This is
1193    called via add_ranges.  Returns 1 on success, 0 on failure.  */
1194
1195 static int
1196 add_unit_addr (struct backtrace_state *state, void *rdata,
1197                uint64_t lowpc, uint64_t highpc,
1198                backtrace_error_callback error_callback, void *data,
1199                void *pvec)
1200 {
1201   struct unit *u = (struct unit *) rdata;
1202   struct unit_addrs_vector *vec = (struct unit_addrs_vector *) pvec;
1203   struct unit_addrs *p;
1204
1205   /* Try to merge with the last entry.  */
1206   if (vec->count > 0)
1207     {
1208       p = (struct unit_addrs *) vec->vec.base + (vec->count - 1);
1209       if ((lowpc == p->high || lowpc == p->high + 1)
1210           && u == p->u)
1211         {
1212           if (highpc > p->high)
1213             p->high = highpc;
1214           return 1;
1215         }
1216     }
1217
1218   p = ((struct unit_addrs *)
1219        backtrace_vector_grow (state, sizeof (struct unit_addrs),
1220                               error_callback, data, &vec->vec));
1221   if (p == NULL)
1222     return 0;
1223
1224   p->low = lowpc;
1225   p->high = highpc;
1226   p->u = u;
1227
1228   ++vec->count;
1229
1230   return 1;
1231 }
1232
1233 /* Compare unit_addrs for qsort.  When ranges are nested, make the
1234    smallest one sort last.  */
1235
1236 static int
1237 unit_addrs_compare (const void *v1, const void *v2)
1238 {
1239   const struct unit_addrs *a1 = (const struct unit_addrs *) v1;
1240   const struct unit_addrs *a2 = (const struct unit_addrs *) v2;
1241
1242   if (a1->low < a2->low)
1243     return -1;
1244   if (a1->low > a2->low)
1245     return 1;
1246   if (a1->high < a2->high)
1247     return 1;
1248   if (a1->high > a2->high)
1249     return -1;
1250   if (a1->u->lineoff < a2->u->lineoff)
1251     return -1;
1252   if (a1->u->lineoff > a2->u->lineoff)
1253     return 1;
1254   return 0;
1255 }
1256
1257 /* Compare a PC against a unit_addrs for bsearch.  We always allocate
1258    an entry entry at the end of the vector, so that this routine can
1259    safely look at the next entry.  Note that if there are multiple
1260    ranges containing PC, which one will be returned is unpredictable.
1261    We compensate for that in dwarf_fileline.  */
1262
1263 static int
1264 unit_addrs_search (const void *vkey, const void *ventry)
1265 {
1266   const uintptr_t *key = (const uintptr_t *) vkey;
1267   const struct unit_addrs *entry = (const struct unit_addrs *) ventry;
1268   uintptr_t pc;
1269
1270   pc = *key;
1271   if (pc < entry->low)
1272     return -1;
1273   else if (pc > (entry + 1)->low)
1274     return 1;
1275   else
1276     return 0;
1277 }
1278
1279 /* Sort the line vector by PC.  We want a stable sort here to maintain
1280    the order of lines for the same PC values.  Since the sequence is
1281    being sorted in place, their addresses cannot be relied on to
1282    maintain stability.  That is the purpose of the index member.  */
1283
1284 static int
1285 line_compare (const void *v1, const void *v2)
1286 {
1287   const struct line *ln1 = (const struct line *) v1;
1288   const struct line *ln2 = (const struct line *) v2;
1289
1290   if (ln1->pc < ln2->pc)
1291     return -1;
1292   else if (ln1->pc > ln2->pc)
1293     return 1;
1294   else if (ln1->idx < ln2->idx)
1295     return -1;
1296   else if (ln1->idx > ln2->idx)
1297     return 1;
1298   else
1299     return 0;
1300 }
1301
1302 /* Find a PC in a line vector.  We always allocate an extra entry at
1303    the end of the lines vector, so that this routine can safely look
1304    at the next entry.  Note that when there are multiple mappings for
1305    the same PC value, this will return the last one.  */
1306
1307 static int
1308 line_search (const void *vkey, const void *ventry)
1309 {
1310   const uintptr_t *key = (const uintptr_t *) vkey;
1311   const struct line *entry = (const struct line *) ventry;
1312   uintptr_t pc;
1313
1314   pc = *key;
1315   if (pc < entry->pc)
1316     return -1;
1317   else if (pc >= (entry + 1)->pc)
1318     return 1;
1319   else
1320     return 0;
1321 }
1322
1323 /* Sort the abbrevs by the abbrev code.  This function is passed to
1324    both qsort and bsearch.  */
1325
1326 static int
1327 abbrev_compare (const void *v1, const void *v2)
1328 {
1329   const struct abbrev *a1 = (const struct abbrev *) v1;
1330   const struct abbrev *a2 = (const struct abbrev *) v2;
1331
1332   if (a1->code < a2->code)
1333     return -1;
1334   else if (a1->code > a2->code)
1335     return 1;
1336   else
1337     {
1338       /* This really shouldn't happen.  It means there are two
1339          different abbrevs with the same code, and that means we don't
1340          know which one lookup_abbrev should return.  */
1341       return 0;
1342     }
1343 }
1344
1345 /* Read the abbreviation table for a compilation unit.  Returns 1 on
1346    success, 0 on failure.  */
1347
1348 static int
1349 read_abbrevs (struct backtrace_state *state, uint64_t abbrev_offset,
1350               const unsigned char *dwarf_abbrev, size_t dwarf_abbrev_size,
1351               int is_bigendian, backtrace_error_callback error_callback,
1352               void *data, struct abbrevs *abbrevs)
1353 {
1354   struct dwarf_buf abbrev_buf;
1355   struct dwarf_buf count_buf;
1356   size_t num_abbrevs;
1357
1358   abbrevs->num_abbrevs = 0;
1359   abbrevs->abbrevs = NULL;
1360
1361   if (abbrev_offset >= dwarf_abbrev_size)
1362     {
1363       error_callback (data, "abbrev offset out of range", 0);
1364       return 0;
1365     }
1366
1367   abbrev_buf.name = ".debug_abbrev";
1368   abbrev_buf.start = dwarf_abbrev;
1369   abbrev_buf.buf = dwarf_abbrev + abbrev_offset;
1370   abbrev_buf.left = dwarf_abbrev_size - abbrev_offset;
1371   abbrev_buf.is_bigendian = is_bigendian;
1372   abbrev_buf.error_callback = error_callback;
1373   abbrev_buf.data = data;
1374   abbrev_buf.reported_underflow = 0;
1375
1376   /* Count the number of abbrevs in this list.  */
1377
1378   count_buf = abbrev_buf;
1379   num_abbrevs = 0;
1380   while (read_uleb128 (&count_buf) != 0)
1381     {
1382       if (count_buf.reported_underflow)
1383         return 0;
1384       ++num_abbrevs;
1385       // Skip tag.
1386       read_uleb128 (&count_buf);
1387       // Skip has_children.
1388       read_byte (&count_buf);
1389       // Skip attributes.
1390       while (read_uleb128 (&count_buf) != 0)
1391         {
1392           uint64_t form;
1393
1394           form = read_uleb128 (&count_buf);
1395           if ((enum dwarf_form) form == DW_FORM_implicit_const)
1396             read_sleb128 (&count_buf);
1397         }
1398       // Skip form of last attribute.
1399       read_uleb128 (&count_buf);
1400     }
1401
1402   if (count_buf.reported_underflow)
1403     return 0;
1404
1405   if (num_abbrevs == 0)
1406     return 1;
1407
1408   abbrevs->abbrevs = ((struct abbrev *)
1409                       backtrace_alloc (state,
1410                                        num_abbrevs * sizeof (struct abbrev),
1411                                        error_callback, data));
1412   if (abbrevs->abbrevs == NULL)
1413     return 0;
1414   abbrevs->num_abbrevs = num_abbrevs;
1415   memset (abbrevs->abbrevs, 0, num_abbrevs * sizeof (struct abbrev));
1416
1417   num_abbrevs = 0;
1418   while (1)
1419     {
1420       uint64_t code;
1421       struct abbrev a;
1422       size_t num_attrs;
1423       struct attr *attrs;
1424
1425       if (abbrev_buf.reported_underflow)
1426         goto fail;
1427
1428       code = read_uleb128 (&abbrev_buf);
1429       if (code == 0)
1430         break;
1431
1432       a.code = code;
1433       a.tag = (enum dwarf_tag) read_uleb128 (&abbrev_buf);
1434       a.has_children = read_byte (&abbrev_buf);
1435
1436       count_buf = abbrev_buf;
1437       num_attrs = 0;
1438       while (read_uleb128 (&count_buf) != 0)
1439         {
1440           uint64_t form;
1441
1442           ++num_attrs;
1443           form = read_uleb128 (&count_buf);
1444           if ((enum dwarf_form) form == DW_FORM_implicit_const)
1445             read_sleb128 (&count_buf);
1446         }
1447
1448       if (num_attrs == 0)
1449         {
1450           attrs = NULL;
1451           read_uleb128 (&abbrev_buf);
1452           read_uleb128 (&abbrev_buf);
1453         }
1454       else
1455         {
1456           attrs = ((struct attr *)
1457                    backtrace_alloc (state, num_attrs * sizeof *attrs,
1458                                     error_callback, data));
1459           if (attrs == NULL)
1460             goto fail;
1461           num_attrs = 0;
1462           while (1)
1463             {
1464               uint64_t name;
1465               uint64_t form;
1466
1467               name = read_uleb128 (&abbrev_buf);
1468               form = read_uleb128 (&abbrev_buf);
1469               if (name == 0)
1470                 break;
1471               attrs[num_attrs].name = (enum dwarf_attribute) name;
1472               attrs[num_attrs].form = (enum dwarf_form) form;
1473               if ((enum dwarf_form) form == DW_FORM_implicit_const)
1474                 attrs[num_attrs].val = read_sleb128 (&abbrev_buf);
1475               else
1476                 attrs[num_attrs].val = 0;
1477               ++num_attrs;
1478             }
1479         }
1480
1481       a.num_attrs = num_attrs;
1482       a.attrs = attrs;
1483
1484       abbrevs->abbrevs[num_abbrevs] = a;
1485       ++num_abbrevs;
1486     }
1487
1488   backtrace_qsort (abbrevs->abbrevs, abbrevs->num_abbrevs,
1489                    sizeof (struct abbrev), abbrev_compare);
1490
1491   return 1;
1492
1493  fail:
1494   free_abbrevs (state, abbrevs, error_callback, data);
1495   return 0;
1496 }
1497
1498 /* Return the abbrev information for an abbrev code.  */
1499
1500 static const struct abbrev *
1501 lookup_abbrev (struct abbrevs *abbrevs, uint64_t code,
1502                backtrace_error_callback error_callback, void *data)
1503 {
1504   struct abbrev key;
1505   void *p;
1506
1507   /* With GCC, where abbrevs are simply numbered in order, we should
1508      be able to just look up the entry.  */
1509   if (code - 1 < abbrevs->num_abbrevs
1510       && abbrevs->abbrevs[code - 1].code == code)
1511     return &abbrevs->abbrevs[code - 1];
1512
1513   /* Otherwise we have to search.  */
1514   memset (&key, 0, sizeof key);
1515   key.code = code;
1516   p = bsearch (&key, abbrevs->abbrevs, abbrevs->num_abbrevs,
1517                sizeof (struct abbrev), abbrev_compare);
1518   if (p == NULL)
1519     {
1520       error_callback (data, "invalid abbreviation code", 0);
1521       return NULL;
1522     }
1523   return (const struct abbrev *) p;
1524 }
1525
1526 /* This struct is used to gather address range information while
1527    reading attributes.  We use this while building a mapping from
1528    address ranges to compilation units and then again while mapping
1529    from address ranges to function entries.  Normally either
1530    lowpc/highpc is set or ranges is set.  */
1531
1532 struct pcrange {
1533   uint64_t lowpc;               /* The low PC value.  */
1534   int have_lowpc;               /* Whether a low PC value was found.  */
1535   int lowpc_is_addr_index;      /* Whether lowpc is in .debug_addr.  */
1536   uint64_t highpc;              /* The high PC value.  */
1537   int have_highpc;              /* Whether a high PC value was found.  */
1538   int highpc_is_relative;       /* Whether highpc is relative to lowpc.  */
1539   int highpc_is_addr_index;     /* Whether highpc is in .debug_addr.  */
1540   uint64_t ranges;              /* Offset in ranges section.  */
1541   int have_ranges;              /* Whether ranges is valid.  */
1542   int ranges_is_index;          /* Whether ranges is DW_FORM_rnglistx.  */
1543 };
1544
1545 /* Update PCRANGE from an attribute value.  */
1546
1547 static void
1548 update_pcrange (const struct attr* attr, const struct attr_val* val,
1549                 struct pcrange *pcrange)
1550 {
1551   switch (attr->name)
1552     {
1553     case DW_AT_low_pc:
1554       if (val->encoding == ATTR_VAL_ADDRESS)
1555         {
1556           pcrange->lowpc = val->u.uint;
1557           pcrange->have_lowpc = 1;
1558         }
1559       else if (val->encoding == ATTR_VAL_ADDRESS_INDEX)
1560         {
1561           pcrange->lowpc = val->u.uint;
1562           pcrange->have_lowpc = 1;
1563           pcrange->lowpc_is_addr_index = 1;
1564         }
1565       break;
1566
1567     case DW_AT_high_pc:
1568       if (val->encoding == ATTR_VAL_ADDRESS)
1569         {
1570           pcrange->highpc = val->u.uint;
1571           pcrange->have_highpc = 1;
1572         }
1573       else if (val->encoding == ATTR_VAL_UINT)
1574         {
1575           pcrange->highpc = val->u.uint;
1576           pcrange->have_highpc = 1;
1577           pcrange->highpc_is_relative = 1;
1578         }
1579       else if (val->encoding == ATTR_VAL_ADDRESS_INDEX)
1580         {
1581           pcrange->highpc = val->u.uint;
1582           pcrange->have_highpc = 1;
1583           pcrange->highpc_is_addr_index = 1;
1584         }
1585       break;
1586
1587     case DW_AT_ranges:
1588       if (val->encoding == ATTR_VAL_UINT
1589           || val->encoding == ATTR_VAL_REF_SECTION)
1590         {
1591           pcrange->ranges = val->u.uint;
1592           pcrange->have_ranges = 1;
1593         }
1594       else if (val->encoding == ATTR_VAL_RNGLISTS_INDEX)
1595         {
1596           pcrange->ranges = val->u.uint;
1597           pcrange->have_ranges = 1;
1598           pcrange->ranges_is_index = 1;
1599         }
1600       break;
1601
1602     default:
1603       break;
1604     }
1605 }
1606
1607 /* Call ADD_RANGE for a low/high PC pair.  Returns 1 on success, 0 on
1608   error.  */
1609
1610 static int
1611 add_low_high_range (struct backtrace_state *state,
1612                     const struct dwarf_sections *dwarf_sections,
1613                     uintptr_t base_address, int is_bigendian,
1614                     struct unit *u, const struct pcrange *pcrange,
1615                     int (*add_range) (struct backtrace_state *state,
1616                                       void *rdata, uint64_t lowpc,
1617                                       uint64_t highpc,
1618                                       backtrace_error_callback error_callback,
1619                                       void *data, void *vec),
1620                     void *rdata,
1621                     backtrace_error_callback error_callback, void *data,
1622                     void *vec)
1623 {
1624   uint64_t lowpc;
1625   uint64_t highpc;
1626
1627   lowpc = pcrange->lowpc;
1628   if (pcrange->lowpc_is_addr_index)
1629     {
1630       if (!resolve_addr_index (dwarf_sections, u->addr_base, u->addrsize,
1631                                is_bigendian, lowpc, error_callback, data,
1632                                &lowpc))
1633         return 0;
1634     }
1635
1636   highpc = pcrange->highpc;
1637   if (pcrange->highpc_is_addr_index)
1638     {
1639       if (!resolve_addr_index (dwarf_sections, u->addr_base, u->addrsize,
1640                                is_bigendian, highpc, error_callback, data,
1641                                &highpc))
1642         return 0;
1643     }
1644   if (pcrange->highpc_is_relative)
1645     highpc += lowpc;
1646
1647   /* Add in the base address of the module when recording PC values,
1648      so that we can look up the PC directly.  */
1649   lowpc += base_address;
1650   highpc += base_address;
1651
1652   return add_range (state, rdata, lowpc, highpc, error_callback, data, vec);
1653 }
1654
1655 /* Call ADD_RANGE for each range read from .debug_ranges, as used in
1656    DWARF versions 2 through 4.  */
1657
1658 static int
1659 add_ranges_from_ranges (
1660     struct backtrace_state *state,
1661     const struct dwarf_sections *dwarf_sections,
1662     uintptr_t base_address, int is_bigendian,
1663     struct unit *u, uint64_t base,
1664     const struct pcrange *pcrange,
1665     int (*add_range) (struct backtrace_state *state, void *rdata,
1666                       uint64_t lowpc, uint64_t highpc,
1667                       backtrace_error_callback error_callback, void *data,
1668                       void *vec),
1669     void *rdata,
1670     backtrace_error_callback error_callback, void *data,
1671     void *vec)
1672 {
1673   struct dwarf_buf ranges_buf;
1674
1675   if (pcrange->ranges >= dwarf_sections->size[DEBUG_RANGES])
1676     {
1677       error_callback (data, "ranges offset out of range", 0);
1678       return 0;
1679     }
1680
1681   ranges_buf.name = ".debug_ranges";
1682   ranges_buf.start = dwarf_sections->data[DEBUG_RANGES];
1683   ranges_buf.buf = dwarf_sections->data[DEBUG_RANGES] + pcrange->ranges;
1684   ranges_buf.left = dwarf_sections->size[DEBUG_RANGES] - pcrange->ranges;
1685   ranges_buf.is_bigendian = is_bigendian;
1686   ranges_buf.error_callback = error_callback;
1687   ranges_buf.data = data;
1688   ranges_buf.reported_underflow = 0;
1689
1690   while (1)
1691     {
1692       uint64_t low;
1693       uint64_t high;
1694
1695       if (ranges_buf.reported_underflow)
1696         return 0;
1697
1698       low = read_address (&ranges_buf, u->addrsize);
1699       high = read_address (&ranges_buf, u->addrsize);
1700
1701       if (low == 0 && high == 0)
1702         break;
1703
1704       if (is_highest_address (low, u->addrsize))
1705         base = high;
1706       else
1707         {
1708           if (!add_range (state, rdata, 
1709                           low + base + base_address,
1710                           high + base + base_address,
1711                           error_callback, data, vec))
1712             return 0;
1713         }
1714     }
1715
1716   if (ranges_buf.reported_underflow)
1717     return 0;
1718
1719   return 1;
1720 }
1721
1722 /* Call ADD_RANGE for each range read from .debug_rnglists, as used in
1723    DWARF version 5.  */
1724
1725 static int
1726 add_ranges_from_rnglists (
1727     struct backtrace_state *state,
1728     const struct dwarf_sections *dwarf_sections,
1729     uintptr_t base_address, int is_bigendian,
1730     struct unit *u, uint64_t base,
1731     const struct pcrange *pcrange,
1732     int (*add_range) (struct backtrace_state *state, void *rdata,
1733                       uint64_t lowpc, uint64_t highpc,
1734                       backtrace_error_callback error_callback, void *data,
1735                       void *vec),
1736     void *rdata,
1737     backtrace_error_callback error_callback, void *data,
1738     void *vec)
1739 {
1740   uint64_t offset;
1741   struct dwarf_buf rnglists_buf;
1742
1743   if (!pcrange->ranges_is_index)
1744     offset = pcrange->ranges;
1745   else
1746     offset = u->rnglists_base + pcrange->ranges * (u->is_dwarf64 ? 8 : 4);
1747   if (offset >= dwarf_sections->size[DEBUG_RNGLISTS])
1748     {
1749       error_callback (data, "rnglists offset out of range", 0);
1750       return 0;
1751     }
1752
1753   rnglists_buf.name = ".debug_rnglists";
1754   rnglists_buf.start = dwarf_sections->data[DEBUG_RNGLISTS];
1755   rnglists_buf.buf = dwarf_sections->data[DEBUG_RNGLISTS] + offset;
1756   rnglists_buf.left = dwarf_sections->size[DEBUG_RNGLISTS] - offset;
1757   rnglists_buf.is_bigendian = is_bigendian;
1758   rnglists_buf.error_callback = error_callback;
1759   rnglists_buf.data = data;
1760   rnglists_buf.reported_underflow = 0;
1761
1762   if (pcrange->ranges_is_index)
1763     {
1764       offset = read_offset (&rnglists_buf, u->is_dwarf64);
1765       offset += u->rnglists_base;
1766       if (offset >= dwarf_sections->size[DEBUG_RNGLISTS])
1767         {
1768           error_callback (data, "rnglists index offset out of range", 0);
1769           return 0;
1770         }
1771       rnglists_buf.buf = dwarf_sections->data[DEBUG_RNGLISTS] + offset;
1772       rnglists_buf.left = dwarf_sections->size[DEBUG_RNGLISTS] - offset;
1773     }
1774
1775   while (1)
1776     {
1777       unsigned char rle;
1778
1779       rle = read_byte (&rnglists_buf);
1780       if (rle == DW_RLE_end_of_list)
1781         break;
1782       switch (rle)
1783         {
1784         case DW_RLE_base_addressx:
1785           {
1786             uint64_t index;
1787
1788             index = read_uleb128 (&rnglists_buf);
1789             if (!resolve_addr_index (dwarf_sections, u->addr_base,
1790                                      u->addrsize, is_bigendian, index,
1791                                      error_callback, data, &base))
1792               return 0;
1793           }
1794           break;
1795
1796         case DW_RLE_startx_endx:
1797           {
1798             uint64_t index;
1799             uint64_t low;
1800             uint64_t high;
1801
1802             index = read_uleb128 (&rnglists_buf);
1803             if (!resolve_addr_index (dwarf_sections, u->addr_base,
1804                                      u->addrsize, is_bigendian, index,
1805                                      error_callback, data, &low))
1806               return 0;
1807             index = read_uleb128 (&rnglists_buf);
1808             if (!resolve_addr_index (dwarf_sections, u->addr_base,
1809                                      u->addrsize, is_bigendian, index,
1810                                      error_callback, data, &high))
1811               return 0;
1812             if (!add_range (state, rdata, low + base_address,
1813                             high + base_address, error_callback, data,
1814                             vec))
1815               return 0;
1816           }
1817           break;
1818
1819         case DW_RLE_startx_length:
1820           {
1821             uint64_t index;
1822             uint64_t low;
1823             uint64_t length;
1824
1825             index = read_uleb128 (&rnglists_buf);
1826             if (!resolve_addr_index (dwarf_sections, u->addr_base,
1827                                      u->addrsize, is_bigendian, index,
1828                                      error_callback, data, &low))
1829               return 0;
1830             length = read_uleb128 (&rnglists_buf);
1831             low += base_address;
1832             if (!add_range (state, rdata, low, low + length,
1833                             error_callback, data, vec))
1834               return 0;
1835           }
1836           break;
1837
1838         case DW_RLE_offset_pair:
1839           {
1840             uint64_t low;
1841             uint64_t high;
1842
1843             low = read_uleb128 (&rnglists_buf);
1844             high = read_uleb128 (&rnglists_buf);
1845             if (!add_range (state, rdata, low + base + base_address,
1846                             high + base + base_address,
1847                             error_callback, data, vec))
1848               return 0;
1849           }
1850           break;
1851
1852         case DW_RLE_base_address:
1853           base = read_address (&rnglists_buf, u->addrsize);
1854           break;
1855
1856         case DW_RLE_start_end:
1857           {
1858             uint64_t low;
1859             uint64_t high;
1860
1861             low = read_address (&rnglists_buf, u->addrsize);
1862             high = read_address (&rnglists_buf, u->addrsize);
1863             if (!add_range (state, rdata, low + base_address,
1864                             high + base_address, error_callback, data,
1865                             vec))
1866               return 0;
1867           }
1868           break;
1869
1870         case DW_RLE_start_length:
1871           {
1872             uint64_t low;
1873             uint64_t length;
1874
1875             low = read_address (&rnglists_buf, u->addrsize);
1876             length = read_uleb128 (&rnglists_buf);
1877             low += base_address;
1878             if (!add_range (state, rdata, low, low + length,
1879                             error_callback, data, vec))
1880               return 0;
1881           }
1882           break;
1883
1884         default:
1885           dwarf_buf_error (&rnglists_buf, "unrecognized DW_RLE value", -1);
1886           return 0;
1887         }
1888     }
1889
1890   if (rnglists_buf.reported_underflow)
1891     return 0;
1892
1893   return 1;
1894 }
1895
1896 /* Call ADD_RANGE for each lowpc/highpc pair in PCRANGE.  RDATA is
1897    passed to ADD_RANGE, and is either a struct unit * or a struct
1898    function *.  VEC is the vector we are adding ranges to, and is
1899    either a struct unit_addrs_vector * or a struct function_vector *.
1900    Returns 1 on success, 0 on error.  */
1901
1902 static int
1903 add_ranges (struct backtrace_state *state,
1904             const struct dwarf_sections *dwarf_sections,
1905             uintptr_t base_address, int is_bigendian,
1906             struct unit *u, uint64_t base, const struct pcrange *pcrange,
1907             int (*add_range) (struct backtrace_state *state, void *rdata, 
1908                               uint64_t lowpc, uint64_t highpc,
1909                               backtrace_error_callback error_callback,
1910                               void *data, void *vec),
1911             void *rdata,
1912             backtrace_error_callback error_callback, void *data,
1913             void *vec)
1914 {
1915   if (pcrange->have_lowpc && pcrange->have_highpc)
1916     return add_low_high_range (state, dwarf_sections, base_address,
1917                                is_bigendian, u, pcrange, add_range, rdata,
1918                                error_callback, data, vec);
1919
1920   if (!pcrange->have_ranges)
1921     {
1922       /* Did not find any address ranges to add.  */
1923       return 1;
1924     }
1925
1926   if (u->version < 5)
1927     return add_ranges_from_ranges (state, dwarf_sections, base_address,
1928                                    is_bigendian, u, base, pcrange, add_range,
1929                                    rdata, error_callback, data, vec);
1930   else
1931     return add_ranges_from_rnglists (state, dwarf_sections, base_address,
1932                                      is_bigendian, u, base, pcrange, add_range,
1933                                      rdata, error_callback, data, vec);
1934 }
1935
1936 /* Find the address range covered by a compilation unit, reading from
1937    UNIT_BUF and adding values to U.  Returns 1 if all data could be
1938    read, 0 if there is some error.  */
1939
1940 static int
1941 find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
1942                      struct dwarf_buf *unit_buf,
1943                      const struct dwarf_sections *dwarf_sections,
1944                      int is_bigendian, struct dwarf_data *altlink,
1945                      backtrace_error_callback error_callback, void *data,
1946                      struct unit *u, struct unit_addrs_vector *addrs,
1947                      enum dwarf_tag *unit_tag)
1948 {
1949   while (unit_buf->left > 0)
1950     {
1951       uint64_t code;
1952       const struct abbrev *abbrev;
1953       struct pcrange pcrange;
1954       struct attr_val name_val;
1955       int have_name_val;
1956       struct attr_val comp_dir_val;
1957       int have_comp_dir_val;
1958       size_t i;
1959
1960       code = read_uleb128 (unit_buf);
1961       if (code == 0)
1962         return 1;
1963
1964       abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
1965       if (abbrev == NULL)
1966         return 0;
1967
1968       if (unit_tag != NULL)
1969         *unit_tag = abbrev->tag;
1970
1971       memset (&pcrange, 0, sizeof pcrange);
1972       memset (&name_val, 0, sizeof name_val);
1973       have_name_val = 0;
1974       memset (&comp_dir_val, 0, sizeof comp_dir_val);
1975       have_comp_dir_val = 0;
1976       for (i = 0; i < abbrev->num_attrs; ++i)
1977         {
1978           struct attr_val val;
1979
1980           if (!read_attribute (abbrev->attrs[i].form, abbrev->attrs[i].val,
1981                                unit_buf, u->is_dwarf64, u->version,
1982                                u->addrsize, dwarf_sections, altlink, &val))
1983             return 0;
1984
1985           switch (abbrev->attrs[i].name)
1986             {
1987             case DW_AT_low_pc: case DW_AT_high_pc: case DW_AT_ranges:
1988               update_pcrange (&abbrev->attrs[i], &val, &pcrange);
1989               break;
1990
1991             case DW_AT_stmt_list:
1992               if (abbrev->tag == DW_TAG_compile_unit
1993                   && (val.encoding == ATTR_VAL_UINT
1994                       || val.encoding == ATTR_VAL_REF_SECTION))
1995                 u->lineoff = val.u.uint;
1996               break;
1997
1998             case DW_AT_name:
1999               if (abbrev->tag == DW_TAG_compile_unit)
2000                 {
2001                   name_val = val;
2002                   have_name_val = 1;
2003                 }
2004               break;
2005
2006             case DW_AT_comp_dir:
2007               if (abbrev->tag == DW_TAG_compile_unit)
2008                 {
2009                   comp_dir_val = val;
2010                   have_comp_dir_val = 1;
2011                 }
2012               break;
2013
2014             case DW_AT_str_offsets_base:
2015               if (abbrev->tag == DW_TAG_compile_unit
2016                   && val.encoding == ATTR_VAL_REF_SECTION)
2017                 u->str_offsets_base = val.u.uint;
2018               break;
2019
2020             case DW_AT_addr_base:
2021               if (abbrev->tag == DW_TAG_compile_unit
2022                   && val.encoding == ATTR_VAL_REF_SECTION)
2023                 u->addr_base = val.u.uint;
2024               break;
2025
2026             case DW_AT_rnglists_base:
2027               if (abbrev->tag == DW_TAG_compile_unit
2028                   && val.encoding == ATTR_VAL_REF_SECTION)
2029                 u->rnglists_base = val.u.uint;
2030               break;
2031
2032             default:
2033               break;
2034             }
2035         }
2036
2037       // Resolve strings after we're sure that we have seen
2038       // DW_AT_str_offsets_base.
2039       if (have_name_val)
2040         {
2041           if (!resolve_string (dwarf_sections, u->is_dwarf64, is_bigendian,
2042                                u->str_offsets_base, &name_val,
2043                                error_callback, data, &u->filename))
2044             return 0;
2045         }
2046       if (have_comp_dir_val)
2047         {
2048           if (!resolve_string (dwarf_sections, u->is_dwarf64, is_bigendian,
2049                                u->str_offsets_base, &comp_dir_val,
2050                                error_callback, data, &u->comp_dir))
2051             return 0;
2052         }
2053
2054       if (abbrev->tag == DW_TAG_compile_unit
2055           || abbrev->tag == DW_TAG_subprogram)
2056         {
2057           if (!add_ranges (state, dwarf_sections, base_address,
2058                            is_bigendian, u, pcrange.lowpc, &pcrange,
2059                            add_unit_addr, (void *) u, error_callback, data,
2060                            (void *) addrs))
2061             return 0;
2062
2063           /* If we found the PC range in the DW_TAG_compile_unit, we
2064              can stop now.  */
2065           if (abbrev->tag == DW_TAG_compile_unit
2066               && (pcrange.have_ranges
2067                   || (pcrange.have_lowpc && pcrange.have_highpc)))
2068             return 1;
2069         }
2070
2071       if (abbrev->has_children)
2072         {
2073           if (!find_address_ranges (state, base_address, unit_buf,
2074                                     dwarf_sections, is_bigendian, altlink,
2075                                     error_callback, data, u, addrs, NULL))
2076             return 0;
2077         }
2078     }
2079
2080   return 1;
2081 }
2082
2083 /* Build a mapping from address ranges to the compilation units where
2084    the line number information for that range can be found.  Returns 1
2085    on success, 0 on failure.  */
2086
2087 static int
2088 build_address_map (struct backtrace_state *state, uintptr_t base_address,
2089                    const struct dwarf_sections *dwarf_sections,
2090                    int is_bigendian, struct dwarf_data *altlink,
2091                    backtrace_error_callback error_callback, void *data,
2092                    struct unit_addrs_vector *addrs,
2093                    struct unit_vector *unit_vec)
2094 {
2095   struct dwarf_buf info;
2096   struct backtrace_vector units;
2097   size_t units_count;
2098   size_t i;
2099   struct unit **pu;
2100   size_t unit_offset = 0;
2101   struct unit_addrs *pa;
2102
2103   memset (&addrs->vec, 0, sizeof addrs->vec);
2104   memset (&unit_vec->vec, 0, sizeof unit_vec->vec);
2105   addrs->count = 0;
2106   unit_vec->count = 0;
2107
2108   /* Read through the .debug_info section.  FIXME: Should we use the
2109      .debug_aranges section?  gdb and addr2line don't use it, but I'm
2110      not sure why.  */
2111
2112   info.name = ".debug_info";
2113   info.start = dwarf_sections->data[DEBUG_INFO];
2114   info.buf = info.start;
2115   info.left = dwarf_sections->size[DEBUG_INFO];
2116   info.is_bigendian = is_bigendian;
2117   info.error_callback = error_callback;
2118   info.data = data;
2119   info.reported_underflow = 0;
2120
2121   memset (&units, 0, sizeof units);
2122   units_count = 0;
2123
2124   while (info.left > 0)
2125     {
2126       const unsigned char *unit_data_start;
2127       uint64_t len;
2128       int is_dwarf64;
2129       struct dwarf_buf unit_buf;
2130       int version;
2131       int unit_type;
2132       uint64_t abbrev_offset;
2133       int addrsize;
2134       struct unit *u;
2135       enum dwarf_tag unit_tag;
2136
2137       if (info.reported_underflow)
2138         goto fail;
2139
2140       unit_data_start = info.buf;
2141
2142       len = read_initial_length (&info, &is_dwarf64);
2143       unit_buf = info;
2144       unit_buf.left = len;
2145
2146       if (!advance (&info, len))
2147         goto fail;
2148
2149       version = read_uint16 (&unit_buf);
2150       if (version < 2 || version > 5)
2151         {
2152           dwarf_buf_error (&unit_buf, "unrecognized DWARF version", -1);
2153           goto fail;
2154         }
2155
2156       if (version < 5)
2157         unit_type = 0;
2158       else
2159         {
2160           unit_type = read_byte (&unit_buf);
2161           if (unit_type == DW_UT_type || unit_type == DW_UT_split_type)
2162             {
2163               /* This unit doesn't have anything we need.  */
2164               continue;
2165             }
2166         }
2167
2168       pu = ((struct unit **)
2169             backtrace_vector_grow (state, sizeof (struct unit *),
2170                                    error_callback, data, &units));
2171       if (pu == NULL)
2172           goto fail;
2173
2174       u = ((struct unit *)
2175            backtrace_alloc (state, sizeof *u, error_callback, data));
2176       if (u == NULL)
2177         goto fail;
2178
2179       *pu = u;
2180       ++units_count;
2181
2182       if (version < 5)
2183         addrsize = 0; /* Set below.  */
2184       else
2185         addrsize = read_byte (&unit_buf);
2186
2187       memset (&u->abbrevs, 0, sizeof u->abbrevs);
2188       abbrev_offset = read_offset (&unit_buf, is_dwarf64);
2189       if (!read_abbrevs (state, abbrev_offset,
2190                          dwarf_sections->data[DEBUG_ABBREV],
2191                          dwarf_sections->size[DEBUG_ABBREV],
2192                          is_bigendian, error_callback, data, &u->abbrevs))
2193         goto fail;
2194
2195       if (version < 5)
2196         addrsize = read_byte (&unit_buf);
2197
2198       switch (unit_type)
2199         {
2200         case 0:
2201           break;
2202         case DW_UT_compile: case DW_UT_partial:
2203           break;
2204         case DW_UT_skeleton: case DW_UT_split_compile:
2205           read_uint64 (&unit_buf); /* dwo_id */
2206           break;
2207         default:
2208           break;
2209         }
2210
2211       u->low_offset = unit_offset;
2212       unit_offset += len + (is_dwarf64 ? 12 : 4);
2213       u->high_offset = unit_offset;
2214       u->unit_data = unit_buf.buf;
2215       u->unit_data_len = unit_buf.left;
2216       u->unit_data_offset = unit_buf.buf - unit_data_start;
2217       u->version = version;
2218       u->is_dwarf64 = is_dwarf64;
2219       u->addrsize = addrsize;
2220       u->filename = NULL;
2221       u->comp_dir = NULL;
2222       u->abs_filename = NULL;
2223       u->lineoff = 0;
2224
2225       /* The actual line number mappings will be read as needed.  */
2226       u->lines = NULL;
2227       u->lines_count = 0;
2228       u->function_addrs = NULL;
2229       u->function_addrs_count = 0;
2230
2231       if (!find_address_ranges (state, base_address, &unit_buf, dwarf_sections,
2232                                 is_bigendian, altlink, error_callback, data,
2233                                 u, addrs, &unit_tag))
2234         goto fail;
2235
2236       if (unit_buf.reported_underflow)
2237         goto fail;
2238     }
2239   if (info.reported_underflow)
2240     goto fail;
2241
2242   /* Add a trailing addrs entry, but don't include it in addrs->count.  */
2243   pa = ((struct unit_addrs *)
2244         backtrace_vector_grow (state, sizeof (struct unit_addrs),
2245                                error_callback, data, &addrs->vec));
2246   if (pa == NULL)
2247     goto fail;
2248   pa->low = 0;
2249   --pa->low;
2250   pa->high = pa->low;
2251   pa->u = NULL;
2252
2253   unit_vec->vec = units;
2254   unit_vec->count = units_count;
2255   return 1;
2256
2257  fail:
2258   if (units_count > 0)
2259     {
2260       pu = (struct unit **) units.base;
2261       for (i = 0; i < units_count; i++)
2262         {
2263           free_abbrevs (state, &pu[i]->abbrevs, error_callback, data);
2264           backtrace_free (state, pu[i], sizeof **pu, error_callback, data);
2265         }
2266       backtrace_vector_free (state, &units, error_callback, data);
2267     }
2268   if (addrs->count > 0)
2269     {
2270       backtrace_vector_free (state, &addrs->vec, error_callback, data);
2271       addrs->count = 0;
2272     }
2273   return 0;
2274 }
2275
2276 /* Add a new mapping to the vector of line mappings that we are
2277    building.  Returns 1 on success, 0 on failure.  */
2278
2279 static int
2280 add_line (struct backtrace_state *state, struct dwarf_data *ddata,
2281           uintptr_t pc, const char *filename, int lineno,
2282           backtrace_error_callback error_callback, void *data,
2283           struct line_vector *vec)
2284 {
2285   struct line *ln;
2286
2287   /* If we are adding the same mapping, ignore it.  This can happen
2288      when using discriminators.  */
2289   if (vec->count > 0)
2290     {
2291       ln = (struct line *) vec->vec.base + (vec->count - 1);
2292       if (pc == ln->pc && filename == ln->filename && lineno == ln->lineno)
2293         return 1;
2294     }
2295
2296   ln = ((struct line *)
2297         backtrace_vector_grow (state, sizeof (struct line), error_callback,
2298                                data, &vec->vec));
2299   if (ln == NULL)
2300     return 0;
2301
2302   /* Add in the base address here, so that we can look up the PC
2303      directly.  */
2304   ln->pc = pc + ddata->base_address;
2305
2306   ln->filename = filename;
2307   ln->lineno = lineno;
2308   ln->idx = vec->count;
2309
2310   ++vec->count;
2311
2312   return 1;
2313 }
2314
2315 /* Free the line header information.  */
2316
2317 static void
2318 free_line_header (struct backtrace_state *state, struct line_header *hdr,
2319                   backtrace_error_callback error_callback, void *data)
2320 {
2321   if (hdr->dirs_count != 0)
2322     backtrace_free (state, hdr->dirs, hdr->dirs_count * sizeof (const char *),
2323                     error_callback, data);
2324   backtrace_free (state, hdr->filenames,
2325                   hdr->filenames_count * sizeof (char *),
2326                   error_callback, data);
2327 }
2328
2329 /* Read the directories and file names for a line header for version
2330    2, setting fields in HDR.  Return 1 on success, 0 on failure.  */
2331
2332 static int
2333 read_v2_paths (struct backtrace_state *state, struct unit *u,
2334                struct dwarf_buf *hdr_buf, struct line_header *hdr)
2335 {
2336   const unsigned char *p;
2337   const unsigned char *pend;
2338   size_t i;
2339
2340   /* Count the number of directory entries.  */
2341   hdr->dirs_count = 0;
2342   p = hdr_buf->buf;
2343   pend = p + hdr_buf->left;
2344   while (p < pend && *p != '\0')
2345     {
2346       p += strnlen((const char *) p, pend - p) + 1;
2347       ++hdr->dirs_count;
2348     }
2349
2350   /* The index of the first entry in the list of directories is 1.  Index 0 is
2351      used for the current directory of the compilation.  To simplify index
2352      handling, we set entry 0 to the compilation unit directory.  */
2353   ++hdr->dirs_count;
2354   hdr->dirs = ((const char **)
2355                backtrace_alloc (state,
2356                                 hdr->dirs_count * sizeof (const char *),
2357                                 hdr_buf->error_callback,
2358                                 hdr_buf->data));
2359   if (hdr->dirs == NULL)
2360     return 0;
2361
2362   hdr->dirs[0] = u->comp_dir;
2363   i = 1;
2364   while (*hdr_buf->buf != '\0')
2365     {
2366       if (hdr_buf->reported_underflow)
2367         return 0;
2368
2369       hdr->dirs[i] = read_string (hdr_buf);
2370       if (hdr->dirs[i] == NULL)
2371         return 0;
2372       ++i;
2373     }
2374   if (!advance (hdr_buf, 1))
2375     return 0;
2376
2377   /* Count the number of file entries.  */
2378   hdr->filenames_count = 0;
2379   p = hdr_buf->buf;
2380   pend = p + hdr_buf->left;
2381   while (p < pend && *p != '\0')
2382     {
2383       p += strnlen ((const char *) p, pend - p) + 1;
2384       p += leb128_len (p);
2385       p += leb128_len (p);
2386       p += leb128_len (p);
2387       ++hdr->filenames_count;
2388     }
2389
2390   /* The index of the first entry in the list of file names is 1.  Index 0 is
2391      used for the DW_AT_name of the compilation unit.  To simplify index
2392      handling, we set entry 0 to the compilation unit file name.  */
2393   ++hdr->filenames_count;
2394   hdr->filenames = ((const char **)
2395                     backtrace_alloc (state,
2396                                      hdr->filenames_count * sizeof (char *),
2397                                      hdr_buf->error_callback,
2398                                      hdr_buf->data));
2399   if (hdr->filenames == NULL)
2400     return 0;
2401   hdr->filenames[0] = u->filename;
2402   i = 1;
2403   while (*hdr_buf->buf != '\0')
2404     {
2405       const char *filename;
2406       uint64_t dir_index;
2407
2408       if (hdr_buf->reported_underflow)
2409         return 0;
2410
2411       filename = read_string (hdr_buf);
2412       if (filename == NULL)
2413         return 0;
2414       dir_index = read_uleb128 (hdr_buf);
2415       if (IS_ABSOLUTE_PATH (filename)
2416           || (dir_index < hdr->dirs_count && hdr->dirs[dir_index] == NULL))
2417         hdr->filenames[i] = filename;
2418       else
2419         {
2420           const char *dir;
2421           size_t dir_len;
2422           size_t filename_len;
2423           char *s;
2424
2425           if (dir_index < hdr->dirs_count)
2426             dir = hdr->dirs[dir_index];
2427           else
2428             {
2429               dwarf_buf_error (hdr_buf,
2430                                ("invalid directory index in "
2431                                 "line number program header"),
2432                                0);
2433               return 0;
2434             }
2435           dir_len = strlen (dir);
2436           filename_len = strlen (filename);
2437           s = ((char *) backtrace_alloc (state, dir_len + filename_len + 2,
2438                                          hdr_buf->error_callback,
2439                                          hdr_buf->data));
2440           if (s == NULL)
2441             return 0;
2442           memcpy (s, dir, dir_len);
2443           /* FIXME: If we are on a DOS-based file system, and the
2444              directory or the file name use backslashes, then we
2445              should use a backslash here.  */
2446           s[dir_len] = '/';
2447           memcpy (s + dir_len + 1, filename, filename_len + 1);
2448           hdr->filenames[i] = s;
2449         }
2450
2451       /* Ignore the modification time and size.  */
2452       read_uleb128 (hdr_buf);
2453       read_uleb128 (hdr_buf);
2454
2455       ++i;
2456     }
2457
2458   return 1;
2459 }
2460
2461 /* Read a single version 5 LNCT entry for a directory or file name in a
2462    line header.  Sets *STRING to the resulting name, ignoring other
2463    data.  Return 1 on success, 0 on failure.  */
2464
2465 static int
2466 read_lnct (struct backtrace_state *state, struct dwarf_data *ddata,
2467            struct unit *u, struct dwarf_buf *hdr_buf,
2468            const struct line_header *hdr, size_t formats_count,
2469            const struct line_header_format *formats, const char **string)
2470 {
2471   size_t i;
2472   const char *dir;
2473   const char *path;
2474
2475   dir = NULL;
2476   path = NULL;
2477   for (i = 0; i < formats_count; i++)
2478     {
2479       struct attr_val val;
2480
2481       if (!read_attribute (formats[i].form, 0, hdr_buf, u->is_dwarf64,
2482                            u->version, hdr->addrsize, &ddata->dwarf_sections,
2483                            ddata->altlink, &val))
2484         return 0;
2485       switch (formats[i].lnct)
2486         {
2487         case DW_LNCT_path:
2488           if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
2489                                ddata->is_bigendian, u->str_offsets_base,
2490                                &val, hdr_buf->error_callback, hdr_buf->data,
2491                                &path))
2492             return 0;
2493           break;
2494         case DW_LNCT_directory_index:
2495           if (val.encoding == ATTR_VAL_UINT)
2496             {
2497               if (val.u.uint >= hdr->dirs_count)
2498                 {
2499                   dwarf_buf_error (hdr_buf,
2500                                    ("invalid directory index in "
2501                                     "line number program header"),
2502                                    0);
2503                   return 0;
2504                 }
2505               dir = hdr->dirs[val.u.uint];
2506             }
2507           break;
2508         default:
2509           /* We don't care about timestamps or sizes or hashes.  */
2510           break;
2511         }
2512     }
2513
2514   if (path == NULL)
2515     {
2516       dwarf_buf_error (hdr_buf,
2517                        "missing file name in line number program header",
2518                        0);
2519       return 0;
2520     }
2521
2522   if (dir == NULL)
2523     *string = path;
2524   else
2525     {
2526       size_t dir_len;
2527       size_t path_len;
2528       char *s;
2529
2530       dir_len = strlen (dir);
2531       path_len = strlen (path);
2532       s = (char *) backtrace_alloc (state, dir_len + path_len + 2,
2533                                     hdr_buf->error_callback, hdr_buf->data);
2534       if (s == NULL)
2535         return 0;
2536       memcpy (s, dir, dir_len);
2537       /* FIXME: If we are on a DOS-based file system, and the
2538          directory or the path name use backslashes, then we should
2539          use a backslash here.  */
2540       s[dir_len] = '/';
2541       memcpy (s + dir_len + 1, path, path_len + 1);
2542       *string = s;
2543     }
2544
2545   return 1;
2546 }
2547
2548 /* Read a set of DWARF 5 line header format entries, setting *PCOUNT
2549    and *PPATHS.  Return 1 on success, 0 on failure.  */
2550
2551 static int
2552 read_line_header_format_entries (struct backtrace_state *state,
2553                                  struct dwarf_data *ddata,
2554                                  struct unit *u,
2555                                  struct dwarf_buf *hdr_buf,
2556                                  struct line_header *hdr,
2557                                  size_t *pcount,
2558                                  const char ***ppaths)
2559 {
2560   size_t formats_count;
2561   struct line_header_format *formats;
2562   size_t paths_count;
2563   const char **paths;
2564   size_t i;
2565   int ret;
2566
2567   formats_count = read_byte (hdr_buf);
2568   if (formats_count == 0)
2569     formats = NULL;
2570   else
2571     {
2572       formats = ((struct line_header_format *)
2573                  backtrace_alloc (state,
2574                                   (formats_count
2575                                    * sizeof (struct line_header_format)),
2576                                   hdr_buf->error_callback,
2577                                   hdr_buf->data));
2578       if (formats == NULL)
2579         return 0;
2580
2581       for (i = 0; i < formats_count; i++)
2582         {
2583           formats[i].lnct = (int) read_uleb128(hdr_buf);
2584           formats[i].form = (enum dwarf_form) read_uleb128 (hdr_buf);
2585         }
2586     }
2587
2588   paths_count = read_uleb128 (hdr_buf);
2589   if (paths_count == 0)
2590     {
2591       *pcount = 0;
2592       *ppaths = NULL;
2593       ret = 1;
2594       goto exit;
2595     }
2596
2597   paths = ((const char **)
2598            backtrace_alloc (state, paths_count * sizeof (const char *),
2599                             hdr_buf->error_callback, hdr_buf->data));
2600   if (paths == NULL)
2601     {
2602       ret = 0;
2603       goto exit;
2604     }
2605   for (i = 0; i < paths_count; i++)
2606     {
2607       if (!read_lnct (state, ddata, u, hdr_buf, hdr, formats_count,
2608                       formats, &paths[i]))
2609         {
2610           backtrace_free (state, paths,
2611                           paths_count * sizeof (const char *),
2612                           hdr_buf->error_callback, hdr_buf->data);
2613           ret = 0;
2614           goto exit;
2615         }
2616     }
2617
2618   *pcount = paths_count;
2619   *ppaths = paths;
2620
2621   ret = 1;
2622
2623  exit:
2624   if (formats != NULL)
2625     backtrace_free (state, formats,
2626                     formats_count * sizeof (struct line_header_format),
2627                     hdr_buf->error_callback, hdr_buf->data);
2628
2629   return  ret;
2630 }
2631
2632 /* Read the line header.  Return 1 on success, 0 on failure.  */
2633
2634 static int
2635 read_line_header (struct backtrace_state *state, struct dwarf_data *ddata,
2636                   struct unit *u, int is_dwarf64, struct dwarf_buf *line_buf,
2637                   struct line_header *hdr)
2638 {
2639   uint64_t hdrlen;
2640   struct dwarf_buf hdr_buf;
2641
2642   hdr->version = read_uint16 (line_buf);
2643   if (hdr->version < 2 || hdr->version > 5)
2644     {
2645       dwarf_buf_error (line_buf, "unsupported line number version", -1);
2646       return 0;
2647     }
2648
2649   if (hdr->version < 5)
2650     hdr->addrsize = u->addrsize;
2651   else
2652     {
2653       hdr->addrsize = read_byte (line_buf);
2654       /* We could support a non-zero segment_selector_size but I doubt
2655          we'll ever see it.  */
2656       if (read_byte (line_buf) != 0)
2657         {
2658           dwarf_buf_error (line_buf,
2659                            "non-zero segment_selector_size not supported",
2660                            -1);
2661           return 0;
2662         }
2663     }
2664
2665   hdrlen = read_offset (line_buf, is_dwarf64);
2666
2667   hdr_buf = *line_buf;
2668   hdr_buf.left = hdrlen;
2669
2670   if (!advance (line_buf, hdrlen))
2671     return 0;
2672
2673   hdr->min_insn_len = read_byte (&hdr_buf);
2674   if (hdr->version < 4)
2675     hdr->max_ops_per_insn = 1;
2676   else
2677     hdr->max_ops_per_insn = read_byte (&hdr_buf);
2678
2679   /* We don't care about default_is_stmt.  */
2680   read_byte (&hdr_buf);
2681
2682   hdr->line_base = read_sbyte (&hdr_buf);
2683   hdr->line_range = read_byte (&hdr_buf);
2684
2685   hdr->opcode_base = read_byte (&hdr_buf);
2686   hdr->opcode_lengths = hdr_buf.buf;
2687   if (!advance (&hdr_buf, hdr->opcode_base - 1))
2688     return 0;
2689
2690   if (hdr->version < 5)
2691     {
2692       if (!read_v2_paths (state, u, &hdr_buf, hdr))
2693         return 0;
2694     }
2695   else
2696     {
2697       if (!read_line_header_format_entries (state, ddata, u, &hdr_buf, hdr,
2698                                             &hdr->dirs_count,
2699                                             &hdr->dirs))
2700         return 0;
2701       if (!read_line_header_format_entries (state, ddata, u, &hdr_buf, hdr,
2702                                             &hdr->filenames_count,
2703                                             &hdr->filenames))
2704         return 0;
2705     }
2706
2707   if (hdr_buf.reported_underflow)
2708     return 0;
2709
2710   return 1;
2711 }
2712
2713 /* Read the line program, adding line mappings to VEC.  Return 1 on
2714    success, 0 on failure.  */
2715
2716 static int
2717 read_line_program (struct backtrace_state *state, struct dwarf_data *ddata,
2718                    const struct line_header *hdr, struct dwarf_buf *line_buf,
2719                    struct line_vector *vec)
2720 {
2721   uint64_t address;
2722   unsigned int op_index;
2723   const char *reset_filename;
2724   const char *filename;
2725   int lineno;
2726
2727   address = 0;
2728   op_index = 0;
2729   if (hdr->filenames_count > 1)
2730     reset_filename = hdr->filenames[1];
2731   else
2732     reset_filename = "";
2733   filename = reset_filename;
2734   lineno = 1;
2735   while (line_buf->left > 0)
2736     {
2737       unsigned int op;
2738
2739       op = read_byte (line_buf);
2740       if (op >= hdr->opcode_base)
2741         {
2742           unsigned int advance;
2743
2744           /* Special opcode.  */
2745           op -= hdr->opcode_base;
2746           advance = op / hdr->line_range;
2747           address += (hdr->min_insn_len * (op_index + advance)
2748                       / hdr->max_ops_per_insn);
2749           op_index = (op_index + advance) % hdr->max_ops_per_insn;
2750           lineno += hdr->line_base + (int) (op % hdr->line_range);
2751           add_line (state, ddata, address, filename, lineno,
2752                     line_buf->error_callback, line_buf->data, vec);
2753         }
2754       else if (op == DW_LNS_extended_op)
2755         {
2756           uint64_t len;
2757
2758           len = read_uleb128 (line_buf);
2759           op = read_byte (line_buf);
2760           switch (op)
2761             {
2762             case DW_LNE_end_sequence:
2763               /* FIXME: Should we mark the high PC here?  It seems
2764                  that we already have that information from the
2765                  compilation unit.  */
2766               address = 0;
2767               op_index = 0;
2768               filename = reset_filename;
2769               lineno = 1;
2770               break;
2771             case DW_LNE_set_address:
2772               address = read_address (line_buf, hdr->addrsize);
2773               break;
2774             case DW_LNE_define_file:
2775               {
2776                 const char *f;
2777                 unsigned int dir_index;
2778
2779                 f = read_string (line_buf);
2780                 if (f == NULL)
2781                   return 0;
2782                 dir_index = read_uleb128 (line_buf);
2783                 /* Ignore that time and length.  */
2784                 read_uleb128 (line_buf);
2785                 read_uleb128 (line_buf);
2786                 if (IS_ABSOLUTE_PATH (f))
2787                   filename = f;
2788                 else
2789                   {
2790                     const char *dir;
2791                     size_t dir_len;
2792                     size_t f_len;
2793                     char *p;
2794
2795                     if (dir_index < hdr->dirs_count)
2796                       dir = hdr->dirs[dir_index];
2797                     else
2798                       {
2799                         dwarf_buf_error (line_buf,
2800                                          ("invalid directory index "
2801                                           "in line number program"),
2802                                          0);
2803                         return 0;
2804                       }
2805                     dir_len = strlen (dir);
2806                     f_len = strlen (f);
2807                     p = ((char *)
2808                          backtrace_alloc (state, dir_len + f_len + 2,
2809                                           line_buf->error_callback,
2810                                           line_buf->data));
2811                     if (p == NULL)
2812                       return 0;
2813                     memcpy (p, dir, dir_len);
2814                     /* FIXME: If we are on a DOS-based file system,
2815                        and the directory or the file name use
2816                        backslashes, then we should use a backslash
2817                        here.  */
2818                     p[dir_len] = '/';
2819                     memcpy (p + dir_len + 1, f, f_len + 1);
2820                     filename = p;
2821                   }
2822               }
2823               break;
2824             case DW_LNE_set_discriminator:
2825               /* We don't care about discriminators.  */
2826               read_uleb128 (line_buf);
2827               break;
2828             default:
2829               if (!advance (line_buf, len - 1))
2830                 return 0;
2831               break;
2832             }
2833         }
2834       else
2835         {
2836           switch (op)
2837             {
2838             case DW_LNS_copy:
2839               add_line (state, ddata, address, filename, lineno,
2840                         line_buf->error_callback, line_buf->data, vec);
2841               break;
2842             case DW_LNS_advance_pc:
2843               {
2844                 uint64_t advance;
2845
2846                 advance = read_uleb128 (line_buf);
2847                 address += (hdr->min_insn_len * (op_index + advance)
2848                             / hdr->max_ops_per_insn);
2849                 op_index = (op_index + advance) % hdr->max_ops_per_insn;
2850               }
2851               break;
2852             case DW_LNS_advance_line:
2853               lineno += (int) read_sleb128 (line_buf);
2854               break;
2855             case DW_LNS_set_file:
2856               {
2857                 uint64_t fileno;
2858
2859                 fileno = read_uleb128 (line_buf);
2860                 if (fileno >= hdr->filenames_count)
2861                   {
2862                     dwarf_buf_error (line_buf,
2863                                      ("invalid file number in "
2864                                       "line number program"),
2865                                      0);
2866                     return 0;
2867                   }
2868                 filename = hdr->filenames[fileno];
2869               }
2870               break;
2871             case DW_LNS_set_column:
2872               read_uleb128 (line_buf);
2873               break;
2874             case DW_LNS_negate_stmt:
2875               break;
2876             case DW_LNS_set_basic_block:
2877               break;
2878             case DW_LNS_const_add_pc:
2879               {
2880                 unsigned int advance;
2881
2882                 op = 255 - hdr->opcode_base;
2883                 advance = op / hdr->line_range;
2884                 address += (hdr->min_insn_len * (op_index + advance)
2885                             / hdr->max_ops_per_insn);
2886                 op_index = (op_index + advance) % hdr->max_ops_per_insn;
2887               }
2888               break;
2889             case DW_LNS_fixed_advance_pc:
2890               address += read_uint16 (line_buf);
2891               op_index = 0;
2892               break;
2893             case DW_LNS_set_prologue_end:
2894               break;
2895             case DW_LNS_set_epilogue_begin:
2896               break;
2897             case DW_LNS_set_isa:
2898               read_uleb128 (line_buf);
2899               break;
2900             default:
2901               {
2902                 unsigned int i;
2903
2904                 for (i = hdr->opcode_lengths[op - 1]; i > 0; --i)
2905                   read_uleb128 (line_buf);
2906               }
2907               break;
2908             }
2909         }
2910     }
2911
2912   return 1;
2913 }
2914
2915 /* Read the line number information for a compilation unit.  Returns 1
2916    on success, 0 on failure.  */
2917
2918 static int
2919 read_line_info (struct backtrace_state *state, struct dwarf_data *ddata,
2920                 backtrace_error_callback error_callback, void *data,
2921                 struct unit *u, struct line_header *hdr, struct line **lines,
2922                 size_t *lines_count)
2923 {
2924   struct line_vector vec;
2925   struct dwarf_buf line_buf;
2926   uint64_t len;
2927   int is_dwarf64;
2928   struct line *ln;
2929
2930   memset (&vec.vec, 0, sizeof vec.vec);
2931   vec.count = 0;
2932
2933   memset (hdr, 0, sizeof *hdr);
2934
2935   if (u->lineoff != (off_t) (size_t) u->lineoff
2936       || (size_t) u->lineoff >= ddata->dwarf_sections.size[DEBUG_LINE])
2937     {
2938       error_callback (data, "unit line offset out of range", 0);
2939       goto fail;
2940     }
2941
2942   line_buf.name = ".debug_line";
2943   line_buf.start = ddata->dwarf_sections.data[DEBUG_LINE];
2944   line_buf.buf = ddata->dwarf_sections.data[DEBUG_LINE] + u->lineoff;
2945   line_buf.left = ddata->dwarf_sections.size[DEBUG_LINE] - u->lineoff;
2946   line_buf.is_bigendian = ddata->is_bigendian;
2947   line_buf.error_callback = error_callback;
2948   line_buf.data = data;
2949   line_buf.reported_underflow = 0;
2950
2951   len = read_initial_length (&line_buf, &is_dwarf64);
2952   line_buf.left = len;
2953
2954   if (!read_line_header (state, ddata, u, is_dwarf64, &line_buf, hdr))
2955     goto fail;
2956
2957   if (!read_line_program (state, ddata, hdr, &line_buf, &vec))
2958     goto fail;
2959
2960   if (line_buf.reported_underflow)
2961     goto fail;
2962
2963   if (vec.count == 0)
2964     {
2965       /* This is not a failure in the sense of a generating an error,
2966          but it is a failure in that sense that we have no useful
2967          information.  */
2968       goto fail;
2969     }
2970
2971   /* Allocate one extra entry at the end.  */
2972   ln = ((struct line *)
2973         backtrace_vector_grow (state, sizeof (struct line), error_callback,
2974                                data, &vec.vec));
2975   if (ln == NULL)
2976     goto fail;
2977   ln->pc = (uintptr_t) -1;
2978   ln->filename = NULL;
2979   ln->lineno = 0;
2980   ln->idx = 0;
2981
2982   if (!backtrace_vector_release (state, &vec.vec, error_callback, data))
2983     goto fail;
2984
2985   ln = (struct line *) vec.vec.base;
2986   backtrace_qsort (ln, vec.count, sizeof (struct line), line_compare);
2987
2988   *lines = ln;
2989   *lines_count = vec.count;
2990
2991   return 1;
2992
2993  fail:
2994   backtrace_vector_free (state, &vec.vec, error_callback, data);
2995   free_line_header (state, hdr, error_callback, data);
2996   *lines = (struct line *) (uintptr_t) -1;
2997   *lines_count = 0;
2998   return 0;
2999 }
3000
3001 static const char *read_referenced_name (struct dwarf_data *, struct unit *,
3002                                          uint64_t, backtrace_error_callback,
3003                                          void *);
3004
3005 /* Read the name of a function from a DIE referenced by ATTR with VAL.  */
3006
3007 static const char *
3008 read_referenced_name_from_attr (struct dwarf_data *ddata, struct unit *u,
3009                                 struct attr *attr, struct attr_val *val,
3010                                 backtrace_error_callback error_callback,
3011                                 void *data)
3012 {
3013   switch (attr->name)
3014     {
3015     case DW_AT_abstract_origin:
3016     case DW_AT_specification:
3017       break;
3018     default:
3019       return NULL;
3020     }
3021
3022   if (attr->form == DW_FORM_ref_sig8)
3023     return NULL;
3024
3025   if (val->encoding == ATTR_VAL_REF_INFO)
3026     {
3027       struct unit *unit
3028         = find_unit (ddata->units, ddata->units_count,
3029                      val->u.uint);
3030       if (unit == NULL)
3031         return NULL;
3032
3033       uint64_t offset = val->u.uint - unit->low_offset;
3034       return read_referenced_name (ddata, unit, offset, error_callback, data);
3035     }
3036
3037   if (val->encoding == ATTR_VAL_UINT
3038       || val->encoding == ATTR_VAL_REF_UNIT)
3039     return read_referenced_name (ddata, u, val->u.uint, error_callback, data);
3040
3041   if (val->encoding == ATTR_VAL_REF_ALT_INFO)
3042     {
3043       struct unit *alt_unit
3044         = find_unit (ddata->altlink->units, ddata->altlink->units_count,
3045                      val->u.uint);
3046       if (alt_unit == NULL)
3047         return NULL;
3048
3049       uint64_t offset = val->u.uint - alt_unit->low_offset;
3050       return read_referenced_name (ddata->altlink, alt_unit, offset,
3051                                    error_callback, data);
3052     }
3053
3054   return NULL;
3055 }
3056
3057 /* Read the name of a function from a DIE referenced by a
3058    DW_AT_abstract_origin or DW_AT_specification tag.  OFFSET is within
3059    the same compilation unit.  */
3060
3061 static const char *
3062 read_referenced_name (struct dwarf_data *ddata, struct unit *u,
3063                       uint64_t offset, backtrace_error_callback error_callback,
3064                       void *data)
3065 {
3066   struct dwarf_buf unit_buf;
3067   uint64_t code;
3068   const struct abbrev *abbrev;
3069   const char *ret;
3070   size_t i;
3071
3072   /* OFFSET is from the start of the data for this compilation unit.
3073      U->unit_data is the data, but it starts U->unit_data_offset bytes
3074      from the beginning.  */
3075
3076   if (offset < u->unit_data_offset
3077       || offset - u->unit_data_offset >= u->unit_data_len)
3078     {
3079       error_callback (data,
3080                       "abstract origin or specification out of range",
3081                       0);
3082       return NULL;
3083     }
3084
3085   offset -= u->unit_data_offset;
3086
3087   unit_buf.name = ".debug_info";
3088   unit_buf.start = ddata->dwarf_sections.data[DEBUG_INFO];
3089   unit_buf.buf = u->unit_data + offset;
3090   unit_buf.left = u->unit_data_len - offset;
3091   unit_buf.is_bigendian = ddata->is_bigendian;
3092   unit_buf.error_callback = error_callback;
3093   unit_buf.data = data;
3094   unit_buf.reported_underflow = 0;
3095
3096   code = read_uleb128 (&unit_buf);
3097   if (code == 0)
3098     {
3099       dwarf_buf_error (&unit_buf,
3100                        "invalid abstract origin or specification",
3101                        0);
3102       return NULL;
3103     }
3104
3105   abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
3106   if (abbrev == NULL)
3107     return NULL;
3108
3109   ret = NULL;
3110   for (i = 0; i < abbrev->num_attrs; ++i)
3111     {
3112       struct attr_val val;
3113
3114       if (!read_attribute (abbrev->attrs[i].form, abbrev->attrs[i].val,
3115                            &unit_buf, u->is_dwarf64, u->version, u->addrsize,
3116                            &ddata->dwarf_sections, ddata->altlink, &val))
3117         return NULL;
3118
3119       switch (abbrev->attrs[i].name)
3120         {
3121         case DW_AT_name:
3122           /* Third name preference: don't override.  A name we found in some
3123              other way, will normally be more useful -- e.g., this name is
3124              normally not mangled.  */
3125           if (ret != NULL)
3126             break;
3127           if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
3128                                ddata->is_bigendian, u->str_offsets_base,
3129                                &val, error_callback, data, &ret))
3130             return NULL;
3131           break;
3132
3133         case DW_AT_linkage_name:
3134         case DW_AT_MIPS_linkage_name:
3135           /* First name preference: override all.  */
3136           {
3137             const char *s;
3138
3139             s = NULL;
3140             if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
3141                                  ddata->is_bigendian, u->str_offsets_base,
3142                                  &val, error_callback, data, &s))
3143               return NULL;
3144             if (s != NULL)
3145               return s;
3146           }
3147           break;
3148
3149         case DW_AT_specification:
3150           /* Second name preference: override DW_AT_name, don't override
3151              DW_AT_linkage_name.  */
3152           {
3153             const char *name;
3154
3155             name = read_referenced_name_from_attr (ddata, u, &abbrev->attrs[i],
3156                                                    &val, error_callback, data);
3157             if (name != NULL)
3158               ret = name;
3159           }
3160           break;
3161
3162         default:
3163           break;
3164         }
3165     }
3166
3167   return ret;
3168 }
3169
3170 /* Add a range to a unit that maps to a function.  This is called via
3171    add_ranges.  Returns 1 on success, 0 on error.  */
3172
3173 static int
3174 add_function_range (struct backtrace_state *state, void *rdata,
3175                     uint64_t lowpc, uint64_t highpc,
3176                     backtrace_error_callback error_callback, void *data,
3177                     void *pvec)
3178 {
3179   struct function *function = (struct function *) rdata;
3180   struct function_vector *vec = (struct function_vector *) pvec;
3181   struct function_addrs *p;
3182
3183   if (vec->count > 0)
3184     {
3185       p = (struct function_addrs *) vec->vec.base + (vec->count - 1);
3186       if ((lowpc == p->high || lowpc == p->high + 1)
3187           && function == p->function)
3188         {
3189           if (highpc > p->high)
3190             p->high = highpc;
3191           return 1;
3192         }
3193     }
3194
3195   p = ((struct function_addrs *)
3196        backtrace_vector_grow (state, sizeof (struct function_addrs),
3197                               error_callback, data, &vec->vec));
3198   if (p == NULL)
3199     return 0;
3200
3201   p->low = lowpc;
3202   p->high = highpc;
3203   p->function = function;
3204
3205   ++vec->count;
3206
3207   return 1;
3208 }
3209
3210 /* Read one entry plus all its children.  Add function addresses to
3211    VEC.  Returns 1 on success, 0 on error.  */
3212
3213 static int
3214 read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata,
3215                      struct unit *u, uint64_t base, struct dwarf_buf *unit_buf,
3216                      const struct line_header *lhdr,
3217                      backtrace_error_callback error_callback, void *data,
3218                      struct function_vector *vec_function,
3219                      struct function_vector *vec_inlined)
3220 {
3221   while (unit_buf->left > 0)
3222     {
3223       uint64_t code;
3224       const struct abbrev *abbrev;
3225       int is_function;
3226       struct function *function;
3227       struct function_vector *vec;
3228       size_t i;
3229       struct pcrange pcrange;
3230       int have_linkage_name;
3231
3232       code = read_uleb128 (unit_buf);
3233       if (code == 0)
3234         return 1;
3235
3236       abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
3237       if (abbrev == NULL)
3238         return 0;
3239
3240       is_function = (abbrev->tag == DW_TAG_subprogram
3241                      || abbrev->tag == DW_TAG_entry_point
3242                      || abbrev->tag == DW_TAG_inlined_subroutine);
3243
3244       if (abbrev->tag == DW_TAG_inlined_subroutine)
3245         vec = vec_inlined;
3246       else
3247         vec = vec_function;
3248
3249       function = NULL;
3250       if (is_function)
3251         {
3252           function = ((struct function *)
3253                       backtrace_alloc (state, sizeof *function,
3254                                        error_callback, data));
3255           if (function == NULL)
3256             return 0;
3257           memset (function, 0, sizeof *function);
3258         }
3259
3260       memset (&pcrange, 0, sizeof pcrange);
3261       have_linkage_name = 0;
3262       for (i = 0; i < abbrev->num_attrs; ++i)
3263         {
3264           struct attr_val val;
3265
3266           if (!read_attribute (abbrev->attrs[i].form, abbrev->attrs[i].val,
3267                                unit_buf, u->is_dwarf64, u->version,
3268                                u->addrsize, &ddata->dwarf_sections,
3269                                ddata->altlink, &val))
3270             return 0;
3271
3272           /* The compile unit sets the base address for any address
3273              ranges in the function entries.  */
3274           if (abbrev->tag == DW_TAG_compile_unit
3275               && abbrev->attrs[i].name == DW_AT_low_pc)
3276             {
3277               if (val.encoding == ATTR_VAL_ADDRESS)
3278                 base = val.u.uint;
3279               else if (val.encoding == ATTR_VAL_ADDRESS_INDEX)
3280                 {
3281                   if (!resolve_addr_index (&ddata->dwarf_sections,
3282                                            u->addr_base, u->addrsize,
3283                                            ddata->is_bigendian, val.u.uint,
3284                                            error_callback, data, &base))
3285                     return 0;
3286                 }
3287             }
3288
3289           if (is_function)
3290             {
3291               switch (abbrev->attrs[i].name)
3292                 {
3293                 case DW_AT_call_file:
3294                   if (val.encoding == ATTR_VAL_UINT)
3295                     {
3296                       if (val.u.uint >= lhdr->filenames_count)
3297                         {
3298                           dwarf_buf_error (unit_buf,
3299                                            ("invalid file number in "
3300                                             "DW_AT_call_file attribute"),
3301                                            0);
3302                           return 0;
3303                         }
3304                       function->caller_filename = lhdr->filenames[val.u.uint];
3305                     }
3306                   break;
3307
3308                 case DW_AT_call_line:
3309                   if (val.encoding == ATTR_VAL_UINT)
3310                     function->caller_lineno = val.u.uint;
3311                   break;
3312
3313                 case DW_AT_abstract_origin:
3314                 case DW_AT_specification:
3315                   /* Second name preference: override DW_AT_name, don't override
3316                      DW_AT_linkage_name.  */
3317                   if (have_linkage_name)
3318                     break;
3319                   {
3320                     const char *name;
3321
3322                     name
3323                       = read_referenced_name_from_attr (ddata, u,
3324                                                         &abbrev->attrs[i], &val,
3325                                                         error_callback, data);
3326                     if (name != NULL)
3327                       function->name = name;
3328                   }
3329                   break;
3330
3331                 case DW_AT_name:
3332                   /* Third name preference: don't override.  */
3333                   if (function->name != NULL)
3334                     break;
3335                   if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
3336                                        ddata->is_bigendian,
3337                                        u->str_offsets_base, &val,
3338                                        error_callback, data, &function->name))
3339                     return 0;
3340                   break;
3341
3342                 case DW_AT_linkage_name:
3343                 case DW_AT_MIPS_linkage_name:
3344                   /* First name preference: override all.  */
3345                   {
3346                     const char *s;
3347
3348                     s = NULL;
3349                     if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
3350                                          ddata->is_bigendian,
3351                                          u->str_offsets_base, &val,
3352                                          error_callback, data, &s))
3353                       return 0;
3354                     if (s != NULL)
3355                       {
3356                         function->name = s;
3357                         have_linkage_name = 1;
3358                       }
3359                   }
3360                   break;
3361
3362                 case DW_AT_low_pc: case DW_AT_high_pc: case DW_AT_ranges:
3363                   update_pcrange (&abbrev->attrs[i], &val, &pcrange);
3364                   break;
3365
3366                 default:
3367                   break;
3368                 }
3369             }
3370         }
3371
3372       /* If we couldn't find a name for the function, we have no use
3373          for it.  */
3374       if (is_function && function->name == NULL)
3375         {
3376           backtrace_free (state, function, sizeof *function,
3377                           error_callback, data);
3378           is_function = 0;
3379         }
3380
3381       if (is_function)
3382         {
3383           if (pcrange.have_ranges
3384               || (pcrange.have_lowpc && pcrange.have_highpc))
3385             {
3386               if (!add_ranges (state, &ddata->dwarf_sections,
3387                                ddata->base_address, ddata->is_bigendian,
3388                                u, base, &pcrange, add_function_range,
3389                                (void *) function, error_callback, data,
3390                                (void *) vec))
3391                 return 0;
3392             }
3393           else
3394             {
3395               backtrace_free (state, function, sizeof *function,
3396                               error_callback, data);
3397               is_function = 0;
3398             }
3399         }
3400
3401       if (abbrev->has_children)
3402         {
3403           if (!is_function)
3404             {
3405               if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
3406                                         error_callback, data, vec_function,
3407                                         vec_inlined))
3408                 return 0;
3409             }
3410           else
3411             {
3412               struct function_vector fvec;
3413
3414               /* Gather any information for inlined functions in
3415                  FVEC.  */
3416
3417               memset (&fvec, 0, sizeof fvec);
3418
3419               if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
3420                                         error_callback, data, vec_function,
3421                                         &fvec))
3422                 return 0;
3423
3424               if (fvec.count > 0)
3425                 {
3426                   struct function_addrs *p;
3427                   struct function_addrs *faddrs;
3428
3429                   /* Allocate a trailing entry, but don't include it
3430                      in fvec.count.  */
3431                   p = ((struct function_addrs *)
3432                        backtrace_vector_grow (state,
3433                                               sizeof (struct function_addrs),
3434                                               error_callback, data,
3435                                               &fvec.vec));
3436                   if (p == NULL)
3437                     return 0;
3438                   p->low = 0;
3439                   --p->low;
3440                   p->high = p->low;
3441                   p->function = NULL;
3442
3443                   if (!backtrace_vector_release (state, &fvec.vec,
3444                                                  error_callback, data))
3445                     return 0;
3446
3447                   faddrs = (struct function_addrs *) fvec.vec.base;
3448                   backtrace_qsort (faddrs, fvec.count,
3449                                    sizeof (struct function_addrs),
3450                                    function_addrs_compare);
3451
3452                   function->function_addrs = faddrs;
3453                   function->function_addrs_count = fvec.count;
3454                 }
3455             }
3456         }
3457     }
3458
3459   return 1;
3460 }
3461
3462 /* Read function name information for a compilation unit.  We look
3463    through the whole unit looking for function tags.  */
3464
3465 static void
3466 read_function_info (struct backtrace_state *state, struct dwarf_data *ddata,
3467                     const struct line_header *lhdr,
3468                     backtrace_error_callback error_callback, void *data,
3469                     struct unit *u, struct function_vector *fvec,
3470                     struct function_addrs **ret_addrs,
3471                     size_t *ret_addrs_count)
3472 {
3473   struct function_vector lvec;
3474   struct function_vector *pfvec;
3475   struct dwarf_buf unit_buf;
3476   struct function_addrs *p;
3477   struct function_addrs *addrs;
3478   size_t addrs_count;
3479
3480   /* Use FVEC if it is not NULL.  Otherwise use our own vector.  */
3481   if (fvec != NULL)
3482     pfvec = fvec;
3483   else
3484     {
3485       memset (&lvec, 0, sizeof lvec);
3486       pfvec = &lvec;
3487     }
3488
3489   unit_buf.name = ".debug_info";
3490   unit_buf.start = ddata->dwarf_sections.data[DEBUG_INFO];
3491   unit_buf.buf = u->unit_data;
3492   unit_buf.left = u->unit_data_len;
3493   unit_buf.is_bigendian = ddata->is_bigendian;
3494   unit_buf.error_callback = error_callback;
3495   unit_buf.data = data;
3496   unit_buf.reported_underflow = 0;
3497
3498   while (unit_buf.left > 0)
3499     {
3500       if (!read_function_entry (state, ddata, u, 0, &unit_buf, lhdr,
3501                                 error_callback, data, pfvec, pfvec))
3502         return;
3503     }
3504
3505   if (pfvec->count == 0)
3506     return;
3507
3508   /* Allocate a trailing entry, but don't include it in
3509      pfvec->count.  */
3510   p = ((struct function_addrs *)
3511        backtrace_vector_grow (state, sizeof (struct function_addrs),
3512                               error_callback, data, &pfvec->vec));
3513   if (p == NULL)
3514     return;
3515   p->low = 0;
3516   --p->low;
3517   p->high = p->low;
3518   p->function = NULL;
3519
3520   addrs_count = pfvec->count;
3521
3522   if (fvec == NULL)
3523     {
3524       if (!backtrace_vector_release (state, &lvec.vec, error_callback, data))
3525         return;
3526       addrs = (struct function_addrs *) pfvec->vec.base;
3527     }
3528   else
3529     {
3530       /* Finish this list of addresses, but leave the remaining space in
3531          the vector available for the next function unit.  */
3532       addrs = ((struct function_addrs *)
3533                backtrace_vector_finish (state, &fvec->vec,
3534                                         error_callback, data));
3535       if (addrs == NULL)
3536         return;
3537       fvec->count = 0;
3538     }
3539
3540   backtrace_qsort (addrs, addrs_count, sizeof (struct function_addrs),
3541                    function_addrs_compare);
3542
3543   *ret_addrs = addrs;
3544   *ret_addrs_count = addrs_count;
3545 }
3546
3547 /* See if PC is inlined in FUNCTION.  If it is, print out the inlined
3548    information, and update FILENAME and LINENO for the caller.
3549    Returns whatever CALLBACK returns, or 0 to keep going.  */
3550
3551 static int
3552 report_inlined_functions (uintptr_t pc, struct function *function,
3553                           backtrace_full_callback callback, void *data,
3554                           const char **filename, int *lineno)
3555 {
3556   struct function_addrs *p;
3557   struct function_addrs *match;
3558   struct function *inlined;
3559   int ret;
3560
3561   if (function->function_addrs_count == 0)
3562     return 0;
3563
3564   /* Our search isn't safe if pc == -1, as that is the sentinel
3565      value.  */
3566   if (pc + 1 == 0)
3567     return 0;
3568
3569   p = ((struct function_addrs *)
3570        bsearch (&pc, function->function_addrs,
3571                 function->function_addrs_count,
3572                 sizeof (struct function_addrs),
3573                 function_addrs_search));
3574   if (p == NULL)
3575     return 0;
3576
3577   /* Here pc >= p->low && pc < (p + 1)->low.  The function_addrs are
3578      sorted by low, so if pc > p->low we are at the end of a range of
3579      function_addrs with the same low value.  If pc == p->low walk
3580      forward to the end of the range with that low value.  Then walk
3581      backward and use the first range that includes pc.  */
3582   while (pc == (p + 1)->low)
3583     ++p;
3584   match = NULL;
3585   while (1)
3586     {
3587       if (pc < p->high)
3588         {
3589           match = p;
3590           break;
3591         }
3592       if (p == function->function_addrs)
3593         break;
3594       if ((p - 1)->low < p->low)
3595         break;
3596       --p;
3597     }
3598   if (match == NULL)
3599     return 0;
3600
3601   /* We found an inlined call.  */
3602
3603   inlined = match->function;
3604
3605   /* Report any calls inlined into this one.  */
3606   ret = report_inlined_functions (pc, inlined, callback, data,
3607                                   filename, lineno);
3608   if (ret != 0)
3609     return ret;
3610
3611   /* Report this inlined call.  */
3612   ret = callback (data, pc, *filename, *lineno, inlined->name);
3613   if (ret != 0)
3614     return ret;
3615
3616   /* Our caller will report the caller of the inlined function; tell
3617      it the appropriate filename and line number.  */
3618   *filename = inlined->caller_filename;
3619   *lineno = inlined->caller_lineno;
3620
3621   return 0;
3622 }
3623
3624 /* Look for a PC in the DWARF mapping for one module.  On success,
3625    call CALLBACK and return whatever it returns.  On error, call
3626    ERROR_CALLBACK and return 0.  Sets *FOUND to 1 if the PC is found,
3627    0 if not.  */
3628
3629 static int
3630 dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
3631                  uintptr_t pc, backtrace_full_callback callback,
3632                  backtrace_error_callback error_callback, void *data,
3633                  int *found)
3634 {
3635   struct unit_addrs *entry;
3636   int found_entry;
3637   struct unit *u;
3638   int new_data;
3639   struct line *lines;
3640   struct line *ln;
3641   struct function_addrs *p;
3642   struct function_addrs *fmatch;
3643   struct function *function;
3644   const char *filename;
3645   int lineno;
3646   int ret;
3647
3648   *found = 1;
3649
3650   /* Find an address range that includes PC.  Our search isn't safe if
3651      PC == -1, as we use that as a sentinel value, so skip the search
3652      in that case.  */
3653   entry = (ddata->addrs_count == 0 || pc + 1 == 0
3654            ? NULL
3655            : bsearch (&pc, ddata->addrs, ddata->addrs_count,
3656                       sizeof (struct unit_addrs), unit_addrs_search));
3657
3658   if (entry == NULL)
3659     {
3660       *found = 0;
3661       return 0;
3662     }
3663
3664   /* Here pc >= entry->low && pc < (entry + 1)->low.  The unit_addrs
3665      are sorted by low, so if pc > p->low we are at the end of a range
3666      of unit_addrs with the same low value.  If pc == p->low walk
3667      forward to the end of the range with that low value.  Then walk
3668      backward and use the first range that includes pc.  */
3669   while (pc == (entry + 1)->low)
3670     ++entry;
3671   found_entry = 0;
3672   while (1)
3673     {
3674       if (pc < entry->high)
3675         {
3676           found_entry = 1;
3677           break;
3678         }
3679       if (entry == ddata->addrs)
3680         break;
3681       if ((entry - 1)->low < entry->low)
3682         break;
3683       --entry;
3684     }
3685   if (!found_entry)
3686     {
3687       *found = 0;
3688       return 0;
3689     }
3690
3691   /* We need the lines, lines_count, function_addrs,
3692      function_addrs_count fields of u.  If they are not set, we need
3693      to set them.  When running in threaded mode, we need to allow for
3694      the possibility that some other thread is setting them
3695      simultaneously.  */
3696
3697   u = entry->u;
3698   lines = u->lines;
3699
3700   /* Skip units with no useful line number information by walking
3701      backward.  Useless line number information is marked by setting
3702      lines == -1.  */
3703   while (entry > ddata->addrs
3704          && pc >= (entry - 1)->low
3705          && pc < (entry - 1)->high)
3706     {
3707       if (state->threaded)
3708         lines = (struct line *) backtrace_atomic_load_pointer (&u->lines);
3709
3710       if (lines != (struct line *) (uintptr_t) -1)
3711         break;
3712
3713       --entry;
3714
3715       u = entry->u;
3716       lines = u->lines;
3717     }
3718
3719   if (state->threaded)
3720     lines = backtrace_atomic_load_pointer (&u->lines);
3721
3722   new_data = 0;
3723   if (lines == NULL)
3724     {
3725       struct function_addrs *function_addrs;
3726       size_t function_addrs_count;
3727       struct line_header lhdr;
3728       size_t count;
3729
3730       /* We have never read the line information for this unit.  Read
3731          it now.  */
3732
3733       function_addrs = NULL;
3734       function_addrs_count = 0;
3735       if (read_line_info (state, ddata, error_callback, data, entry->u, &lhdr,
3736                           &lines, &count))
3737         {
3738           struct function_vector *pfvec;
3739
3740           /* If not threaded, reuse DDATA->FVEC for better memory
3741              consumption.  */
3742           if (state->threaded)
3743             pfvec = NULL;
3744           else
3745             pfvec = &ddata->fvec;
3746           read_function_info (state, ddata, &lhdr, error_callback, data,
3747                               entry->u, pfvec, &function_addrs,
3748                               &function_addrs_count);
3749           free_line_header (state, &lhdr, error_callback, data);
3750           new_data = 1;
3751         }
3752
3753       /* Atomically store the information we just read into the unit.
3754          If another thread is simultaneously writing, it presumably
3755          read the same information, and we don't care which one we
3756          wind up with; we just leak the other one.  We do have to
3757          write the lines field last, so that the acquire-loads above
3758          ensure that the other fields are set.  */
3759
3760       if (!state->threaded)
3761         {
3762           u->lines_count = count;
3763           u->function_addrs = function_addrs;
3764           u->function_addrs_count = function_addrs_count;
3765           u->lines = lines;
3766         }
3767       else
3768         {
3769           backtrace_atomic_store_size_t (&u->lines_count, count);
3770           backtrace_atomic_store_pointer (&u->function_addrs, function_addrs);
3771           backtrace_atomic_store_size_t (&u->function_addrs_count,
3772                                          function_addrs_count);
3773           backtrace_atomic_store_pointer (&u->lines, lines);
3774         }
3775     }
3776
3777   /* Now all fields of U have been initialized.  */
3778
3779   if (lines == (struct line *) (uintptr_t) -1)
3780     {
3781       /* If reading the line number information failed in some way,
3782          try again to see if there is a better compilation unit for
3783          this PC.  */
3784       if (new_data)
3785         return dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
3786                                 data, found);
3787       return callback (data, pc, NULL, 0, NULL);
3788     }
3789
3790   /* Search for PC within this unit.  */
3791
3792   ln = (struct line *) bsearch (&pc, lines, entry->u->lines_count,
3793                                 sizeof (struct line), line_search);
3794   if (ln == NULL)
3795     {
3796       /* The PC is between the low_pc and high_pc attributes of the
3797          compilation unit, but no entry in the line table covers it.
3798          This implies that the start of the compilation unit has no
3799          line number information.  */
3800
3801       if (entry->u->abs_filename == NULL)
3802         {
3803           const char *filename;
3804
3805           filename = entry->u->filename;
3806           if (filename != NULL
3807               && !IS_ABSOLUTE_PATH (filename)
3808               && entry->u->comp_dir != NULL)
3809             {
3810               size_t filename_len;
3811               const char *dir;
3812               size_t dir_len;
3813               char *s;
3814
3815               filename_len = strlen (filename);
3816               dir = entry->u->comp_dir;
3817               dir_len = strlen (dir);
3818               s = (char *) backtrace_alloc (state, dir_len + filename_len + 2,
3819                                             error_callback, data);
3820               if (s == NULL)
3821                 {
3822                   *found = 0;
3823                   return 0;
3824                 }
3825               memcpy (s, dir, dir_len);
3826               /* FIXME: Should use backslash if DOS file system.  */
3827               s[dir_len] = '/';
3828               memcpy (s + dir_len + 1, filename, filename_len + 1);
3829               filename = s;
3830             }
3831           entry->u->abs_filename = filename;
3832         }
3833
3834       return callback (data, pc, entry->u->abs_filename, 0, NULL);
3835     }
3836
3837   /* Search for function name within this unit.  */
3838
3839   if (entry->u->function_addrs_count == 0)
3840     return callback (data, pc, ln->filename, ln->lineno, NULL);
3841
3842   p = ((struct function_addrs *)
3843        bsearch (&pc, entry->u->function_addrs,
3844                 entry->u->function_addrs_count,
3845                 sizeof (struct function_addrs),
3846                 function_addrs_search));
3847   if (p == NULL)
3848     return callback (data, pc, ln->filename, ln->lineno, NULL);
3849
3850   /* Here pc >= p->low && pc < (p + 1)->low.  The function_addrs are
3851      sorted by low, so if pc > p->low we are at the end of a range of
3852      function_addrs with the same low value.  If pc == p->low walk
3853      forward to the end of the range with that low value.  Then walk
3854      backward and use the first range that includes pc.  */
3855   while (pc == (p + 1)->low)
3856     ++p;
3857   fmatch = NULL;
3858   while (1)
3859     {
3860       if (pc < p->high)
3861         {
3862           fmatch = p;
3863           break;
3864         }
3865       if (p == entry->u->function_addrs)
3866         break;
3867       if ((p - 1)->low < p->low)
3868         break;
3869       --p;
3870     }
3871   if (fmatch == NULL)
3872     return callback (data, pc, ln->filename, ln->lineno, NULL);
3873
3874   function = fmatch->function;
3875
3876   filename = ln->filename;
3877   lineno = ln->lineno;
3878
3879   ret = report_inlined_functions (pc, function, callback, data,
3880                                   &filename, &lineno);
3881   if (ret != 0)
3882     return ret;
3883
3884   return callback (data, pc, filename, lineno, function->name);
3885 }
3886
3887
3888 /* Return the file/line information for a PC using the DWARF mapping
3889    we built earlier.  */
3890
3891 static int
3892 dwarf_fileline (struct backtrace_state *state, uintptr_t pc,
3893                 backtrace_full_callback callback,
3894                 backtrace_error_callback error_callback, void *data)
3895 {
3896   struct dwarf_data *ddata;
3897   int found;
3898   int ret;
3899
3900   if (!state->threaded)
3901     {
3902       for (ddata = (struct dwarf_data *) state->fileline_data;
3903            ddata != NULL;
3904            ddata = ddata->next)
3905         {
3906           ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
3907                                  data, &found);
3908           if (ret != 0 || found)
3909             return ret;
3910         }
3911     }
3912   else
3913     {
3914       struct dwarf_data **pp;
3915
3916       pp = (struct dwarf_data **) (void *) &state->fileline_data;
3917       while (1)
3918         {
3919           ddata = backtrace_atomic_load_pointer (pp);
3920           if (ddata == NULL)
3921             break;
3922
3923           ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
3924                                  data, &found);
3925           if (ret != 0 || found)
3926             return ret;
3927
3928           pp = &ddata->next;
3929         }
3930     }
3931
3932   /* FIXME: See if any libraries have been dlopen'ed.  */
3933
3934   return callback (data, pc, NULL, 0, NULL);
3935 }
3936
3937 /* Initialize our data structures from the DWARF debug info for a
3938    file.  Return NULL on failure.  */
3939
3940 static struct dwarf_data *
3941 build_dwarf_data (struct backtrace_state *state,
3942                   uintptr_t base_address,
3943                   const struct dwarf_sections *dwarf_sections,
3944                   int is_bigendian,
3945                   struct dwarf_data *altlink,
3946                   backtrace_error_callback error_callback,
3947                   void *data)
3948 {
3949   struct unit_addrs_vector addrs_vec;
3950   struct unit_addrs *addrs;
3951   size_t addrs_count;
3952   struct unit_vector units_vec;
3953   struct unit **units;
3954   size_t units_count;
3955   struct dwarf_data *fdata;
3956
3957   if (!build_address_map (state, base_address, dwarf_sections, is_bigendian,
3958                           altlink, error_callback, data, &addrs_vec,
3959                           &units_vec))
3960     return NULL;
3961
3962   if (!backtrace_vector_release (state, &addrs_vec.vec, error_callback, data))
3963     return NULL;
3964   if (!backtrace_vector_release (state, &units_vec.vec, error_callback, data))
3965     return NULL;
3966   addrs = (struct unit_addrs *) addrs_vec.vec.base;
3967   units = (struct unit **) units_vec.vec.base;
3968   addrs_count = addrs_vec.count;
3969   units_count = units_vec.count;
3970   backtrace_qsort (addrs, addrs_count, sizeof (struct unit_addrs),
3971                    unit_addrs_compare);
3972   /* No qsort for units required, already sorted.  */
3973
3974   fdata = ((struct dwarf_data *)
3975            backtrace_alloc (state, sizeof (struct dwarf_data),
3976                             error_callback, data));
3977   if (fdata == NULL)
3978     return NULL;
3979
3980   fdata->next = NULL;
3981   fdata->altlink = altlink;
3982   fdata->base_address = base_address;
3983   fdata->addrs = addrs;
3984   fdata->addrs_count = addrs_count;
3985   fdata->units = units;
3986   fdata->units_count = units_count;
3987   fdata->dwarf_sections = *dwarf_sections;
3988   fdata->is_bigendian = is_bigendian;
3989   memset (&fdata->fvec, 0, sizeof fdata->fvec);
3990
3991   return fdata;
3992 }
3993
3994 /* Build our data structures from the DWARF sections for a module.
3995    Set FILELINE_FN and STATE->FILELINE_DATA.  Return 1 on success, 0
3996    on failure.  */
3997
3998 int
3999 backtrace_dwarf_add (struct backtrace_state *state,
4000                      uintptr_t base_address,
4001                      const struct dwarf_sections *dwarf_sections,
4002                      int is_bigendian,
4003                      struct dwarf_data *fileline_altlink,
4004                      backtrace_error_callback error_callback,
4005                      void *data, fileline *fileline_fn,
4006                      struct dwarf_data **fileline_entry)
4007 {
4008   struct dwarf_data *fdata;
4009
4010   fdata = build_dwarf_data (state, base_address, dwarf_sections, is_bigendian,
4011                             fileline_altlink, error_callback, data);
4012   if (fdata == NULL)
4013     return 0;
4014
4015   if (fileline_entry != NULL)
4016     *fileline_entry = fdata;
4017
4018   if (!state->threaded)
4019     {
4020       struct dwarf_data **pp;
4021
4022       for (pp = (struct dwarf_data **) (void *) &state->fileline_data;
4023            *pp != NULL;
4024            pp = &(*pp)->next)
4025         ;
4026       *pp = fdata;
4027     }
4028   else
4029     {
4030       while (1)
4031         {
4032           struct dwarf_data **pp;
4033
4034           pp = (struct dwarf_data **) (void *) &state->fileline_data;
4035
4036           while (1)
4037             {
4038               struct dwarf_data *p;
4039
4040               p = backtrace_atomic_load_pointer (pp);
4041
4042               if (p == NULL)
4043                 break;
4044
4045               pp = &p->next;
4046             }
4047
4048           if (__sync_bool_compare_and_swap (pp, NULL, fdata))
4049             break;
4050         }
4051     }
4052
4053   *fileline_fn = dwarf_fileline;
4054
4055   return 1;
4056 }