github.com/axw/llgo@v0.0.0-20160805011314-95b5fe4dca20/third_party/gofrontend/libbacktrace/dwarf.c (about)

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