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