Import GCC-8 to a new vendor branch
[dragonfly.git] / contrib / gcc-8.0 / libbacktrace / dwarf.c
1 /* dwarf.c -- Get file/line information from DWARF for backtraces.
2    Copyright (C) 2012-2018 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 };
96
97 /* A single DWARF abbreviation.  */
98
99 struct abbrev
100 {
101   /* The abbrev code--the number used to refer to the abbrev.  */
102   uint64_t code;
103   /* The entry tag.  */
104   enum dwarf_tag tag;
105   /* Non-zero if this abbrev has child entries.  */
106   int has_children;
107   /* The number of attributes.  */
108   size_t num_attrs;
109   /* The attributes.  */
110   struct attr *attrs;
111 };
112
113 /* The DWARF abbreviations for a compilation unit.  This structure
114    only exists while reading the compilation unit.  Most DWARF readers
115    seem to a hash table to map abbrev ID's to abbrev entries.
116    However, we primarily care about GCC, and GCC simply issues ID's in
117    numerical order starting at 1.  So we simply keep a sorted vector,
118    and try to just look up the code.  */
119
120 struct abbrevs
121 {
122   /* The number of abbrevs in the vector.  */
123   size_t num_abbrevs;
124   /* The abbrevs, sorted by the code field.  */
125   struct abbrev *abbrevs;
126 };
127
128 /* The different kinds of attribute values.  */
129
130 enum attr_val_encoding
131 {
132   /* An address.  */
133   ATTR_VAL_ADDRESS,
134   /* A unsigned integer.  */
135   ATTR_VAL_UINT,
136   /* A sigd integer.  */
137   ATTR_VAL_SINT,
138   /* A string.  */
139   ATTR_VAL_STRING,
140   /* An offset to other data in the containing unit.  */
141   ATTR_VAL_REF_UNIT,
142   /* An offset to other data within the .dwarf_info section.  */
143   ATTR_VAL_REF_INFO,
144   /* An offset to data in some other section.  */
145   ATTR_VAL_REF_SECTION,
146   /* A type signature.  */
147   ATTR_VAL_REF_TYPE,
148   /* A block of data (not represented).  */
149   ATTR_VAL_BLOCK,
150   /* An expression (not represented).  */
151   ATTR_VAL_EXPR,
152 };
153
154 /* An attribute value.  */
155
156 struct attr_val
157 {
158   /* How the value is stored in the field u.  */
159   enum attr_val_encoding encoding;
160   union
161   {
162     /* ATTR_VAL_ADDRESS, ATTR_VAL_UINT, ATTR_VAL_REF*.  */
163     uint64_t uint;
164     /* ATTR_VAL_SINT.  */
165     int64_t sint;
166     /* ATTR_VAL_STRING.  */
167     const char *string;
168     /* ATTR_VAL_BLOCK not stored.  */
169   } u;
170 };
171
172 /* The line number program header.  */
173
174 struct line_header
175 {
176   /* The version of the line number information.  */
177   int version;
178   /* The minimum instruction length.  */
179   unsigned int min_insn_len;
180   /* The maximum number of ops per instruction.  */
181   unsigned int max_ops_per_insn;
182   /* The line base for special opcodes.  */
183   int line_base;
184   /* The line range for special opcodes.  */
185   unsigned int line_range;
186   /* The opcode base--the first special opcode.  */
187   unsigned int opcode_base;
188   /* Opcode lengths, indexed by opcode - 1.  */
189   const unsigned char *opcode_lengths;
190   /* The number of directory entries.  */
191   size_t dirs_count;
192   /* The directory entries.  */
193   const char **dirs;
194   /* The number of filenames.  */
195   size_t filenames_count;
196   /* The filenames.  */
197   const char **filenames;
198 };
199
200 /* Map a single PC value to a file/line.  We will keep a vector of
201    these sorted by PC value.  Each file/line will be correct from the
202    PC up to the PC of the next entry if there is one.  We allocate one
203    extra entry at the end so that we can use bsearch.  */
204
205 struct line
206 {
207   /* PC.  */
208   uintptr_t pc;
209   /* File name.  Many entries in the array are expected to point to
210      the same file name.  */
211   const char *filename;
212   /* Line number.  */
213   int lineno;
214   /* Index of the object in the original array read from the DWARF
215      section, before it has been sorted.  The index makes it possible
216      to use Quicksort and maintain stability.  */
217   int idx;
218 };
219
220 /* A growable vector of line number information.  This is used while
221    reading the line numbers.  */
222
223 struct line_vector
224 {
225   /* Memory.  This is an array of struct line.  */
226   struct backtrace_vector vec;
227   /* Number of valid mappings.  */
228   size_t count;
229 };
230
231 /* A function described in the debug info.  */
232
233 struct function
234 {
235   /* The name of the function.  */
236   const char *name;
237   /* If this is an inlined function, the filename of the call
238      site.  */
239   const char *caller_filename;
240   /* If this is an inlined function, the line number of the call
241      site.  */
242   int caller_lineno;
243   /* Map PC ranges to inlined functions.  */
244   struct function_addrs *function_addrs;
245   size_t function_addrs_count;
246 };
247
248 /* An address range for a function.  This maps a PC value to a
249    specific function.  */
250
251 struct function_addrs
252 {
253   /* Range is LOW <= PC < HIGH.  */
254   uint64_t low;
255   uint64_t high;
256   /* Function for this address range.  */
257   struct function *function;
258 };
259
260 /* A growable vector of function address ranges.  */
261
262 struct function_vector
263 {
264   /* Memory.  This is an array of struct function_addrs.  */
265   struct backtrace_vector vec;
266   /* Number of address ranges present.  */
267   size_t count;
268 };
269
270 /* A DWARF compilation unit.  This only holds the information we need
271    to map a PC to a file and line.  */
272
273 struct unit
274 {
275   /* The first entry for this compilation unit.  */
276   const unsigned char *unit_data;
277   /* The length of the data for this compilation unit.  */
278   size_t unit_data_len;
279   /* The offset of UNIT_DATA from the start of the information for
280      this compilation unit.  */
281   size_t unit_data_offset;
282   /* DWARF version.  */
283   int version;
284   /* Whether unit is DWARF64.  */
285   int is_dwarf64;
286   /* Address size.  */
287   int addrsize;
288   /* Offset into line number information.  */
289   off_t lineoff;
290   /* Primary source file.  */
291   const char *filename;
292   /* Compilation command working directory.  */
293   const char *comp_dir;
294   /* Absolute file name, only set if needed.  */
295   const char *abs_filename;
296   /* The abbreviations for this unit.  */
297   struct abbrevs abbrevs;
298
299   /* The fields above this point are read in during initialization and
300      may be accessed freely.  The fields below this point are read in
301      as needed, and therefore require care, as different threads may
302      try to initialize them simultaneously.  */
303
304   /* PC to line number mapping.  This is NULL if the values have not
305      been read.  This is (struct line *) -1 if there was an error
306      reading the values.  */
307   struct line *lines;
308   /* Number of entries in lines.  */
309   size_t lines_count;
310   /* PC ranges to function.  */
311   struct function_addrs *function_addrs;
312   size_t function_addrs_count;
313 };
314
315 /* An address range for a compilation unit.  This maps a PC value to a
316    specific compilation unit.  Note that we invert the representation
317    in DWARF: instead of listing the units and attaching a list of
318    ranges, we list the ranges and have each one point to the unit.
319    This lets us do a binary search to find the unit.  */
320
321 struct unit_addrs
322 {
323   /* Range is LOW <= PC < HIGH.  */
324   uint64_t low;
325   uint64_t high;
326   /* Compilation unit for this address range.  */
327   struct unit *u;
328 };
329
330 /* A growable vector of compilation unit address ranges.  */
331
332 struct unit_addrs_vector
333 {
334   /* Memory.  This is an array of struct unit_addrs.  */
335   struct backtrace_vector vec;
336   /* Number of address ranges present.  */
337   size_t count;
338 };
339
340 /* The information we need to map a PC to a file and line.  */
341
342 struct dwarf_data
343 {
344   /* The data for the next file we know about.  */
345   struct dwarf_data *next;
346   /* The base address for this file.  */
347   uintptr_t base_address;
348   /* A sorted list of address ranges.  */
349   struct unit_addrs *addrs;
350   /* Number of address ranges in list.  */
351   size_t addrs_count;
352   /* The unparsed .debug_info section.  */
353   const unsigned char *dwarf_info;
354   size_t dwarf_info_size;
355   /* The unparsed .debug_line section.  */
356   const unsigned char *dwarf_line;
357   size_t dwarf_line_size;
358   /* The unparsed .debug_ranges section.  */
359   const unsigned char *dwarf_ranges;
360   size_t dwarf_ranges_size;
361   /* The unparsed .debug_str section.  */
362   const unsigned char *dwarf_str;
363   size_t dwarf_str_size;
364   /* Whether the data is big-endian or not.  */
365   int is_bigendian;
366   /* A vector used for function addresses.  We keep this here so that
367      we can grow the vector as we read more functions.  */
368   struct function_vector fvec;
369 };
370
371 /* Report an error for a DWARF buffer.  */
372
373 static void
374 dwarf_buf_error (struct dwarf_buf *buf, const char *msg)
375 {
376   char b[200];
377
378   snprintf (b, sizeof b, "%s in %s at %d",
379             msg, buf->name, (int) (buf->buf - buf->start));
380   buf->error_callback (buf->data, b, 0);
381 }
382
383 /* Require at least COUNT bytes in BUF.  Return 1 if all is well, 0 on
384    error.  */
385
386 static int
387 require (struct dwarf_buf *buf, size_t count)
388 {
389   if (buf->left >= count)
390     return 1;
391
392   if (!buf->reported_underflow)
393     {
394       dwarf_buf_error (buf, "DWARF underflow");
395       buf->reported_underflow = 1;
396     }
397
398   return 0;
399 }
400
401 /* Advance COUNT bytes in BUF.  Return 1 if all is well, 0 on
402    error.  */
403
404 static int
405 advance (struct dwarf_buf *buf, size_t count)
406 {
407   if (!require (buf, count))
408     return 0;
409   buf->buf += count;
410   buf->left -= count;
411   return 1;
412 }
413
414 /* Read one byte from BUF and advance 1 byte.  */
415
416 static unsigned char
417 read_byte (struct dwarf_buf *buf)
418 {
419   const unsigned char *p = buf->buf;
420
421   if (!advance (buf, 1))
422     return 0;
423   return p[0];
424 }
425
426 /* Read a signed char from BUF and advance 1 byte.  */
427
428 static signed char
429 read_sbyte (struct dwarf_buf *buf)
430 {
431   const unsigned char *p = buf->buf;
432
433   if (!advance (buf, 1))
434     return 0;
435   return (*p ^ 0x80) - 0x80;
436 }
437
438 /* Read a uint16 from BUF and advance 2 bytes.  */
439
440 static uint16_t
441 read_uint16 (struct dwarf_buf *buf)
442 {
443   const unsigned char *p = buf->buf;
444
445   if (!advance (buf, 2))
446     return 0;
447   if (buf->is_bigendian)
448     return ((uint16_t) p[0] << 8) | (uint16_t) p[1];
449   else
450     return ((uint16_t) p[1] << 8) | (uint16_t) p[0];
451 }
452
453 /* Read a uint32 from BUF and advance 4 bytes.  */
454
455 static uint32_t
456 read_uint32 (struct dwarf_buf *buf)
457 {
458   const unsigned char *p = buf->buf;
459
460   if (!advance (buf, 4))
461     return 0;
462   if (buf->is_bigendian)
463     return (((uint32_t) p[0] << 24) | ((uint32_t) p[1] << 16)
464             | ((uint32_t) p[2] << 8) | (uint32_t) p[3]);
465   else
466     return (((uint32_t) p[3] << 24) | ((uint32_t) p[2] << 16)
467             | ((uint32_t) p[1] << 8) | (uint32_t) p[0]);
468 }
469
470 /* Read a uint64 from BUF and advance 8 bytes.  */
471
472 static uint64_t
473 read_uint64 (struct dwarf_buf *buf)
474 {
475   const unsigned char *p = buf->buf;
476
477   if (!advance (buf, 8))
478     return 0;
479   if (buf->is_bigendian)
480     return (((uint64_t) p[0] << 56) | ((uint64_t) p[1] << 48)
481             | ((uint64_t) p[2] << 40) | ((uint64_t) p[3] << 32)
482             | ((uint64_t) p[4] << 24) | ((uint64_t) p[5] << 16)
483             | ((uint64_t) p[6] << 8) | (uint64_t) p[7]);
484   else
485     return (((uint64_t) p[7] << 56) | ((uint64_t) p[6] << 48)
486             | ((uint64_t) p[5] << 40) | ((uint64_t) p[4] << 32)
487             | ((uint64_t) p[3] << 24) | ((uint64_t) p[2] << 16)
488             | ((uint64_t) p[1] << 8) | (uint64_t) p[0]);
489 }
490
491 /* Read an offset from BUF and advance the appropriate number of
492    bytes.  */
493
494 static uint64_t
495 read_offset (struct dwarf_buf *buf, int is_dwarf64)
496 {
497   if (is_dwarf64)
498     return read_uint64 (buf);
499   else
500     return read_uint32 (buf);
501 }
502
503 /* Read an address from BUF and advance the appropriate number of
504    bytes.  */
505
506 static uint64_t
507 read_address (struct dwarf_buf *buf, int addrsize)
508 {
509   switch (addrsize)
510     {
511     case 1:
512       return read_byte (buf);
513     case 2:
514       return read_uint16 (buf);
515     case 4:
516       return read_uint32 (buf);
517     case 8:
518       return read_uint64 (buf);
519     default:
520       dwarf_buf_error (buf, "unrecognized address size");
521       return 0;
522     }
523 }
524
525 /* Return whether a value is the highest possible address, given the
526    address size.  */
527
528 static int
529 is_highest_address (uint64_t address, int addrsize)
530 {
531   switch (addrsize)
532     {
533     case 1:
534       return address == (unsigned char) -1;
535     case 2:
536       return address == (uint16_t) -1;
537     case 4:
538       return address == (uint32_t) -1;
539     case 8:
540       return address == (uint64_t) -1;
541     default:
542       return 0;
543     }
544 }
545
546 /* Read an unsigned LEB128 number.  */
547
548 static uint64_t
549 read_uleb128 (struct dwarf_buf *buf)
550 {
551   uint64_t ret;
552   unsigned int shift;
553   int overflow;
554   unsigned char b;
555
556   ret = 0;
557   shift = 0;
558   overflow = 0;
559   do
560     {
561       const unsigned char *p;
562
563       p = buf->buf;
564       if (!advance (buf, 1))
565         return 0;
566       b = *p;
567       if (shift < 64)
568         ret |= ((uint64_t) (b & 0x7f)) << shift;
569       else if (!overflow)
570         {
571           dwarf_buf_error (buf, "LEB128 overflows uint64_t");
572           overflow = 1;
573         }
574       shift += 7;
575     }
576   while ((b & 0x80) != 0);
577
578   return ret;
579 }
580
581 /* Read a signed LEB128 number.  */
582
583 static int64_t
584 read_sleb128 (struct dwarf_buf *buf)
585 {
586   uint64_t val;
587   unsigned int shift;
588   int overflow;
589   unsigned char b;
590
591   val = 0;
592   shift = 0;
593   overflow = 0;
594   do
595     {
596       const unsigned char *p;
597
598       p = buf->buf;
599       if (!advance (buf, 1))
600         return 0;
601       b = *p;
602       if (shift < 64)
603         val |= ((uint64_t) (b & 0x7f)) << shift;
604       else if (!overflow)
605         {
606           dwarf_buf_error (buf, "signed LEB128 overflows uint64_t");
607           overflow = 1;
608         }
609       shift += 7;
610     }
611   while ((b & 0x80) != 0);
612
613   if ((b & 0x40) != 0 && shift < 64)
614     val |= ((uint64_t) -1) << shift;
615
616   return (int64_t) val;
617 }
618
619 /* Return the length of an LEB128 number.  */
620
621 static size_t
622 leb128_len (const unsigned char *p)
623 {
624   size_t ret;
625
626   ret = 1;
627   while ((*p & 0x80) != 0)
628     {
629       ++p;
630       ++ret;
631     }
632   return ret;
633 }
634
635 /* Free an abbreviations structure.  */
636
637 static void
638 free_abbrevs (struct backtrace_state *state, struct abbrevs *abbrevs,
639               backtrace_error_callback error_callback, void *data)
640 {
641   size_t i;
642
643   for (i = 0; i < abbrevs->num_abbrevs; ++i)
644     backtrace_free (state, abbrevs->abbrevs[i].attrs,
645                     abbrevs->abbrevs[i].num_attrs * sizeof (struct attr),
646                     error_callback, data);
647   backtrace_free (state, abbrevs->abbrevs,
648                   abbrevs->num_abbrevs * sizeof (struct abbrev),
649                   error_callback, data);
650   abbrevs->num_abbrevs = 0;
651   abbrevs->abbrevs = NULL;
652 }
653
654 /* Read an attribute value.  Returns 1 on success, 0 on failure.  If
655    the value can be represented as a uint64_t, sets *VAL and sets
656    *IS_VALID to 1.  We don't try to store the value of other attribute
657    forms, because we don't care about them.  */
658
659 static int
660 read_attribute (enum dwarf_form form, struct dwarf_buf *buf,
661                 int is_dwarf64, int version, int addrsize,
662                 const unsigned char *dwarf_str, size_t dwarf_str_size,
663                 struct attr_val *val)
664 {
665   /* Avoid warnings about val.u.FIELD may be used uninitialized if
666      this function is inlined.  The warnings aren't valid but can
667      occur because the different fields are set and used
668      conditionally.  */
669   memset (val, 0, sizeof *val);
670
671   switch (form)
672     {
673     case DW_FORM_addr:
674       val->encoding = ATTR_VAL_ADDRESS;
675       val->u.uint = read_address (buf, addrsize);
676       return 1;
677     case DW_FORM_block2:
678       val->encoding = ATTR_VAL_BLOCK;
679       return advance (buf, read_uint16 (buf));
680     case DW_FORM_block4:
681       val->encoding = ATTR_VAL_BLOCK;
682       return advance (buf, read_uint32 (buf));
683     case DW_FORM_data2:
684       val->encoding = ATTR_VAL_UINT;
685       val->u.uint = read_uint16 (buf);
686       return 1;
687     case DW_FORM_data4:
688       val->encoding = ATTR_VAL_UINT;
689       val->u.uint = read_uint32 (buf);
690       return 1;
691     case DW_FORM_data8:
692       val->encoding = ATTR_VAL_UINT;
693       val->u.uint = read_uint64 (buf);
694       return 1;
695     case DW_FORM_string:
696       val->encoding = ATTR_VAL_STRING;
697       val->u.string = (const char *) buf->buf;
698       return advance (buf, strnlen ((const char *) buf->buf, buf->left) + 1);
699     case DW_FORM_block:
700       val->encoding = ATTR_VAL_BLOCK;
701       return advance (buf, read_uleb128 (buf));
702     case DW_FORM_block1:
703       val->encoding = ATTR_VAL_BLOCK;
704       return advance (buf, read_byte (buf));
705     case DW_FORM_data1:
706       val->encoding = ATTR_VAL_UINT;
707       val->u.uint = read_byte (buf);
708       return 1;
709     case DW_FORM_flag:
710       val->encoding = ATTR_VAL_UINT;
711       val->u.uint = read_byte (buf);
712       return 1;
713     case DW_FORM_sdata:
714       val->encoding = ATTR_VAL_SINT;
715       val->u.sint = read_sleb128 (buf);
716       return 1;
717     case DW_FORM_strp:
718       {
719         uint64_t offset;
720
721         offset = read_offset (buf, is_dwarf64);
722         if (offset >= dwarf_str_size)
723           {
724             dwarf_buf_error (buf, "DW_FORM_strp out of range");
725             return 0;
726           }
727         val->encoding = ATTR_VAL_STRING;
728         val->u.string = (const char *) dwarf_str + offset;
729         return 1;
730       }
731     case DW_FORM_udata:
732       val->encoding = ATTR_VAL_UINT;
733       val->u.uint = read_uleb128 (buf);
734       return 1;
735     case DW_FORM_ref_addr:
736       val->encoding = ATTR_VAL_REF_INFO;
737       if (version == 2)
738         val->u.uint = read_address (buf, addrsize);
739       else
740         val->u.uint = read_offset (buf, is_dwarf64);
741       return 1;
742     case DW_FORM_ref1:
743       val->encoding = ATTR_VAL_REF_UNIT;
744       val->u.uint = read_byte (buf);
745       return 1;
746     case DW_FORM_ref2:
747       val->encoding = ATTR_VAL_REF_UNIT;
748       val->u.uint = read_uint16 (buf);
749       return 1;
750     case DW_FORM_ref4:
751       val->encoding = ATTR_VAL_REF_UNIT;
752       val->u.uint = read_uint32 (buf);
753       return 1;
754     case DW_FORM_ref8:
755       val->encoding = ATTR_VAL_REF_UNIT;
756       val->u.uint = read_uint64 (buf);
757       return 1;
758     case DW_FORM_ref_udata:
759       val->encoding = ATTR_VAL_REF_UNIT;
760       val->u.uint = read_uleb128 (buf);
761       return 1;
762     case DW_FORM_indirect:
763       {
764         uint64_t form;
765
766         form = read_uleb128 (buf);
767         return read_attribute ((enum dwarf_form) form, buf, is_dwarf64,
768                                version, addrsize, dwarf_str, dwarf_str_size,
769                                val);
770       }
771     case DW_FORM_sec_offset:
772       val->encoding = ATTR_VAL_REF_SECTION;
773       val->u.uint = read_offset (buf, is_dwarf64);
774       return 1;
775     case DW_FORM_exprloc:
776       val->encoding = ATTR_VAL_EXPR;
777       return advance (buf, read_uleb128 (buf));
778     case DW_FORM_flag_present:
779       val->encoding = ATTR_VAL_UINT;
780       val->u.uint = 1;
781       return 1;
782     case DW_FORM_ref_sig8:
783       val->encoding = ATTR_VAL_REF_TYPE;
784       val->u.uint = read_uint64 (buf);
785       return 1;
786     case DW_FORM_GNU_addr_index:
787       val->encoding = ATTR_VAL_REF_SECTION;
788       val->u.uint = read_uleb128 (buf);
789       return 1;
790     case DW_FORM_GNU_str_index:
791       val->encoding = ATTR_VAL_REF_SECTION;
792       val->u.uint = read_uleb128 (buf);
793       return 1;
794     case DW_FORM_GNU_ref_alt:
795       val->encoding = ATTR_VAL_REF_SECTION;
796       val->u.uint = read_offset (buf, is_dwarf64);
797       return 1;
798     case DW_FORM_GNU_strp_alt:
799       val->encoding = ATTR_VAL_REF_SECTION;
800       val->u.uint = read_offset (buf, is_dwarf64);
801       return 1;
802     default:
803       dwarf_buf_error (buf, "unrecognized DWARF form");
804       return 0;
805     }
806 }
807
808 /* Compare function_addrs for qsort.  When ranges are nested, make the
809    smallest one sort last.  */
810
811 static int
812 function_addrs_compare (const void *v1, const void *v2)
813 {
814   const struct function_addrs *a1 = (const struct function_addrs *) v1;
815   const struct function_addrs *a2 = (const struct function_addrs *) v2;
816
817   if (a1->low < a2->low)
818     return -1;
819   if (a1->low > a2->low)
820     return 1;
821   if (a1->high < a2->high)
822     return 1;
823   if (a1->high > a2->high)
824     return -1;
825   return strcmp (a1->function->name, a2->function->name);
826 }
827
828 /* Compare a PC against a function_addrs for bsearch.  Note that if
829    there are multiple ranges containing PC, which one will be returned
830    is unpredictable.  We compensate for that in dwarf_fileline.  */
831
832 static int
833 function_addrs_search (const void *vkey, const void *ventry)
834 {
835   const uintptr_t *key = (const uintptr_t *) vkey;
836   const struct function_addrs *entry = (const struct function_addrs *) ventry;
837   uintptr_t pc;
838
839   pc = *key;
840   if (pc < entry->low)
841     return -1;
842   else if (pc >= entry->high)
843     return 1;
844   else
845     return 0;
846 }
847
848 /* Add a new compilation unit address range to a vector.  Returns 1 on
849    success, 0 on failure.  */
850
851 static int
852 add_unit_addr (struct backtrace_state *state, uintptr_t base_address,
853                struct unit_addrs addrs,
854                backtrace_error_callback error_callback, void *data,
855                struct unit_addrs_vector *vec)
856 {
857   struct unit_addrs *p;
858
859   /* Add in the base address of the module here, so that we can look
860      up the PC directly.  */
861   addrs.low += base_address;
862   addrs.high += base_address;
863
864   /* Try to merge with the last entry.  */
865   if (vec->count > 0)
866     {
867       p = (struct unit_addrs *) vec->vec.base + (vec->count - 1);
868       if ((addrs.low == p->high || addrs.low == p->high + 1)
869           && addrs.u == p->u)
870         {
871           if (addrs.high > p->high)
872             p->high = addrs.high;
873           return 1;
874         }
875     }
876
877   p = ((struct unit_addrs *)
878        backtrace_vector_grow (state, sizeof (struct unit_addrs),
879                               error_callback, data, &vec->vec));
880   if (p == NULL)
881     return 0;
882
883   *p = addrs;
884   ++vec->count;
885   return 1;
886 }
887
888 /* Free a unit address vector.  */
889
890 static void
891 free_unit_addrs_vector (struct backtrace_state *state,
892                         struct unit_addrs_vector *vec,
893                         backtrace_error_callback error_callback, void *data)
894 {
895   struct unit_addrs *addrs;
896   size_t i;
897
898   addrs = (struct unit_addrs *) vec->vec.base;
899   for (i = 0; i < vec->count; ++i)
900     free_abbrevs (state, &addrs[i].u->abbrevs, error_callback, data);
901 }
902
903 /* Compare unit_addrs for qsort.  When ranges are nested, make the
904    smallest one sort last.  */
905
906 static int
907 unit_addrs_compare (const void *v1, const void *v2)
908 {
909   const struct unit_addrs *a1 = (const struct unit_addrs *) v1;
910   const struct unit_addrs *a2 = (const struct unit_addrs *) v2;
911
912   if (a1->low < a2->low)
913     return -1;
914   if (a1->low > a2->low)
915     return 1;
916   if (a1->high < a2->high)
917     return 1;
918   if (a1->high > a2->high)
919     return -1;
920   if (a1->u->lineoff < a2->u->lineoff)
921     return -1;
922   if (a1->u->lineoff > a2->u->lineoff)
923     return 1;
924   return 0;
925 }
926
927 /* Compare a PC against a unit_addrs for bsearch.  Note that if there
928    are multiple ranges containing PC, which one will be returned is
929    unpredictable.  We compensate for that in dwarf_fileline.  */
930
931 static int
932 unit_addrs_search (const void *vkey, const void *ventry)
933 {
934   const uintptr_t *key = (const uintptr_t *) vkey;
935   const struct unit_addrs *entry = (const struct unit_addrs *) ventry;
936   uintptr_t pc;
937
938   pc = *key;
939   if (pc < entry->low)
940     return -1;
941   else if (pc >= entry->high)
942     return 1;
943   else
944     return 0;
945 }
946
947 /* Sort the line vector by PC.  We want a stable sort here to maintain
948    the order of lines for the same PC values.  Since the sequence is
949    being sorted in place, their addresses cannot be relied on to
950    maintain stability.  That is the purpose of the index member.  */
951
952 static int
953 line_compare (const void *v1, const void *v2)
954 {
955   const struct line *ln1 = (const struct line *) v1;
956   const struct line *ln2 = (const struct line *) v2;
957
958   if (ln1->pc < ln2->pc)
959     return -1;
960   else if (ln1->pc > ln2->pc)
961     return 1;
962   else if (ln1->idx < ln2->idx)
963     return -1;
964   else if (ln1->idx > ln2->idx)
965     return 1;
966   else
967     return 0;
968 }
969
970 /* Find a PC in a line vector.  We always allocate an extra entry at
971    the end of the lines vector, so that this routine can safely look
972    at the next entry.  Note that when there are multiple mappings for
973    the same PC value, this will return the last one.  */
974
975 static int
976 line_search (const void *vkey, const void *ventry)
977 {
978   const uintptr_t *key = (const uintptr_t *) vkey;
979   const struct line *entry = (const struct line *) ventry;
980   uintptr_t pc;
981
982   pc = *key;
983   if (pc < entry->pc)
984     return -1;
985   else if (pc >= (entry + 1)->pc)
986     return 1;
987   else
988     return 0;
989 }
990
991 /* Sort the abbrevs by the abbrev code.  This function is passed to
992    both qsort and bsearch.  */
993
994 static int
995 abbrev_compare (const void *v1, const void *v2)
996 {
997   const struct abbrev *a1 = (const struct abbrev *) v1;
998   const struct abbrev *a2 = (const struct abbrev *) v2;
999
1000   if (a1->code < a2->code)
1001     return -1;
1002   else if (a1->code > a2->code)
1003     return 1;
1004   else
1005     {
1006       /* This really shouldn't happen.  It means there are two
1007          different abbrevs with the same code, and that means we don't
1008          know which one lookup_abbrev should return.  */
1009       return 0;
1010     }
1011 }
1012
1013 /* Read the abbreviation table for a compilation unit.  Returns 1 on
1014    success, 0 on failure.  */
1015
1016 static int
1017 read_abbrevs (struct backtrace_state *state, uint64_t abbrev_offset,
1018               const unsigned char *dwarf_abbrev, size_t dwarf_abbrev_size,
1019               int is_bigendian, backtrace_error_callback error_callback,
1020               void *data, struct abbrevs *abbrevs)
1021 {
1022   struct dwarf_buf abbrev_buf;
1023   struct dwarf_buf count_buf;
1024   size_t num_abbrevs;
1025
1026   abbrevs->num_abbrevs = 0;
1027   abbrevs->abbrevs = NULL;
1028
1029   if (abbrev_offset >= dwarf_abbrev_size)
1030     {
1031       error_callback (data, "abbrev offset out of range", 0);
1032       return 0;
1033     }
1034
1035   abbrev_buf.name = ".debug_abbrev";
1036   abbrev_buf.start = dwarf_abbrev;
1037   abbrev_buf.buf = dwarf_abbrev + abbrev_offset;
1038   abbrev_buf.left = dwarf_abbrev_size - abbrev_offset;
1039   abbrev_buf.is_bigendian = is_bigendian;
1040   abbrev_buf.error_callback = error_callback;
1041   abbrev_buf.data = data;
1042   abbrev_buf.reported_underflow = 0;
1043
1044   /* Count the number of abbrevs in this list.  */
1045
1046   count_buf = abbrev_buf;
1047   num_abbrevs = 0;
1048   while (read_uleb128 (&count_buf) != 0)
1049     {
1050       if (count_buf.reported_underflow)
1051         return 0;
1052       ++num_abbrevs;
1053       // Skip tag.
1054       read_uleb128 (&count_buf);
1055       // Skip has_children.
1056       read_byte (&count_buf);
1057       // Skip attributes.
1058       while (read_uleb128 (&count_buf) != 0)
1059         read_uleb128 (&count_buf);
1060       // Skip form of last attribute.
1061       read_uleb128 (&count_buf);
1062     }
1063
1064   if (count_buf.reported_underflow)
1065     return 0;
1066
1067   if (num_abbrevs == 0)
1068     return 1;
1069
1070   abbrevs->num_abbrevs = num_abbrevs;
1071   abbrevs->abbrevs = ((struct abbrev *)
1072                       backtrace_alloc (state,
1073                                        num_abbrevs * sizeof (struct abbrev),
1074                                        error_callback, data));
1075   if (abbrevs->abbrevs == NULL)
1076     return 0;
1077   memset (abbrevs->abbrevs, 0, num_abbrevs * sizeof (struct abbrev));
1078
1079   num_abbrevs = 0;
1080   while (1)
1081     {
1082       uint64_t code;
1083       struct abbrev a;
1084       size_t num_attrs;
1085       struct attr *attrs;
1086
1087       if (abbrev_buf.reported_underflow)
1088         goto fail;
1089
1090       code = read_uleb128 (&abbrev_buf);
1091       if (code == 0)
1092         break;
1093
1094       a.code = code;
1095       a.tag = (enum dwarf_tag) read_uleb128 (&abbrev_buf);
1096       a.has_children = read_byte (&abbrev_buf);
1097
1098       count_buf = abbrev_buf;
1099       num_attrs = 0;
1100       while (read_uleb128 (&count_buf) != 0)
1101         {
1102           ++num_attrs;
1103           read_uleb128 (&count_buf);
1104         }
1105
1106       if (num_attrs == 0)
1107         {
1108           attrs = NULL;
1109           read_uleb128 (&abbrev_buf);
1110           read_uleb128 (&abbrev_buf);
1111         }
1112       else
1113         {
1114           attrs = ((struct attr *)
1115                    backtrace_alloc (state, num_attrs * sizeof *attrs,
1116                                     error_callback, data));
1117           if (attrs == NULL)
1118             goto fail;
1119           num_attrs = 0;
1120           while (1)
1121             {
1122               uint64_t name;
1123               uint64_t form;
1124
1125               name = read_uleb128 (&abbrev_buf);
1126               form = read_uleb128 (&abbrev_buf);
1127               if (name == 0)
1128                 break;
1129               attrs[num_attrs].name = (enum dwarf_attribute) name;
1130               attrs[num_attrs].form = (enum dwarf_form) form;
1131               ++num_attrs;
1132             }
1133         }
1134
1135       a.num_attrs = num_attrs;
1136       a.attrs = attrs;
1137
1138       abbrevs->abbrevs[num_abbrevs] = a;
1139       ++num_abbrevs;
1140     }
1141
1142   backtrace_qsort (abbrevs->abbrevs, abbrevs->num_abbrevs,
1143                    sizeof (struct abbrev), abbrev_compare);
1144
1145   return 1;
1146
1147  fail:
1148   free_abbrevs (state, abbrevs, error_callback, data);
1149   return 0;
1150 }
1151
1152 /* Return the abbrev information for an abbrev code.  */
1153
1154 static const struct abbrev *
1155 lookup_abbrev (struct abbrevs *abbrevs, uint64_t code,
1156                backtrace_error_callback error_callback, void *data)
1157 {
1158   struct abbrev key;
1159   void *p;
1160
1161   /* With GCC, where abbrevs are simply numbered in order, we should
1162      be able to just look up the entry.  */
1163   if (code - 1 < abbrevs->num_abbrevs
1164       && abbrevs->abbrevs[code - 1].code == code)
1165     return &abbrevs->abbrevs[code - 1];
1166
1167   /* Otherwise we have to search.  */
1168   memset (&key, 0, sizeof key);
1169   key.code = code;
1170   p = bsearch (&key, abbrevs->abbrevs, abbrevs->num_abbrevs,
1171                sizeof (struct abbrev), abbrev_compare);
1172   if (p == NULL)
1173     {
1174       error_callback (data, "invalid abbreviation code", 0);
1175       return NULL;
1176     }
1177   return (const struct abbrev *) p;
1178 }
1179
1180 /* Add non-contiguous address ranges for a compilation unit.  Returns
1181    1 on success, 0 on failure.  */
1182
1183 static int
1184 add_unit_ranges (struct backtrace_state *state, uintptr_t base_address,
1185                  struct unit *u, uint64_t ranges, uint64_t base,
1186                  int is_bigendian, const unsigned char *dwarf_ranges,
1187                  size_t dwarf_ranges_size,
1188                  backtrace_error_callback error_callback, void *data,
1189                  struct unit_addrs_vector *addrs)
1190 {
1191   struct dwarf_buf ranges_buf;
1192
1193   if (ranges >= dwarf_ranges_size)
1194     {
1195       error_callback (data, "ranges offset out of range", 0);
1196       return 0;
1197     }
1198
1199   ranges_buf.name = ".debug_ranges";
1200   ranges_buf.start = dwarf_ranges;
1201   ranges_buf.buf = dwarf_ranges + ranges;
1202   ranges_buf.left = dwarf_ranges_size - ranges;
1203   ranges_buf.is_bigendian = is_bigendian;
1204   ranges_buf.error_callback = error_callback;
1205   ranges_buf.data = data;
1206   ranges_buf.reported_underflow = 0;
1207
1208   while (1)
1209     {
1210       uint64_t low;
1211       uint64_t high;
1212
1213       if (ranges_buf.reported_underflow)
1214         return 0;
1215
1216       low = read_address (&ranges_buf, u->addrsize);
1217       high = read_address (&ranges_buf, u->addrsize);
1218
1219       if (low == 0 && high == 0)
1220         break;
1221
1222       if (is_highest_address (low, u->addrsize))
1223         base = high;
1224       else
1225         {
1226           struct unit_addrs a;
1227
1228           a.low = low + base;
1229           a.high = high + base;
1230           a.u = u;
1231           if (!add_unit_addr (state, base_address, a, error_callback, data,
1232                               addrs))
1233             return 0;
1234         }
1235     }
1236
1237   if (ranges_buf.reported_underflow)
1238     return 0;
1239
1240   return 1;
1241 }
1242
1243 /* Find the address range covered by a compilation unit, reading from
1244    UNIT_BUF and adding values to U.  Returns 1 if all data could be
1245    read, 0 if there is some error.  */
1246
1247 static int
1248 find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
1249                      struct dwarf_buf *unit_buf,
1250                      const unsigned char *dwarf_str, size_t dwarf_str_size,
1251                      const unsigned char *dwarf_ranges,
1252                      size_t dwarf_ranges_size,
1253                      int is_bigendian, backtrace_error_callback error_callback,
1254                      void *data, struct unit *u,
1255                      struct unit_addrs_vector *addrs)
1256 {
1257   while (unit_buf->left > 0)
1258     {
1259       uint64_t code;
1260       const struct abbrev *abbrev;
1261       uint64_t lowpc;
1262       int have_lowpc;
1263       uint64_t highpc;
1264       int have_highpc;
1265       int highpc_is_relative;
1266       uint64_t ranges;
1267       int have_ranges;
1268       size_t i;
1269
1270       code = read_uleb128 (unit_buf);
1271       if (code == 0)
1272         return 1;
1273
1274       abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
1275       if (abbrev == NULL)
1276         return 0;
1277
1278       lowpc = 0;
1279       have_lowpc = 0;
1280       highpc = 0;
1281       have_highpc = 0;
1282       highpc_is_relative = 0;
1283       ranges = 0;
1284       have_ranges = 0;
1285       for (i = 0; i < abbrev->num_attrs; ++i)
1286         {
1287           struct attr_val val;
1288
1289           if (!read_attribute (abbrev->attrs[i].form, unit_buf,
1290                                u->is_dwarf64, u->version, u->addrsize,
1291                                dwarf_str, dwarf_str_size, &val))
1292             return 0;
1293
1294           switch (abbrev->attrs[i].name)
1295             {
1296             case DW_AT_low_pc:
1297               if (val.encoding == ATTR_VAL_ADDRESS)
1298                 {
1299                   lowpc = val.u.uint;
1300                   have_lowpc = 1;
1301                 }
1302               break;
1303
1304             case DW_AT_high_pc:
1305               if (val.encoding == ATTR_VAL_ADDRESS)
1306                 {
1307                   highpc = val.u.uint;
1308                   have_highpc = 1;
1309                 }
1310               else if (val.encoding == ATTR_VAL_UINT)
1311                 {
1312                   highpc = val.u.uint;
1313                   have_highpc = 1;
1314                   highpc_is_relative = 1;
1315                 }
1316               break;
1317
1318             case DW_AT_ranges:
1319               if (val.encoding == ATTR_VAL_UINT
1320                   || val.encoding == ATTR_VAL_REF_SECTION)
1321                 {
1322                   ranges = val.u.uint;
1323                   have_ranges = 1;
1324                 }
1325               break;
1326
1327             case DW_AT_stmt_list:
1328               if (abbrev->tag == DW_TAG_compile_unit
1329                   && (val.encoding == ATTR_VAL_UINT
1330                       || val.encoding == ATTR_VAL_REF_SECTION))
1331                 u->lineoff = val.u.uint;
1332               break;
1333
1334             case DW_AT_name:
1335               if (abbrev->tag == DW_TAG_compile_unit
1336                   && val.encoding == ATTR_VAL_STRING)
1337                 u->filename = val.u.string;
1338               break;
1339
1340             case DW_AT_comp_dir:
1341               if (abbrev->tag == DW_TAG_compile_unit
1342                   && val.encoding == ATTR_VAL_STRING)
1343                 u->comp_dir = val.u.string;
1344               break;
1345
1346             default:
1347               break;
1348             }
1349         }
1350
1351       if (abbrev->tag == DW_TAG_compile_unit
1352           || abbrev->tag == DW_TAG_subprogram)
1353         {
1354           if (have_ranges)
1355             {
1356               if (!add_unit_ranges (state, base_address, u, ranges, lowpc,
1357                                     is_bigendian, dwarf_ranges,
1358                                     dwarf_ranges_size, error_callback,
1359                                     data, addrs))
1360                 return 0;
1361             }
1362           else if (have_lowpc && have_highpc)
1363             {
1364               struct unit_addrs a;
1365
1366               if (highpc_is_relative)
1367                 highpc += lowpc;
1368               a.low = lowpc;
1369               a.high = highpc;
1370               a.u = u;
1371
1372               if (!add_unit_addr (state, base_address, a, error_callback, data,
1373                                   addrs))
1374                 return 0;
1375             }
1376
1377           /* If we found the PC range in the DW_TAG_compile_unit, we
1378              can stop now.  */
1379           if (abbrev->tag == DW_TAG_compile_unit
1380               && (have_ranges || (have_lowpc && have_highpc)))
1381             return 1;
1382         }
1383
1384       if (abbrev->has_children)
1385         {
1386           if (!find_address_ranges (state, base_address, unit_buf,
1387                                     dwarf_str, dwarf_str_size,
1388                                     dwarf_ranges, dwarf_ranges_size,
1389                                     is_bigendian, error_callback, data,
1390                                     u, addrs))
1391             return 0;
1392         }
1393     }
1394
1395   return 1;
1396 }
1397
1398 /* Build a mapping from address ranges to the compilation units where
1399    the line number information for that range can be found.  Returns 1
1400    on success, 0 on failure.  */
1401
1402 static int
1403 build_address_map (struct backtrace_state *state, uintptr_t base_address,
1404                    const unsigned char *dwarf_info, size_t dwarf_info_size,
1405                    const unsigned char *dwarf_abbrev, size_t dwarf_abbrev_size,
1406                    const unsigned char *dwarf_ranges, size_t dwarf_ranges_size,
1407                    const unsigned char *dwarf_str, size_t dwarf_str_size,
1408                    int is_bigendian, backtrace_error_callback error_callback,
1409                    void *data, struct unit_addrs_vector *addrs)
1410 {
1411   struct dwarf_buf info;
1412   struct abbrevs abbrevs;
1413
1414   memset (&addrs->vec, 0, sizeof addrs->vec);
1415   addrs->count = 0;
1416
1417   /* Read through the .debug_info section.  FIXME: Should we use the
1418      .debug_aranges section?  gdb and addr2line don't use it, but I'm
1419      not sure why.  */
1420
1421   info.name = ".debug_info";
1422   info.start = dwarf_info;
1423   info.buf = dwarf_info;
1424   info.left = dwarf_info_size;
1425   info.is_bigendian = is_bigendian;
1426   info.error_callback = error_callback;
1427   info.data = data;
1428   info.reported_underflow = 0;
1429
1430   memset (&abbrevs, 0, sizeof abbrevs);
1431   while (info.left > 0)
1432     {
1433       const unsigned char *unit_data_start;
1434       uint64_t len;
1435       int is_dwarf64;
1436       struct dwarf_buf unit_buf;
1437       int version;
1438       uint64_t abbrev_offset;
1439       int addrsize;
1440       struct unit *u;
1441
1442       if (info.reported_underflow)
1443         goto fail;
1444
1445       unit_data_start = info.buf;
1446
1447       is_dwarf64 = 0;
1448       len = read_uint32 (&info);
1449       if (len == 0xffffffff)
1450         {
1451           len = read_uint64 (&info);
1452           is_dwarf64 = 1;
1453         }
1454
1455       unit_buf = info;
1456       unit_buf.left = len;
1457
1458       if (!advance (&info, len))
1459         goto fail;
1460
1461       version = read_uint16 (&unit_buf);
1462       if (version < 2 || version > 4)
1463         {
1464           dwarf_buf_error (&unit_buf, "unrecognized DWARF version");
1465           goto fail;
1466         }
1467
1468       abbrev_offset = read_offset (&unit_buf, is_dwarf64);
1469       if (!read_abbrevs (state, abbrev_offset, dwarf_abbrev, dwarf_abbrev_size,
1470                          is_bigendian, error_callback, data, &abbrevs))
1471         goto fail;
1472
1473       addrsize = read_byte (&unit_buf);
1474
1475       u = ((struct unit *)
1476            backtrace_alloc (state, sizeof *u, error_callback, data));
1477       if (u == NULL)
1478         goto fail;
1479       u->unit_data = unit_buf.buf;
1480       u->unit_data_len = unit_buf.left;
1481       u->unit_data_offset = unit_buf.buf - unit_data_start;
1482       u->version = version;
1483       u->is_dwarf64 = is_dwarf64;
1484       u->addrsize = addrsize;
1485       u->filename = NULL;
1486       u->comp_dir = NULL;
1487       u->abs_filename = NULL;
1488       u->lineoff = 0;
1489       u->abbrevs = abbrevs;
1490       memset (&abbrevs, 0, sizeof abbrevs);
1491
1492       /* The actual line number mappings will be read as needed.  */
1493       u->lines = NULL;
1494       u->lines_count = 0;
1495       u->function_addrs = NULL;
1496       u->function_addrs_count = 0;
1497
1498       if (!find_address_ranges (state, base_address, &unit_buf,
1499                                 dwarf_str, dwarf_str_size,
1500                                 dwarf_ranges, dwarf_ranges_size,
1501                                 is_bigendian, error_callback, data,
1502                                 u, addrs))
1503         {
1504           free_abbrevs (state, &u->abbrevs, error_callback, data);
1505           backtrace_free (state, u, sizeof *u, error_callback, data);
1506           goto fail;
1507         }
1508
1509       if (unit_buf.reported_underflow)
1510         {
1511           free_abbrevs (state, &u->abbrevs, error_callback, data);
1512           backtrace_free (state, u, sizeof *u, error_callback, data);
1513           goto fail;
1514         }
1515     }
1516   if (info.reported_underflow)
1517     goto fail;
1518
1519   return 1;
1520
1521  fail:
1522   free_abbrevs (state, &abbrevs, error_callback, data);
1523   free_unit_addrs_vector (state, addrs, error_callback, data);
1524   return 0;
1525 }
1526
1527 /* Add a new mapping to the vector of line mappings that we are
1528    building.  Returns 1 on success, 0 on failure.  */
1529
1530 static int
1531 add_line (struct backtrace_state *state, struct dwarf_data *ddata,
1532           uintptr_t pc, const char *filename, int lineno,
1533           backtrace_error_callback error_callback, void *data,
1534           struct line_vector *vec)
1535 {
1536   struct line *ln;
1537
1538   /* If we are adding the same mapping, ignore it.  This can happen
1539      when using discriminators.  */
1540   if (vec->count > 0)
1541     {
1542       ln = (struct line *) vec->vec.base + (vec->count - 1);
1543       if (pc == ln->pc && filename == ln->filename && lineno == ln->lineno)
1544         return 1;
1545     }
1546
1547   ln = ((struct line *)
1548         backtrace_vector_grow (state, sizeof (struct line), error_callback,
1549                                data, &vec->vec));
1550   if (ln == NULL)
1551     return 0;
1552
1553   /* Add in the base address here, so that we can look up the PC
1554      directly.  */
1555   ln->pc = pc + ddata->base_address;
1556
1557   ln->filename = filename;
1558   ln->lineno = lineno;
1559   ln->idx = vec->count;
1560
1561   ++vec->count;
1562
1563   return 1;
1564 }
1565
1566 /* Free the line header information.  */
1567
1568 static void
1569 free_line_header (struct backtrace_state *state, struct line_header *hdr,
1570                   backtrace_error_callback error_callback, void *data)
1571 {
1572   if (hdr->dirs_count != 0)
1573     backtrace_free (state, hdr->dirs, hdr->dirs_count * sizeof (const char *),
1574                     error_callback, data);
1575   backtrace_free (state, hdr->filenames,
1576                   hdr->filenames_count * sizeof (char *),
1577                   error_callback, data);
1578 }
1579
1580 /* Read the line header.  Return 1 on success, 0 on failure.  */
1581
1582 static int
1583 read_line_header (struct backtrace_state *state, struct unit *u,
1584                   int is_dwarf64, struct dwarf_buf *line_buf,
1585                   struct line_header *hdr)
1586 {
1587   uint64_t hdrlen;
1588   struct dwarf_buf hdr_buf;
1589   const unsigned char *p;
1590   const unsigned char *pend;
1591   size_t i;
1592
1593   hdr->version = read_uint16 (line_buf);
1594   if (hdr->version < 2 || hdr->version > 4)
1595     {
1596       dwarf_buf_error (line_buf, "unsupported line number version");
1597       return 0;
1598     }
1599
1600   hdrlen = read_offset (line_buf, is_dwarf64);
1601
1602   hdr_buf = *line_buf;
1603   hdr_buf.left = hdrlen;
1604
1605   if (!advance (line_buf, hdrlen))
1606     return 0;
1607
1608   hdr->min_insn_len = read_byte (&hdr_buf);
1609   if (hdr->version < 4)
1610     hdr->max_ops_per_insn = 1;
1611   else
1612     hdr->max_ops_per_insn = read_byte (&hdr_buf);
1613
1614   /* We don't care about default_is_stmt.  */
1615   read_byte (&hdr_buf);
1616
1617   hdr->line_base = read_sbyte (&hdr_buf);
1618   hdr->line_range = read_byte (&hdr_buf);
1619
1620   hdr->opcode_base = read_byte (&hdr_buf);
1621   hdr->opcode_lengths = hdr_buf.buf;
1622   if (!advance (&hdr_buf, hdr->opcode_base - 1))
1623     return 0;
1624
1625   /* Count the number of directory entries.  */
1626   hdr->dirs_count = 0;
1627   p = hdr_buf.buf;
1628   pend = p + hdr_buf.left;
1629   while (p < pend && *p != '\0')
1630     {
1631       p += strnlen((const char *) p, pend - p) + 1;
1632       ++hdr->dirs_count;
1633     }
1634
1635   hdr->dirs = NULL;
1636   if (hdr->dirs_count != 0)
1637     {
1638       hdr->dirs = ((const char **)
1639                    backtrace_alloc (state,
1640                                     hdr->dirs_count * sizeof (const char *),
1641                                     line_buf->error_callback, line_buf->data));
1642       if (hdr->dirs == NULL)
1643         return 0;
1644     }
1645
1646   i = 0;
1647   while (*hdr_buf.buf != '\0')
1648     {
1649       if (hdr_buf.reported_underflow)
1650         return 0;
1651
1652       hdr->dirs[i] = (const char *) hdr_buf.buf;
1653       ++i;
1654       if (!advance (&hdr_buf,
1655                     strnlen ((const char *) hdr_buf.buf, hdr_buf.left) + 1))
1656         return 0;
1657     }
1658   if (!advance (&hdr_buf, 1))
1659     return 0;
1660
1661   /* Count the number of file entries.  */
1662   hdr->filenames_count = 0;
1663   p = hdr_buf.buf;
1664   pend = p + hdr_buf.left;
1665   while (p < pend && *p != '\0')
1666     {
1667       p += strnlen ((const char *) p, pend - p) + 1;
1668       p += leb128_len (p);
1669       p += leb128_len (p);
1670       p += leb128_len (p);
1671       ++hdr->filenames_count;
1672     }
1673
1674   hdr->filenames = ((const char **)
1675                     backtrace_alloc (state,
1676                                      hdr->filenames_count * sizeof (char *),
1677                                      line_buf->error_callback,
1678                                      line_buf->data));
1679   if (hdr->filenames == NULL)
1680     return 0;
1681   i = 0;
1682   while (*hdr_buf.buf != '\0')
1683     {
1684       const char *filename;
1685       uint64_t dir_index;
1686
1687       if (hdr_buf.reported_underflow)
1688         return 0;
1689
1690       filename = (const char *) hdr_buf.buf;
1691       if (!advance (&hdr_buf,
1692                     strnlen ((const char *) hdr_buf.buf, hdr_buf.left) + 1))
1693         return 0;
1694       dir_index = read_uleb128 (&hdr_buf);
1695       if (IS_ABSOLUTE_PATH (filename)
1696           || (dir_index == 0 && u->comp_dir == NULL))
1697         hdr->filenames[i] = filename;
1698       else
1699         {
1700           const char *dir;
1701           size_t dir_len;
1702           size_t filename_len;
1703           char *s;
1704
1705           if (dir_index == 0)
1706             dir = u->comp_dir;
1707           else if (dir_index - 1 < hdr->dirs_count)
1708             dir = hdr->dirs[dir_index - 1];
1709           else
1710             {
1711               dwarf_buf_error (line_buf,
1712                                ("invalid directory index in "
1713                                 "line number program header"));
1714               return 0;
1715             }
1716           dir_len = strlen (dir);
1717           filename_len = strlen (filename);
1718           s = ((char *)
1719                backtrace_alloc (state, dir_len + filename_len + 2,
1720                                 line_buf->error_callback, line_buf->data));
1721           if (s == NULL)
1722             return 0;
1723           memcpy (s, dir, dir_len);
1724           /* FIXME: If we are on a DOS-based file system, and the
1725              directory or the file name use backslashes, then we
1726              should use a backslash here.  */
1727           s[dir_len] = '/';
1728           memcpy (s + dir_len + 1, filename, filename_len + 1);
1729           hdr->filenames[i] = s;
1730         }
1731
1732       /* Ignore the modification time and size.  */
1733       read_uleb128 (&hdr_buf);
1734       read_uleb128 (&hdr_buf);
1735
1736       ++i;
1737     }
1738
1739   if (hdr_buf.reported_underflow)
1740     return 0;
1741
1742   return 1;
1743 }
1744
1745 /* Read the line program, adding line mappings to VEC.  Return 1 on
1746    success, 0 on failure.  */
1747
1748 static int
1749 read_line_program (struct backtrace_state *state, struct dwarf_data *ddata,
1750                    struct unit *u, const struct line_header *hdr,
1751                    struct dwarf_buf *line_buf, struct line_vector *vec)
1752 {
1753   uint64_t address;
1754   unsigned int op_index;
1755   const char *reset_filename;
1756   const char *filename;
1757   int lineno;
1758
1759   address = 0;
1760   op_index = 0;
1761   if (hdr->filenames_count > 0)
1762     reset_filename = hdr->filenames[0];
1763   else
1764     reset_filename = "";
1765   filename = reset_filename;
1766   lineno = 1;
1767   while (line_buf->left > 0)
1768     {
1769       unsigned int op;
1770
1771       op = read_byte (line_buf);
1772       if (op >= hdr->opcode_base)
1773         {
1774           unsigned int advance;
1775
1776           /* Special opcode.  */
1777           op -= hdr->opcode_base;
1778           advance = op / hdr->line_range;
1779           address += (hdr->min_insn_len * (op_index + advance)
1780                       / hdr->max_ops_per_insn);
1781           op_index = (op_index + advance) % hdr->max_ops_per_insn;
1782           lineno += hdr->line_base + (int) (op % hdr->line_range);
1783           add_line (state, ddata, address, filename, lineno,
1784                     line_buf->error_callback, line_buf->data, vec);
1785         }
1786       else if (op == DW_LNS_extended_op)
1787         {
1788           uint64_t len;
1789
1790           len = read_uleb128 (line_buf);
1791           op = read_byte (line_buf);
1792           switch (op)
1793             {
1794             case DW_LNE_end_sequence:
1795               /* FIXME: Should we mark the high PC here?  It seems
1796                  that we already have that information from the
1797                  compilation unit.  */
1798               address = 0;
1799               op_index = 0;
1800               filename = reset_filename;
1801               lineno = 1;
1802               break;
1803             case DW_LNE_set_address:
1804               address = read_address (line_buf, u->addrsize);
1805               break;
1806             case DW_LNE_define_file:
1807               {
1808                 const char *f;
1809                 unsigned int dir_index;
1810
1811                 f = (const char *) line_buf->buf;
1812                 if (!advance (line_buf, strnlen (f, line_buf->left) + 1))
1813                   return 0;
1814                 dir_index = read_uleb128 (line_buf);
1815                 /* Ignore that time and length.  */
1816                 read_uleb128 (line_buf);
1817                 read_uleb128 (line_buf);
1818                 if (IS_ABSOLUTE_PATH (f))
1819                   filename = f;
1820                 else
1821                   {
1822                     const char *dir;
1823                     size_t dir_len;
1824                     size_t f_len;
1825                     char *p;
1826
1827                     if (dir_index == 0)
1828                       dir = u->comp_dir;
1829                     else if (dir_index - 1 < hdr->dirs_count)
1830                       dir = hdr->dirs[dir_index - 1];
1831                     else
1832                       {
1833                         dwarf_buf_error (line_buf,
1834                                          ("invalid directory index "
1835                                           "in line number program"));
1836                         return 0;
1837                       }
1838                     dir_len = strlen (dir);
1839                     f_len = strlen (f);
1840                     p = ((char *)
1841                          backtrace_alloc (state, dir_len + f_len + 2,
1842                                           line_buf->error_callback,
1843                                           line_buf->data));
1844                     if (p == NULL)
1845                       return 0;
1846                     memcpy (p, dir, dir_len);
1847                     /* FIXME: If we are on a DOS-based file system,
1848                        and the directory or the file name use
1849                        backslashes, then we should use a backslash
1850                        here.  */
1851                     p[dir_len] = '/';
1852                     memcpy (p + dir_len + 1, f, f_len + 1);
1853                     filename = p;
1854                   }
1855               }
1856               break;
1857             case DW_LNE_set_discriminator:
1858               /* We don't care about discriminators.  */
1859               read_uleb128 (line_buf);
1860               break;
1861             default:
1862               if (!advance (line_buf, len - 1))
1863                 return 0;
1864               break;
1865             }
1866         }
1867       else
1868         {
1869           switch (op)
1870             {
1871             case DW_LNS_copy:
1872               add_line (state, ddata, address, filename, lineno,
1873                         line_buf->error_callback, line_buf->data, vec);
1874               break;
1875             case DW_LNS_advance_pc:
1876               {
1877                 uint64_t advance;
1878
1879                 advance = read_uleb128 (line_buf);
1880                 address += (hdr->min_insn_len * (op_index + advance)
1881                             / hdr->max_ops_per_insn);
1882                 op_index = (op_index + advance) % hdr->max_ops_per_insn;
1883               }
1884               break;
1885             case DW_LNS_advance_line:
1886               lineno += (int) read_sleb128 (line_buf);
1887               break;
1888             case DW_LNS_set_file:
1889               {
1890                 uint64_t fileno;
1891
1892                 fileno = read_uleb128 (line_buf);
1893                 if (fileno == 0)
1894                   filename = "";
1895                 else
1896                   {
1897                     if (fileno - 1 >= hdr->filenames_count)
1898                       {
1899                         dwarf_buf_error (line_buf,
1900                                          ("invalid file number in "
1901                                           "line number program"));
1902                         return 0;
1903                       }
1904                     filename = hdr->filenames[fileno - 1];
1905                   }
1906               }
1907               break;
1908             case DW_LNS_set_column:
1909               read_uleb128 (line_buf);
1910               break;
1911             case DW_LNS_negate_stmt:
1912               break;
1913             case DW_LNS_set_basic_block:
1914               break;
1915             case DW_LNS_const_add_pc:
1916               {
1917                 unsigned int advance;
1918
1919                 op = 255 - hdr->opcode_base;
1920                 advance = op / hdr->line_range;
1921                 address += (hdr->min_insn_len * (op_index + advance)
1922                             / hdr->max_ops_per_insn);
1923                 op_index = (op_index + advance) % hdr->max_ops_per_insn;
1924               }
1925               break;
1926             case DW_LNS_fixed_advance_pc:
1927               address += read_uint16 (line_buf);
1928               op_index = 0;
1929               break;
1930             case DW_LNS_set_prologue_end:
1931               break;
1932             case DW_LNS_set_epilogue_begin:
1933               break;
1934             case DW_LNS_set_isa:
1935               read_uleb128 (line_buf);
1936               break;
1937             default:
1938               {
1939                 unsigned int i;
1940
1941                 for (i = hdr->opcode_lengths[op - 1]; i > 0; --i)
1942                   read_uleb128 (line_buf);
1943               }
1944               break;
1945             }
1946         }
1947     }
1948
1949   return 1;
1950 }
1951
1952 /* Read the line number information for a compilation unit.  Returns 1
1953    on success, 0 on failure.  */
1954
1955 static int
1956 read_line_info (struct backtrace_state *state, struct dwarf_data *ddata,
1957                 backtrace_error_callback error_callback, void *data,
1958                 struct unit *u, struct line_header *hdr, struct line **lines,
1959                 size_t *lines_count)
1960 {
1961   struct line_vector vec;
1962   struct dwarf_buf line_buf;
1963   uint64_t len;
1964   int is_dwarf64;
1965   struct line *ln;
1966
1967   memset (&vec.vec, 0, sizeof vec.vec);
1968   vec.count = 0;
1969
1970   memset (hdr, 0, sizeof *hdr);
1971
1972   if (u->lineoff != (off_t) (size_t) u->lineoff
1973       || (size_t) u->lineoff >= ddata->dwarf_line_size)
1974     {
1975       error_callback (data, "unit line offset out of range", 0);
1976       goto fail;
1977     }
1978
1979   line_buf.name = ".debug_line";
1980   line_buf.start = ddata->dwarf_line;
1981   line_buf.buf = ddata->dwarf_line + u->lineoff;
1982   line_buf.left = ddata->dwarf_line_size - u->lineoff;
1983   line_buf.is_bigendian = ddata->is_bigendian;
1984   line_buf.error_callback = error_callback;
1985   line_buf.data = data;
1986   line_buf.reported_underflow = 0;
1987
1988   is_dwarf64 = 0;
1989   len = read_uint32 (&line_buf);
1990   if (len == 0xffffffff)
1991     {
1992       len = read_uint64 (&line_buf);
1993       is_dwarf64 = 1;
1994     }
1995   line_buf.left = len;
1996
1997   if (!read_line_header (state, u, is_dwarf64, &line_buf, hdr))
1998     goto fail;
1999
2000   if (!read_line_program (state, ddata, u, hdr, &line_buf, &vec))
2001     goto fail;
2002
2003   if (line_buf.reported_underflow)
2004     goto fail;
2005
2006   if (vec.count == 0)
2007     {
2008       /* This is not a failure in the sense of a generating an error,
2009          but it is a failure in that sense that we have no useful
2010          information.  */
2011       goto fail;
2012     }
2013
2014   /* Allocate one extra entry at the end.  */
2015   ln = ((struct line *)
2016         backtrace_vector_grow (state, sizeof (struct line), error_callback,
2017                                data, &vec.vec));
2018   if (ln == NULL)
2019     goto fail;
2020   ln->pc = (uintptr_t) -1;
2021   ln->filename = NULL;
2022   ln->lineno = 0;
2023   ln->idx = 0;
2024
2025   if (!backtrace_vector_release (state, &vec.vec, error_callback, data))
2026     goto fail;
2027
2028   ln = (struct line *) vec.vec.base;
2029   backtrace_qsort (ln, vec.count, sizeof (struct line), line_compare);
2030
2031   *lines = ln;
2032   *lines_count = vec.count;
2033
2034   return 1;
2035
2036  fail:
2037   vec.vec.alc += vec.vec.size;
2038   vec.vec.size = 0;
2039   backtrace_vector_release (state, &vec.vec, error_callback, data);
2040   free_line_header (state, hdr, error_callback, data);
2041   *lines = (struct line *) (uintptr_t) -1;
2042   *lines_count = 0;
2043   return 0;
2044 }
2045
2046 /* Read the name of a function from a DIE referenced by a
2047    DW_AT_abstract_origin or DW_AT_specification tag.  OFFSET is within
2048    the same compilation unit.  */
2049
2050 static const char *
2051 read_referenced_name (struct dwarf_data *ddata, struct unit *u,
2052                       uint64_t offset, backtrace_error_callback error_callback,
2053                       void *data)
2054 {
2055   struct dwarf_buf unit_buf;
2056   uint64_t code;
2057   const struct abbrev *abbrev;
2058   const char *ret;
2059   size_t i;
2060
2061   /* OFFSET is from the start of the data for this compilation unit.
2062      U->unit_data is the data, but it starts U->unit_data_offset bytes
2063      from the beginning.  */
2064
2065   if (offset < u->unit_data_offset
2066       || offset - u->unit_data_offset >= u->unit_data_len)
2067     {
2068       error_callback (data,
2069                       "abstract origin or specification out of range",
2070                       0);
2071       return NULL;
2072     }
2073
2074   offset -= u->unit_data_offset;
2075
2076   unit_buf.name = ".debug_info";
2077   unit_buf.start = ddata->dwarf_info;
2078   unit_buf.buf = u->unit_data + offset;
2079   unit_buf.left = u->unit_data_len - offset;
2080   unit_buf.is_bigendian = ddata->is_bigendian;
2081   unit_buf.error_callback = error_callback;
2082   unit_buf.data = data;
2083   unit_buf.reported_underflow = 0;
2084
2085   code = read_uleb128 (&unit_buf);
2086   if (code == 0)
2087     {
2088       dwarf_buf_error (&unit_buf, "invalid abstract origin or specification");
2089       return NULL;
2090     }
2091
2092   abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
2093   if (abbrev == NULL)
2094     return NULL;
2095
2096   ret = NULL;
2097   for (i = 0; i < abbrev->num_attrs; ++i)
2098     {
2099       struct attr_val val;
2100
2101       if (!read_attribute (abbrev->attrs[i].form, &unit_buf,
2102                            u->is_dwarf64, u->version, u->addrsize,
2103                            ddata->dwarf_str, ddata->dwarf_str_size,
2104                            &val))
2105         return NULL;
2106
2107       switch (abbrev->attrs[i].name)
2108         {
2109         case DW_AT_name:
2110           /* We prefer the linkage name if get one.  */
2111           if (val.encoding == ATTR_VAL_STRING)
2112             ret = val.u.string;
2113           break;
2114
2115         case DW_AT_linkage_name:
2116         case DW_AT_MIPS_linkage_name:
2117           if (val.encoding == ATTR_VAL_STRING)
2118             return val.u.string;
2119           break;
2120
2121         case DW_AT_specification:
2122           if (abbrev->attrs[i].form == DW_FORM_ref_addr
2123               || abbrev->attrs[i].form == DW_FORM_ref_sig8)
2124             {
2125               /* This refers to a specification defined in some other
2126                  compilation unit.  We can handle this case if we
2127                  must, but it's harder.  */
2128               break;
2129             }
2130           if (val.encoding == ATTR_VAL_UINT
2131               || val.encoding == ATTR_VAL_REF_UNIT)
2132             {
2133               const char *name;
2134
2135               name = read_referenced_name (ddata, u, val.u.uint,
2136                                            error_callback, data);
2137               if (name != NULL)
2138                 ret = name;
2139             }
2140           break;
2141
2142         default:
2143           break;
2144         }
2145     }
2146
2147   return ret;
2148 }
2149
2150 /* Add a single range to U that maps to function.  Returns 1 on
2151    success, 0 on error.  */
2152
2153 static int
2154 add_function_range (struct backtrace_state *state, struct dwarf_data *ddata,
2155                     struct function *function, uint64_t lowpc, uint64_t highpc,
2156                     backtrace_error_callback error_callback,
2157                     void *data, struct function_vector *vec)
2158 {
2159   struct function_addrs *p;
2160
2161   /* Add in the base address here, so that we can look up the PC
2162      directly.  */
2163   lowpc += ddata->base_address;
2164   highpc += ddata->base_address;
2165
2166   if (vec->count > 0)
2167     {
2168       p = (struct function_addrs *) vec->vec.base + vec->count - 1;
2169       if ((lowpc == p->high || lowpc == p->high + 1)
2170           && function == p->function)
2171         {
2172           if (highpc > p->high)
2173             p->high = highpc;
2174           return 1;
2175         }
2176     }
2177
2178   p = ((struct function_addrs *)
2179        backtrace_vector_grow (state, sizeof (struct function_addrs),
2180                               error_callback, data, &vec->vec));
2181   if (p == NULL)
2182     return 0;
2183
2184   p->low = lowpc;
2185   p->high = highpc;
2186   p->function = function;
2187   ++vec->count;
2188   return 1;
2189 }
2190
2191 /* Add PC ranges to U that map to FUNCTION.  Returns 1 on success, 0
2192    on error.  */
2193
2194 static int
2195 add_function_ranges (struct backtrace_state *state, struct dwarf_data *ddata,
2196                      struct unit *u, struct function *function,
2197                      uint64_t ranges, uint64_t base,
2198                      backtrace_error_callback error_callback, void *data,
2199                      struct function_vector *vec)
2200 {
2201   struct dwarf_buf ranges_buf;
2202
2203   if (ranges >= ddata->dwarf_ranges_size)
2204     {
2205       error_callback (data, "function ranges offset out of range", 0);
2206       return 0;
2207     }
2208
2209   ranges_buf.name = ".debug_ranges";
2210   ranges_buf.start = ddata->dwarf_ranges;
2211   ranges_buf.buf = ddata->dwarf_ranges + ranges;
2212   ranges_buf.left = ddata->dwarf_ranges_size - ranges;
2213   ranges_buf.is_bigendian = ddata->is_bigendian;
2214   ranges_buf.error_callback = error_callback;
2215   ranges_buf.data = data;
2216   ranges_buf.reported_underflow = 0;
2217
2218   while (1)
2219     {
2220       uint64_t low;
2221       uint64_t high;
2222
2223       if (ranges_buf.reported_underflow)
2224         return 0;
2225
2226       low = read_address (&ranges_buf, u->addrsize);
2227       high = read_address (&ranges_buf, u->addrsize);
2228
2229       if (low == 0 && high == 0)
2230         break;
2231
2232       if (is_highest_address (low, u->addrsize))
2233         base = high;
2234       else
2235         {
2236           if (!add_function_range (state, ddata, function, low + base,
2237                                    high + base, error_callback, data, vec))
2238             return 0;
2239         }
2240     }
2241
2242   if (ranges_buf.reported_underflow)
2243     return 0;
2244
2245   return 1;
2246 }
2247
2248 /* Read one entry plus all its children.  Add function addresses to
2249    VEC.  Returns 1 on success, 0 on error.  */
2250
2251 static int
2252 read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata,
2253                      struct unit *u, uint64_t base, struct dwarf_buf *unit_buf,
2254                      const struct line_header *lhdr,
2255                      backtrace_error_callback error_callback, void *data,
2256                      struct function_vector *vec_function,
2257                      struct function_vector *vec_inlined)
2258 {
2259   while (unit_buf->left > 0)
2260     {
2261       uint64_t code;
2262       const struct abbrev *abbrev;
2263       int is_function;
2264       struct function *function;
2265       struct function_vector *vec;
2266       size_t i;
2267       uint64_t lowpc;
2268       int have_lowpc;
2269       uint64_t highpc;
2270       int have_highpc;
2271       int highpc_is_relative;
2272       uint64_t ranges;
2273       int have_ranges;
2274
2275       code = read_uleb128 (unit_buf);
2276       if (code == 0)
2277         return 1;
2278
2279       abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
2280       if (abbrev == NULL)
2281         return 0;
2282
2283       is_function = (abbrev->tag == DW_TAG_subprogram
2284                      || abbrev->tag == DW_TAG_entry_point
2285                      || abbrev->tag == DW_TAG_inlined_subroutine);
2286
2287       if (abbrev->tag == DW_TAG_inlined_subroutine)
2288         vec = vec_inlined;
2289       else
2290         vec = vec_function;
2291
2292       function = NULL;
2293       if (is_function)
2294         {
2295           function = ((struct function *)
2296                       backtrace_alloc (state, sizeof *function,
2297                                        error_callback, data));
2298           if (function == NULL)
2299             return 0;
2300           memset (function, 0, sizeof *function);
2301         }
2302
2303       lowpc = 0;
2304       have_lowpc = 0;
2305       highpc = 0;
2306       have_highpc = 0;
2307       highpc_is_relative = 0;
2308       ranges = 0;
2309       have_ranges = 0;
2310       for (i = 0; i < abbrev->num_attrs; ++i)
2311         {
2312           struct attr_val val;
2313
2314           if (!read_attribute (abbrev->attrs[i].form, unit_buf,
2315                                u->is_dwarf64, u->version, u->addrsize,
2316                                ddata->dwarf_str, ddata->dwarf_str_size,
2317                                &val))
2318             return 0;
2319
2320           /* The compile unit sets the base address for any address
2321              ranges in the function entries.  */
2322           if (abbrev->tag == DW_TAG_compile_unit
2323               && abbrev->attrs[i].name == DW_AT_low_pc
2324               && val.encoding == ATTR_VAL_ADDRESS)
2325             base = val.u.uint;
2326
2327           if (is_function)
2328             {
2329               switch (abbrev->attrs[i].name)
2330                 {
2331                 case DW_AT_call_file:
2332                   if (val.encoding == ATTR_VAL_UINT)
2333                     {
2334                       if (val.u.uint == 0)
2335                         function->caller_filename = "";
2336                       else
2337                         {
2338                           if (val.u.uint - 1 >= lhdr->filenames_count)
2339                             {
2340                               dwarf_buf_error (unit_buf,
2341                                                ("invalid file number in "
2342                                                 "DW_AT_call_file attribute"));
2343                               return 0;
2344                             }
2345                           function->caller_filename =
2346                             lhdr->filenames[val.u.uint - 1];
2347                         }
2348                     }
2349                   break;
2350
2351                 case DW_AT_call_line:
2352                   if (val.encoding == ATTR_VAL_UINT)
2353                     function->caller_lineno = val.u.uint;
2354                   break;
2355
2356                 case DW_AT_abstract_origin:
2357                 case DW_AT_specification:
2358                   if (abbrev->attrs[i].form == DW_FORM_ref_addr
2359                       || abbrev->attrs[i].form == DW_FORM_ref_sig8)
2360                     {
2361                       /* This refers to an abstract origin defined in
2362                          some other compilation unit.  We can handle
2363                          this case if we must, but it's harder.  */
2364                       break;
2365                     }
2366                   if (val.encoding == ATTR_VAL_UINT
2367                       || val.encoding == ATTR_VAL_REF_UNIT)
2368                     {
2369                       const char *name;
2370
2371                       name = read_referenced_name (ddata, u, val.u.uint,
2372                                                    error_callback, data);
2373                       if (name != NULL)
2374                         function->name = name;
2375                     }
2376                   break;
2377
2378                 case DW_AT_name:
2379                   if (val.encoding == ATTR_VAL_STRING)
2380                     {
2381                       /* Don't override a name we found in some other
2382                          way, as it will normally be more
2383                          useful--e.g., this name is normally not
2384                          mangled.  */
2385                       if (function->name == NULL)
2386                         function->name = val.u.string;
2387                     }
2388                   break;
2389
2390                 case DW_AT_linkage_name:
2391                 case DW_AT_MIPS_linkage_name:
2392                   if (val.encoding == ATTR_VAL_STRING)
2393                     function->name = val.u.string;
2394                   break;
2395
2396                 case DW_AT_low_pc:
2397                   if (val.encoding == ATTR_VAL_ADDRESS)
2398                     {
2399                       lowpc = val.u.uint;
2400                       have_lowpc = 1;
2401                     }
2402                   break;
2403
2404                 case DW_AT_high_pc:
2405                   if (val.encoding == ATTR_VAL_ADDRESS)
2406                     {
2407                       highpc = val.u.uint;
2408                       have_highpc = 1;
2409                     }
2410                   else if (val.encoding == ATTR_VAL_UINT)
2411                     {
2412                       highpc = val.u.uint;
2413                       have_highpc = 1;
2414                       highpc_is_relative = 1;
2415                     }
2416                   break;
2417
2418                 case DW_AT_ranges:
2419                   if (val.encoding == ATTR_VAL_UINT
2420                       || val.encoding == ATTR_VAL_REF_SECTION)
2421                     {
2422                       ranges = val.u.uint;
2423                       have_ranges = 1;
2424                     }
2425                   break;
2426
2427                 default:
2428                   break;
2429                 }
2430             }
2431         }
2432
2433       /* If we couldn't find a name for the function, we have no use
2434          for it.  */
2435       if (is_function && function->name == NULL)
2436         {
2437           backtrace_free (state, function, sizeof *function,
2438                           error_callback, data);
2439           is_function = 0;
2440         }
2441
2442       if (is_function)
2443         {
2444           if (have_ranges)
2445             {
2446               if (!add_function_ranges (state, ddata, u, function, ranges,
2447                                         base, error_callback, data, vec))
2448                 return 0;
2449             }
2450           else if (have_lowpc && have_highpc)
2451             {
2452               if (highpc_is_relative)
2453                 highpc += lowpc;
2454               if (!add_function_range (state, ddata, function, lowpc, highpc,
2455                                        error_callback, data, vec))
2456                 return 0;
2457             }
2458           else
2459             {
2460               backtrace_free (state, function, sizeof *function,
2461                               error_callback, data);
2462               is_function = 0;
2463             }
2464         }
2465
2466       if (abbrev->has_children)
2467         {
2468           if (!is_function)
2469             {
2470               if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
2471                                         error_callback, data, vec_function,
2472                                         vec_inlined))
2473                 return 0;
2474             }
2475           else
2476             {
2477               struct function_vector fvec;
2478
2479               /* Gather any information for inlined functions in
2480                  FVEC.  */
2481
2482               memset (&fvec, 0, sizeof fvec);
2483
2484               if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
2485                                         error_callback, data, vec_function,
2486                                         &fvec))
2487                 return 0;
2488
2489               if (fvec.count > 0)
2490                 {
2491                   struct function_addrs *faddrs;
2492
2493                   if (!backtrace_vector_release (state, &fvec.vec,
2494                                                  error_callback, data))
2495                     return 0;
2496
2497                   faddrs = (struct function_addrs *) fvec.vec.base;
2498                   backtrace_qsort (faddrs, fvec.count,
2499                                    sizeof (struct function_addrs),
2500                                    function_addrs_compare);
2501
2502                   function->function_addrs = faddrs;
2503                   function->function_addrs_count = fvec.count;
2504                 }
2505             }
2506         }
2507     }
2508
2509   return 1;
2510 }
2511
2512 /* Read function name information for a compilation unit.  We look
2513    through the whole unit looking for function tags.  */
2514
2515 static void
2516 read_function_info (struct backtrace_state *state, struct dwarf_data *ddata,
2517                     const struct line_header *lhdr,
2518                     backtrace_error_callback error_callback, void *data,
2519                     struct unit *u, struct function_vector *fvec,
2520                     struct function_addrs **ret_addrs,
2521                     size_t *ret_addrs_count)
2522 {
2523   struct function_vector lvec;
2524   struct function_vector *pfvec;
2525   struct dwarf_buf unit_buf;
2526   struct function_addrs *addrs;
2527   size_t addrs_count;
2528
2529   /* Use FVEC if it is not NULL.  Otherwise use our own vector.  */
2530   if (fvec != NULL)
2531     pfvec = fvec;
2532   else
2533     {
2534       memset (&lvec, 0, sizeof lvec);
2535       pfvec = &lvec;
2536     }
2537
2538   unit_buf.name = ".debug_info";
2539   unit_buf.start = ddata->dwarf_info;
2540   unit_buf.buf = u->unit_data;
2541   unit_buf.left = u->unit_data_len;
2542   unit_buf.is_bigendian = ddata->is_bigendian;
2543   unit_buf.error_callback = error_callback;
2544   unit_buf.data = data;
2545   unit_buf.reported_underflow = 0;
2546
2547   while (unit_buf.left > 0)
2548     {
2549       if (!read_function_entry (state, ddata, u, 0, &unit_buf, lhdr,
2550                                 error_callback, data, pfvec, pfvec))
2551         return;
2552     }
2553
2554   if (pfvec->count == 0)
2555     return;
2556
2557   addrs_count = pfvec->count;
2558
2559   if (fvec == NULL)
2560     {
2561       if (!backtrace_vector_release (state, &lvec.vec, error_callback, data))
2562         return;
2563       addrs = (struct function_addrs *) pfvec->vec.base;
2564     }
2565   else
2566     {
2567       /* Finish this list of addresses, but leave the remaining space in
2568          the vector available for the next function unit.  */
2569       addrs = ((struct function_addrs *)
2570                backtrace_vector_finish (state, &fvec->vec,
2571                                         error_callback, data));
2572       if (addrs == NULL)
2573         return;
2574       fvec->count = 0;
2575     }
2576
2577   backtrace_qsort (addrs, addrs_count, sizeof (struct function_addrs),
2578                    function_addrs_compare);
2579
2580   *ret_addrs = addrs;
2581   *ret_addrs_count = addrs_count;
2582 }
2583
2584 /* See if PC is inlined in FUNCTION.  If it is, print out the inlined
2585    information, and update FILENAME and LINENO for the caller.
2586    Returns whatever CALLBACK returns, or 0 to keep going.  */
2587
2588 static int
2589 report_inlined_functions (uintptr_t pc, struct function *function,
2590                           backtrace_full_callback callback, void *data,
2591                           const char **filename, int *lineno)
2592 {
2593   struct function_addrs *function_addrs;
2594   struct function *inlined;
2595   int ret;
2596
2597   if (function->function_addrs_count == 0)
2598     return 0;
2599
2600   function_addrs = ((struct function_addrs *)
2601                     bsearch (&pc, function->function_addrs,
2602                              function->function_addrs_count,
2603                              sizeof (struct function_addrs),
2604                              function_addrs_search));
2605   if (function_addrs == NULL)
2606     return 0;
2607
2608   while (((size_t) (function_addrs - function->function_addrs) + 1
2609           < function->function_addrs_count)
2610          && pc >= (function_addrs + 1)->low
2611          && pc < (function_addrs + 1)->high)
2612     ++function_addrs;
2613
2614   /* We found an inlined call.  */
2615
2616   inlined = function_addrs->function;
2617
2618   /* Report any calls inlined into this one.  */
2619   ret = report_inlined_functions (pc, inlined, callback, data,
2620                                   filename, lineno);
2621   if (ret != 0)
2622     return ret;
2623
2624   /* Report this inlined call.  */
2625   ret = callback (data, pc, *filename, *lineno, inlined->name);
2626   if (ret != 0)
2627     return ret;
2628
2629   /* Our caller will report the caller of the inlined function; tell
2630      it the appropriate filename and line number.  */
2631   *filename = inlined->caller_filename;
2632   *lineno = inlined->caller_lineno;
2633
2634   return 0;
2635 }
2636
2637 /* Look for a PC in the DWARF mapping for one module.  On success,
2638    call CALLBACK and return whatever it returns.  On error, call
2639    ERROR_CALLBACK and return 0.  Sets *FOUND to 1 if the PC is found,
2640    0 if not.  */
2641
2642 static int
2643 dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
2644                  uintptr_t pc, backtrace_full_callback callback,
2645                  backtrace_error_callback error_callback, void *data,
2646                  int *found)
2647 {
2648   struct unit_addrs *entry;
2649   struct unit *u;
2650   int new_data;
2651   struct line *lines;
2652   struct line *ln;
2653   struct function_addrs *function_addrs;
2654   struct function *function;
2655   const char *filename;
2656   int lineno;
2657   int ret;
2658
2659   *found = 1;
2660
2661   /* Find an address range that includes PC.  */
2662   entry = bsearch (&pc, ddata->addrs, ddata->addrs_count,
2663                    sizeof (struct unit_addrs), unit_addrs_search);
2664
2665   if (entry == NULL)
2666     {
2667       *found = 0;
2668       return 0;
2669     }
2670
2671   /* If there are multiple ranges that contain PC, use the last one,
2672      in order to produce predictable results.  If we assume that all
2673      ranges are properly nested, then the last range will be the
2674      smallest one.  */
2675   while ((size_t) (entry - ddata->addrs) + 1 < ddata->addrs_count
2676          && pc >= (entry + 1)->low
2677          && pc < (entry + 1)->high)
2678     ++entry;
2679
2680   /* We need the lines, lines_count, function_addrs,
2681      function_addrs_count fields of u.  If they are not set, we need
2682      to set them.  When running in threaded mode, we need to allow for
2683      the possibility that some other thread is setting them
2684      simultaneously.  */
2685
2686   u = entry->u;
2687   lines = u->lines;
2688
2689   /* Skip units with no useful line number information by walking
2690      backward.  Useless line number information is marked by setting
2691      lines == -1.  */
2692   while (entry > ddata->addrs
2693          && pc >= (entry - 1)->low
2694          && pc < (entry - 1)->high)
2695     {
2696       if (state->threaded)
2697         lines = (struct line *) backtrace_atomic_load_pointer (&u->lines);
2698
2699       if (lines != (struct line *) (uintptr_t) -1)
2700         break;
2701
2702       --entry;
2703
2704       u = entry->u;
2705       lines = u->lines;
2706     }
2707
2708   if (state->threaded)
2709     lines = backtrace_atomic_load_pointer (&u->lines);
2710
2711   new_data = 0;
2712   if (lines == NULL)
2713     {
2714       size_t function_addrs_count;
2715       struct line_header lhdr;
2716       size_t count;
2717
2718       /* We have never read the line information for this unit.  Read
2719          it now.  */
2720
2721       function_addrs = NULL;
2722       function_addrs_count = 0;
2723       if (read_line_info (state, ddata, error_callback, data, entry->u, &lhdr,
2724                           &lines, &count))
2725         {
2726           struct function_vector *pfvec;
2727
2728           /* If not threaded, reuse DDATA->FVEC for better memory
2729              consumption.  */
2730           if (state->threaded)
2731             pfvec = NULL;
2732           else
2733             pfvec = &ddata->fvec;
2734           read_function_info (state, ddata, &lhdr, error_callback, data,
2735                               entry->u, pfvec, &function_addrs,
2736                               &function_addrs_count);
2737           free_line_header (state, &lhdr, error_callback, data);
2738           new_data = 1;
2739         }
2740
2741       /* Atomically store the information we just read into the unit.
2742          If another thread is simultaneously writing, it presumably
2743          read the same information, and we don't care which one we
2744          wind up with; we just leak the other one.  We do have to
2745          write the lines field last, so that the acquire-loads above
2746          ensure that the other fields are set.  */
2747
2748       if (!state->threaded)
2749         {
2750           u->lines_count = count;
2751           u->function_addrs = function_addrs;
2752           u->function_addrs_count = function_addrs_count;
2753           u->lines = lines;
2754         }
2755       else
2756         {
2757           backtrace_atomic_store_size_t (&u->lines_count, count);
2758           backtrace_atomic_store_pointer (&u->function_addrs, function_addrs);
2759           backtrace_atomic_store_size_t (&u->function_addrs_count,
2760                                          function_addrs_count);
2761           backtrace_atomic_store_pointer (&u->lines, lines);
2762         }
2763     }
2764
2765   /* Now all fields of U have been initialized.  */
2766
2767   if (lines == (struct line *) (uintptr_t) -1)
2768     {
2769       /* If reading the line number information failed in some way,
2770          try again to see if there is a better compilation unit for
2771          this PC.  */
2772       if (new_data)
2773         return dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
2774                                 data, found);
2775       return callback (data, pc, NULL, 0, NULL);
2776     }
2777
2778   /* Search for PC within this unit.  */
2779
2780   ln = (struct line *) bsearch (&pc, lines, entry->u->lines_count,
2781                                 sizeof (struct line), line_search);
2782   if (ln == NULL)
2783     {
2784       /* The PC is between the low_pc and high_pc attributes of the
2785          compilation unit, but no entry in the line table covers it.
2786          This implies that the start of the compilation unit has no
2787          line number information.  */
2788
2789       if (entry->u->abs_filename == NULL)
2790         {
2791           const char *filename;
2792
2793           filename = entry->u->filename;
2794           if (filename != NULL
2795               && !IS_ABSOLUTE_PATH (filename)
2796               && entry->u->comp_dir != NULL)
2797             {
2798               size_t filename_len;
2799               const char *dir;
2800               size_t dir_len;
2801               char *s;
2802
2803               filename_len = strlen (filename);
2804               dir = entry->u->comp_dir;
2805               dir_len = strlen (dir);
2806               s = (char *) backtrace_alloc (state, dir_len + filename_len + 2,
2807                                             error_callback, data);
2808               if (s == NULL)
2809                 {
2810                   *found = 0;
2811                   return 0;
2812                 }
2813               memcpy (s, dir, dir_len);
2814               /* FIXME: Should use backslash if DOS file system.  */
2815               s[dir_len] = '/';
2816               memcpy (s + dir_len + 1, filename, filename_len + 1);
2817               filename = s;
2818             }
2819           entry->u->abs_filename = filename;
2820         }
2821
2822       return callback (data, pc, entry->u->abs_filename, 0, NULL);
2823     }
2824
2825   /* Search for function name within this unit.  */
2826
2827   if (entry->u->function_addrs_count == 0)
2828     return callback (data, pc, ln->filename, ln->lineno, NULL);
2829
2830   function_addrs = ((struct function_addrs *)
2831                     bsearch (&pc, entry->u->function_addrs,
2832                              entry->u->function_addrs_count,
2833                              sizeof (struct function_addrs),
2834                              function_addrs_search));
2835   if (function_addrs == NULL)
2836     return callback (data, pc, ln->filename, ln->lineno, NULL);
2837
2838   /* If there are multiple function ranges that contain PC, use the
2839      last one, in order to produce predictable results.  */
2840
2841   while (((size_t) (function_addrs - entry->u->function_addrs + 1)
2842           < entry->u->function_addrs_count)
2843          && pc >= (function_addrs + 1)->low
2844          && pc < (function_addrs + 1)->high)
2845     ++function_addrs;
2846
2847   function = function_addrs->function;
2848
2849   filename = ln->filename;
2850   lineno = ln->lineno;
2851
2852   ret = report_inlined_functions (pc, function, callback, data,
2853                                   &filename, &lineno);
2854   if (ret != 0)
2855     return ret;
2856
2857   return callback (data, pc, filename, lineno, function->name);
2858 }
2859
2860
2861 /* Return the file/line information for a PC using the DWARF mapping
2862    we built earlier.  */
2863
2864 static int
2865 dwarf_fileline (struct backtrace_state *state, uintptr_t pc,
2866                 backtrace_full_callback callback,
2867                 backtrace_error_callback error_callback, void *data)
2868 {
2869   struct dwarf_data *ddata;
2870   int found;
2871   int ret;
2872
2873   if (!state->threaded)
2874     {
2875       for (ddata = (struct dwarf_data *) state->fileline_data;
2876            ddata != NULL;
2877            ddata = ddata->next)
2878         {
2879           ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
2880                                  data, &found);
2881           if (ret != 0 || found)
2882             return ret;
2883         }
2884     }
2885   else
2886     {
2887       struct dwarf_data **pp;
2888
2889       pp = (struct dwarf_data **) (void *) &state->fileline_data;
2890       while (1)
2891         {
2892           ddata = backtrace_atomic_load_pointer (pp);
2893           if (ddata == NULL)
2894             break;
2895
2896           ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
2897                                  data, &found);
2898           if (ret != 0 || found)
2899             return ret;
2900
2901           pp = &ddata->next;
2902         }
2903     }
2904
2905   /* FIXME: See if any libraries have been dlopen'ed.  */
2906
2907   return callback (data, pc, NULL, 0, NULL);
2908 }
2909
2910 /* Initialize our data structures from the DWARF debug info for a
2911    file.  Return NULL on failure.  */
2912
2913 static struct dwarf_data *
2914 build_dwarf_data (struct backtrace_state *state,
2915                   uintptr_t base_address,
2916                   const unsigned char *dwarf_info,
2917                   size_t dwarf_info_size,
2918                   const unsigned char *dwarf_line,
2919                   size_t dwarf_line_size,
2920                   const unsigned char *dwarf_abbrev,
2921                   size_t dwarf_abbrev_size,
2922                   const unsigned char *dwarf_ranges,
2923                   size_t dwarf_ranges_size,
2924                   const unsigned char *dwarf_str,
2925                   size_t dwarf_str_size,
2926                   int is_bigendian,
2927                   backtrace_error_callback error_callback,
2928                   void *data)
2929 {
2930   struct unit_addrs_vector addrs_vec;
2931   struct unit_addrs *addrs;
2932   size_t addrs_count;
2933   struct dwarf_data *fdata;
2934
2935   if (!build_address_map (state, base_address, dwarf_info, dwarf_info_size,
2936                           dwarf_abbrev, dwarf_abbrev_size, dwarf_ranges,
2937                           dwarf_ranges_size, dwarf_str, dwarf_str_size,
2938                           is_bigendian, error_callback, data, &addrs_vec))
2939     return NULL;
2940
2941   if (!backtrace_vector_release (state, &addrs_vec.vec, error_callback, data))
2942     return NULL;
2943   addrs = (struct unit_addrs *) addrs_vec.vec.base;
2944   addrs_count = addrs_vec.count;
2945   backtrace_qsort (addrs, addrs_count, sizeof (struct unit_addrs),
2946                    unit_addrs_compare);
2947
2948   fdata = ((struct dwarf_data *)
2949            backtrace_alloc (state, sizeof (struct dwarf_data),
2950                             error_callback, data));
2951   if (fdata == NULL)
2952     return NULL;
2953
2954   fdata->next = NULL;
2955   fdata->base_address = base_address;
2956   fdata->addrs = addrs;
2957   fdata->addrs_count = addrs_count;
2958   fdata->dwarf_info = dwarf_info;
2959   fdata->dwarf_info_size = dwarf_info_size;
2960   fdata->dwarf_line = dwarf_line;
2961   fdata->dwarf_line_size = dwarf_line_size;
2962   fdata->dwarf_ranges = dwarf_ranges;
2963   fdata->dwarf_ranges_size = dwarf_ranges_size;
2964   fdata->dwarf_str = dwarf_str;
2965   fdata->dwarf_str_size = dwarf_str_size;
2966   fdata->is_bigendian = is_bigendian;
2967   memset (&fdata->fvec, 0, sizeof fdata->fvec);
2968
2969   return fdata;
2970 }
2971
2972 /* Build our data structures from the DWARF sections for a module.
2973    Set FILELINE_FN and STATE->FILELINE_DATA.  Return 1 on success, 0
2974    on failure.  */
2975
2976 int
2977 backtrace_dwarf_add (struct backtrace_state *state,
2978                      uintptr_t base_address,
2979                      const unsigned char *dwarf_info,
2980                      size_t dwarf_info_size,
2981                      const unsigned char *dwarf_line,
2982                      size_t dwarf_line_size,
2983                      const unsigned char *dwarf_abbrev,
2984                      size_t dwarf_abbrev_size,
2985                      const unsigned char *dwarf_ranges,
2986                      size_t dwarf_ranges_size,
2987                      const unsigned char *dwarf_str,
2988                      size_t dwarf_str_size,
2989                      int is_bigendian,
2990                      backtrace_error_callback error_callback,
2991                      void *data, fileline *fileline_fn)
2992 {
2993   struct dwarf_data *fdata;
2994
2995   fdata = build_dwarf_data (state, base_address, dwarf_info, dwarf_info_size,
2996                             dwarf_line, dwarf_line_size, dwarf_abbrev,
2997                             dwarf_abbrev_size, dwarf_ranges, dwarf_ranges_size,
2998                             dwarf_str, dwarf_str_size, is_bigendian,
2999                             error_callback, data);
3000   if (fdata == NULL)
3001     return 0;
3002
3003   if (!state->threaded)
3004     {
3005       struct dwarf_data **pp;
3006
3007       for (pp = (struct dwarf_data **) (void *) &state->fileline_data;
3008            *pp != NULL;
3009            pp = &(*pp)->next)
3010         ;
3011       *pp = fdata;
3012     }
3013   else
3014     {
3015       while (1)
3016         {
3017           struct dwarf_data **pp;
3018
3019           pp = (struct dwarf_data **) (void *) &state->fileline_data;
3020
3021           while (1)
3022             {
3023               struct dwarf_data *p;
3024
3025               p = backtrace_atomic_load_pointer (pp);
3026
3027               if (p == NULL)
3028                 break;
3029
3030               pp = &p->next;
3031             }
3032
3033           if (__sync_bool_compare_and_swap (pp, NULL, fdata))
3034             break;
3035         }
3036     }
3037
3038   *fileline_fn = dwarf_fileline;
3039
3040   return 1;
3041 }