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