Home | History | Annotate | Line # | Download | only in libbacktrace
dwarf.c revision 1.1.1.9
      1 /* dwarf.c -- Get file/line information from DWARF for backtraces.
      2    Copyright (C) 2012-2020 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)
    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, 0);
    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");
    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");
    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");
    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");
    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");
    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");
    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 	    return 0;
    885 	  }
    886 	return read_attribute ((enum dwarf_form) form, 0, buf, is_dwarf64,
    887 			       version, addrsize, dwarf_sections, altlink,
    888 			       val);
    889       }
    890     case DW_FORM_sec_offset:
    891       val->encoding = ATTR_VAL_REF_SECTION;
    892       val->u.uint = read_offset (buf, is_dwarf64);
    893       return 1;
    894     case DW_FORM_exprloc:
    895       val->encoding = ATTR_VAL_EXPR;
    896       return advance (buf, read_uleb128 (buf));
    897     case DW_FORM_flag_present:
    898       val->encoding = ATTR_VAL_UINT;
    899       val->u.uint = 1;
    900       return 1;
    901     case DW_FORM_ref_sig8:
    902       val->encoding = ATTR_VAL_REF_TYPE;
    903       val->u.uint = read_uint64 (buf);
    904       return 1;
    905     case DW_FORM_strx: case DW_FORM_strx1: case DW_FORM_strx2:
    906     case DW_FORM_strx3: case DW_FORM_strx4:
    907       {
    908 	uint64_t offset;
    909 
    910 	switch (form)
    911 	  {
    912 	  case DW_FORM_strx:
    913 	    offset = read_uleb128 (buf);
    914 	    break;
    915 	  case DW_FORM_strx1:
    916 	    offset = read_byte (buf);
    917 	    break;
    918 	  case DW_FORM_strx2:
    919 	    offset = read_uint16 (buf);
    920 	    break;
    921 	  case DW_FORM_strx3:
    922 	    offset = read_uint24 (buf);
    923 	    break;
    924 	  case DW_FORM_strx4:
    925 	    offset = read_uint32 (buf);
    926 	    break;
    927 	  default:
    928 	    /* This case can't happen.  */
    929 	    return 0;
    930 	  }
    931 	val->encoding = ATTR_VAL_STRING_INDEX;
    932 	val->u.uint = offset;
    933 	return 1;
    934       }
    935     case DW_FORM_addrx: case DW_FORM_addrx1: case DW_FORM_addrx2:
    936     case DW_FORM_addrx3: case DW_FORM_addrx4:
    937       {
    938 	uint64_t offset;
    939 
    940 	switch (form)
    941 	  {
    942 	  case DW_FORM_addrx:
    943 	    offset = read_uleb128 (buf);
    944 	    break;
    945 	  case DW_FORM_addrx1:
    946 	    offset = read_byte (buf);
    947 	    break;
    948 	  case DW_FORM_addrx2:
    949 	    offset = read_uint16 (buf);
    950 	    break;
    951 	  case DW_FORM_addrx3:
    952 	    offset = read_uint24 (buf);
    953 	    break;
    954 	  case DW_FORM_addrx4:
    955 	    offset = read_uint32 (buf);
    956 	    break;
    957 	  default:
    958 	    /* This case can't happen.  */
    959 	    return 0;
    960 	  }
    961 	val->encoding = ATTR_VAL_ADDRESS_INDEX;
    962 	val->u.uint = offset;
    963 	return 1;
    964       }
    965     case DW_FORM_ref_sup4:
    966       val->encoding = ATTR_VAL_REF_SECTION;
    967       val->u.uint = read_uint32 (buf);
    968       return 1;
    969     case DW_FORM_ref_sup8:
    970       val->encoding = ATTR_VAL_REF_SECTION;
    971       val->u.uint = read_uint64 (buf);
    972       return 1;
    973     case DW_FORM_implicit_const:
    974       val->encoding = ATTR_VAL_UINT;
    975       val->u.uint = implicit_val;
    976       return 1;
    977     case DW_FORM_loclistx:
    978       /* We don't distinguish this from DW_FORM_sec_offset.  It
    979        * shouldn't matter since we don't care about loclists.  */
    980       val->encoding = ATTR_VAL_REF_SECTION;
    981       val->u.uint = read_uleb128 (buf);
    982       return 1;
    983     case DW_FORM_rnglistx:
    984       val->encoding = ATTR_VAL_RNGLISTS_INDEX;
    985       val->u.uint = read_uleb128 (buf);
    986       return 1;
    987     case DW_FORM_GNU_addr_index:
    988       val->encoding = ATTR_VAL_REF_SECTION;
    989       val->u.uint = read_uleb128 (buf);
    990       return 1;
    991     case DW_FORM_GNU_str_index:
    992       val->encoding = ATTR_VAL_REF_SECTION;
    993       val->u.uint = read_uleb128 (buf);
    994       return 1;
    995     case DW_FORM_GNU_ref_alt:
    996       val->u.uint = read_offset (buf, is_dwarf64);
    997       if (altlink == NULL)
    998 	{
    999 	  val->encoding = ATTR_VAL_NONE;
   1000 	  return 1;
   1001 	}
   1002       val->encoding = ATTR_VAL_REF_ALT_INFO;
   1003       return 1;
   1004     case DW_FORM_strp_sup: case DW_FORM_GNU_strp_alt:
   1005       {
   1006 	uint64_t offset;
   1007 
   1008 	offset = read_offset (buf, is_dwarf64);
   1009 	if (altlink == NULL)
   1010 	  {
   1011 	    val->encoding = ATTR_VAL_NONE;
   1012 	    return 1;
   1013 	  }
   1014 	if (offset >= altlink->dwarf_sections.size[DEBUG_STR])
   1015 	  {
   1016 	    dwarf_buf_error (buf, "DW_FORM_strp_sup out of range");
   1017 	    return 0;
   1018 	  }
   1019 	val->encoding = ATTR_VAL_STRING;
   1020 	val->u.string =
   1021 	  (const char *) altlink->dwarf_sections.data[DEBUG_STR] + offset;
   1022 	return 1;
   1023       }
   1024     default:
   1025       dwarf_buf_error (buf, "unrecognized DWARF form");
   1026       return 0;
   1027     }
   1028 }
   1029 
   1030 /* If we can determine the value of a string attribute, set *STRING to
   1031    point to the string.  Return 1 on success, 0 on error.  If we don't
   1032    know the value, we consider that a success, and we don't change
   1033    *STRING.  An error is only reported for some sort of out of range
   1034    offset.  */
   1035 
   1036 static int
   1037 resolve_string (const struct dwarf_sections *dwarf_sections, int is_dwarf64,
   1038 		int is_bigendian, uint64_t str_offsets_base,
   1039 		const struct attr_val *val,
   1040 		backtrace_error_callback error_callback, void *data,
   1041 		const char **string)
   1042 {
   1043   switch (val->encoding)
   1044     {
   1045     case ATTR_VAL_STRING:
   1046       *string = val->u.string;
   1047       return 1;
   1048 
   1049     case ATTR_VAL_STRING_INDEX:
   1050       {
   1051 	uint64_t offset;
   1052 	struct dwarf_buf offset_buf;
   1053 
   1054 	offset = val->u.uint * (is_dwarf64 ? 8 : 4) + str_offsets_base;
   1055 	if (offset + (is_dwarf64 ? 8 : 4)
   1056 	    >= dwarf_sections->size[DEBUG_STR_OFFSETS])
   1057 	  {
   1058 	    error_callback (data, "DW_FORM_strx value out of range", 0);
   1059 	    return 0;
   1060 	  }
   1061 
   1062 	offset_buf.name = ".debug_str_offsets";
   1063 	offset_buf.start = dwarf_sections->data[DEBUG_STR_OFFSETS];
   1064 	offset_buf.buf = dwarf_sections->data[DEBUG_STR_OFFSETS] + offset;
   1065 	offset_buf.left = dwarf_sections->size[DEBUG_STR_OFFSETS] - offset;
   1066 	offset_buf.is_bigendian = is_bigendian;
   1067 	offset_buf.error_callback = error_callback;
   1068 	offset_buf.data = data;
   1069 	offset_buf.reported_underflow = 0;
   1070 
   1071 	offset = read_offset (&offset_buf, is_dwarf64);
   1072 	if (offset >= dwarf_sections->size[DEBUG_STR])
   1073 	  {
   1074 	    dwarf_buf_error (&offset_buf, "DW_FORM_strx offset out of range");
   1075 	    return 0;
   1076 	  }
   1077 	*string = (const char *) dwarf_sections->data[DEBUG_STR] + offset;
   1078 	return 1;
   1079       }
   1080 
   1081     default:
   1082       return 1;
   1083     }
   1084 }
   1085 
   1086 /* Set *ADDRESS to the real address for a ATTR_VAL_ADDRESS_INDEX.
   1087    Return 1 on success, 0 on error.  */
   1088 
   1089 static int
   1090 resolve_addr_index (const struct dwarf_sections *dwarf_sections,
   1091 		    uint64_t addr_base, int addrsize, int is_bigendian,
   1092 		    uint64_t addr_index,
   1093 		    backtrace_error_callback error_callback, void *data,
   1094 		    uint64_t *address)
   1095 {
   1096   uint64_t offset;
   1097   struct dwarf_buf addr_buf;
   1098 
   1099   offset = addr_index * addrsize + addr_base;
   1100   if (offset + addrsize >= dwarf_sections->size[DEBUG_ADDR])
   1101     {
   1102       error_callback (data, "DW_FORM_addrx value out of range", 0);
   1103       return 0;
   1104     }
   1105 
   1106   addr_buf.name = ".debug_addr";
   1107   addr_buf.start = dwarf_sections->data[DEBUG_ADDR];
   1108   addr_buf.buf = dwarf_sections->data[DEBUG_ADDR] + offset;
   1109   addr_buf.left = dwarf_sections->size[DEBUG_ADDR] - offset;
   1110   addr_buf.is_bigendian = is_bigendian;
   1111   addr_buf.error_callback = error_callback;
   1112   addr_buf.data = data;
   1113   addr_buf.reported_underflow = 0;
   1114 
   1115   *address = read_address (&addr_buf, addrsize);
   1116   return 1;
   1117 }
   1118 
   1119 /* Compare a unit offset against a unit for bsearch.  */
   1120 
   1121 static int
   1122 units_search (const void *vkey, const void *ventry)
   1123 {
   1124   const size_t *key = (const size_t *) vkey;
   1125   const struct unit *entry = *((const struct unit *const *) ventry);
   1126   size_t offset;
   1127 
   1128   offset = *key;
   1129   if (offset < entry->low_offset)
   1130     return -1;
   1131   else if (offset >= entry->high_offset)
   1132     return 1;
   1133   else
   1134     return 0;
   1135 }
   1136 
   1137 /* Find a unit in PU containing OFFSET.  */
   1138 
   1139 static struct unit *
   1140 find_unit (struct unit **pu, size_t units_count, size_t offset)
   1141 {
   1142   struct unit **u;
   1143   u = bsearch (&offset, pu, units_count, sizeof (struct unit *), units_search);
   1144   return u == NULL ? NULL : *u;
   1145 }
   1146 
   1147 /* Compare function_addrs for qsort.  When ranges are nested, make the
   1148    smallest one sort last.  */
   1149 
   1150 static int
   1151 function_addrs_compare (const void *v1, const void *v2)
   1152 {
   1153   const struct function_addrs *a1 = (const struct function_addrs *) v1;
   1154   const struct function_addrs *a2 = (const struct function_addrs *) v2;
   1155 
   1156   if (a1->low < a2->low)
   1157     return -1;
   1158   if (a1->low > a2->low)
   1159     return 1;
   1160   if (a1->high < a2->high)
   1161     return 1;
   1162   if (a1->high > a2->high)
   1163     return -1;
   1164   return strcmp (a1->function->name, a2->function->name);
   1165 }
   1166 
   1167 /* Compare a PC against a function_addrs for bsearch.  Note that if
   1168    there are multiple ranges containing PC, which one will be returned
   1169    is unpredictable.  We compensate for that in dwarf_fileline.  */
   1170 
   1171 static int
   1172 function_addrs_search (const void *vkey, const void *ventry)
   1173 {
   1174   const uintptr_t *key = (const uintptr_t *) vkey;
   1175   const struct function_addrs *entry = (const struct function_addrs *) ventry;
   1176   uintptr_t pc;
   1177 
   1178   pc = *key;
   1179   if (pc < entry->low)
   1180     return -1;
   1181   else if (pc >= entry->high)
   1182     return 1;
   1183   else
   1184     return 0;
   1185 }
   1186 
   1187 /* Add a new compilation unit address range to a vector.  This is
   1188    called via add_ranges.  Returns 1 on success, 0 on failure.  */
   1189 
   1190 static int
   1191 add_unit_addr (struct backtrace_state *state, void *rdata,
   1192 	       uint64_t lowpc, uint64_t highpc,
   1193 	       backtrace_error_callback error_callback, void *data,
   1194 	       void *pvec)
   1195 {
   1196   struct unit *u = (struct unit *) rdata;
   1197   struct unit_addrs_vector *vec = (struct unit_addrs_vector *) pvec;
   1198   struct unit_addrs *p;
   1199 
   1200   /* Try to merge with the last entry.  */
   1201   if (vec->count > 0)
   1202     {
   1203       p = (struct unit_addrs *) vec->vec.base + (vec->count - 1);
   1204       if ((lowpc == p->high || lowpc == p->high + 1)
   1205 	  && u == p->u)
   1206 	{
   1207 	  if (highpc > p->high)
   1208 	    p->high = highpc;
   1209 	  return 1;
   1210 	}
   1211     }
   1212 
   1213   p = ((struct unit_addrs *)
   1214        backtrace_vector_grow (state, sizeof (struct unit_addrs),
   1215 			      error_callback, data, &vec->vec));
   1216   if (p == NULL)
   1217     return 0;
   1218 
   1219   p->low = lowpc;
   1220   p->high = highpc;
   1221   p->u = u;
   1222 
   1223   ++vec->count;
   1224 
   1225   return 1;
   1226 }
   1227 
   1228 /* Compare unit_addrs for qsort.  When ranges are nested, make the
   1229    smallest one sort last.  */
   1230 
   1231 static int
   1232 unit_addrs_compare (const void *v1, const void *v2)
   1233 {
   1234   const struct unit_addrs *a1 = (const struct unit_addrs *) v1;
   1235   const struct unit_addrs *a2 = (const struct unit_addrs *) v2;
   1236 
   1237   if (a1->low < a2->low)
   1238     return -1;
   1239   if (a1->low > a2->low)
   1240     return 1;
   1241   if (a1->high < a2->high)
   1242     return 1;
   1243   if (a1->high > a2->high)
   1244     return -1;
   1245   if (a1->u->lineoff < a2->u->lineoff)
   1246     return -1;
   1247   if (a1->u->lineoff > a2->u->lineoff)
   1248     return 1;
   1249   return 0;
   1250 }
   1251 
   1252 /* Compare a PC against a unit_addrs for bsearch.  Note that if there
   1253    are multiple ranges containing PC, which one will be returned is
   1254    unpredictable.  We compensate for that in dwarf_fileline.  */
   1255 
   1256 static int
   1257 unit_addrs_search (const void *vkey, const void *ventry)
   1258 {
   1259   const uintptr_t *key = (const uintptr_t *) vkey;
   1260   const struct unit_addrs *entry = (const struct unit_addrs *) ventry;
   1261   uintptr_t pc;
   1262 
   1263   pc = *key;
   1264   if (pc < entry->low)
   1265     return -1;
   1266   else if (pc >= entry->high)
   1267     return 1;
   1268   else
   1269     return 0;
   1270 }
   1271 
   1272 /* Sort the line vector by PC.  We want a stable sort here to maintain
   1273    the order of lines for the same PC values.  Since the sequence is
   1274    being sorted in place, their addresses cannot be relied on to
   1275    maintain stability.  That is the purpose of the index member.  */
   1276 
   1277 static int
   1278 line_compare (const void *v1, const void *v2)
   1279 {
   1280   const struct line *ln1 = (const struct line *) v1;
   1281   const struct line *ln2 = (const struct line *) v2;
   1282 
   1283   if (ln1->pc < ln2->pc)
   1284     return -1;
   1285   else if (ln1->pc > ln2->pc)
   1286     return 1;
   1287   else if (ln1->idx < ln2->idx)
   1288     return -1;
   1289   else if (ln1->idx > ln2->idx)
   1290     return 1;
   1291   else
   1292     return 0;
   1293 }
   1294 
   1295 /* Find a PC in a line vector.  We always allocate an extra entry at
   1296    the end of the lines vector, so that this routine can safely look
   1297    at the next entry.  Note that when there are multiple mappings for
   1298    the same PC value, this will return the last one.  */
   1299 
   1300 static int
   1301 line_search (const void *vkey, const void *ventry)
   1302 {
   1303   const uintptr_t *key = (const uintptr_t *) vkey;
   1304   const struct line *entry = (const struct line *) ventry;
   1305   uintptr_t pc;
   1306 
   1307   pc = *key;
   1308   if (pc < entry->pc)
   1309     return -1;
   1310   else if (pc >= (entry + 1)->pc)
   1311     return 1;
   1312   else
   1313     return 0;
   1314 }
   1315 
   1316 /* Sort the abbrevs by the abbrev code.  This function is passed to
   1317    both qsort and bsearch.  */
   1318 
   1319 static int
   1320 abbrev_compare (const void *v1, const void *v2)
   1321 {
   1322   const struct abbrev *a1 = (const struct abbrev *) v1;
   1323   const struct abbrev *a2 = (const struct abbrev *) v2;
   1324 
   1325   if (a1->code < a2->code)
   1326     return -1;
   1327   else if (a1->code > a2->code)
   1328     return 1;
   1329   else
   1330     {
   1331       /* This really shouldn't happen.  It means there are two
   1332 	 different abbrevs with the same code, and that means we don't
   1333 	 know which one lookup_abbrev should return.  */
   1334       return 0;
   1335     }
   1336 }
   1337 
   1338 /* Read the abbreviation table for a compilation unit.  Returns 1 on
   1339    success, 0 on failure.  */
   1340 
   1341 static int
   1342 read_abbrevs (struct backtrace_state *state, uint64_t abbrev_offset,
   1343 	      const unsigned char *dwarf_abbrev, size_t dwarf_abbrev_size,
   1344 	      int is_bigendian, backtrace_error_callback error_callback,
   1345 	      void *data, struct abbrevs *abbrevs)
   1346 {
   1347   struct dwarf_buf abbrev_buf;
   1348   struct dwarf_buf count_buf;
   1349   size_t num_abbrevs;
   1350 
   1351   abbrevs->num_abbrevs = 0;
   1352   abbrevs->abbrevs = NULL;
   1353 
   1354   if (abbrev_offset >= dwarf_abbrev_size)
   1355     {
   1356       error_callback (data, "abbrev offset out of range", 0);
   1357       return 0;
   1358     }
   1359 
   1360   abbrev_buf.name = ".debug_abbrev";
   1361   abbrev_buf.start = dwarf_abbrev;
   1362   abbrev_buf.buf = dwarf_abbrev + abbrev_offset;
   1363   abbrev_buf.left = dwarf_abbrev_size - abbrev_offset;
   1364   abbrev_buf.is_bigendian = is_bigendian;
   1365   abbrev_buf.error_callback = error_callback;
   1366   abbrev_buf.data = data;
   1367   abbrev_buf.reported_underflow = 0;
   1368 
   1369   /* Count the number of abbrevs in this list.  */
   1370 
   1371   count_buf = abbrev_buf;
   1372   num_abbrevs = 0;
   1373   while (read_uleb128 (&count_buf) != 0)
   1374     {
   1375       if (count_buf.reported_underflow)
   1376 	return 0;
   1377       ++num_abbrevs;
   1378       // Skip tag.
   1379       read_uleb128 (&count_buf);
   1380       // Skip has_children.
   1381       read_byte (&count_buf);
   1382       // Skip attributes.
   1383       while (read_uleb128 (&count_buf) != 0)
   1384 	{
   1385 	  uint64_t form;
   1386 
   1387 	  form = read_uleb128 (&count_buf);
   1388 	  if ((enum dwarf_form) form == DW_FORM_implicit_const)
   1389 	    read_sleb128 (&count_buf);
   1390 	}
   1391       // Skip form of last attribute.
   1392       read_uleb128 (&count_buf);
   1393     }
   1394 
   1395   if (count_buf.reported_underflow)
   1396     return 0;
   1397 
   1398   if (num_abbrevs == 0)
   1399     return 1;
   1400 
   1401   abbrevs->abbrevs = ((struct abbrev *)
   1402 		      backtrace_alloc (state,
   1403 				       num_abbrevs * sizeof (struct abbrev),
   1404 				       error_callback, data));
   1405   if (abbrevs->abbrevs == NULL)
   1406     return 0;
   1407   abbrevs->num_abbrevs = num_abbrevs;
   1408   memset (abbrevs->abbrevs, 0, num_abbrevs * sizeof (struct abbrev));
   1409 
   1410   num_abbrevs = 0;
   1411   while (1)
   1412     {
   1413       uint64_t code;
   1414       struct abbrev a;
   1415       size_t num_attrs;
   1416       struct attr *attrs;
   1417 
   1418       if (abbrev_buf.reported_underflow)
   1419 	goto fail;
   1420 
   1421       code = read_uleb128 (&abbrev_buf);
   1422       if (code == 0)
   1423 	break;
   1424 
   1425       a.code = code;
   1426       a.tag = (enum dwarf_tag) read_uleb128 (&abbrev_buf);
   1427       a.has_children = read_byte (&abbrev_buf);
   1428 
   1429       count_buf = abbrev_buf;
   1430       num_attrs = 0;
   1431       while (read_uleb128 (&count_buf) != 0)
   1432 	{
   1433 	  uint64_t form;
   1434 
   1435 	  ++num_attrs;
   1436 	  form = read_uleb128 (&count_buf);
   1437 	  if ((enum dwarf_form) form == DW_FORM_implicit_const)
   1438 	    read_sleb128 (&count_buf);
   1439 	}
   1440 
   1441       if (num_attrs == 0)
   1442 	{
   1443 	  attrs = NULL;
   1444 	  read_uleb128 (&abbrev_buf);
   1445 	  read_uleb128 (&abbrev_buf);
   1446 	}
   1447       else
   1448 	{
   1449 	  attrs = ((struct attr *)
   1450 		   backtrace_alloc (state, num_attrs * sizeof *attrs,
   1451 				    error_callback, data));
   1452 	  if (attrs == NULL)
   1453 	    goto fail;
   1454 	  num_attrs = 0;
   1455 	  while (1)
   1456 	    {
   1457 	      uint64_t name;
   1458 	      uint64_t form;
   1459 
   1460 	      name = read_uleb128 (&abbrev_buf);
   1461 	      form = read_uleb128 (&abbrev_buf);
   1462 	      if (name == 0)
   1463 		break;
   1464 	      attrs[num_attrs].name = (enum dwarf_attribute) name;
   1465 	      attrs[num_attrs].form = (enum dwarf_form) form;
   1466 	      if ((enum dwarf_form) form == DW_FORM_implicit_const)
   1467 		attrs[num_attrs].val = read_sleb128 (&abbrev_buf);
   1468 	      else
   1469 		attrs[num_attrs].val = 0;
   1470 	      ++num_attrs;
   1471 	    }
   1472 	}
   1473 
   1474       a.num_attrs = num_attrs;
   1475       a.attrs = attrs;
   1476 
   1477       abbrevs->abbrevs[num_abbrevs] = a;
   1478       ++num_abbrevs;
   1479     }
   1480 
   1481   backtrace_qsort (abbrevs->abbrevs, abbrevs->num_abbrevs,
   1482 		   sizeof (struct abbrev), abbrev_compare);
   1483 
   1484   return 1;
   1485 
   1486  fail:
   1487   free_abbrevs (state, abbrevs, error_callback, data);
   1488   return 0;
   1489 }
   1490 
   1491 /* Return the abbrev information for an abbrev code.  */
   1492 
   1493 static const struct abbrev *
   1494 lookup_abbrev (struct abbrevs *abbrevs, uint64_t code,
   1495 	       backtrace_error_callback error_callback, void *data)
   1496 {
   1497   struct abbrev key;
   1498   void *p;
   1499 
   1500   /* With GCC, where abbrevs are simply numbered in order, we should
   1501      be able to just look up the entry.  */
   1502   if (code - 1 < abbrevs->num_abbrevs
   1503       && abbrevs->abbrevs[code - 1].code == code)
   1504     return &abbrevs->abbrevs[code - 1];
   1505 
   1506   /* Otherwise we have to search.  */
   1507   memset (&key, 0, sizeof key);
   1508   key.code = code;
   1509   p = bsearch (&key, abbrevs->abbrevs, abbrevs->num_abbrevs,
   1510 	       sizeof (struct abbrev), abbrev_compare);
   1511   if (p == NULL)
   1512     {
   1513       error_callback (data, "invalid abbreviation code", 0);
   1514       return NULL;
   1515     }
   1516   return (const struct abbrev *) p;
   1517 }
   1518 
   1519 /* This struct is used to gather address range information while
   1520    reading attributes.  We use this while building a mapping from
   1521    address ranges to compilation units and then again while mapping
   1522    from address ranges to function entries.  Normally either
   1523    lowpc/highpc is set or ranges is set.  */
   1524 
   1525 struct pcrange {
   1526   uint64_t lowpc;		/* The low PC value.  */
   1527   int have_lowpc;		/* Whether a low PC value was found.  */
   1528   int lowpc_is_addr_index;	/* Whether lowpc is in .debug_addr.  */
   1529   uint64_t highpc;		/* The high PC value.  */
   1530   int have_highpc;		/* Whether a high PC value was found.  */
   1531   int highpc_is_relative;	/* Whether highpc is relative to lowpc.  */
   1532   int highpc_is_addr_index;	/* Whether highpc is in .debug_addr.  */
   1533   uint64_t ranges;		/* Offset in ranges section.  */
   1534   int have_ranges;		/* Whether ranges is valid.  */
   1535   int ranges_is_index;		/* Whether ranges is DW_FORM_rnglistx.  */
   1536 };
   1537 
   1538 /* Update PCRANGE from an attribute value.  */
   1539 
   1540 static void
   1541 update_pcrange (const struct attr* attr, const struct attr_val* val,
   1542 		struct pcrange *pcrange)
   1543 {
   1544   switch (attr->name)
   1545     {
   1546     case DW_AT_low_pc:
   1547       if (val->encoding == ATTR_VAL_ADDRESS)
   1548 	{
   1549 	  pcrange->lowpc = val->u.uint;
   1550 	  pcrange->have_lowpc = 1;
   1551 	}
   1552       else if (val->encoding == ATTR_VAL_ADDRESS_INDEX)
   1553 	{
   1554 	  pcrange->lowpc = val->u.uint;
   1555 	  pcrange->have_lowpc = 1;
   1556 	  pcrange->lowpc_is_addr_index = 1;
   1557 	}
   1558       break;
   1559 
   1560     case DW_AT_high_pc:
   1561       if (val->encoding == ATTR_VAL_ADDRESS)
   1562 	{
   1563 	  pcrange->highpc = val->u.uint;
   1564 	  pcrange->have_highpc = 1;
   1565 	}
   1566       else if (val->encoding == ATTR_VAL_UINT)
   1567 	{
   1568 	  pcrange->highpc = val->u.uint;
   1569 	  pcrange->have_highpc = 1;
   1570 	  pcrange->highpc_is_relative = 1;
   1571 	}
   1572       else if (val->encoding == ATTR_VAL_ADDRESS_INDEX)
   1573 	{
   1574 	  pcrange->highpc = val->u.uint;
   1575 	  pcrange->have_highpc = 1;
   1576 	  pcrange->highpc_is_addr_index = 1;
   1577 	}
   1578       break;
   1579 
   1580     case DW_AT_ranges:
   1581       if (val->encoding == ATTR_VAL_UINT
   1582 	  || val->encoding == ATTR_VAL_REF_SECTION)
   1583 	{
   1584 	  pcrange->ranges = val->u.uint;
   1585 	  pcrange->have_ranges = 1;
   1586 	}
   1587       else if (val->encoding == ATTR_VAL_RNGLISTS_INDEX)
   1588 	{
   1589 	  pcrange->ranges = val->u.uint;
   1590 	  pcrange->have_ranges = 1;
   1591 	  pcrange->ranges_is_index = 1;
   1592 	}
   1593       break;
   1594 
   1595     default:
   1596       break;
   1597     }
   1598 }
   1599 
   1600 /* Call ADD_RANGE for a low/high PC pair.  Returns 1 on success, 0 on
   1601   error.  */
   1602 
   1603 static int
   1604 add_low_high_range (struct backtrace_state *state,
   1605 		    const struct dwarf_sections *dwarf_sections,
   1606 		    uintptr_t base_address, int is_bigendian,
   1607 		    struct unit *u, const struct pcrange *pcrange,
   1608 		    int (*add_range) (struct backtrace_state *state,
   1609 				      void *rdata, uint64_t lowpc,
   1610 				      uint64_t highpc,
   1611 				      backtrace_error_callback error_callback,
   1612 				      void *data, void *vec),
   1613 		    void *rdata,
   1614 		    backtrace_error_callback error_callback, void *data,
   1615 		    void *vec)
   1616 {
   1617   uint64_t lowpc;
   1618   uint64_t highpc;
   1619 
   1620   lowpc = pcrange->lowpc;
   1621   if (pcrange->lowpc_is_addr_index)
   1622     {
   1623       if (!resolve_addr_index (dwarf_sections, u->addr_base, u->addrsize,
   1624 			       is_bigendian, lowpc, error_callback, data,
   1625 			       &lowpc))
   1626 	return 0;
   1627     }
   1628 
   1629   highpc = pcrange->highpc;
   1630   if (pcrange->highpc_is_addr_index)
   1631     {
   1632       if (!resolve_addr_index (dwarf_sections, u->addr_base, u->addrsize,
   1633 			       is_bigendian, highpc, error_callback, data,
   1634 			       &highpc))
   1635 	return 0;
   1636     }
   1637   if (pcrange->highpc_is_relative)
   1638     highpc += lowpc;
   1639 
   1640   /* Add in the base address of the module when recording PC values,
   1641      so that we can look up the PC directly.  */
   1642   lowpc += base_address;
   1643   highpc += base_address;
   1644 
   1645   return add_range (state, rdata, lowpc, highpc, error_callback, data, vec);
   1646 }
   1647 
   1648 /* Call ADD_RANGE for each range read from .debug_ranges, as used in
   1649    DWARF versions 2 through 4.  */
   1650 
   1651 static int
   1652 add_ranges_from_ranges (
   1653     struct backtrace_state *state,
   1654     const struct dwarf_sections *dwarf_sections,
   1655     uintptr_t base_address, int is_bigendian,
   1656     struct unit *u, uint64_t base,
   1657     const struct pcrange *pcrange,
   1658     int (*add_range) (struct backtrace_state *state, void *rdata,
   1659 		      uint64_t lowpc, uint64_t highpc,
   1660 		      backtrace_error_callback error_callback, void *data,
   1661 		      void *vec),
   1662     void *rdata,
   1663     backtrace_error_callback error_callback, void *data,
   1664     void *vec)
   1665 {
   1666   struct dwarf_buf ranges_buf;
   1667 
   1668   if (pcrange->ranges >= dwarf_sections->size[DEBUG_RANGES])
   1669     {
   1670       error_callback (data, "ranges offset out of range", 0);
   1671       return 0;
   1672     }
   1673 
   1674   ranges_buf.name = ".debug_ranges";
   1675   ranges_buf.start = dwarf_sections->data[DEBUG_RANGES];
   1676   ranges_buf.buf = dwarf_sections->data[DEBUG_RANGES] + pcrange->ranges;
   1677   ranges_buf.left = dwarf_sections->size[DEBUG_RANGES] - pcrange->ranges;
   1678   ranges_buf.is_bigendian = is_bigendian;
   1679   ranges_buf.error_callback = error_callback;
   1680   ranges_buf.data = data;
   1681   ranges_buf.reported_underflow = 0;
   1682 
   1683   while (1)
   1684     {
   1685       uint64_t low;
   1686       uint64_t high;
   1687 
   1688       if (ranges_buf.reported_underflow)
   1689 	return 0;
   1690 
   1691       low = read_address (&ranges_buf, u->addrsize);
   1692       high = read_address (&ranges_buf, u->addrsize);
   1693 
   1694       if (low == 0 && high == 0)
   1695 	break;
   1696 
   1697       if (is_highest_address (low, u->addrsize))
   1698 	base = high;
   1699       else
   1700 	{
   1701 	  if (!add_range (state, rdata,
   1702 			  low + base + base_address,
   1703 			  high + base + base_address,
   1704 			  error_callback, data, vec))
   1705 	    return 0;
   1706 	}
   1707     }
   1708 
   1709   if (ranges_buf.reported_underflow)
   1710     return 0;
   1711 
   1712   return 1;
   1713 }
   1714 
   1715 /* Call ADD_RANGE for each range read from .debug_rnglists, as used in
   1716    DWARF version 5.  */
   1717 
   1718 static int
   1719 add_ranges_from_rnglists (
   1720     struct backtrace_state *state,
   1721     const struct dwarf_sections *dwarf_sections,
   1722     uintptr_t base_address, int is_bigendian,
   1723     struct unit *u, uint64_t base,
   1724     const struct pcrange *pcrange,
   1725     int (*add_range) (struct backtrace_state *state, void *rdata,
   1726 		      uint64_t lowpc, uint64_t highpc,
   1727 		      backtrace_error_callback error_callback, void *data,
   1728 		      void *vec),
   1729     void *rdata,
   1730     backtrace_error_callback error_callback, void *data,
   1731     void *vec)
   1732 {
   1733   uint64_t offset;
   1734   struct dwarf_buf rnglists_buf;
   1735 
   1736   if (!pcrange->ranges_is_index)
   1737     offset = pcrange->ranges;
   1738   else
   1739     offset = u->rnglists_base + pcrange->ranges * (u->is_dwarf64 ? 8 : 4);
   1740   if (offset >= dwarf_sections->size[DEBUG_RNGLISTS])
   1741     {
   1742       error_callback (data, "rnglists offset out of range", 0);
   1743       return 0;
   1744     }
   1745 
   1746   rnglists_buf.name = ".debug_rnglists";
   1747   rnglists_buf.start = dwarf_sections->data[DEBUG_RNGLISTS];
   1748   rnglists_buf.buf = dwarf_sections->data[DEBUG_RNGLISTS] + offset;
   1749   rnglists_buf.left = dwarf_sections->size[DEBUG_RNGLISTS] - offset;
   1750   rnglists_buf.is_bigendian = is_bigendian;
   1751   rnglists_buf.error_callback = error_callback;
   1752   rnglists_buf.data = data;
   1753   rnglists_buf.reported_underflow = 0;
   1754 
   1755   if (pcrange->ranges_is_index)
   1756     {
   1757       offset = read_offset (&rnglists_buf, u->is_dwarf64);
   1758       offset += u->rnglists_base;
   1759       if (offset >= dwarf_sections->size[DEBUG_RNGLISTS])
   1760 	{
   1761 	  error_callback (data, "rnglists index offset out of range", 0);
   1762 	  return 0;
   1763 	}
   1764       rnglists_buf.buf = dwarf_sections->data[DEBUG_RNGLISTS] + offset;
   1765       rnglists_buf.left = dwarf_sections->size[DEBUG_RNGLISTS] - offset;
   1766     }
   1767 
   1768   while (1)
   1769     {
   1770       unsigned char rle;
   1771 
   1772       rle = read_byte (&rnglists_buf);
   1773       if (rle == DW_RLE_end_of_list)
   1774 	break;
   1775       switch (rle)
   1776 	{
   1777 	case DW_RLE_base_addressx:
   1778 	  {
   1779 	    uint64_t index;
   1780 
   1781 	    index = read_uleb128 (&rnglists_buf);
   1782 	    if (!resolve_addr_index (dwarf_sections, u->addr_base,
   1783 				     u->addrsize, is_bigendian, index,
   1784 				     error_callback, data, &base))
   1785 	      return 0;
   1786 	  }
   1787 	  break;
   1788 
   1789 	case DW_RLE_startx_endx:
   1790 	  {
   1791 	    uint64_t index;
   1792 	    uint64_t low;
   1793 	    uint64_t high;
   1794 
   1795 	    index = read_uleb128 (&rnglists_buf);
   1796 	    if (!resolve_addr_index (dwarf_sections, u->addr_base,
   1797 				     u->addrsize, is_bigendian, index,
   1798 				     error_callback, data, &low))
   1799 	      return 0;
   1800 	    index = read_uleb128 (&rnglists_buf);
   1801 	    if (!resolve_addr_index (dwarf_sections, u->addr_base,
   1802 				     u->addrsize, is_bigendian, index,
   1803 				     error_callback, data, &high))
   1804 	      return 0;
   1805 	    if (!add_range (state, rdata, low + base_address,
   1806 			    high + base_address, error_callback, data,
   1807 			    vec))
   1808 	      return 0;
   1809 	  }
   1810 	  break;
   1811 
   1812 	case DW_RLE_startx_length:
   1813 	  {
   1814 	    uint64_t index;
   1815 	    uint64_t low;
   1816 	    uint64_t length;
   1817 
   1818 	    index = read_uleb128 (&rnglists_buf);
   1819 	    if (!resolve_addr_index (dwarf_sections, u->addr_base,
   1820 				     u->addrsize, is_bigendian, index,
   1821 				     error_callback, data, &low))
   1822 	      return 0;
   1823 	    length = read_uleb128 (&rnglists_buf);
   1824 	    low += base_address;
   1825 	    if (!add_range (state, rdata, low, low + length,
   1826 			    error_callback, data, vec))
   1827 	      return 0;
   1828 	  }
   1829 	  break;
   1830 
   1831 	case DW_RLE_offset_pair:
   1832 	  {
   1833 	    uint64_t low;
   1834 	    uint64_t high;
   1835 
   1836 	    low = read_uleb128 (&rnglists_buf);
   1837 	    high = read_uleb128 (&rnglists_buf);
   1838 	    if (!add_range (state, rdata, low + base + base_address,
   1839 			    high + base + base_address,
   1840 			    error_callback, data, vec))
   1841 	      return 0;
   1842 	  }
   1843 	  break;
   1844 
   1845 	case DW_RLE_base_address:
   1846 	  base = read_address (&rnglists_buf, u->addrsize);
   1847 	  break;
   1848 
   1849 	case DW_RLE_start_end:
   1850 	  {
   1851 	    uint64_t low;
   1852 	    uint64_t high;
   1853 
   1854 	    low = read_address (&rnglists_buf, u->addrsize);
   1855 	    high = read_address (&rnglists_buf, u->addrsize);
   1856 	    if (!add_range (state, rdata, low + base_address,
   1857 			    high + base_address, error_callback, data,
   1858 			    vec))
   1859 	      return 0;
   1860 	  }
   1861 	  break;
   1862 
   1863 	case DW_RLE_start_length:
   1864 	  {
   1865 	    uint64_t low;
   1866 	    uint64_t length;
   1867 
   1868 	    low = read_address (&rnglists_buf, u->addrsize);
   1869 	    length = read_uleb128 (&rnglists_buf);
   1870 	    low += base_address;
   1871 	    if (!add_range (state, rdata, low, low + length,
   1872 			    error_callback, data, vec))
   1873 	      return 0;
   1874 	  }
   1875 	  break;
   1876 
   1877 	default:
   1878 	  dwarf_buf_error (&rnglists_buf, "unrecognized DW_RLE value");
   1879 	  return 0;
   1880 	}
   1881     }
   1882 
   1883   if (rnglists_buf.reported_underflow)
   1884     return 0;
   1885 
   1886   return 1;
   1887 }
   1888 
   1889 /* Call ADD_RANGE for each lowpc/highpc pair in PCRANGE.  RDATA is
   1890    passed to ADD_RANGE, and is either a struct unit * or a struct
   1891    function *.  VEC is the vector we are adding ranges to, and is
   1892    either a struct unit_addrs_vector * or a struct function_vector *.
   1893    Returns 1 on success, 0 on error.  */
   1894 
   1895 static int
   1896 add_ranges (struct backtrace_state *state,
   1897 	    const struct dwarf_sections *dwarf_sections,
   1898 	    uintptr_t base_address, int is_bigendian,
   1899 	    struct unit *u, uint64_t base, const struct pcrange *pcrange,
   1900 	    int (*add_range) (struct backtrace_state *state, void *rdata,
   1901 			      uint64_t lowpc, uint64_t highpc,
   1902 			      backtrace_error_callback error_callback,
   1903 			      void *data, void *vec),
   1904 	    void *rdata,
   1905 	    backtrace_error_callback error_callback, void *data,
   1906 	    void *vec)
   1907 {
   1908   if (pcrange->have_lowpc && pcrange->have_highpc)
   1909     return add_low_high_range (state, dwarf_sections, base_address,
   1910 			       is_bigendian, u, pcrange, add_range, rdata,
   1911 			       error_callback, data, vec);
   1912 
   1913   if (!pcrange->have_ranges)
   1914     {
   1915       /* Did not find any address ranges to add.  */
   1916       return 1;
   1917     }
   1918 
   1919   if (u->version < 5)
   1920     return add_ranges_from_ranges (state, dwarf_sections, base_address,
   1921 				   is_bigendian, u, base, pcrange, add_range,
   1922 				   rdata, error_callback, data, vec);
   1923   else
   1924     return add_ranges_from_rnglists (state, dwarf_sections, base_address,
   1925 				     is_bigendian, u, base, pcrange, add_range,
   1926 				     rdata, error_callback, data, vec);
   1927 }
   1928 
   1929 /* Find the address range covered by a compilation unit, reading from
   1930    UNIT_BUF and adding values to U.  Returns 1 if all data could be
   1931    read, 0 if there is some error.  */
   1932 
   1933 static int
   1934 find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
   1935 		     struct dwarf_buf *unit_buf,
   1936 		     const struct dwarf_sections *dwarf_sections,
   1937 		     int is_bigendian, struct dwarf_data *altlink,
   1938 		     backtrace_error_callback error_callback, void *data,
   1939 		     struct unit *u, struct unit_addrs_vector *addrs,
   1940 		     enum dwarf_tag *unit_tag)
   1941 {
   1942   while (unit_buf->left > 0)
   1943     {
   1944       uint64_t code;
   1945       const struct abbrev *abbrev;
   1946       struct pcrange pcrange;
   1947       struct attr_val name_val;
   1948       int have_name_val;
   1949       struct attr_val comp_dir_val;
   1950       int have_comp_dir_val;
   1951       size_t i;
   1952 
   1953       code = read_uleb128 (unit_buf);
   1954       if (code == 0)
   1955 	return 1;
   1956 
   1957       abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
   1958       if (abbrev == NULL)
   1959 	return 0;
   1960 
   1961       if (unit_tag != NULL)
   1962 	*unit_tag = abbrev->tag;
   1963 
   1964       memset (&pcrange, 0, sizeof pcrange);
   1965       memset (&name_val, 0, sizeof name_val);
   1966       have_name_val = 0;
   1967       memset (&comp_dir_val, 0, sizeof comp_dir_val);
   1968       have_comp_dir_val = 0;
   1969       for (i = 0; i < abbrev->num_attrs; ++i)
   1970 	{
   1971 	  struct attr_val val;
   1972 
   1973 	  if (!read_attribute (abbrev->attrs[i].form, abbrev->attrs[i].val,
   1974 			       unit_buf, u->is_dwarf64, u->version,
   1975 			       u->addrsize, dwarf_sections, altlink, &val))
   1976 	    return 0;
   1977 
   1978 	  switch (abbrev->attrs[i].name)
   1979 	    {
   1980 	    case DW_AT_low_pc: case DW_AT_high_pc: case DW_AT_ranges:
   1981 	      update_pcrange (&abbrev->attrs[i], &val, &pcrange);
   1982 	      break;
   1983 
   1984 	    case DW_AT_stmt_list:
   1985 	      if (abbrev->tag == DW_TAG_compile_unit
   1986 		  && (val.encoding == ATTR_VAL_UINT
   1987 		      || val.encoding == ATTR_VAL_REF_SECTION))
   1988 		u->lineoff = val.u.uint;
   1989 	      break;
   1990 
   1991 	    case DW_AT_name:
   1992 	      if (abbrev->tag == DW_TAG_compile_unit)
   1993 		{
   1994 		  name_val = val;
   1995 		  have_name_val = 1;
   1996 		}
   1997 	      break;
   1998 
   1999 	    case DW_AT_comp_dir:
   2000 	      if (abbrev->tag == DW_TAG_compile_unit)
   2001 		{
   2002 		  comp_dir_val = val;
   2003 		  have_comp_dir_val = 1;
   2004 		}
   2005 	      break;
   2006 
   2007 	    case DW_AT_str_offsets_base:
   2008 	      if (abbrev->tag == DW_TAG_compile_unit
   2009 		  && val.encoding == ATTR_VAL_REF_SECTION)
   2010 		u->str_offsets_base = val.u.uint;
   2011 	      break;
   2012 
   2013 	    case DW_AT_addr_base:
   2014 	      if (abbrev->tag == DW_TAG_compile_unit
   2015 		  && val.encoding == ATTR_VAL_REF_SECTION)
   2016 		u->addr_base = val.u.uint;
   2017 	      break;
   2018 
   2019 	    case DW_AT_rnglists_base:
   2020 	      if (abbrev->tag == DW_TAG_compile_unit
   2021 		  && val.encoding == ATTR_VAL_REF_SECTION)
   2022 		u->rnglists_base = val.u.uint;
   2023 	      break;
   2024 
   2025 	    default:
   2026 	      break;
   2027 	    }
   2028 	}
   2029 
   2030       // Resolve strings after we're sure that we have seen
   2031       // DW_AT_str_offsets_base.
   2032       if (have_name_val)
   2033 	{
   2034 	  if (!resolve_string (dwarf_sections, u->is_dwarf64, is_bigendian,
   2035 			       u->str_offsets_base, &name_val,
   2036 			       error_callback, data, &u->filename))
   2037 	    return 0;
   2038 	}
   2039       if (have_comp_dir_val)
   2040 	{
   2041 	  if (!resolve_string (dwarf_sections, u->is_dwarf64, is_bigendian,
   2042 			       u->str_offsets_base, &comp_dir_val,
   2043 			       error_callback, data, &u->comp_dir))
   2044 	    return 0;
   2045 	}
   2046 
   2047       if (abbrev->tag == DW_TAG_compile_unit
   2048 	  || abbrev->tag == DW_TAG_subprogram)
   2049 	{
   2050 	  if (!add_ranges (state, dwarf_sections, base_address,
   2051 			   is_bigendian, u, pcrange.lowpc, &pcrange,
   2052 			   add_unit_addr, (void *) u, error_callback, data,
   2053 			   (void *) addrs))
   2054 	    return 0;
   2055 
   2056 	  /* If we found the PC range in the DW_TAG_compile_unit, we
   2057 	     can stop now.  */
   2058 	  if (abbrev->tag == DW_TAG_compile_unit
   2059 	      && (pcrange.have_ranges
   2060 		  || (pcrange.have_lowpc && pcrange.have_highpc)))
   2061 	    return 1;
   2062 	}
   2063 
   2064       if (abbrev->has_children)
   2065 	{
   2066 	  if (!find_address_ranges (state, base_address, unit_buf,
   2067 				    dwarf_sections, is_bigendian, altlink,
   2068 				    error_callback, data, u, addrs, NULL))
   2069 	    return 0;
   2070 	}
   2071     }
   2072 
   2073   return 1;
   2074 }
   2075 
   2076 /* Build a mapping from address ranges to the compilation units where
   2077    the line number information for that range can be found.  Returns 1
   2078    on success, 0 on failure.  */
   2079 
   2080 static int
   2081 build_address_map (struct backtrace_state *state, uintptr_t base_address,
   2082 		   const struct dwarf_sections *dwarf_sections,
   2083 		   int is_bigendian, struct dwarf_data *altlink,
   2084 		   backtrace_error_callback error_callback, void *data,
   2085 		   struct unit_addrs_vector *addrs,
   2086 		   struct unit_vector *unit_vec)
   2087 {
   2088   struct dwarf_buf info;
   2089   struct backtrace_vector units;
   2090   size_t units_count;
   2091   size_t i;
   2092   struct unit **pu;
   2093   size_t unit_offset = 0;
   2094 
   2095   memset (&addrs->vec, 0, sizeof addrs->vec);
   2096   memset (&unit_vec->vec, 0, sizeof unit_vec->vec);
   2097   addrs->count = 0;
   2098   unit_vec->count = 0;
   2099 
   2100   /* Read through the .debug_info section.  FIXME: Should we use the
   2101      .debug_aranges section?  gdb and addr2line don't use it, but I'm
   2102      not sure why.  */
   2103 
   2104   info.name = ".debug_info";
   2105   info.start = dwarf_sections->data[DEBUG_INFO];
   2106   info.buf = info.start;
   2107   info.left = dwarf_sections->size[DEBUG_INFO];
   2108   info.is_bigendian = is_bigendian;
   2109   info.error_callback = error_callback;
   2110   info.data = data;
   2111   info.reported_underflow = 0;
   2112 
   2113   memset (&units, 0, sizeof units);
   2114   units_count = 0;
   2115 
   2116   while (info.left > 0)
   2117     {
   2118       const unsigned char *unit_data_start;
   2119       uint64_t len;
   2120       int is_dwarf64;
   2121       struct dwarf_buf unit_buf;
   2122       int version;
   2123       int unit_type;
   2124       uint64_t abbrev_offset;
   2125       int addrsize;
   2126       struct unit *u;
   2127       enum dwarf_tag unit_tag;
   2128 
   2129       if (info.reported_underflow)
   2130 	goto fail;
   2131 
   2132       unit_data_start = info.buf;
   2133 
   2134       len = read_initial_length (&info, &is_dwarf64);
   2135       unit_buf = info;
   2136       unit_buf.left = len;
   2137 
   2138       if (!advance (&info, len))
   2139 	goto fail;
   2140 
   2141       version = read_uint16 (&unit_buf);
   2142       if (version < 2 || version > 5)
   2143 	{
   2144 	  dwarf_buf_error (&unit_buf, "unrecognized DWARF version");
   2145 	  goto fail;
   2146 	}
   2147 
   2148       if (version < 5)
   2149 	unit_type = 0;
   2150       else
   2151 	{
   2152 	  unit_type = read_byte (&unit_buf);
   2153 	  if (unit_type == DW_UT_type || unit_type == DW_UT_split_type)
   2154 	    {
   2155 	      /* This unit doesn't have anything we need.  */
   2156 	      continue;
   2157 	    }
   2158 	}
   2159 
   2160       pu = ((struct unit **)
   2161 	    backtrace_vector_grow (state, sizeof (struct unit *),
   2162 				   error_callback, data, &units));
   2163       if (pu == NULL)
   2164 	  goto fail;
   2165 
   2166       u = ((struct unit *)
   2167 	   backtrace_alloc (state, sizeof *u, error_callback, data));
   2168       if (u == NULL)
   2169 	goto fail;
   2170 
   2171       *pu = u;
   2172       ++units_count;
   2173 
   2174       if (version < 5)
   2175 	addrsize = 0; /* Set below.  */
   2176       else
   2177 	addrsize = read_byte (&unit_buf);
   2178 
   2179       memset (&u->abbrevs, 0, sizeof u->abbrevs);
   2180       abbrev_offset = read_offset (&unit_buf, is_dwarf64);
   2181       if (!read_abbrevs (state, abbrev_offset,
   2182 			 dwarf_sections->data[DEBUG_ABBREV],
   2183 			 dwarf_sections->size[DEBUG_ABBREV],
   2184 			 is_bigendian, error_callback, data, &u->abbrevs))
   2185 	goto fail;
   2186 
   2187       if (version < 5)
   2188 	addrsize = read_byte (&unit_buf);
   2189 
   2190       switch (unit_type)
   2191 	{
   2192 	case 0:
   2193 	  break;
   2194 	case DW_UT_compile: case DW_UT_partial:
   2195 	  break;
   2196 	case DW_UT_skeleton: case DW_UT_split_compile:
   2197 	  read_uint64 (&unit_buf); /* dwo_id */
   2198 	  break;
   2199 	default:
   2200 	  break;
   2201 	}
   2202 
   2203       u->low_offset = unit_offset;
   2204       unit_offset += len + (is_dwarf64 ? 12 : 4);
   2205       u->high_offset = unit_offset;
   2206       u->unit_data = unit_buf.buf;
   2207       u->unit_data_len = unit_buf.left;
   2208       u->unit_data_offset = unit_buf.buf - unit_data_start;
   2209       u->version = version;
   2210       u->is_dwarf64 = is_dwarf64;
   2211       u->addrsize = addrsize;
   2212       u->filename = NULL;
   2213       u->comp_dir = NULL;
   2214       u->abs_filename = NULL;
   2215       u->lineoff = 0;
   2216 
   2217       /* The actual line number mappings will be read as needed.  */
   2218       u->lines = NULL;
   2219       u->lines_count = 0;
   2220       u->function_addrs = NULL;
   2221       u->function_addrs_count = 0;
   2222 
   2223       if (!find_address_ranges (state, base_address, &unit_buf, dwarf_sections,
   2224 				is_bigendian, altlink, error_callback, data,
   2225 				u, addrs, &unit_tag))
   2226 	goto fail;
   2227 
   2228       if (unit_buf.reported_underflow)
   2229 	goto fail;
   2230     }
   2231   if (info.reported_underflow)
   2232     goto fail;
   2233 
   2234   unit_vec->vec = units;
   2235   unit_vec->count = units_count;
   2236   return 1;
   2237 
   2238  fail:
   2239   if (units_count > 0)
   2240     {
   2241       pu = (struct unit **) units.base;
   2242       for (i = 0; i < units_count; i++)
   2243 	{
   2244 	  free_abbrevs (state, &pu[i]->abbrevs, error_callback, data);
   2245 	  backtrace_free (state, pu[i], sizeof **pu, error_callback, data);
   2246 	}
   2247       backtrace_vector_free (state, &units, error_callback, data);
   2248     }
   2249   if (addrs->count > 0)
   2250     {
   2251       backtrace_vector_free (state, &addrs->vec, error_callback, data);
   2252       addrs->count = 0;
   2253     }
   2254   return 0;
   2255 }
   2256 
   2257 /* Add a new mapping to the vector of line mappings that we are
   2258    building.  Returns 1 on success, 0 on failure.  */
   2259 
   2260 static int
   2261 add_line (struct backtrace_state *state, struct dwarf_data *ddata,
   2262 	  uintptr_t pc, const char *filename, int lineno,
   2263 	  backtrace_error_callback error_callback, void *data,
   2264 	  struct line_vector *vec)
   2265 {
   2266   struct line *ln;
   2267 
   2268   /* If we are adding the same mapping, ignore it.  This can happen
   2269      when using discriminators.  */
   2270   if (vec->count > 0)
   2271     {
   2272       ln = (struct line *) vec->vec.base + (vec->count - 1);
   2273       if (pc == ln->pc && filename == ln->filename && lineno == ln->lineno)
   2274 	return 1;
   2275     }
   2276 
   2277   ln = ((struct line *)
   2278 	backtrace_vector_grow (state, sizeof (struct line), error_callback,
   2279 			       data, &vec->vec));
   2280   if (ln == NULL)
   2281     return 0;
   2282 
   2283   /* Add in the base address here, so that we can look up the PC
   2284      directly.  */
   2285   ln->pc = pc + ddata->base_address;
   2286 
   2287   ln->filename = filename;
   2288   ln->lineno = lineno;
   2289   ln->idx = vec->count;
   2290 
   2291   ++vec->count;
   2292 
   2293   return 1;
   2294 }
   2295 
   2296 /* Free the line header information.  */
   2297 
   2298 static void
   2299 free_line_header (struct backtrace_state *state, struct line_header *hdr,
   2300 		  backtrace_error_callback error_callback, void *data)
   2301 {
   2302   if (hdr->dirs_count != 0)
   2303     backtrace_free (state, hdr->dirs, hdr->dirs_count * sizeof (const char *),
   2304 		    error_callback, data);
   2305   backtrace_free (state, hdr->filenames,
   2306 		  hdr->filenames_count * sizeof (char *),
   2307 		  error_callback, data);
   2308 }
   2309 
   2310 /* Read the directories and file names for a line header for version
   2311    2, setting fields in HDR.  Return 1 on success, 0 on failure.  */
   2312 
   2313 static int
   2314 read_v2_paths (struct backtrace_state *state, struct unit *u,
   2315 	       struct dwarf_buf *hdr_buf, struct line_header *hdr)
   2316 {
   2317   const unsigned char *p;
   2318   const unsigned char *pend;
   2319   size_t i;
   2320 
   2321   /* Count the number of directory entries.  */
   2322   hdr->dirs_count = 0;
   2323   p = hdr_buf->buf;
   2324   pend = p + hdr_buf->left;
   2325   while (p < pend && *p != '\0')
   2326     {
   2327       p += strnlen((const char *) p, pend - p) + 1;
   2328       ++hdr->dirs_count;
   2329     }
   2330 
   2331   hdr->dirs = NULL;
   2332   if (hdr->dirs_count != 0)
   2333     {
   2334       hdr->dirs = ((const char **)
   2335 		   backtrace_alloc (state,
   2336 				    hdr->dirs_count * sizeof (const char *),
   2337 				    hdr_buf->error_callback,
   2338 				    hdr_buf->data));
   2339       if (hdr->dirs == NULL)
   2340 	return 0;
   2341     }
   2342 
   2343   i = 0;
   2344   while (*hdr_buf->buf != '\0')
   2345     {
   2346       if (hdr_buf->reported_underflow)
   2347 	return 0;
   2348 
   2349       hdr->dirs[i] = read_string (hdr_buf);
   2350       if (hdr->dirs[i] == NULL)
   2351 	return 0;
   2352       ++i;
   2353     }
   2354   if (!advance (hdr_buf, 1))
   2355     return 0;
   2356 
   2357   /* Count the number of file entries.  */
   2358   hdr->filenames_count = 0;
   2359   p = hdr_buf->buf;
   2360   pend = p + hdr_buf->left;
   2361   while (p < pend && *p != '\0')
   2362     {
   2363       p += strnlen ((const char *) p, pend - p) + 1;
   2364       p += leb128_len (p);
   2365       p += leb128_len (p);
   2366       p += leb128_len (p);
   2367       ++hdr->filenames_count;
   2368     }
   2369 
   2370   hdr->filenames = ((const char **)
   2371 		    backtrace_alloc (state,
   2372 				     hdr->filenames_count * sizeof (char *),
   2373 				     hdr_buf->error_callback,
   2374 				     hdr_buf->data));
   2375   if (hdr->filenames == NULL)
   2376     return 0;
   2377   i = 0;
   2378   while (*hdr_buf->buf != '\0')
   2379     {
   2380       const char *filename;
   2381       uint64_t dir_index;
   2382 
   2383       if (hdr_buf->reported_underflow)
   2384 	return 0;
   2385 
   2386       filename = read_string (hdr_buf);
   2387       if (filename == NULL)
   2388 	return 0;
   2389       dir_index = read_uleb128 (hdr_buf);
   2390       if (IS_ABSOLUTE_PATH (filename)
   2391 	  || (dir_index == 0 && u->comp_dir == NULL))
   2392 	hdr->filenames[i] = filename;
   2393       else
   2394 	{
   2395 	  const char *dir;
   2396 	  size_t dir_len;
   2397 	  size_t filename_len;
   2398 	  char *s;
   2399 
   2400 	  if (dir_index == 0)
   2401 	    dir = u->comp_dir;
   2402 	  else if (dir_index - 1 < hdr->dirs_count)
   2403 	    dir = hdr->dirs[dir_index - 1];
   2404 	  else
   2405 	    {
   2406 	      dwarf_buf_error (hdr_buf,
   2407 			       ("invalid directory index in "
   2408 				"line number program header"));
   2409 	      return 0;
   2410 	    }
   2411 	  dir_len = strlen (dir);
   2412 	  filename_len = strlen (filename);
   2413 	  s = ((char *) backtrace_alloc (state, dir_len + filename_len + 2,
   2414 					 hdr_buf->error_callback,
   2415 					 hdr_buf->data));
   2416 	  if (s == NULL)
   2417 	    return 0;
   2418 	  memcpy (s, dir, dir_len);
   2419 	  /* FIXME: If we are on a DOS-based file system, and the
   2420 	     directory or the file name use backslashes, then we
   2421 	     should use a backslash here.  */
   2422 	  s[dir_len] = '/';
   2423 	  memcpy (s + dir_len + 1, filename, filename_len + 1);
   2424 	  hdr->filenames[i] = s;
   2425 	}
   2426 
   2427       /* Ignore the modification time and size.  */
   2428       read_uleb128 (hdr_buf);
   2429       read_uleb128 (hdr_buf);
   2430 
   2431       ++i;
   2432     }
   2433 
   2434   return 1;
   2435 }
   2436 
   2437 /* Read a single version 5 LNCT entry for a directory or file name in a
   2438    line header.  Sets *STRING to the resulting name, ignoring other
   2439    data.  Return 1 on success, 0 on failure.  */
   2440 
   2441 static int
   2442 read_lnct (struct backtrace_state *state, struct dwarf_data *ddata,
   2443 	   struct unit *u, struct dwarf_buf *hdr_buf,
   2444 	   const struct line_header *hdr, size_t formats_count,
   2445 	   const struct line_header_format *formats, const char **string)
   2446 {
   2447   size_t i;
   2448   const char *dir;
   2449   const char *path;
   2450 
   2451   dir = NULL;
   2452   path = NULL;
   2453   for (i = 0; i < formats_count; i++)
   2454     {
   2455       struct attr_val val;
   2456 
   2457       if (!read_attribute (formats[i].form, 0, hdr_buf, u->is_dwarf64,
   2458 			   u->version, hdr->addrsize, &ddata->dwarf_sections,
   2459 			   ddata->altlink, &val))
   2460 	return 0;
   2461       switch (formats[i].lnct)
   2462 	{
   2463 	case DW_LNCT_path:
   2464 	  if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
   2465 			       ddata->is_bigendian, u->str_offsets_base,
   2466 			       &val, hdr_buf->error_callback, hdr_buf->data,
   2467 			       &path))
   2468 	    return 0;
   2469 	  break;
   2470 	case DW_LNCT_directory_index:
   2471 	  if (val.encoding == ATTR_VAL_UINT)
   2472 	    {
   2473 	      if (val.u.uint >= hdr->dirs_count)
   2474 		{
   2475 		  dwarf_buf_error (hdr_buf,
   2476 				   ("invalid directory index in "
   2477 				    "line number program header"));
   2478 		  return 0;
   2479 		}
   2480 	      dir = hdr->dirs[val.u.uint];
   2481 	    }
   2482 	  break;
   2483 	default:
   2484 	  /* We don't care about timestamps or sizes or hashes.  */
   2485 	  break;
   2486 	}
   2487     }
   2488 
   2489   if (path == NULL)
   2490     {
   2491       dwarf_buf_error (hdr_buf,
   2492 		       "missing file name in line number program header");
   2493       return 0;
   2494     }
   2495 
   2496   if (dir == NULL)
   2497     *string = path;
   2498   else
   2499     {
   2500       size_t dir_len;
   2501       size_t path_len;
   2502       char *s;
   2503 
   2504       dir_len = strlen (dir);
   2505       path_len = strlen (path);
   2506       s = (char *) backtrace_alloc (state, dir_len + path_len + 2,
   2507 				    hdr_buf->error_callback, hdr_buf->data);
   2508       if (s == NULL)
   2509 	return 0;
   2510       memcpy (s, dir, dir_len);
   2511       /* FIXME: If we are on a DOS-based file system, and the
   2512 	 directory or the path name use backslashes, then we should
   2513 	 use a backslash here.  */
   2514       s[dir_len] = '/';
   2515       memcpy (s + dir_len + 1, path, path_len + 1);
   2516       *string = s;
   2517     }
   2518 
   2519   return 1;
   2520 }
   2521 
   2522 /* Read a set of DWARF 5 line header format entries, setting *PCOUNT
   2523    and *PPATHS.  Return 1 on success, 0 on failure.  */
   2524 
   2525 static int
   2526 read_line_header_format_entries (struct backtrace_state *state,
   2527 				 struct dwarf_data *ddata,
   2528 				 struct unit *u,
   2529 				 struct dwarf_buf *hdr_buf,
   2530 				 struct line_header *hdr,
   2531 				 size_t *pcount,
   2532 				 const char ***ppaths)
   2533 {
   2534   size_t formats_count;
   2535   struct line_header_format *formats;
   2536   size_t paths_count;
   2537   const char **paths;
   2538   size_t i;
   2539   int ret;
   2540 
   2541   formats_count = read_byte (hdr_buf);
   2542   if (formats_count == 0)
   2543     formats = NULL;
   2544   else
   2545     {
   2546       formats = ((struct line_header_format *)
   2547 		 backtrace_alloc (state,
   2548 				  (formats_count
   2549 				   * sizeof (struct line_header_format)),
   2550 				  hdr_buf->error_callback,
   2551 				  hdr_buf->data));
   2552       if (formats == NULL)
   2553 	return 0;
   2554 
   2555       for (i = 0; i < formats_count; i++)
   2556 	{
   2557 	  formats[i].lnct = (int) read_uleb128(hdr_buf);
   2558 	  formats[i].form = (enum dwarf_form) read_uleb128 (hdr_buf);
   2559 	}
   2560     }
   2561 
   2562   paths_count = read_uleb128 (hdr_buf);
   2563   if (paths_count == 0)
   2564     {
   2565       *pcount = 0;
   2566       *ppaths = NULL;
   2567       ret = 1;
   2568       goto exit;
   2569     }
   2570 
   2571   paths = ((const char **)
   2572 	   backtrace_alloc (state, paths_count * sizeof (const char *),
   2573 			    hdr_buf->error_callback, hdr_buf->data));
   2574   if (paths == NULL)
   2575     {
   2576       ret = 0;
   2577       goto exit;
   2578     }
   2579   for (i = 0; i < paths_count; i++)
   2580     {
   2581       if (!read_lnct (state, ddata, u, hdr_buf, hdr, formats_count,
   2582 		      formats, &paths[i]))
   2583 	{
   2584 	  backtrace_free (state, paths,
   2585 			  paths_count * sizeof (const char *),
   2586 			  hdr_buf->error_callback, hdr_buf->data);
   2587 	  ret = 0;
   2588 	  goto exit;
   2589 	}
   2590     }
   2591 
   2592   *pcount = paths_count;
   2593   *ppaths = paths;
   2594 
   2595   ret = 1;
   2596 
   2597  exit:
   2598   if (formats != NULL)
   2599     backtrace_free (state, formats,
   2600 		    formats_count * sizeof (struct line_header_format),
   2601 		    hdr_buf->error_callback, hdr_buf->data);
   2602 
   2603   return  ret;
   2604 }
   2605 
   2606 /* Read the line header.  Return 1 on success, 0 on failure.  */
   2607 
   2608 static int
   2609 read_line_header (struct backtrace_state *state, struct dwarf_data *ddata,
   2610 		  struct unit *u, int is_dwarf64, struct dwarf_buf *line_buf,
   2611 		  struct line_header *hdr)
   2612 {
   2613   uint64_t hdrlen;
   2614   struct dwarf_buf hdr_buf;
   2615 
   2616   hdr->version = read_uint16 (line_buf);
   2617   if (hdr->version < 2 || hdr->version > 5)
   2618     {
   2619       dwarf_buf_error (line_buf, "unsupported line number version");
   2620       return 0;
   2621     }
   2622 
   2623   if (hdr->version < 5)
   2624     hdr->addrsize = u->addrsize;
   2625   else
   2626     {
   2627       hdr->addrsize = read_byte (line_buf);
   2628       /* We could support a non-zero segment_selector_size but I doubt
   2629 	 we'll ever see it.  */
   2630       if (read_byte (line_buf) != 0)
   2631 	{
   2632 	  dwarf_buf_error (line_buf,
   2633 			   "non-zero segment_selector_size not supported");
   2634 	  return 0;
   2635 	}
   2636     }
   2637 
   2638   hdrlen = read_offset (line_buf, is_dwarf64);
   2639 
   2640   hdr_buf = *line_buf;
   2641   hdr_buf.left = hdrlen;
   2642 
   2643   if (!advance (line_buf, hdrlen))
   2644     return 0;
   2645 
   2646   hdr->min_insn_len = read_byte (&hdr_buf);
   2647   if (hdr->version < 4)
   2648     hdr->max_ops_per_insn = 1;
   2649   else
   2650     hdr->max_ops_per_insn = read_byte (&hdr_buf);
   2651 
   2652   /* We don't care about default_is_stmt.  */
   2653   read_byte (&hdr_buf);
   2654 
   2655   hdr->line_base = read_sbyte (&hdr_buf);
   2656   hdr->line_range = read_byte (&hdr_buf);
   2657 
   2658   hdr->opcode_base = read_byte (&hdr_buf);
   2659   hdr->opcode_lengths = hdr_buf.buf;
   2660   if (!advance (&hdr_buf, hdr->opcode_base - 1))
   2661     return 0;
   2662 
   2663   if (hdr->version < 5)
   2664     {
   2665       if (!read_v2_paths (state, u, &hdr_buf, hdr))
   2666 	return 0;
   2667     }
   2668   else
   2669     {
   2670       if (!read_line_header_format_entries (state, ddata, u, &hdr_buf, hdr,
   2671 					    &hdr->dirs_count,
   2672 					    &hdr->dirs))
   2673 	return 0;
   2674       if (!read_line_header_format_entries (state, ddata, u, &hdr_buf, hdr,
   2675 					    &hdr->filenames_count,
   2676 					    &hdr->filenames))
   2677 	return 0;
   2678     }
   2679 
   2680   if (hdr_buf.reported_underflow)
   2681     return 0;
   2682 
   2683   return 1;
   2684 }
   2685 
   2686 /* Read the line program, adding line mappings to VEC.  Return 1 on
   2687    success, 0 on failure.  */
   2688 
   2689 static int
   2690 read_line_program (struct backtrace_state *state, struct dwarf_data *ddata,
   2691 		   struct unit *u, const struct line_header *hdr,
   2692 		   struct dwarf_buf *line_buf, struct line_vector *vec)
   2693 {
   2694   uint64_t address;
   2695   unsigned int op_index;
   2696   const char *reset_filename;
   2697   const char *filename;
   2698   int lineno;
   2699 
   2700   address = 0;
   2701   op_index = 0;
   2702   if (hdr->filenames_count > 0)
   2703     reset_filename = hdr->filenames[0];
   2704   else
   2705     reset_filename = "";
   2706   filename = reset_filename;
   2707   lineno = 1;
   2708   while (line_buf->left > 0)
   2709     {
   2710       unsigned int op;
   2711 
   2712       op = read_byte (line_buf);
   2713       if (op >= hdr->opcode_base)
   2714 	{
   2715 	  unsigned int advance;
   2716 
   2717 	  /* Special opcode.  */
   2718 	  op -= hdr->opcode_base;
   2719 	  advance = op / hdr->line_range;
   2720 	  address += (hdr->min_insn_len * (op_index + advance)
   2721 		      / hdr->max_ops_per_insn);
   2722 	  op_index = (op_index + advance) % hdr->max_ops_per_insn;
   2723 	  lineno += hdr->line_base + (int) (op % hdr->line_range);
   2724 	  add_line (state, ddata, address, filename, lineno,
   2725 		    line_buf->error_callback, line_buf->data, vec);
   2726 	}
   2727       else if (op == DW_LNS_extended_op)
   2728 	{
   2729 	  uint64_t len;
   2730 
   2731 	  len = read_uleb128 (line_buf);
   2732 	  op = read_byte (line_buf);
   2733 	  switch (op)
   2734 	    {
   2735 	    case DW_LNE_end_sequence:
   2736 	      /* FIXME: Should we mark the high PC here?  It seems
   2737 		 that we already have that information from the
   2738 		 compilation unit.  */
   2739 	      address = 0;
   2740 	      op_index = 0;
   2741 	      filename = reset_filename;
   2742 	      lineno = 1;
   2743 	      break;
   2744 	    case DW_LNE_set_address:
   2745 	      address = read_address (line_buf, hdr->addrsize);
   2746 	      break;
   2747 	    case DW_LNE_define_file:
   2748 	      {
   2749 		const char *f;
   2750 		unsigned int dir_index;
   2751 
   2752 		f = read_string (line_buf);
   2753 		if (f == NULL)
   2754 		  return 0;
   2755 		dir_index = read_uleb128 (line_buf);
   2756 		/* Ignore that time and length.  */
   2757 		read_uleb128 (line_buf);
   2758 		read_uleb128 (line_buf);
   2759 		if (IS_ABSOLUTE_PATH (f))
   2760 		  filename = f;
   2761 		else
   2762 		  {
   2763 		    const char *dir;
   2764 		    size_t dir_len;
   2765 		    size_t f_len;
   2766 		    char *p;
   2767 
   2768 		    if (dir_index == 0 && hdr->version < 5)
   2769 		      dir = u->comp_dir;
   2770 		    else if (dir_index - 1 < hdr->dirs_count)
   2771 		      dir = hdr->dirs[dir_index - 1];
   2772 		    else
   2773 		      {
   2774 			dwarf_buf_error (line_buf,
   2775 					 ("invalid directory index "
   2776 					  "in line number program"));
   2777 			return 0;
   2778 		      }
   2779 		    dir_len = strlen (dir);
   2780 		    f_len = strlen (f);
   2781 		    p = ((char *)
   2782 			 backtrace_alloc (state, dir_len + f_len + 2,
   2783 					  line_buf->error_callback,
   2784 					  line_buf->data));
   2785 		    if (p == NULL)
   2786 		      return 0;
   2787 		    memcpy (p, dir, dir_len);
   2788 		    /* FIXME: If we are on a DOS-based file system,
   2789 		       and the directory or the file name use
   2790 		       backslashes, then we should use a backslash
   2791 		       here.  */
   2792 		    p[dir_len] = '/';
   2793 		    memcpy (p + dir_len + 1, f, f_len + 1);
   2794 		    filename = p;
   2795 		  }
   2796 	      }
   2797 	      break;
   2798 	    case DW_LNE_set_discriminator:
   2799 	      /* We don't care about discriminators.  */
   2800 	      read_uleb128 (line_buf);
   2801 	      break;
   2802 	    default:
   2803 	      if (!advance (line_buf, len - 1))
   2804 		return 0;
   2805 	      break;
   2806 	    }
   2807 	}
   2808       else
   2809 	{
   2810 	  switch (op)
   2811 	    {
   2812 	    case DW_LNS_copy:
   2813 	      add_line (state, ddata, address, filename, lineno,
   2814 			line_buf->error_callback, line_buf->data, vec);
   2815 	      break;
   2816 	    case DW_LNS_advance_pc:
   2817 	      {
   2818 		uint64_t advance;
   2819 
   2820 		advance = read_uleb128 (line_buf);
   2821 		address += (hdr->min_insn_len * (op_index + advance)
   2822 			    / hdr->max_ops_per_insn);
   2823 		op_index = (op_index + advance) % hdr->max_ops_per_insn;
   2824 	      }
   2825 	      break;
   2826 	    case DW_LNS_advance_line:
   2827 	      lineno += (int) read_sleb128 (line_buf);
   2828 	      break;
   2829 	    case DW_LNS_set_file:
   2830 	      {
   2831 		uint64_t fileno;
   2832 
   2833 		fileno = read_uleb128 (line_buf);
   2834 		if (fileno == 0)
   2835 		  filename = "";
   2836 		else
   2837 		  {
   2838 		    if (fileno - 1 >= hdr->filenames_count)
   2839 		      {
   2840 			dwarf_buf_error (line_buf,
   2841 					 ("invalid file number in "
   2842 					  "line number program"));
   2843 			return 0;
   2844 		      }
   2845 		    filename = hdr->filenames[fileno - 1];
   2846 		  }
   2847 	      }
   2848 	      break;
   2849 	    case DW_LNS_set_column:
   2850 	      read_uleb128 (line_buf);
   2851 	      break;
   2852 	    case DW_LNS_negate_stmt:
   2853 	      break;
   2854 	    case DW_LNS_set_basic_block:
   2855 	      break;
   2856 	    case DW_LNS_const_add_pc:
   2857 	      {
   2858 		unsigned int advance;
   2859 
   2860 		op = 255 - hdr->opcode_base;
   2861 		advance = op / hdr->line_range;
   2862 		address += (hdr->min_insn_len * (op_index + advance)
   2863 			    / hdr->max_ops_per_insn);
   2864 		op_index = (op_index + advance) % hdr->max_ops_per_insn;
   2865 	      }
   2866 	      break;
   2867 	    case DW_LNS_fixed_advance_pc:
   2868 	      address += read_uint16 (line_buf);
   2869 	      op_index = 0;
   2870 	      break;
   2871 	    case DW_LNS_set_prologue_end:
   2872 	      break;
   2873 	    case DW_LNS_set_epilogue_begin:
   2874 	      break;
   2875 	    case DW_LNS_set_isa:
   2876 	      read_uleb128 (line_buf);
   2877 	      break;
   2878 	    default:
   2879 	      {
   2880 		unsigned int i;
   2881 
   2882 		for (i = hdr->opcode_lengths[op - 1]; i > 0; --i)
   2883 		  read_uleb128 (line_buf);
   2884 	      }
   2885 	      break;
   2886 	    }
   2887 	}
   2888     }
   2889 
   2890   return 1;
   2891 }
   2892 
   2893 /* Read the line number information for a compilation unit.  Returns 1
   2894    on success, 0 on failure.  */
   2895 
   2896 static int
   2897 read_line_info (struct backtrace_state *state, struct dwarf_data *ddata,
   2898 		backtrace_error_callback error_callback, void *data,
   2899 		struct unit *u, struct line_header *hdr, struct line **lines,
   2900 		size_t *lines_count)
   2901 {
   2902   struct line_vector vec;
   2903   struct dwarf_buf line_buf;
   2904   uint64_t len;
   2905   int is_dwarf64;
   2906   struct line *ln;
   2907 
   2908   memset (&vec.vec, 0, sizeof vec.vec);
   2909   vec.count = 0;
   2910 
   2911   memset (hdr, 0, sizeof *hdr);
   2912 
   2913   if (u->lineoff != (off_t) (size_t) u->lineoff
   2914       || (size_t) u->lineoff >= ddata->dwarf_sections.size[DEBUG_LINE])
   2915     {
   2916       error_callback (data, "unit line offset out of range", 0);
   2917       goto fail;
   2918     }
   2919 
   2920   line_buf.name = ".debug_line";
   2921   line_buf.start = ddata->dwarf_sections.data[DEBUG_LINE];
   2922   line_buf.buf = ddata->dwarf_sections.data[DEBUG_LINE] + u->lineoff;
   2923   line_buf.left = ddata->dwarf_sections.size[DEBUG_LINE] - u->lineoff;
   2924   line_buf.is_bigendian = ddata->is_bigendian;
   2925   line_buf.error_callback = error_callback;
   2926   line_buf.data = data;
   2927   line_buf.reported_underflow = 0;
   2928 
   2929   len = read_initial_length (&line_buf, &is_dwarf64);
   2930   line_buf.left = len;
   2931 
   2932   if (!read_line_header (state, ddata, u, is_dwarf64, &line_buf, hdr))
   2933     goto fail;
   2934 
   2935   if (!read_line_program (state, ddata, u, hdr, &line_buf, &vec))
   2936     goto fail;
   2937 
   2938   if (line_buf.reported_underflow)
   2939     goto fail;
   2940 
   2941   if (vec.count == 0)
   2942     {
   2943       /* This is not a failure in the sense of a generating an error,
   2944 	 but it is a failure in that sense that we have no useful
   2945 	 information.  */
   2946       goto fail;
   2947     }
   2948 
   2949   /* Allocate one extra entry at the end.  */
   2950   ln = ((struct line *)
   2951 	backtrace_vector_grow (state, sizeof (struct line), error_callback,
   2952 			       data, &vec.vec));
   2953   if (ln == NULL)
   2954     goto fail;
   2955   ln->pc = (uintptr_t) -1;
   2956   ln->filename = NULL;
   2957   ln->lineno = 0;
   2958   ln->idx = 0;
   2959 
   2960   if (!backtrace_vector_release (state, &vec.vec, error_callback, data))
   2961     goto fail;
   2962 
   2963   ln = (struct line *) vec.vec.base;
   2964   backtrace_qsort (ln, vec.count, sizeof (struct line), line_compare);
   2965 
   2966   *lines = ln;
   2967   *lines_count = vec.count;
   2968 
   2969   return 1;
   2970 
   2971  fail:
   2972   backtrace_vector_free (state, &vec.vec, error_callback, data);
   2973   free_line_header (state, hdr, error_callback, data);
   2974   *lines = (struct line *) (uintptr_t) -1;
   2975   *lines_count = 0;
   2976   return 0;
   2977 }
   2978 
   2979 static const char *read_referenced_name (struct dwarf_data *, struct unit *,
   2980 					 uint64_t, backtrace_error_callback,
   2981 					 void *);
   2982 
   2983 /* Read the name of a function from a DIE referenced by ATTR with VAL.  */
   2984 
   2985 static const char *
   2986 read_referenced_name_from_attr (struct dwarf_data *ddata, struct unit *u,
   2987 				struct attr *attr, struct attr_val *val,
   2988 				backtrace_error_callback error_callback,
   2989 				void *data)
   2990 {
   2991   switch (attr->name)
   2992     {
   2993     case DW_AT_abstract_origin:
   2994     case DW_AT_specification:
   2995       break;
   2996     default:
   2997       return NULL;
   2998     }
   2999 
   3000   if (attr->form == DW_FORM_ref_sig8)
   3001     return NULL;
   3002 
   3003   if (val->encoding == ATTR_VAL_REF_INFO)
   3004     {
   3005       struct unit *unit
   3006 	= find_unit (ddata->units, ddata->units_count,
   3007 		     val->u.uint);
   3008       if (unit == NULL)
   3009 	return NULL;
   3010 
   3011       uint64_t offset = val->u.uint - unit->low_offset;
   3012       return read_referenced_name (ddata, unit, offset, error_callback, data);
   3013     }
   3014 
   3015   if (val->encoding == ATTR_VAL_UINT
   3016       || val->encoding == ATTR_VAL_REF_UNIT)
   3017     return read_referenced_name (ddata, u, val->u.uint, error_callback, data);
   3018 
   3019   if (val->encoding == ATTR_VAL_REF_ALT_INFO)
   3020     {
   3021       struct unit *alt_unit
   3022 	= find_unit (ddata->altlink->units, ddata->altlink->units_count,
   3023 		     val->u.uint);
   3024       if (alt_unit == NULL)
   3025 	return NULL;
   3026 
   3027       uint64_t offset = val->u.uint - alt_unit->low_offset;
   3028       return read_referenced_name (ddata->altlink, alt_unit, offset,
   3029 				   error_callback, data);
   3030     }
   3031 
   3032   return NULL;
   3033 }
   3034 
   3035 /* Read the name of a function from a DIE referenced by a
   3036    DW_AT_abstract_origin or DW_AT_specification tag.  OFFSET is within
   3037    the same compilation unit.  */
   3038 
   3039 static const char *
   3040 read_referenced_name (struct dwarf_data *ddata, struct unit *u,
   3041 		      uint64_t offset, backtrace_error_callback error_callback,
   3042 		      void *data)
   3043 {
   3044   struct dwarf_buf unit_buf;
   3045   uint64_t code;
   3046   const struct abbrev *abbrev;
   3047   const char *ret;
   3048   size_t i;
   3049 
   3050   /* OFFSET is from the start of the data for this compilation unit.
   3051      U->unit_data is the data, but it starts U->unit_data_offset bytes
   3052      from the beginning.  */
   3053 
   3054   if (offset < u->unit_data_offset
   3055       || offset - u->unit_data_offset >= u->unit_data_len)
   3056     {
   3057       error_callback (data,
   3058 		      "abstract origin or specification out of range",
   3059 		      0);
   3060       return NULL;
   3061     }
   3062 
   3063   offset -= u->unit_data_offset;
   3064 
   3065   unit_buf.name = ".debug_info";
   3066   unit_buf.start = ddata->dwarf_sections.data[DEBUG_INFO];
   3067   unit_buf.buf = u->unit_data + offset;
   3068   unit_buf.left = u->unit_data_len - offset;
   3069   unit_buf.is_bigendian = ddata->is_bigendian;
   3070   unit_buf.error_callback = error_callback;
   3071   unit_buf.data = data;
   3072   unit_buf.reported_underflow = 0;
   3073 
   3074   code = read_uleb128 (&unit_buf);
   3075   if (code == 0)
   3076     {
   3077       dwarf_buf_error (&unit_buf, "invalid abstract origin or specification");
   3078       return NULL;
   3079     }
   3080 
   3081   abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
   3082   if (abbrev == NULL)
   3083     return NULL;
   3084 
   3085   ret = NULL;
   3086   for (i = 0; i < abbrev->num_attrs; ++i)
   3087     {
   3088       struct attr_val val;
   3089 
   3090       if (!read_attribute (abbrev->attrs[i].form, abbrev->attrs[i].val,
   3091 			   &unit_buf, u->is_dwarf64, u->version, u->addrsize,
   3092 			   &ddata->dwarf_sections, ddata->altlink, &val))
   3093 	return NULL;
   3094 
   3095       switch (abbrev->attrs[i].name)
   3096 	{
   3097 	case DW_AT_name:
   3098 	  /* Third name preference: don't override.  A name we found in some
   3099 	     other way, will normally be more useful -- e.g., this name is
   3100 	     normally not mangled.  */
   3101 	  if (ret != NULL)
   3102 	    break;
   3103 	  if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
   3104 			       ddata->is_bigendian, u->str_offsets_base,
   3105 			       &val, error_callback, data, &ret))
   3106 	    return NULL;
   3107 	  break;
   3108 
   3109 	case DW_AT_linkage_name:
   3110 	case DW_AT_MIPS_linkage_name:
   3111 	  /* First name preference: override all.  */
   3112 	  {
   3113 	    const char *s;
   3114 
   3115 	    s = NULL;
   3116 	    if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
   3117 				 ddata->is_bigendian, u->str_offsets_base,
   3118 				 &val, error_callback, data, &s))
   3119 	      return NULL;
   3120 	    if (s != NULL)
   3121 	      return s;
   3122 	  }
   3123 	  break;
   3124 
   3125 	case DW_AT_specification:
   3126 	  /* Second name preference: override DW_AT_name, don't override
   3127 	     DW_AT_linkage_name.  */
   3128 	  {
   3129 	    const char *name;
   3130 
   3131 	    name = read_referenced_name_from_attr (ddata, u, &abbrev->attrs[i],
   3132 						   &val, error_callback, data);
   3133 	    if (name != NULL)
   3134 	      ret = name;
   3135 	  }
   3136 	  break;
   3137 
   3138 	default:
   3139 	  break;
   3140 	}
   3141     }
   3142 
   3143   return ret;
   3144 }
   3145 
   3146 /* Add a range to a unit that maps to a function.  This is called via
   3147    add_ranges.  Returns 1 on success, 0 on error.  */
   3148 
   3149 static int
   3150 add_function_range (struct backtrace_state *state, void *rdata,
   3151 		    uint64_t lowpc, uint64_t highpc,
   3152 		    backtrace_error_callback error_callback, void *data,
   3153 		    void *pvec)
   3154 {
   3155   struct function *function = (struct function *) rdata;
   3156   struct function_vector *vec = (struct function_vector *) pvec;
   3157   struct function_addrs *p;
   3158 
   3159   if (vec->count > 0)
   3160     {
   3161       p = (struct function_addrs *) vec->vec.base + (vec->count - 1);
   3162       if ((lowpc == p->high || lowpc == p->high + 1)
   3163 	  && function == p->function)
   3164 	{
   3165 	  if (highpc > p->high)
   3166 	    p->high = highpc;
   3167 	  return 1;
   3168 	}
   3169     }
   3170 
   3171   p = ((struct function_addrs *)
   3172        backtrace_vector_grow (state, sizeof (struct function_addrs),
   3173 			      error_callback, data, &vec->vec));
   3174   if (p == NULL)
   3175     return 0;
   3176 
   3177   p->low = lowpc;
   3178   p->high = highpc;
   3179   p->function = function;
   3180 
   3181   ++vec->count;
   3182 
   3183   return 1;
   3184 }
   3185 
   3186 /* Read one entry plus all its children.  Add function addresses to
   3187    VEC.  Returns 1 on success, 0 on error.  */
   3188 
   3189 static int
   3190 read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata,
   3191 		     struct unit *u, uint64_t base, struct dwarf_buf *unit_buf,
   3192 		     const struct line_header *lhdr,
   3193 		     backtrace_error_callback error_callback, void *data,
   3194 		     struct function_vector *vec_function,
   3195 		     struct function_vector *vec_inlined)
   3196 {
   3197   while (unit_buf->left > 0)
   3198     {
   3199       uint64_t code;
   3200       const struct abbrev *abbrev;
   3201       int is_function;
   3202       struct function *function;
   3203       struct function_vector *vec;
   3204       size_t i;
   3205       struct pcrange pcrange;
   3206       int have_linkage_name;
   3207 
   3208       code = read_uleb128 (unit_buf);
   3209       if (code == 0)
   3210 	return 1;
   3211 
   3212       abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
   3213       if (abbrev == NULL)
   3214 	return 0;
   3215 
   3216       is_function = (abbrev->tag == DW_TAG_subprogram
   3217 		     || abbrev->tag == DW_TAG_entry_point
   3218 		     || abbrev->tag == DW_TAG_inlined_subroutine);
   3219 
   3220       if (abbrev->tag == DW_TAG_inlined_subroutine)
   3221 	vec = vec_inlined;
   3222       else
   3223 	vec = vec_function;
   3224 
   3225       function = NULL;
   3226       if (is_function)
   3227 	{
   3228 	  function = ((struct function *)
   3229 		      backtrace_alloc (state, sizeof *function,
   3230 				       error_callback, data));
   3231 	  if (function == NULL)
   3232 	    return 0;
   3233 	  memset (function, 0, sizeof *function);
   3234 	}
   3235 
   3236       memset (&pcrange, 0, sizeof pcrange);
   3237       have_linkage_name = 0;
   3238       for (i = 0; i < abbrev->num_attrs; ++i)
   3239 	{
   3240 	  struct attr_val val;
   3241 
   3242 	  if (!read_attribute (abbrev->attrs[i].form, abbrev->attrs[i].val,
   3243 			       unit_buf, u->is_dwarf64, u->version,
   3244 			       u->addrsize, &ddata->dwarf_sections,
   3245 			       ddata->altlink, &val))
   3246 	    return 0;
   3247 
   3248 	  /* The compile unit sets the base address for any address
   3249 	     ranges in the function entries.  */
   3250 	  if (abbrev->tag == DW_TAG_compile_unit
   3251 	      && abbrev->attrs[i].name == DW_AT_low_pc)
   3252 	    {
   3253 	      if (val.encoding == ATTR_VAL_ADDRESS)
   3254 		base = val.u.uint;
   3255 	      else if (val.encoding == ATTR_VAL_ADDRESS_INDEX)
   3256 		{
   3257 		  if (!resolve_addr_index (&ddata->dwarf_sections,
   3258 					   u->addr_base, u->addrsize,
   3259 					   ddata->is_bigendian, val.u.uint,
   3260 					   error_callback, data, &base))
   3261 		    return 0;
   3262 		}
   3263 	    }
   3264 
   3265 	  if (is_function)
   3266 	    {
   3267 	      switch (abbrev->attrs[i].name)
   3268 		{
   3269 		case DW_AT_call_file:
   3270 		  if (val.encoding == ATTR_VAL_UINT)
   3271 		    {
   3272 		      if (val.u.uint == 0)
   3273 			function->caller_filename = "";
   3274 		      else
   3275 			{
   3276 			  if (val.u.uint - 1 >= lhdr->filenames_count)
   3277 			    {
   3278 			      dwarf_buf_error (unit_buf,
   3279 					       ("invalid file number in "
   3280 						"DW_AT_call_file attribute"));
   3281 			      return 0;
   3282 			    }
   3283 			  function->caller_filename =
   3284 			    lhdr->filenames[val.u.uint - 1];
   3285 			}
   3286 		    }
   3287 		  break;
   3288 
   3289 		case DW_AT_call_line:
   3290 		  if (val.encoding == ATTR_VAL_UINT)
   3291 		    function->caller_lineno = val.u.uint;
   3292 		  break;
   3293 
   3294 		case DW_AT_abstract_origin:
   3295 		case DW_AT_specification:
   3296 		  /* Second name preference: override DW_AT_name, don't override
   3297 		     DW_AT_linkage_name.  */
   3298 		  if (have_linkage_name)
   3299 		    break;
   3300 		  {
   3301 		    const char *name;
   3302 
   3303 		    name
   3304 		      = read_referenced_name_from_attr (ddata, u,
   3305 							&abbrev->attrs[i], &val,
   3306 							error_callback, data);
   3307 		    if (name != NULL)
   3308 		      function->name = name;
   3309 		  }
   3310 		  break;
   3311 
   3312 		case DW_AT_name:
   3313 		  /* Third name preference: don't override.  */
   3314 		  if (function->name != NULL)
   3315 		    break;
   3316 		  if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
   3317 				       ddata->is_bigendian,
   3318 				       u->str_offsets_base, &val,
   3319 				       error_callback, data, &function->name))
   3320 		    return 0;
   3321 		  break;
   3322 
   3323 		case DW_AT_linkage_name:
   3324 		case DW_AT_MIPS_linkage_name:
   3325 		  /* First name preference: override all.  */
   3326 		  {
   3327 		    const char *s;
   3328 
   3329 		    s = NULL;
   3330 		    if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
   3331 					 ddata->is_bigendian,
   3332 					 u->str_offsets_base, &val,
   3333 					 error_callback, data, &s))
   3334 		      return 0;
   3335 		    if (s != NULL)
   3336 		      {
   3337 			function->name = s;
   3338 			have_linkage_name = 1;
   3339 		      }
   3340 		  }
   3341 		  break;
   3342 
   3343 		case DW_AT_low_pc: case DW_AT_high_pc: case DW_AT_ranges:
   3344 		  update_pcrange (&abbrev->attrs[i], &val, &pcrange);
   3345 		  break;
   3346 
   3347 		default:
   3348 		  break;
   3349 		}
   3350 	    }
   3351 	}
   3352 
   3353       /* If we couldn't find a name for the function, we have no use
   3354 	 for it.  */
   3355       if (is_function && function->name == NULL)
   3356 	{
   3357 	  backtrace_free (state, function, sizeof *function,
   3358 			  error_callback, data);
   3359 	  is_function = 0;
   3360 	}
   3361 
   3362       if (is_function)
   3363 	{
   3364 	  if (pcrange.have_ranges
   3365 	      || (pcrange.have_lowpc && pcrange.have_highpc))
   3366 	    {
   3367 	      if (!add_ranges (state, &ddata->dwarf_sections,
   3368 			       ddata->base_address, ddata->is_bigendian,
   3369 			       u, base, &pcrange, add_function_range,
   3370 			       (void *) function, error_callback, data,
   3371 			       (void *) vec))
   3372 		return 0;
   3373 	    }
   3374 	  else
   3375 	    {
   3376 	      backtrace_free (state, function, sizeof *function,
   3377 			      error_callback, data);
   3378 	      is_function = 0;
   3379 	    }
   3380 	}
   3381 
   3382       if (abbrev->has_children)
   3383 	{
   3384 	  if (!is_function)
   3385 	    {
   3386 	      if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
   3387 					error_callback, data, vec_function,
   3388 					vec_inlined))
   3389 		return 0;
   3390 	    }
   3391 	  else
   3392 	    {
   3393 	      struct function_vector fvec;
   3394 
   3395 	      /* Gather any information for inlined functions in
   3396 		 FVEC.  */
   3397 
   3398 	      memset (&fvec, 0, sizeof fvec);
   3399 
   3400 	      if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
   3401 					error_callback, data, vec_function,
   3402 					&fvec))
   3403 		return 0;
   3404 
   3405 	      if (fvec.count > 0)
   3406 		{
   3407 		  struct function_addrs *faddrs;
   3408 
   3409 		  if (!backtrace_vector_release (state, &fvec.vec,
   3410 						 error_callback, data))
   3411 		    return 0;
   3412 
   3413 		  faddrs = (struct function_addrs *) fvec.vec.base;
   3414 		  backtrace_qsort (faddrs, fvec.count,
   3415 				   sizeof (struct function_addrs),
   3416 				   function_addrs_compare);
   3417 
   3418 		  function->function_addrs = faddrs;
   3419 		  function->function_addrs_count = fvec.count;
   3420 		}
   3421 	    }
   3422 	}
   3423     }
   3424 
   3425   return 1;
   3426 }
   3427 
   3428 /* Read function name information for a compilation unit.  We look
   3429    through the whole unit looking for function tags.  */
   3430 
   3431 static void
   3432 read_function_info (struct backtrace_state *state, struct dwarf_data *ddata,
   3433 		    const struct line_header *lhdr,
   3434 		    backtrace_error_callback error_callback, void *data,
   3435 		    struct unit *u, struct function_vector *fvec,
   3436 		    struct function_addrs **ret_addrs,
   3437 		    size_t *ret_addrs_count)
   3438 {
   3439   struct function_vector lvec;
   3440   struct function_vector *pfvec;
   3441   struct dwarf_buf unit_buf;
   3442   struct function_addrs *addrs;
   3443   size_t addrs_count;
   3444 
   3445   /* Use FVEC if it is not NULL.  Otherwise use our own vector.  */
   3446   if (fvec != NULL)
   3447     pfvec = fvec;
   3448   else
   3449     {
   3450       memset (&lvec, 0, sizeof lvec);
   3451       pfvec = &lvec;
   3452     }
   3453 
   3454   unit_buf.name = ".debug_info";
   3455   unit_buf.start = ddata->dwarf_sections.data[DEBUG_INFO];
   3456   unit_buf.buf = u->unit_data;
   3457   unit_buf.left = u->unit_data_len;
   3458   unit_buf.is_bigendian = ddata->is_bigendian;
   3459   unit_buf.error_callback = error_callback;
   3460   unit_buf.data = data;
   3461   unit_buf.reported_underflow = 0;
   3462 
   3463   while (unit_buf.left > 0)
   3464     {
   3465       if (!read_function_entry (state, ddata, u, 0, &unit_buf, lhdr,
   3466 				error_callback, data, pfvec, pfvec))
   3467 	return;
   3468     }
   3469 
   3470   if (pfvec->count == 0)
   3471     return;
   3472 
   3473   addrs_count = pfvec->count;
   3474 
   3475   if (fvec == NULL)
   3476     {
   3477       if (!backtrace_vector_release (state, &lvec.vec, error_callback, data))
   3478 	return;
   3479       addrs = (struct function_addrs *) pfvec->vec.base;
   3480     }
   3481   else
   3482     {
   3483       /* Finish this list of addresses, but leave the remaining space in
   3484 	 the vector available for the next function unit.  */
   3485       addrs = ((struct function_addrs *)
   3486 	       backtrace_vector_finish (state, &fvec->vec,
   3487 					error_callback, data));
   3488       if (addrs == NULL)
   3489 	return;
   3490       fvec->count = 0;
   3491     }
   3492 
   3493   backtrace_qsort (addrs, addrs_count, sizeof (struct function_addrs),
   3494 		   function_addrs_compare);
   3495 
   3496   *ret_addrs = addrs;
   3497   *ret_addrs_count = addrs_count;
   3498 }
   3499 
   3500 /* See if PC is inlined in FUNCTION.  If it is, print out the inlined
   3501    information, and update FILENAME and LINENO for the caller.
   3502    Returns whatever CALLBACK returns, or 0 to keep going.  */
   3503 
   3504 static int
   3505 report_inlined_functions (uintptr_t pc, struct function *function,
   3506 			  backtrace_full_callback callback, void *data,
   3507 			  const char **filename, int *lineno)
   3508 {
   3509   struct function_addrs *function_addrs;
   3510   struct function *inlined;
   3511   int ret;
   3512 
   3513   if (function->function_addrs_count == 0)
   3514     return 0;
   3515 
   3516   function_addrs = ((struct function_addrs *)
   3517 		    bsearch (&pc, function->function_addrs,
   3518 			     function->function_addrs_count,
   3519 			     sizeof (struct function_addrs),
   3520 			     function_addrs_search));
   3521   if (function_addrs == NULL)
   3522     return 0;
   3523 
   3524   while (((size_t) (function_addrs - function->function_addrs) + 1
   3525 	  < function->function_addrs_count)
   3526 	 && pc >= (function_addrs + 1)->low
   3527 	 && pc < (function_addrs + 1)->high)
   3528     ++function_addrs;
   3529 
   3530   /* We found an inlined call.  */
   3531 
   3532   inlined = function_addrs->function;
   3533 
   3534   /* Report any calls inlined into this one.  */
   3535   ret = report_inlined_functions (pc, inlined, callback, data,
   3536 				  filename, lineno);
   3537   if (ret != 0)
   3538     return ret;
   3539 
   3540   /* Report this inlined call.  */
   3541   ret = callback (data, pc, *filename, *lineno, inlined->name);
   3542   if (ret != 0)
   3543     return ret;
   3544 
   3545   /* Our caller will report the caller of the inlined function; tell
   3546      it the appropriate filename and line number.  */
   3547   *filename = inlined->caller_filename;
   3548   *lineno = inlined->caller_lineno;
   3549 
   3550   return 0;
   3551 }
   3552 
   3553 /* Look for a PC in the DWARF mapping for one module.  On success,
   3554    call CALLBACK and return whatever it returns.  On error, call
   3555    ERROR_CALLBACK and return 0.  Sets *FOUND to 1 if the PC is found,
   3556    0 if not.  */
   3557 
   3558 static int
   3559 dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
   3560 		 uintptr_t pc, backtrace_full_callback callback,
   3561 		 backtrace_error_callback error_callback, void *data,
   3562 		 int *found)
   3563 {
   3564   struct unit_addrs *entry;
   3565   struct unit *u;
   3566   int new_data;
   3567   struct line *lines;
   3568   struct line *ln;
   3569   struct function_addrs *function_addrs;
   3570   struct function *function;
   3571   const char *filename;
   3572   int lineno;
   3573   int ret;
   3574 
   3575   *found = 1;
   3576 
   3577   /* Find an address range that includes PC.  */
   3578   entry = (ddata->addrs_count == 0
   3579 	   ? NULL
   3580 	   : bsearch (&pc, ddata->addrs, ddata->addrs_count,
   3581 		      sizeof (struct unit_addrs), unit_addrs_search));
   3582 
   3583   if (entry == NULL)
   3584     {
   3585       *found = 0;
   3586       return 0;
   3587     }
   3588 
   3589   /* If there are multiple ranges that contain PC, use the last one,
   3590      in order to produce predictable results.  If we assume that all
   3591      ranges are properly nested, then the last range will be the
   3592      smallest one.  */
   3593   while ((size_t) (entry - ddata->addrs) + 1 < ddata->addrs_count
   3594 	 && pc >= (entry + 1)->low
   3595 	 && pc < (entry + 1)->high)
   3596     ++entry;
   3597 
   3598   /* We need the lines, lines_count, function_addrs,
   3599      function_addrs_count fields of u.  If they are not set, we need
   3600      to set them.  When running in threaded mode, we need to allow for
   3601      the possibility that some other thread is setting them
   3602      simultaneously.  */
   3603 
   3604   u = entry->u;
   3605   lines = u->lines;
   3606 
   3607   /* Skip units with no useful line number information by walking
   3608      backward.  Useless line number information is marked by setting
   3609      lines == -1.  */
   3610   while (entry > ddata->addrs
   3611 	 && pc >= (entry - 1)->low
   3612 	 && pc < (entry - 1)->high)
   3613     {
   3614       if (state->threaded)
   3615 	lines = (struct line *) backtrace_atomic_load_pointer (&u->lines);
   3616 
   3617       if (lines != (struct line *) (uintptr_t) -1)
   3618 	break;
   3619 
   3620       --entry;
   3621 
   3622       u = entry->u;
   3623       lines = u->lines;
   3624     }
   3625 
   3626   if (state->threaded)
   3627     lines = backtrace_atomic_load_pointer (&u->lines);
   3628 
   3629   new_data = 0;
   3630   if (lines == NULL)
   3631     {
   3632       size_t function_addrs_count;
   3633       struct line_header lhdr;
   3634       size_t count;
   3635 
   3636       /* We have never read the line information for this unit.  Read
   3637 	 it now.  */
   3638 
   3639       function_addrs = NULL;
   3640       function_addrs_count = 0;
   3641       if (read_line_info (state, ddata, error_callback, data, entry->u, &lhdr,
   3642 			  &lines, &count))
   3643 	{
   3644 	  struct function_vector *pfvec;
   3645 
   3646 	  /* If not threaded, reuse DDATA->FVEC for better memory
   3647 	     consumption.  */
   3648 	  if (state->threaded)
   3649 	    pfvec = NULL;
   3650 	  else
   3651 	    pfvec = &ddata->fvec;
   3652 	  read_function_info (state, ddata, &lhdr, error_callback, data,
   3653 			      entry->u, pfvec, &function_addrs,
   3654 			      &function_addrs_count);
   3655 	  free_line_header (state, &lhdr, error_callback, data);
   3656 	  new_data = 1;
   3657 	}
   3658 
   3659       /* Atomically store the information we just read into the unit.
   3660 	 If another thread is simultaneously writing, it presumably
   3661 	 read the same information, and we don't care which one we
   3662 	 wind up with; we just leak the other one.  We do have to
   3663 	 write the lines field last, so that the acquire-loads above
   3664 	 ensure that the other fields are set.  */
   3665 
   3666       if (!state->threaded)
   3667 	{
   3668 	  u->lines_count = count;
   3669 	  u->function_addrs = function_addrs;
   3670 	  u->function_addrs_count = function_addrs_count;
   3671 	  u->lines = lines;
   3672 	}
   3673       else
   3674 	{
   3675 	  backtrace_atomic_store_size_t (&u->lines_count, count);
   3676 	  backtrace_atomic_store_pointer (&u->function_addrs, function_addrs);
   3677 	  backtrace_atomic_store_size_t (&u->function_addrs_count,
   3678 					 function_addrs_count);
   3679 	  backtrace_atomic_store_pointer (&u->lines, lines);
   3680 	}
   3681     }
   3682 
   3683   /* Now all fields of U have been initialized.  */
   3684 
   3685   if (lines == (struct line *) (uintptr_t) -1)
   3686     {
   3687       /* If reading the line number information failed in some way,
   3688 	 try again to see if there is a better compilation unit for
   3689 	 this PC.  */
   3690       if (new_data)
   3691 	return dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
   3692 				data, found);
   3693       return callback (data, pc, NULL, 0, NULL);
   3694     }
   3695 
   3696   /* Search for PC within this unit.  */
   3697 
   3698   ln = (struct line *) bsearch (&pc, lines, entry->u->lines_count,
   3699 				sizeof (struct line), line_search);
   3700   if (ln == NULL)
   3701     {
   3702       /* The PC is between the low_pc and high_pc attributes of the
   3703 	 compilation unit, but no entry in the line table covers it.
   3704 	 This implies that the start of the compilation unit has no
   3705 	 line number information.  */
   3706 
   3707       if (entry->u->abs_filename == NULL)
   3708 	{
   3709 	  const char *filename;
   3710 
   3711 	  filename = entry->u->filename;
   3712 	  if (filename != NULL
   3713 	      && !IS_ABSOLUTE_PATH (filename)
   3714 	      && entry->u->comp_dir != NULL)
   3715 	    {
   3716 	      size_t filename_len;
   3717 	      const char *dir;
   3718 	      size_t dir_len;
   3719 	      char *s;
   3720 
   3721 	      filename_len = strlen (filename);
   3722 	      dir = entry->u->comp_dir;
   3723 	      dir_len = strlen (dir);
   3724 	      s = (char *) backtrace_alloc (state, dir_len + filename_len + 2,
   3725 					    error_callback, data);
   3726 	      if (s == NULL)
   3727 		{
   3728 		  *found = 0;
   3729 		  return 0;
   3730 		}
   3731 	      memcpy (s, dir, dir_len);
   3732 	      /* FIXME: Should use backslash if DOS file system.  */
   3733 	      s[dir_len] = '/';
   3734 	      memcpy (s + dir_len + 1, filename, filename_len + 1);
   3735 	      filename = s;
   3736 	    }
   3737 	  entry->u->abs_filename = filename;
   3738 	}
   3739 
   3740       return callback (data, pc, entry->u->abs_filename, 0, NULL);
   3741     }
   3742 
   3743   /* Search for function name within this unit.  */
   3744 
   3745   if (entry->u->function_addrs_count == 0)
   3746     return callback (data, pc, ln->filename, ln->lineno, NULL);
   3747 
   3748   function_addrs = ((struct function_addrs *)
   3749 		    bsearch (&pc, entry->u->function_addrs,
   3750 			     entry->u->function_addrs_count,
   3751 			     sizeof (struct function_addrs),
   3752 			     function_addrs_search));
   3753   if (function_addrs == NULL)
   3754     return callback (data, pc, ln->filename, ln->lineno, NULL);
   3755 
   3756   /* If there are multiple function ranges that contain PC, use the
   3757      last one, in order to produce predictable results.  */
   3758 
   3759   while (((size_t) (function_addrs - entry->u->function_addrs + 1)
   3760 	  < entry->u->function_addrs_count)
   3761 	 && pc >= (function_addrs + 1)->low
   3762 	 && pc < (function_addrs + 1)->high)
   3763     ++function_addrs;
   3764 
   3765   function = function_addrs->function;
   3766 
   3767   filename = ln->filename;
   3768   lineno = ln->lineno;
   3769 
   3770   ret = report_inlined_functions (pc, function, callback, data,
   3771 				  &filename, &lineno);
   3772   if (ret != 0)
   3773     return ret;
   3774 
   3775   return callback (data, pc, filename, lineno, function->name);
   3776 }
   3777 
   3778 
   3779 /* Return the file/line information for a PC using the DWARF mapping
   3780    we built earlier.  */
   3781 
   3782 static int
   3783 dwarf_fileline (struct backtrace_state *state, uintptr_t pc,
   3784 		backtrace_full_callback callback,
   3785 		backtrace_error_callback error_callback, void *data)
   3786 {
   3787   struct dwarf_data *ddata;
   3788   int found;
   3789   int ret;
   3790 
   3791   if (!state->threaded)
   3792     {
   3793       for (ddata = (struct dwarf_data *) state->fileline_data;
   3794 	   ddata != NULL;
   3795 	   ddata = ddata->next)
   3796 	{
   3797 	  ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
   3798 				 data, &found);
   3799 	  if (ret != 0 || found)
   3800 	    return ret;
   3801 	}
   3802     }
   3803   else
   3804     {
   3805       struct dwarf_data **pp;
   3806 
   3807       pp = (struct dwarf_data **) (void *) &state->fileline_data;
   3808       while (1)
   3809 	{
   3810 	  ddata = backtrace_atomic_load_pointer (pp);
   3811 	  if (ddata == NULL)
   3812 	    break;
   3813 
   3814 	  ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
   3815 				 data, &found);
   3816 	  if (ret != 0 || found)
   3817 	    return ret;
   3818 
   3819 	  pp = &ddata->next;
   3820 	}
   3821     }
   3822 
   3823   /* FIXME: See if any libraries have been dlopen'ed.  */
   3824 
   3825   return callback (data, pc, NULL, 0, NULL);
   3826 }
   3827 
   3828 /* Initialize our data structures from the DWARF debug info for a
   3829    file.  Return NULL on failure.  */
   3830 
   3831 static struct dwarf_data *
   3832 build_dwarf_data (struct backtrace_state *state,
   3833 		  uintptr_t base_address,
   3834 		  const struct dwarf_sections *dwarf_sections,
   3835 		  int is_bigendian,
   3836 		  struct dwarf_data *altlink,
   3837 		  backtrace_error_callback error_callback,
   3838 		  void *data)
   3839 {
   3840   struct unit_addrs_vector addrs_vec;
   3841   struct unit_addrs *addrs;
   3842   size_t addrs_count;
   3843   struct unit_vector units_vec;
   3844   struct unit **units;
   3845   size_t units_count;
   3846   struct dwarf_data *fdata;
   3847 
   3848   if (!build_address_map (state, base_address, dwarf_sections, is_bigendian,
   3849 			  altlink, error_callback, data, &addrs_vec,
   3850 			  &units_vec))
   3851     return NULL;
   3852 
   3853   if (!backtrace_vector_release (state, &addrs_vec.vec, error_callback, data))
   3854     return NULL;
   3855   if (!backtrace_vector_release (state, &units_vec.vec, error_callback, data))
   3856     return NULL;
   3857   addrs = (struct unit_addrs *) addrs_vec.vec.base;
   3858   units = (struct unit **) units_vec.vec.base;
   3859   addrs_count = addrs_vec.count;
   3860   units_count = units_vec.count;
   3861   backtrace_qsort (addrs, addrs_count, sizeof (struct unit_addrs),
   3862 		   unit_addrs_compare);
   3863   /* No qsort for units required, already sorted.  */
   3864 
   3865   fdata = ((struct dwarf_data *)
   3866 	   backtrace_alloc (state, sizeof (struct dwarf_data),
   3867 			    error_callback, data));
   3868   if (fdata == NULL)
   3869     return NULL;
   3870 
   3871   fdata->next = NULL;
   3872   fdata->altlink = altlink;
   3873   fdata->base_address = base_address;
   3874   fdata->addrs = addrs;
   3875   fdata->addrs_count = addrs_count;
   3876   fdata->units = units;
   3877   fdata->units_count = units_count;
   3878   fdata->dwarf_sections = *dwarf_sections;
   3879   fdata->is_bigendian = is_bigendian;
   3880   memset (&fdata->fvec, 0, sizeof fdata->fvec);
   3881 
   3882   return fdata;
   3883 }
   3884 
   3885 /* Build our data structures from the DWARF sections for a module.
   3886    Set FILELINE_FN and STATE->FILELINE_DATA.  Return 1 on success, 0
   3887    on failure.  */
   3888 
   3889 int
   3890 backtrace_dwarf_add (struct backtrace_state *state,
   3891 		     uintptr_t base_address,
   3892 		     const struct dwarf_sections *dwarf_sections,
   3893 		     int is_bigendian,
   3894 		     struct dwarf_data *fileline_altlink,
   3895 		     backtrace_error_callback error_callback,
   3896 		     void *data, fileline *fileline_fn,
   3897 		     struct dwarf_data **fileline_entry)
   3898 {
   3899   struct dwarf_data *fdata;
   3900 
   3901   fdata = build_dwarf_data (state, base_address, dwarf_sections, is_bigendian,
   3902 			    fileline_altlink, error_callback, data);
   3903   if (fdata == NULL)
   3904     return 0;
   3905 
   3906   if (fileline_entry != NULL)
   3907     *fileline_entry = fdata;
   3908 
   3909   if (!state->threaded)
   3910     {
   3911       struct dwarf_data **pp;
   3912 
   3913       for (pp = (struct dwarf_data **) (void *) &state->fileline_data;
   3914 	   *pp != NULL;
   3915 	   pp = &(*pp)->next)
   3916 	;
   3917       *pp = fdata;
   3918     }
   3919   else
   3920     {
   3921       while (1)
   3922 	{
   3923 	  struct dwarf_data **pp;
   3924 
   3925 	  pp = (struct dwarf_data **) (void *) &state->fileline_data;
   3926 
   3927 	  while (1)
   3928 	    {
   3929 	      struct dwarf_data *p;
   3930 
   3931 	      p = backtrace_atomic_load_pointer (pp);
   3932 
   3933 	      if (p == NULL)
   3934 		break;
   3935 
   3936 	      pp = &p->next;
   3937 	    }
   3938 
   3939 	  if (__sync_bool_compare_and_swap (pp, NULL, fdata))
   3940 	    break;
   3941 	}
   3942     }
   3943 
   3944   *fileline_fn = dwarf_fileline;
   3945 
   3946   return 1;
   3947 }
   3948