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