1 /* dwarf.c -- Get file/line information from DWARF for backtraces.
2 Copyright (C) 2012-2018 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Google.
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are
9 (1) Redistributions of source code must retain the above copyright
10 notice, this list of conditions and the following disclaimer.
12 (2) Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in
14 the documentation and/or other materials provided with the
17 (3) The name of the author may not be used to
18 endorse or promote products derived from this software without
19 specific prior written permission.
21 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
25 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30 IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 POSSIBILITY OF SUCH DAMAGE. */
38 #include <sys/types.h>
41 #include "filenames.h"
43 #include "backtrace.h"
46 #if !defined(HAVE_DECL_STRNLEN) || !HAVE_DECL_STRNLEN
48 /* If strnlen is not declared, provide our own version. */
51 xstrnlen (const char *s
, size_t maxlen
)
55 for (i
= 0; i
< maxlen
; ++i
)
61 #define strnlen xstrnlen
65 /* A buffer to read DWARF info. */
69 /* Buffer name for error messages. */
71 /* Start of the buffer. */
72 const unsigned char *start
;
73 /* Next byte to read. */
74 const unsigned char *buf
;
75 /* The number of bytes remaining. */
77 /* Whether the data is big-endian. */
79 /* Error callback routine. */
80 backtrace_error_callback error_callback
;
81 /* Data for error_callback. */
83 /* Non-zero if we've reported an underflow error. */
84 int reported_underflow
;
87 /* A single attribute in a DWARF abbreviation. */
91 /* The attribute name. */
92 enum dwarf_attribute name
;
93 /* The attribute form. */
97 /* A single DWARF abbreviation. */
101 /* The abbrev code--the number used to refer to the abbrev. */
105 /* Non-zero if this abbrev has child entries. */
107 /* The number of attributes. */
109 /* The attributes. */
113 /* The DWARF abbreviations for a compilation unit. This structure
114 only exists while reading the compilation unit. Most DWARF readers
115 seem to a hash table to map abbrev ID's to abbrev entries.
116 However, we primarily care about GCC, and GCC simply issues ID's in
117 numerical order starting at 1. So we simply keep a sorted vector,
118 and try to just look up the code. */
122 /* The number of abbrevs in the vector. */
124 /* The abbrevs, sorted by the code field. */
125 struct abbrev
*abbrevs
;
128 /* The different kinds of attribute values. */
130 enum attr_val_encoding
134 /* A unsigned integer. */
136 /* A sigd integer. */
140 /* An offset to other data in the containing unit. */
142 /* An offset to other data within the .dwarf_info section. */
144 /* An offset to data in some other section. */
145 ATTR_VAL_REF_SECTION
,
146 /* A type signature. */
148 /* A block of data (not represented). */
150 /* An expression (not represented). */
154 /* An attribute value. */
158 /* How the value is stored in the field u. */
159 enum attr_val_encoding encoding
;
162 /* ATTR_VAL_ADDRESS, ATTR_VAL_UINT, ATTR_VAL_REF*. */
166 /* ATTR_VAL_STRING. */
168 /* ATTR_VAL_BLOCK not stored. */
172 /* The line number program header. */
176 /* The version of the line number information. */
178 /* The minimum instruction length. */
179 unsigned int min_insn_len
;
180 /* The maximum number of ops per instruction. */
181 unsigned int max_ops_per_insn
;
182 /* The line base for special opcodes. */
184 /* The line range for special opcodes. */
185 unsigned int line_range
;
186 /* The opcode base--the first special opcode. */
187 unsigned int opcode_base
;
188 /* Opcode lengths, indexed by opcode - 1. */
189 const unsigned char *opcode_lengths
;
190 /* The number of directory entries. */
192 /* The directory entries. */
194 /* The number of filenames. */
195 size_t filenames_count
;
197 const char **filenames
;
200 /* Map a single PC value to a file/line. We will keep a vector of
201 these sorted by PC value. Each file/line will be correct from the
202 PC up to the PC of the next entry if there is one. We allocate one
203 extra entry at the end so that we can use bsearch. */
209 /* File name. Many entries in the array are expected to point to
210 the same file name. */
211 const char *filename
;
214 /* Index of the object in the original array read from the DWARF
215 section, before it has been sorted. The index makes it possible
216 to use Quicksort and maintain stability. */
220 /* A growable vector of line number information. This is used while
221 reading the line numbers. */
225 /* Memory. This is an array of struct line. */
226 struct backtrace_vector vec
;
227 /* Number of valid mappings. */
231 /* A function described in the debug info. */
235 /* The name of the function. */
237 /* If this is an inlined function, the filename of the call
239 const char *caller_filename
;
240 /* If this is an inlined function, the line number of the call
243 /* Map PC ranges to inlined functions. */
244 struct function_addrs
*function_addrs
;
245 size_t function_addrs_count
;
248 /* An address range for a function. This maps a PC value to a
249 specific function. */
251 struct function_addrs
253 /* Range is LOW <= PC < HIGH. */
256 /* Function for this address range. */
257 struct function
*function
;
260 /* A growable vector of function address ranges. */
262 struct function_vector
264 /* Memory. This is an array of struct function_addrs. */
265 struct backtrace_vector vec
;
266 /* Number of address ranges present. */
270 /* A DWARF compilation unit. This only holds the information we need
271 to map a PC to a file and line. */
275 /* The first entry for this compilation unit. */
276 const unsigned char *unit_data
;
277 /* The length of the data for this compilation unit. */
278 size_t unit_data_len
;
279 /* The offset of UNIT_DATA from the start of the information for
280 this compilation unit. */
281 size_t unit_data_offset
;
284 /* Whether unit is DWARF64. */
288 /* Offset into line number information. */
290 /* Primary source file. */
291 const char *filename
;
292 /* Compilation command working directory. */
293 const char *comp_dir
;
294 /* Absolute file name, only set if needed. */
295 const char *abs_filename
;
296 /* The abbreviations for this unit. */
297 struct abbrevs abbrevs
;
299 /* The fields above this point are read in during initialization and
300 may be accessed freely. The fields below this point are read in
301 as needed, and therefore require care, as different threads may
302 try to initialize them simultaneously. */
304 /* PC to line number mapping. This is NULL if the values have not
305 been read. This is (struct line *) -1 if there was an error
306 reading the values. */
308 /* Number of entries in lines. */
310 /* PC ranges to function. */
311 struct function_addrs
*function_addrs
;
312 size_t function_addrs_count
;
315 /* An address range for a compilation unit. This maps a PC value to a
316 specific compilation unit. Note that we invert the representation
317 in DWARF: instead of listing the units and attaching a list of
318 ranges, we list the ranges and have each one point to the unit.
319 This lets us do a binary search to find the unit. */
323 /* Range is LOW <= PC < HIGH. */
326 /* Compilation unit for this address range. */
330 /* A growable vector of compilation unit address ranges. */
332 struct unit_addrs_vector
334 /* Memory. This is an array of struct unit_addrs. */
335 struct backtrace_vector vec
;
336 /* Number of address ranges present. */
340 /* The information we need to map a PC to a file and line. */
344 /* The data for the next file we know about. */
345 struct dwarf_data
*next
;
346 /* The base address for this file. */
347 uintptr_t base_address
;
348 /* A sorted list of address ranges. */
349 struct unit_addrs
*addrs
;
350 /* Number of address ranges in list. */
352 /* The unparsed .debug_info section. */
353 const unsigned char *dwarf_info
;
354 size_t dwarf_info_size
;
355 /* The unparsed .debug_line section. */
356 const unsigned char *dwarf_line
;
357 size_t dwarf_line_size
;
358 /* The unparsed .debug_ranges section. */
359 const unsigned char *dwarf_ranges
;
360 size_t dwarf_ranges_size
;
361 /* The unparsed .debug_str section. */
362 const unsigned char *dwarf_str
;
363 size_t dwarf_str_size
;
364 /* Whether the data is big-endian or not. */
366 /* A vector used for function addresses. We keep this here so that
367 we can grow the vector as we read more functions. */
368 struct function_vector fvec
;
371 /* Report an error for a DWARF buffer. */
374 dwarf_buf_error (struct dwarf_buf
*buf
, const char *msg
)
378 snprintf (b
, sizeof b
, "%s in %s at %d",
379 msg
, buf
->name
, (int) (buf
->buf
- buf
->start
));
380 buf
->error_callback (buf
->data
, b
, 0);
383 /* Require at least COUNT bytes in BUF. Return 1 if all is well, 0 on
387 require (struct dwarf_buf
*buf
, size_t count
)
389 if (buf
->left
>= count
)
392 if (!buf
->reported_underflow
)
394 dwarf_buf_error (buf
, "DWARF underflow");
395 buf
->reported_underflow
= 1;
401 /* Advance COUNT bytes in BUF. Return 1 if all is well, 0 on
405 advance (struct dwarf_buf
*buf
, size_t count
)
407 if (!require (buf
, count
))
414 /* Read one byte from BUF and advance 1 byte. */
417 read_byte (struct dwarf_buf
*buf
)
419 const unsigned char *p
= buf
->buf
;
421 if (!advance (buf
, 1))
426 /* Read a signed char from BUF and advance 1 byte. */
429 read_sbyte (struct dwarf_buf
*buf
)
431 const unsigned char *p
= buf
->buf
;
433 if (!advance (buf
, 1))
435 return (*p
^ 0x80) - 0x80;
438 /* Read a uint16 from BUF and advance 2 bytes. */
441 read_uint16 (struct dwarf_buf
*buf
)
443 const unsigned char *p
= buf
->buf
;
445 if (!advance (buf
, 2))
447 if (buf
->is_bigendian
)
448 return ((uint16_t) p
[0] << 8) | (uint16_t) p
[1];
450 return ((uint16_t) p
[1] << 8) | (uint16_t) p
[0];
453 /* Read a uint32 from BUF and advance 4 bytes. */
456 read_uint32 (struct dwarf_buf
*buf
)
458 const unsigned char *p
= buf
->buf
;
460 if (!advance (buf
, 4))
462 if (buf
->is_bigendian
)
463 return (((uint32_t) p
[0] << 24) | ((uint32_t) p
[1] << 16)
464 | ((uint32_t) p
[2] << 8) | (uint32_t) p
[3]);
466 return (((uint32_t) p
[3] << 24) | ((uint32_t) p
[2] << 16)
467 | ((uint32_t) p
[1] << 8) | (uint32_t) p
[0]);
470 /* Read a uint64 from BUF and advance 8 bytes. */
473 read_uint64 (struct dwarf_buf
*buf
)
475 const unsigned char *p
= buf
->buf
;
477 if (!advance (buf
, 8))
479 if (buf
->is_bigendian
)
480 return (((uint64_t) p
[0] << 56) | ((uint64_t) p
[1] << 48)
481 | ((uint64_t) p
[2] << 40) | ((uint64_t) p
[3] << 32)
482 | ((uint64_t) p
[4] << 24) | ((uint64_t) p
[5] << 16)
483 | ((uint64_t) p
[6] << 8) | (uint64_t) p
[7]);
485 return (((uint64_t) p
[7] << 56) | ((uint64_t) p
[6] << 48)
486 | ((uint64_t) p
[5] << 40) | ((uint64_t) p
[4] << 32)
487 | ((uint64_t) p
[3] << 24) | ((uint64_t) p
[2] << 16)
488 | ((uint64_t) p
[1] << 8) | (uint64_t) p
[0]);
491 /* Read an offset from BUF and advance the appropriate number of
495 read_offset (struct dwarf_buf
*buf
, int is_dwarf64
)
498 return read_uint64 (buf
);
500 return read_uint32 (buf
);
503 /* Read an address from BUF and advance the appropriate number of
507 read_address (struct dwarf_buf
*buf
, int addrsize
)
512 return read_byte (buf
);
514 return read_uint16 (buf
);
516 return read_uint32 (buf
);
518 return read_uint64 (buf
);
520 dwarf_buf_error (buf
, "unrecognized address size");
525 /* Return whether a value is the highest possible address, given the
529 is_highest_address (uint64_t address
, int addrsize
)
534 return address
== (unsigned char) -1;
536 return address
== (uint16_t) -1;
538 return address
== (uint32_t) -1;
540 return address
== (uint64_t) -1;
546 /* Read an unsigned LEB128 number. */
549 read_uleb128 (struct dwarf_buf
*buf
)
561 const unsigned char *p
;
564 if (!advance (buf
, 1))
568 ret
|= ((uint64_t) (b
& 0x7f)) << shift
;
571 dwarf_buf_error (buf
, "LEB128 overflows uint64_t");
576 while ((b
& 0x80) != 0);
581 /* Read a signed LEB128 number. */
584 read_sleb128 (struct dwarf_buf
*buf
)
596 const unsigned char *p
;
599 if (!advance (buf
, 1))
603 val
|= ((uint64_t) (b
& 0x7f)) << shift
;
606 dwarf_buf_error (buf
, "signed LEB128 overflows uint64_t");
611 while ((b
& 0x80) != 0);
613 if ((b
& 0x40) != 0 && shift
< 64)
614 val
|= ((uint64_t) -1) << shift
;
616 return (int64_t) val
;
619 /* Return the length of an LEB128 number. */
622 leb128_len (const unsigned char *p
)
627 while ((*p
& 0x80) != 0)
635 /* Free an abbreviations structure. */
638 free_abbrevs (struct backtrace_state
*state
, struct abbrevs
*abbrevs
,
639 backtrace_error_callback error_callback
, void *data
)
643 for (i
= 0; i
< abbrevs
->num_abbrevs
; ++i
)
644 backtrace_free (state
, abbrevs
->abbrevs
[i
].attrs
,
645 abbrevs
->abbrevs
[i
].num_attrs
* sizeof (struct attr
),
646 error_callback
, data
);
647 backtrace_free (state
, abbrevs
->abbrevs
,
648 abbrevs
->num_abbrevs
* sizeof (struct abbrev
),
649 error_callback
, data
);
650 abbrevs
->num_abbrevs
= 0;
651 abbrevs
->abbrevs
= NULL
;
654 /* Read an attribute value. Returns 1 on success, 0 on failure. If
655 the value can be represented as a uint64_t, sets *VAL and sets
656 *IS_VALID to 1. We don't try to store the value of other attribute
657 forms, because we don't care about them. */
660 read_attribute (enum dwarf_form form
, struct dwarf_buf
*buf
,
661 int is_dwarf64
, int version
, int addrsize
,
662 const unsigned char *dwarf_str
, size_t dwarf_str_size
,
663 struct attr_val
*val
)
665 /* Avoid warnings about val.u.FIELD may be used uninitialized if
666 this function is inlined. The warnings aren't valid but can
667 occur because the different fields are set and used
669 memset (val
, 0, sizeof *val
);
674 val
->encoding
= ATTR_VAL_ADDRESS
;
675 val
->u
.uint
= read_address (buf
, addrsize
);
678 val
->encoding
= ATTR_VAL_BLOCK
;
679 return advance (buf
, read_uint16 (buf
));
681 val
->encoding
= ATTR_VAL_BLOCK
;
682 return advance (buf
, read_uint32 (buf
));
684 val
->encoding
= ATTR_VAL_UINT
;
685 val
->u
.uint
= read_uint16 (buf
);
688 val
->encoding
= ATTR_VAL_UINT
;
689 val
->u
.uint
= read_uint32 (buf
);
692 val
->encoding
= ATTR_VAL_UINT
;
693 val
->u
.uint
= read_uint64 (buf
);
696 val
->encoding
= ATTR_VAL_STRING
;
697 val
->u
.string
= (const char *) buf
->buf
;
698 return advance (buf
, strnlen ((const char *) buf
->buf
, buf
->left
) + 1);
700 val
->encoding
= ATTR_VAL_BLOCK
;
701 return advance (buf
, read_uleb128 (buf
));
703 val
->encoding
= ATTR_VAL_BLOCK
;
704 return advance (buf
, read_byte (buf
));
706 val
->encoding
= ATTR_VAL_UINT
;
707 val
->u
.uint
= read_byte (buf
);
710 val
->encoding
= ATTR_VAL_UINT
;
711 val
->u
.uint
= read_byte (buf
);
714 val
->encoding
= ATTR_VAL_SINT
;
715 val
->u
.sint
= read_sleb128 (buf
);
721 offset
= read_offset (buf
, is_dwarf64
);
722 if (offset
>= dwarf_str_size
)
724 dwarf_buf_error (buf
, "DW_FORM_strp out of range");
727 val
->encoding
= ATTR_VAL_STRING
;
728 val
->u
.string
= (const char *) dwarf_str
+ offset
;
732 val
->encoding
= ATTR_VAL_UINT
;
733 val
->u
.uint
= read_uleb128 (buf
);
735 case DW_FORM_ref_addr
:
736 val
->encoding
= ATTR_VAL_REF_INFO
;
738 val
->u
.uint
= read_address (buf
, addrsize
);
740 val
->u
.uint
= read_offset (buf
, is_dwarf64
);
743 val
->encoding
= ATTR_VAL_REF_UNIT
;
744 val
->u
.uint
= read_byte (buf
);
747 val
->encoding
= ATTR_VAL_REF_UNIT
;
748 val
->u
.uint
= read_uint16 (buf
);
751 val
->encoding
= ATTR_VAL_REF_UNIT
;
752 val
->u
.uint
= read_uint32 (buf
);
755 val
->encoding
= ATTR_VAL_REF_UNIT
;
756 val
->u
.uint
= read_uint64 (buf
);
758 case DW_FORM_ref_udata
:
759 val
->encoding
= ATTR_VAL_REF_UNIT
;
760 val
->u
.uint
= read_uleb128 (buf
);
762 case DW_FORM_indirect
:
766 form
= read_uleb128 (buf
);
767 return read_attribute ((enum dwarf_form
) form
, buf
, is_dwarf64
,
768 version
, addrsize
, dwarf_str
, dwarf_str_size
,
771 case DW_FORM_sec_offset
:
772 val
->encoding
= ATTR_VAL_REF_SECTION
;
773 val
->u
.uint
= read_offset (buf
, is_dwarf64
);
775 case DW_FORM_exprloc
:
776 val
->encoding
= ATTR_VAL_EXPR
;
777 return advance (buf
, read_uleb128 (buf
));
778 case DW_FORM_flag_present
:
779 val
->encoding
= ATTR_VAL_UINT
;
782 case DW_FORM_ref_sig8
:
783 val
->encoding
= ATTR_VAL_REF_TYPE
;
784 val
->u
.uint
= read_uint64 (buf
);
786 case DW_FORM_GNU_addr_index
:
787 val
->encoding
= ATTR_VAL_REF_SECTION
;
788 val
->u
.uint
= read_uleb128 (buf
);
790 case DW_FORM_GNU_str_index
:
791 val
->encoding
= ATTR_VAL_REF_SECTION
;
792 val
->u
.uint
= read_uleb128 (buf
);
794 case DW_FORM_GNU_ref_alt
:
795 val
->encoding
= ATTR_VAL_REF_SECTION
;
796 val
->u
.uint
= read_offset (buf
, is_dwarf64
);
798 case DW_FORM_GNU_strp_alt
:
799 val
->encoding
= ATTR_VAL_REF_SECTION
;
800 val
->u
.uint
= read_offset (buf
, is_dwarf64
);
803 dwarf_buf_error (buf
, "unrecognized DWARF form");
808 /* Compare function_addrs for qsort. When ranges are nested, make the
809 smallest one sort last. */
812 function_addrs_compare (const void *v1
, const void *v2
)
814 const struct function_addrs
*a1
= (const struct function_addrs
*) v1
;
815 const struct function_addrs
*a2
= (const struct function_addrs
*) v2
;
817 if (a1
->low
< a2
->low
)
819 if (a1
->low
> a2
->low
)
821 if (a1
->high
< a2
->high
)
823 if (a1
->high
> a2
->high
)
825 return strcmp (a1
->function
->name
, a2
->function
->name
);
828 /* Compare a PC against a function_addrs for bsearch. Note that if
829 there are multiple ranges containing PC, which one will be returned
830 is unpredictable. We compensate for that in dwarf_fileline. */
833 function_addrs_search (const void *vkey
, const void *ventry
)
835 const uintptr_t *key
= (const uintptr_t *) vkey
;
836 const struct function_addrs
*entry
= (const struct function_addrs
*) ventry
;
842 else if (pc
>= entry
->high
)
848 /* Add a new compilation unit address range to a vector. Returns 1 on
849 success, 0 on failure. */
852 add_unit_addr (struct backtrace_state
*state
, uintptr_t base_address
,
853 struct unit_addrs addrs
,
854 backtrace_error_callback error_callback
, void *data
,
855 struct unit_addrs_vector
*vec
)
857 struct unit_addrs
*p
;
859 /* Add in the base address of the module here, so that we can look
860 up the PC directly. */
861 addrs
.low
+= base_address
;
862 addrs
.high
+= base_address
;
864 /* Try to merge with the last entry. */
867 p
= (struct unit_addrs
*) vec
->vec
.base
+ (vec
->count
- 1);
868 if ((addrs
.low
== p
->high
|| addrs
.low
== p
->high
+ 1)
871 if (addrs
.high
> p
->high
)
872 p
->high
= addrs
.high
;
877 p
= ((struct unit_addrs
*)
878 backtrace_vector_grow (state
, sizeof (struct unit_addrs
),
879 error_callback
, data
, &vec
->vec
));
888 /* Free a unit address vector. */
891 free_unit_addrs_vector (struct backtrace_state
*state
,
892 struct unit_addrs_vector
*vec
,
893 backtrace_error_callback error_callback
, void *data
)
895 struct unit_addrs
*addrs
;
898 addrs
= (struct unit_addrs
*) vec
->vec
.base
;
899 for (i
= 0; i
< vec
->count
; ++i
)
900 free_abbrevs (state
, &addrs
[i
].u
->abbrevs
, error_callback
, data
);
903 /* Compare unit_addrs for qsort. When ranges are nested, make the
904 smallest one sort last. */
907 unit_addrs_compare (const void *v1
, const void *v2
)
909 const struct unit_addrs
*a1
= (const struct unit_addrs
*) v1
;
910 const struct unit_addrs
*a2
= (const struct unit_addrs
*) v2
;
912 if (a1
->low
< a2
->low
)
914 if (a1
->low
> a2
->low
)
916 if (a1
->high
< a2
->high
)
918 if (a1
->high
> a2
->high
)
920 if (a1
->u
->lineoff
< a2
->u
->lineoff
)
922 if (a1
->u
->lineoff
> a2
->u
->lineoff
)
927 /* Compare a PC against a unit_addrs for bsearch. Note that if there
928 are multiple ranges containing PC, which one will be returned is
929 unpredictable. We compensate for that in dwarf_fileline. */
932 unit_addrs_search (const void *vkey
, const void *ventry
)
934 const uintptr_t *key
= (const uintptr_t *) vkey
;
935 const struct unit_addrs
*entry
= (const struct unit_addrs
*) ventry
;
941 else if (pc
>= entry
->high
)
947 /* Sort the line vector by PC. We want a stable sort here to maintain
948 the order of lines for the same PC values. Since the sequence is
949 being sorted in place, their addresses cannot be relied on to
950 maintain stability. That is the purpose of the index member. */
953 line_compare (const void *v1
, const void *v2
)
955 const struct line
*ln1
= (const struct line
*) v1
;
956 const struct line
*ln2
= (const struct line
*) v2
;
958 if (ln1
->pc
< ln2
->pc
)
960 else if (ln1
->pc
> ln2
->pc
)
962 else if (ln1
->idx
< ln2
->idx
)
964 else if (ln1
->idx
> ln2
->idx
)
970 /* Find a PC in a line vector. We always allocate an extra entry at
971 the end of the lines vector, so that this routine can safely look
972 at the next entry. Note that when there are multiple mappings for
973 the same PC value, this will return the last one. */
976 line_search (const void *vkey
, const void *ventry
)
978 const uintptr_t *key
= (const uintptr_t *) vkey
;
979 const struct line
*entry
= (const struct line
*) ventry
;
985 else if (pc
>= (entry
+ 1)->pc
)
991 /* Sort the abbrevs by the abbrev code. This function is passed to
992 both qsort and bsearch. */
995 abbrev_compare (const void *v1
, const void *v2
)
997 const struct abbrev
*a1
= (const struct abbrev
*) v1
;
998 const struct abbrev
*a2
= (const struct abbrev
*) v2
;
1000 if (a1
->code
< a2
->code
)
1002 else if (a1
->code
> a2
->code
)
1006 /* This really shouldn't happen. It means there are two
1007 different abbrevs with the same code, and that means we don't
1008 know which one lookup_abbrev should return. */
1013 /* Read the abbreviation table for a compilation unit. Returns 1 on
1014 success, 0 on failure. */
1017 read_abbrevs (struct backtrace_state
*state
, uint64_t abbrev_offset
,
1018 const unsigned char *dwarf_abbrev
, size_t dwarf_abbrev_size
,
1019 int is_bigendian
, backtrace_error_callback error_callback
,
1020 void *data
, struct abbrevs
*abbrevs
)
1022 struct dwarf_buf abbrev_buf
;
1023 struct dwarf_buf count_buf
;
1026 abbrevs
->num_abbrevs
= 0;
1027 abbrevs
->abbrevs
= NULL
;
1029 if (abbrev_offset
>= dwarf_abbrev_size
)
1031 error_callback (data
, "abbrev offset out of range", 0);
1035 abbrev_buf
.name
= ".debug_abbrev";
1036 abbrev_buf
.start
= dwarf_abbrev
;
1037 abbrev_buf
.buf
= dwarf_abbrev
+ abbrev_offset
;
1038 abbrev_buf
.left
= dwarf_abbrev_size
- abbrev_offset
;
1039 abbrev_buf
.is_bigendian
= is_bigendian
;
1040 abbrev_buf
.error_callback
= error_callback
;
1041 abbrev_buf
.data
= data
;
1042 abbrev_buf
.reported_underflow
= 0;
1044 /* Count the number of abbrevs in this list. */
1046 count_buf
= abbrev_buf
;
1048 while (read_uleb128 (&count_buf
) != 0)
1050 if (count_buf
.reported_underflow
)
1054 read_uleb128 (&count_buf
);
1055 // Skip has_children.
1056 read_byte (&count_buf
);
1058 while (read_uleb128 (&count_buf
) != 0)
1059 read_uleb128 (&count_buf
);
1060 // Skip form of last attribute.
1061 read_uleb128 (&count_buf
);
1064 if (count_buf
.reported_underflow
)
1067 if (num_abbrevs
== 0)
1070 abbrevs
->num_abbrevs
= num_abbrevs
;
1071 abbrevs
->abbrevs
= ((struct abbrev
*)
1072 backtrace_alloc (state
,
1073 num_abbrevs
* sizeof (struct abbrev
),
1074 error_callback
, data
));
1075 if (abbrevs
->abbrevs
== NULL
)
1077 memset (abbrevs
->abbrevs
, 0, num_abbrevs
* sizeof (struct abbrev
));
1087 if (abbrev_buf
.reported_underflow
)
1090 code
= read_uleb128 (&abbrev_buf
);
1095 a
.tag
= (enum dwarf_tag
) read_uleb128 (&abbrev_buf
);
1096 a
.has_children
= read_byte (&abbrev_buf
);
1098 count_buf
= abbrev_buf
;
1100 while (read_uleb128 (&count_buf
) != 0)
1103 read_uleb128 (&count_buf
);
1109 read_uleb128 (&abbrev_buf
);
1110 read_uleb128 (&abbrev_buf
);
1114 attrs
= ((struct attr
*)
1115 backtrace_alloc (state
, num_attrs
* sizeof *attrs
,
1116 error_callback
, data
));
1125 name
= read_uleb128 (&abbrev_buf
);
1126 form
= read_uleb128 (&abbrev_buf
);
1129 attrs
[num_attrs
].name
= (enum dwarf_attribute
) name
;
1130 attrs
[num_attrs
].form
= (enum dwarf_form
) form
;
1135 a
.num_attrs
= num_attrs
;
1138 abbrevs
->abbrevs
[num_abbrevs
] = a
;
1142 backtrace_qsort (abbrevs
->abbrevs
, abbrevs
->num_abbrevs
,
1143 sizeof (struct abbrev
), abbrev_compare
);
1148 free_abbrevs (state
, abbrevs
, error_callback
, data
);
1152 /* Return the abbrev information for an abbrev code. */
1154 static const struct abbrev
*
1155 lookup_abbrev (struct abbrevs
*abbrevs
, uint64_t code
,
1156 backtrace_error_callback error_callback
, void *data
)
1161 /* With GCC, where abbrevs are simply numbered in order, we should
1162 be able to just look up the entry. */
1163 if (code
- 1 < abbrevs
->num_abbrevs
1164 && abbrevs
->abbrevs
[code
- 1].code
== code
)
1165 return &abbrevs
->abbrevs
[code
- 1];
1167 /* Otherwise we have to search. */
1168 memset (&key
, 0, sizeof key
);
1170 p
= bsearch (&key
, abbrevs
->abbrevs
, abbrevs
->num_abbrevs
,
1171 sizeof (struct abbrev
), abbrev_compare
);
1174 error_callback (data
, "invalid abbreviation code", 0);
1177 return (const struct abbrev
*) p
;
1180 /* Add non-contiguous address ranges for a compilation unit. Returns
1181 1 on success, 0 on failure. */
1184 add_unit_ranges (struct backtrace_state
*state
, uintptr_t base_address
,
1185 struct unit
*u
, uint64_t ranges
, uint64_t base
,
1186 int is_bigendian
, const unsigned char *dwarf_ranges
,
1187 size_t dwarf_ranges_size
,
1188 backtrace_error_callback error_callback
, void *data
,
1189 struct unit_addrs_vector
*addrs
)
1191 struct dwarf_buf ranges_buf
;
1193 if (ranges
>= dwarf_ranges_size
)
1195 error_callback (data
, "ranges offset out of range", 0);
1199 ranges_buf
.name
= ".debug_ranges";
1200 ranges_buf
.start
= dwarf_ranges
;
1201 ranges_buf
.buf
= dwarf_ranges
+ ranges
;
1202 ranges_buf
.left
= dwarf_ranges_size
- ranges
;
1203 ranges_buf
.is_bigendian
= is_bigendian
;
1204 ranges_buf
.error_callback
= error_callback
;
1205 ranges_buf
.data
= data
;
1206 ranges_buf
.reported_underflow
= 0;
1213 if (ranges_buf
.reported_underflow
)
1216 low
= read_address (&ranges_buf
, u
->addrsize
);
1217 high
= read_address (&ranges_buf
, u
->addrsize
);
1219 if (low
== 0 && high
== 0)
1222 if (is_highest_address (low
, u
->addrsize
))
1226 struct unit_addrs a
;
1229 a
.high
= high
+ base
;
1231 if (!add_unit_addr (state
, base_address
, a
, error_callback
, data
,
1237 if (ranges_buf
.reported_underflow
)
1243 /* Find the address range covered by a compilation unit, reading from
1244 UNIT_BUF and adding values to U. Returns 1 if all data could be
1245 read, 0 if there is some error. */
1248 find_address_ranges (struct backtrace_state
*state
, uintptr_t base_address
,
1249 struct dwarf_buf
*unit_buf
,
1250 const unsigned char *dwarf_str
, size_t dwarf_str_size
,
1251 const unsigned char *dwarf_ranges
,
1252 size_t dwarf_ranges_size
,
1253 int is_bigendian
, backtrace_error_callback error_callback
,
1254 void *data
, struct unit
*u
,
1255 struct unit_addrs_vector
*addrs
)
1257 while (unit_buf
->left
> 0)
1260 const struct abbrev
*abbrev
;
1265 int highpc_is_relative
;
1270 code
= read_uleb128 (unit_buf
);
1274 abbrev
= lookup_abbrev (&u
->abbrevs
, code
, error_callback
, data
);
1282 highpc_is_relative
= 0;
1285 for (i
= 0; i
< abbrev
->num_attrs
; ++i
)
1287 struct attr_val val
;
1289 if (!read_attribute (abbrev
->attrs
[i
].form
, unit_buf
,
1290 u
->is_dwarf64
, u
->version
, u
->addrsize
,
1291 dwarf_str
, dwarf_str_size
, &val
))
1294 switch (abbrev
->attrs
[i
].name
)
1297 if (val
.encoding
== ATTR_VAL_ADDRESS
)
1305 if (val
.encoding
== ATTR_VAL_ADDRESS
)
1307 highpc
= val
.u
.uint
;
1310 else if (val
.encoding
== ATTR_VAL_UINT
)
1312 highpc
= val
.u
.uint
;
1314 highpc_is_relative
= 1;
1319 if (val
.encoding
== ATTR_VAL_UINT
1320 || val
.encoding
== ATTR_VAL_REF_SECTION
)
1322 ranges
= val
.u
.uint
;
1327 case DW_AT_stmt_list
:
1328 if (abbrev
->tag
== DW_TAG_compile_unit
1329 && (val
.encoding
== ATTR_VAL_UINT
1330 || val
.encoding
== ATTR_VAL_REF_SECTION
))
1331 u
->lineoff
= val
.u
.uint
;
1335 if (abbrev
->tag
== DW_TAG_compile_unit
1336 && val
.encoding
== ATTR_VAL_STRING
)
1337 u
->filename
= val
.u
.string
;
1340 case DW_AT_comp_dir
:
1341 if (abbrev
->tag
== DW_TAG_compile_unit
1342 && val
.encoding
== ATTR_VAL_STRING
)
1343 u
->comp_dir
= val
.u
.string
;
1351 if (abbrev
->tag
== DW_TAG_compile_unit
1352 || abbrev
->tag
== DW_TAG_subprogram
)
1356 if (!add_unit_ranges (state
, base_address
, u
, ranges
, lowpc
,
1357 is_bigendian
, dwarf_ranges
,
1358 dwarf_ranges_size
, error_callback
,
1362 else if (have_lowpc
&& have_highpc
)
1364 struct unit_addrs a
;
1366 if (highpc_is_relative
)
1372 if (!add_unit_addr (state
, base_address
, a
, error_callback
, data
,
1377 /* If we found the PC range in the DW_TAG_compile_unit, we
1379 if (abbrev
->tag
== DW_TAG_compile_unit
1380 && (have_ranges
|| (have_lowpc
&& have_highpc
)))
1384 if (abbrev
->has_children
)
1386 if (!find_address_ranges (state
, base_address
, unit_buf
,
1387 dwarf_str
, dwarf_str_size
,
1388 dwarf_ranges
, dwarf_ranges_size
,
1389 is_bigendian
, error_callback
, data
,
1398 /* Build a mapping from address ranges to the compilation units where
1399 the line number information for that range can be found. Returns 1
1400 on success, 0 on failure. */
1403 build_address_map (struct backtrace_state
*state
, uintptr_t base_address
,
1404 const unsigned char *dwarf_info
, size_t dwarf_info_size
,
1405 const unsigned char *dwarf_abbrev
, size_t dwarf_abbrev_size
,
1406 const unsigned char *dwarf_ranges
, size_t dwarf_ranges_size
,
1407 const unsigned char *dwarf_str
, size_t dwarf_str_size
,
1408 int is_bigendian
, backtrace_error_callback error_callback
,
1409 void *data
, struct unit_addrs_vector
*addrs
)
1411 struct dwarf_buf info
;
1412 struct abbrevs abbrevs
;
1414 memset (&addrs
->vec
, 0, sizeof addrs
->vec
);
1417 /* Read through the .debug_info section. FIXME: Should we use the
1418 .debug_aranges section? gdb and addr2line don't use it, but I'm
1421 info
.name
= ".debug_info";
1422 info
.start
= dwarf_info
;
1423 info
.buf
= dwarf_info
;
1424 info
.left
= dwarf_info_size
;
1425 info
.is_bigendian
= is_bigendian
;
1426 info
.error_callback
= error_callback
;
1428 info
.reported_underflow
= 0;
1430 memset (&abbrevs
, 0, sizeof abbrevs
);
1431 while (info
.left
> 0)
1433 const unsigned char *unit_data_start
;
1436 struct dwarf_buf unit_buf
;
1438 uint64_t abbrev_offset
;
1442 if (info
.reported_underflow
)
1445 unit_data_start
= info
.buf
;
1448 len
= read_uint32 (&info
);
1449 if (len
== 0xffffffff)
1451 len
= read_uint64 (&info
);
1456 unit_buf
.left
= len
;
1458 if (!advance (&info
, len
))
1461 version
= read_uint16 (&unit_buf
);
1462 if (version
< 2 || version
> 4)
1464 dwarf_buf_error (&unit_buf
, "unrecognized DWARF version");
1468 abbrev_offset
= read_offset (&unit_buf
, is_dwarf64
);
1469 if (!read_abbrevs (state
, abbrev_offset
, dwarf_abbrev
, dwarf_abbrev_size
,
1470 is_bigendian
, error_callback
, data
, &abbrevs
))
1473 addrsize
= read_byte (&unit_buf
);
1475 u
= ((struct unit
*)
1476 backtrace_alloc (state
, sizeof *u
, error_callback
, data
));
1479 u
->unit_data
= unit_buf
.buf
;
1480 u
->unit_data_len
= unit_buf
.left
;
1481 u
->unit_data_offset
= unit_buf
.buf
- unit_data_start
;
1482 u
->version
= version
;
1483 u
->is_dwarf64
= is_dwarf64
;
1484 u
->addrsize
= addrsize
;
1487 u
->abs_filename
= NULL
;
1489 u
->abbrevs
= abbrevs
;
1490 memset (&abbrevs
, 0, sizeof abbrevs
);
1492 /* The actual line number mappings will be read as needed. */
1495 u
->function_addrs
= NULL
;
1496 u
->function_addrs_count
= 0;
1498 if (!find_address_ranges (state
, base_address
, &unit_buf
,
1499 dwarf_str
, dwarf_str_size
,
1500 dwarf_ranges
, dwarf_ranges_size
,
1501 is_bigendian
, error_callback
, data
,
1504 free_abbrevs (state
, &u
->abbrevs
, error_callback
, data
);
1505 backtrace_free (state
, u
, sizeof *u
, error_callback
, data
);
1509 if (unit_buf
.reported_underflow
)
1511 free_abbrevs (state
, &u
->abbrevs
, error_callback
, data
);
1512 backtrace_free (state
, u
, sizeof *u
, error_callback
, data
);
1516 if (info
.reported_underflow
)
1522 free_abbrevs (state
, &abbrevs
, error_callback
, data
);
1523 free_unit_addrs_vector (state
, addrs
, error_callback
, data
);
1527 /* Add a new mapping to the vector of line mappings that we are
1528 building. Returns 1 on success, 0 on failure. */
1531 add_line (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
1532 uintptr_t pc
, const char *filename
, int lineno
,
1533 backtrace_error_callback error_callback
, void *data
,
1534 struct line_vector
*vec
)
1538 /* If we are adding the same mapping, ignore it. This can happen
1539 when using discriminators. */
1542 ln
= (struct line
*) vec
->vec
.base
+ (vec
->count
- 1);
1543 if (pc
== ln
->pc
&& filename
== ln
->filename
&& lineno
== ln
->lineno
)
1547 ln
= ((struct line
*)
1548 backtrace_vector_grow (state
, sizeof (struct line
), error_callback
,
1553 /* Add in the base address here, so that we can look up the PC
1555 ln
->pc
= pc
+ ddata
->base_address
;
1557 ln
->filename
= filename
;
1558 ln
->lineno
= lineno
;
1559 ln
->idx
= vec
->count
;
1566 /* Free the line header information. */
1569 free_line_header (struct backtrace_state
*state
, struct line_header
*hdr
,
1570 backtrace_error_callback error_callback
, void *data
)
1572 if (hdr
->dirs_count
!= 0)
1573 backtrace_free (state
, hdr
->dirs
, hdr
->dirs_count
* sizeof (const char *),
1574 error_callback
, data
);
1575 backtrace_free (state
, hdr
->filenames
,
1576 hdr
->filenames_count
* sizeof (char *),
1577 error_callback
, data
);
1580 /* Read the line header. Return 1 on success, 0 on failure. */
1583 read_line_header (struct backtrace_state
*state
, struct unit
*u
,
1584 int is_dwarf64
, struct dwarf_buf
*line_buf
,
1585 struct line_header
*hdr
)
1588 struct dwarf_buf hdr_buf
;
1589 const unsigned char *p
;
1590 const unsigned char *pend
;
1593 hdr
->version
= read_uint16 (line_buf
);
1594 if (hdr
->version
< 2 || hdr
->version
> 4)
1596 dwarf_buf_error (line_buf
, "unsupported line number version");
1600 hdrlen
= read_offset (line_buf
, is_dwarf64
);
1602 hdr_buf
= *line_buf
;
1603 hdr_buf
.left
= hdrlen
;
1605 if (!advance (line_buf
, hdrlen
))
1608 hdr
->min_insn_len
= read_byte (&hdr_buf
);
1609 if (hdr
->version
< 4)
1610 hdr
->max_ops_per_insn
= 1;
1612 hdr
->max_ops_per_insn
= read_byte (&hdr_buf
);
1614 /* We don't care about default_is_stmt. */
1615 read_byte (&hdr_buf
);
1617 hdr
->line_base
= read_sbyte (&hdr_buf
);
1618 hdr
->line_range
= read_byte (&hdr_buf
);
1620 hdr
->opcode_base
= read_byte (&hdr_buf
);
1621 hdr
->opcode_lengths
= hdr_buf
.buf
;
1622 if (!advance (&hdr_buf
, hdr
->opcode_base
- 1))
1625 /* Count the number of directory entries. */
1626 hdr
->dirs_count
= 0;
1628 pend
= p
+ hdr_buf
.left
;
1629 while (p
< pend
&& *p
!= '\0')
1631 p
+= strnlen((const char *) p
, pend
- p
) + 1;
1636 if (hdr
->dirs_count
!= 0)
1638 hdr
->dirs
= ((const char **)
1639 backtrace_alloc (state
,
1640 hdr
->dirs_count
* sizeof (const char *),
1641 line_buf
->error_callback
, line_buf
->data
));
1642 if (hdr
->dirs
== NULL
)
1647 while (*hdr_buf
.buf
!= '\0')
1649 if (hdr_buf
.reported_underflow
)
1652 hdr
->dirs
[i
] = (const char *) hdr_buf
.buf
;
1654 if (!advance (&hdr_buf
,
1655 strnlen ((const char *) hdr_buf
.buf
, hdr_buf
.left
) + 1))
1658 if (!advance (&hdr_buf
, 1))
1661 /* Count the number of file entries. */
1662 hdr
->filenames_count
= 0;
1664 pend
= p
+ hdr_buf
.left
;
1665 while (p
< pend
&& *p
!= '\0')
1667 p
+= strnlen ((const char *) p
, pend
- p
) + 1;
1668 p
+= leb128_len (p
);
1669 p
+= leb128_len (p
);
1670 p
+= leb128_len (p
);
1671 ++hdr
->filenames_count
;
1674 hdr
->filenames
= ((const char **)
1675 backtrace_alloc (state
,
1676 hdr
->filenames_count
* sizeof (char *),
1677 line_buf
->error_callback
,
1679 if (hdr
->filenames
== NULL
)
1682 while (*hdr_buf
.buf
!= '\0')
1684 const char *filename
;
1687 if (hdr_buf
.reported_underflow
)
1690 filename
= (const char *) hdr_buf
.buf
;
1691 if (!advance (&hdr_buf
,
1692 strnlen ((const char *) hdr_buf
.buf
, hdr_buf
.left
) + 1))
1694 dir_index
= read_uleb128 (&hdr_buf
);
1695 if (IS_ABSOLUTE_PATH (filename
)
1696 || (dir_index
== 0 && u
->comp_dir
== NULL
))
1697 hdr
->filenames
[i
] = filename
;
1702 size_t filename_len
;
1707 else if (dir_index
- 1 < hdr
->dirs_count
)
1708 dir
= hdr
->dirs
[dir_index
- 1];
1711 dwarf_buf_error (line_buf
,
1712 ("invalid directory index in "
1713 "line number program header"));
1716 dir_len
= strlen (dir
);
1717 filename_len
= strlen (filename
);
1719 backtrace_alloc (state
, dir_len
+ filename_len
+ 2,
1720 line_buf
->error_callback
, line_buf
->data
));
1723 memcpy (s
, dir
, dir_len
);
1724 /* FIXME: If we are on a DOS-based file system, and the
1725 directory or the file name use backslashes, then we
1726 should use a backslash here. */
1728 memcpy (s
+ dir_len
+ 1, filename
, filename_len
+ 1);
1729 hdr
->filenames
[i
] = s
;
1732 /* Ignore the modification time and size. */
1733 read_uleb128 (&hdr_buf
);
1734 read_uleb128 (&hdr_buf
);
1739 if (hdr_buf
.reported_underflow
)
1745 /* Read the line program, adding line mappings to VEC. Return 1 on
1746 success, 0 on failure. */
1749 read_line_program (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
1750 struct unit
*u
, const struct line_header
*hdr
,
1751 struct dwarf_buf
*line_buf
, struct line_vector
*vec
)
1754 unsigned int op_index
;
1755 const char *reset_filename
;
1756 const char *filename
;
1761 if (hdr
->filenames_count
> 0)
1762 reset_filename
= hdr
->filenames
[0];
1764 reset_filename
= "";
1765 filename
= reset_filename
;
1767 while (line_buf
->left
> 0)
1771 op
= read_byte (line_buf
);
1772 if (op
>= hdr
->opcode_base
)
1774 unsigned int advance
;
1776 /* Special opcode. */
1777 op
-= hdr
->opcode_base
;
1778 advance
= op
/ hdr
->line_range
;
1779 address
+= (hdr
->min_insn_len
* (op_index
+ advance
)
1780 / hdr
->max_ops_per_insn
);
1781 op_index
= (op_index
+ advance
) % hdr
->max_ops_per_insn
;
1782 lineno
+= hdr
->line_base
+ (int) (op
% hdr
->line_range
);
1783 add_line (state
, ddata
, address
, filename
, lineno
,
1784 line_buf
->error_callback
, line_buf
->data
, vec
);
1786 else if (op
== DW_LNS_extended_op
)
1790 len
= read_uleb128 (line_buf
);
1791 op
= read_byte (line_buf
);
1794 case DW_LNE_end_sequence
:
1795 /* FIXME: Should we mark the high PC here? It seems
1796 that we already have that information from the
1797 compilation unit. */
1800 filename
= reset_filename
;
1803 case DW_LNE_set_address
:
1804 address
= read_address (line_buf
, u
->addrsize
);
1806 case DW_LNE_define_file
:
1809 unsigned int dir_index
;
1811 f
= (const char *) line_buf
->buf
;
1812 if (!advance (line_buf
, strnlen (f
, line_buf
->left
) + 1))
1814 dir_index
= read_uleb128 (line_buf
);
1815 /* Ignore that time and length. */
1816 read_uleb128 (line_buf
);
1817 read_uleb128 (line_buf
);
1818 if (IS_ABSOLUTE_PATH (f
))
1829 else if (dir_index
- 1 < hdr
->dirs_count
)
1830 dir
= hdr
->dirs
[dir_index
- 1];
1833 dwarf_buf_error (line_buf
,
1834 ("invalid directory index "
1835 "in line number program"));
1838 dir_len
= strlen (dir
);
1841 backtrace_alloc (state
, dir_len
+ f_len
+ 2,
1842 line_buf
->error_callback
,
1846 memcpy (p
, dir
, dir_len
);
1847 /* FIXME: If we are on a DOS-based file system,
1848 and the directory or the file name use
1849 backslashes, then we should use a backslash
1852 memcpy (p
+ dir_len
+ 1, f
, f_len
+ 1);
1857 case DW_LNE_set_discriminator
:
1858 /* We don't care about discriminators. */
1859 read_uleb128 (line_buf
);
1862 if (!advance (line_buf
, len
- 1))
1872 add_line (state
, ddata
, address
, filename
, lineno
,
1873 line_buf
->error_callback
, line_buf
->data
, vec
);
1875 case DW_LNS_advance_pc
:
1879 advance
= read_uleb128 (line_buf
);
1880 address
+= (hdr
->min_insn_len
* (op_index
+ advance
)
1881 / hdr
->max_ops_per_insn
);
1882 op_index
= (op_index
+ advance
) % hdr
->max_ops_per_insn
;
1885 case DW_LNS_advance_line
:
1886 lineno
+= (int) read_sleb128 (line_buf
);
1888 case DW_LNS_set_file
:
1892 fileno
= read_uleb128 (line_buf
);
1897 if (fileno
- 1 >= hdr
->filenames_count
)
1899 dwarf_buf_error (line_buf
,
1900 ("invalid file number in "
1901 "line number program"));
1904 filename
= hdr
->filenames
[fileno
- 1];
1908 case DW_LNS_set_column
:
1909 read_uleb128 (line_buf
);
1911 case DW_LNS_negate_stmt
:
1913 case DW_LNS_set_basic_block
:
1915 case DW_LNS_const_add_pc
:
1917 unsigned int advance
;
1919 op
= 255 - hdr
->opcode_base
;
1920 advance
= op
/ hdr
->line_range
;
1921 address
+= (hdr
->min_insn_len
* (op_index
+ advance
)
1922 / hdr
->max_ops_per_insn
);
1923 op_index
= (op_index
+ advance
) % hdr
->max_ops_per_insn
;
1926 case DW_LNS_fixed_advance_pc
:
1927 address
+= read_uint16 (line_buf
);
1930 case DW_LNS_set_prologue_end
:
1932 case DW_LNS_set_epilogue_begin
:
1934 case DW_LNS_set_isa
:
1935 read_uleb128 (line_buf
);
1941 for (i
= hdr
->opcode_lengths
[op
- 1]; i
> 0; --i
)
1942 read_uleb128 (line_buf
);
1952 /* Read the line number information for a compilation unit. Returns 1
1953 on success, 0 on failure. */
1956 read_line_info (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
1957 backtrace_error_callback error_callback
, void *data
,
1958 struct unit
*u
, struct line_header
*hdr
, struct line
**lines
,
1959 size_t *lines_count
)
1961 struct line_vector vec
;
1962 struct dwarf_buf line_buf
;
1967 memset (&vec
.vec
, 0, sizeof vec
.vec
);
1970 memset (hdr
, 0, sizeof *hdr
);
1972 if (u
->lineoff
!= (off_t
) (size_t) u
->lineoff
1973 || (size_t) u
->lineoff
>= ddata
->dwarf_line_size
)
1975 error_callback (data
, "unit line offset out of range", 0);
1979 line_buf
.name
= ".debug_line";
1980 line_buf
.start
= ddata
->dwarf_line
;
1981 line_buf
.buf
= ddata
->dwarf_line
+ u
->lineoff
;
1982 line_buf
.left
= ddata
->dwarf_line_size
- u
->lineoff
;
1983 line_buf
.is_bigendian
= ddata
->is_bigendian
;
1984 line_buf
.error_callback
= error_callback
;
1985 line_buf
.data
= data
;
1986 line_buf
.reported_underflow
= 0;
1989 len
= read_uint32 (&line_buf
);
1990 if (len
== 0xffffffff)
1992 len
= read_uint64 (&line_buf
);
1995 line_buf
.left
= len
;
1997 if (!read_line_header (state
, u
, is_dwarf64
, &line_buf
, hdr
))
2000 if (!read_line_program (state
, ddata
, u
, hdr
, &line_buf
, &vec
))
2003 if (line_buf
.reported_underflow
)
2008 /* This is not a failure in the sense of a generating an error,
2009 but it is a failure in that sense that we have no useful
2014 /* Allocate one extra entry at the end. */
2015 ln
= ((struct line
*)
2016 backtrace_vector_grow (state
, sizeof (struct line
), error_callback
,
2020 ln
->pc
= (uintptr_t) -1;
2021 ln
->filename
= NULL
;
2025 if (!backtrace_vector_release (state
, &vec
.vec
, error_callback
, data
))
2028 ln
= (struct line
*) vec
.vec
.base
;
2029 backtrace_qsort (ln
, vec
.count
, sizeof (struct line
), line_compare
);
2032 *lines_count
= vec
.count
;
2037 vec
.vec
.alc
+= vec
.vec
.size
;
2039 backtrace_vector_release (state
, &vec
.vec
, error_callback
, data
);
2040 free_line_header (state
, hdr
, error_callback
, data
);
2041 *lines
= (struct line
*) (uintptr_t) -1;
2046 /* Read the name of a function from a DIE referenced by a
2047 DW_AT_abstract_origin or DW_AT_specification tag. OFFSET is within
2048 the same compilation unit. */
2051 read_referenced_name (struct dwarf_data
*ddata
, struct unit
*u
,
2052 uint64_t offset
, backtrace_error_callback error_callback
,
2055 struct dwarf_buf unit_buf
;
2057 const struct abbrev
*abbrev
;
2061 /* OFFSET is from the start of the data for this compilation unit.
2062 U->unit_data is the data, but it starts U->unit_data_offset bytes
2063 from the beginning. */
2065 if (offset
< u
->unit_data_offset
2066 || offset
- u
->unit_data_offset
>= u
->unit_data_len
)
2068 error_callback (data
,
2069 "abstract origin or specification out of range",
2074 offset
-= u
->unit_data_offset
;
2076 unit_buf
.name
= ".debug_info";
2077 unit_buf
.start
= ddata
->dwarf_info
;
2078 unit_buf
.buf
= u
->unit_data
+ offset
;
2079 unit_buf
.left
= u
->unit_data_len
- offset
;
2080 unit_buf
.is_bigendian
= ddata
->is_bigendian
;
2081 unit_buf
.error_callback
= error_callback
;
2082 unit_buf
.data
= data
;
2083 unit_buf
.reported_underflow
= 0;
2085 code
= read_uleb128 (&unit_buf
);
2088 dwarf_buf_error (&unit_buf
, "invalid abstract origin or specification");
2092 abbrev
= lookup_abbrev (&u
->abbrevs
, code
, error_callback
, data
);
2097 for (i
= 0; i
< abbrev
->num_attrs
; ++i
)
2099 struct attr_val val
;
2101 if (!read_attribute (abbrev
->attrs
[i
].form
, &unit_buf
,
2102 u
->is_dwarf64
, u
->version
, u
->addrsize
,
2103 ddata
->dwarf_str
, ddata
->dwarf_str_size
,
2107 switch (abbrev
->attrs
[i
].name
)
2110 /* We prefer the linkage name if get one. */
2111 if (val
.encoding
== ATTR_VAL_STRING
)
2115 case DW_AT_linkage_name
:
2116 case DW_AT_MIPS_linkage_name
:
2117 if (val
.encoding
== ATTR_VAL_STRING
)
2118 return val
.u
.string
;
2121 case DW_AT_specification
:
2122 if (abbrev
->attrs
[i
].form
== DW_FORM_ref_addr
2123 || abbrev
->attrs
[i
].form
== DW_FORM_ref_sig8
)
2125 /* This refers to a specification defined in some other
2126 compilation unit. We can handle this case if we
2127 must, but it's harder. */
2130 if (val
.encoding
== ATTR_VAL_UINT
2131 || val
.encoding
== ATTR_VAL_REF_UNIT
)
2135 name
= read_referenced_name (ddata
, u
, val
.u
.uint
,
2136 error_callback
, data
);
2150 /* Add a single range to U that maps to function. Returns 1 on
2151 success, 0 on error. */
2154 add_function_range (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
2155 struct function
*function
, uint64_t lowpc
, uint64_t highpc
,
2156 backtrace_error_callback error_callback
,
2157 void *data
, struct function_vector
*vec
)
2159 struct function_addrs
*p
;
2161 /* Add in the base address here, so that we can look up the PC
2163 lowpc
+= ddata
->base_address
;
2164 highpc
+= ddata
->base_address
;
2168 p
= (struct function_addrs
*) vec
->vec
.base
+ vec
->count
- 1;
2169 if ((lowpc
== p
->high
|| lowpc
== p
->high
+ 1)
2170 && function
== p
->function
)
2172 if (highpc
> p
->high
)
2178 p
= ((struct function_addrs
*)
2179 backtrace_vector_grow (state
, sizeof (struct function_addrs
),
2180 error_callback
, data
, &vec
->vec
));
2186 p
->function
= function
;
2191 /* Add PC ranges to U that map to FUNCTION. Returns 1 on success, 0
2195 add_function_ranges (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
2196 struct unit
*u
, struct function
*function
,
2197 uint64_t ranges
, uint64_t base
,
2198 backtrace_error_callback error_callback
, void *data
,
2199 struct function_vector
*vec
)
2201 struct dwarf_buf ranges_buf
;
2203 if (ranges
>= ddata
->dwarf_ranges_size
)
2205 error_callback (data
, "function ranges offset out of range", 0);
2209 ranges_buf
.name
= ".debug_ranges";
2210 ranges_buf
.start
= ddata
->dwarf_ranges
;
2211 ranges_buf
.buf
= ddata
->dwarf_ranges
+ ranges
;
2212 ranges_buf
.left
= ddata
->dwarf_ranges_size
- ranges
;
2213 ranges_buf
.is_bigendian
= ddata
->is_bigendian
;
2214 ranges_buf
.error_callback
= error_callback
;
2215 ranges_buf
.data
= data
;
2216 ranges_buf
.reported_underflow
= 0;
2223 if (ranges_buf
.reported_underflow
)
2226 low
= read_address (&ranges_buf
, u
->addrsize
);
2227 high
= read_address (&ranges_buf
, u
->addrsize
);
2229 if (low
== 0 && high
== 0)
2232 if (is_highest_address (low
, u
->addrsize
))
2236 if (!add_function_range (state
, ddata
, function
, low
+ base
,
2237 high
+ base
, error_callback
, data
, vec
))
2242 if (ranges_buf
.reported_underflow
)
2248 /* Read one entry plus all its children. Add function addresses to
2249 VEC. Returns 1 on success, 0 on error. */
2252 read_function_entry (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
2253 struct unit
*u
, uint64_t base
, struct dwarf_buf
*unit_buf
,
2254 const struct line_header
*lhdr
,
2255 backtrace_error_callback error_callback
, void *data
,
2256 struct function_vector
*vec_function
,
2257 struct function_vector
*vec_inlined
)
2259 while (unit_buf
->left
> 0)
2262 const struct abbrev
*abbrev
;
2264 struct function
*function
;
2265 struct function_vector
*vec
;
2271 int highpc_is_relative
;
2275 code
= read_uleb128 (unit_buf
);
2279 abbrev
= lookup_abbrev (&u
->abbrevs
, code
, error_callback
, data
);
2283 is_function
= (abbrev
->tag
== DW_TAG_subprogram
2284 || abbrev
->tag
== DW_TAG_entry_point
2285 || abbrev
->tag
== DW_TAG_inlined_subroutine
);
2287 if (abbrev
->tag
== DW_TAG_inlined_subroutine
)
2295 function
= ((struct function
*)
2296 backtrace_alloc (state
, sizeof *function
,
2297 error_callback
, data
));
2298 if (function
== NULL
)
2300 memset (function
, 0, sizeof *function
);
2307 highpc_is_relative
= 0;
2310 for (i
= 0; i
< abbrev
->num_attrs
; ++i
)
2312 struct attr_val val
;
2314 if (!read_attribute (abbrev
->attrs
[i
].form
, unit_buf
,
2315 u
->is_dwarf64
, u
->version
, u
->addrsize
,
2316 ddata
->dwarf_str
, ddata
->dwarf_str_size
,
2320 /* The compile unit sets the base address for any address
2321 ranges in the function entries. */
2322 if (abbrev
->tag
== DW_TAG_compile_unit
2323 && abbrev
->attrs
[i
].name
== DW_AT_low_pc
2324 && val
.encoding
== ATTR_VAL_ADDRESS
)
2329 switch (abbrev
->attrs
[i
].name
)
2331 case DW_AT_call_file
:
2332 if (val
.encoding
== ATTR_VAL_UINT
)
2334 if (val
.u
.uint
== 0)
2335 function
->caller_filename
= "";
2338 if (val
.u
.uint
- 1 >= lhdr
->filenames_count
)
2340 dwarf_buf_error (unit_buf
,
2341 ("invalid file number in "
2342 "DW_AT_call_file attribute"));
2345 function
->caller_filename
=
2346 lhdr
->filenames
[val
.u
.uint
- 1];
2351 case DW_AT_call_line
:
2352 if (val
.encoding
== ATTR_VAL_UINT
)
2353 function
->caller_lineno
= val
.u
.uint
;
2356 case DW_AT_abstract_origin
:
2357 case DW_AT_specification
:
2358 if (abbrev
->attrs
[i
].form
== DW_FORM_ref_addr
2359 || abbrev
->attrs
[i
].form
== DW_FORM_ref_sig8
)
2361 /* This refers to an abstract origin defined in
2362 some other compilation unit. We can handle
2363 this case if we must, but it's harder. */
2366 if (val
.encoding
== ATTR_VAL_UINT
2367 || val
.encoding
== ATTR_VAL_REF_UNIT
)
2371 name
= read_referenced_name (ddata
, u
, val
.u
.uint
,
2372 error_callback
, data
);
2374 function
->name
= name
;
2379 if (val
.encoding
== ATTR_VAL_STRING
)
2381 /* Don't override a name we found in some other
2382 way, as it will normally be more
2383 useful--e.g., this name is normally not
2385 if (function
->name
== NULL
)
2386 function
->name
= val
.u
.string
;
2390 case DW_AT_linkage_name
:
2391 case DW_AT_MIPS_linkage_name
:
2392 if (val
.encoding
== ATTR_VAL_STRING
)
2393 function
->name
= val
.u
.string
;
2397 if (val
.encoding
== ATTR_VAL_ADDRESS
)
2405 if (val
.encoding
== ATTR_VAL_ADDRESS
)
2407 highpc
= val
.u
.uint
;
2410 else if (val
.encoding
== ATTR_VAL_UINT
)
2412 highpc
= val
.u
.uint
;
2414 highpc_is_relative
= 1;
2419 if (val
.encoding
== ATTR_VAL_UINT
2420 || val
.encoding
== ATTR_VAL_REF_SECTION
)
2422 ranges
= val
.u
.uint
;
2433 /* If we couldn't find a name for the function, we have no use
2435 if (is_function
&& function
->name
== NULL
)
2437 backtrace_free (state
, function
, sizeof *function
,
2438 error_callback
, data
);
2446 if (!add_function_ranges (state
, ddata
, u
, function
, ranges
,
2447 base
, error_callback
, data
, vec
))
2450 else if (have_lowpc
&& have_highpc
)
2452 if (highpc_is_relative
)
2454 if (!add_function_range (state
, ddata
, function
, lowpc
, highpc
,
2455 error_callback
, data
, vec
))
2460 backtrace_free (state
, function
, sizeof *function
,
2461 error_callback
, data
);
2466 if (abbrev
->has_children
)
2470 if (!read_function_entry (state
, ddata
, u
, base
, unit_buf
, lhdr
,
2471 error_callback
, data
, vec_function
,
2477 struct function_vector fvec
;
2479 /* Gather any information for inlined functions in
2482 memset (&fvec
, 0, sizeof fvec
);
2484 if (!read_function_entry (state
, ddata
, u
, base
, unit_buf
, lhdr
,
2485 error_callback
, data
, vec_function
,
2491 struct function_addrs
*faddrs
;
2493 if (!backtrace_vector_release (state
, &fvec
.vec
,
2494 error_callback
, data
))
2497 faddrs
= (struct function_addrs
*) fvec
.vec
.base
;
2498 backtrace_qsort (faddrs
, fvec
.count
,
2499 sizeof (struct function_addrs
),
2500 function_addrs_compare
);
2502 function
->function_addrs
= faddrs
;
2503 function
->function_addrs_count
= fvec
.count
;
2512 /* Read function name information for a compilation unit. We look
2513 through the whole unit looking for function tags. */
2516 read_function_info (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
2517 const struct line_header
*lhdr
,
2518 backtrace_error_callback error_callback
, void *data
,
2519 struct unit
*u
, struct function_vector
*fvec
,
2520 struct function_addrs
**ret_addrs
,
2521 size_t *ret_addrs_count
)
2523 struct function_vector lvec
;
2524 struct function_vector
*pfvec
;
2525 struct dwarf_buf unit_buf
;
2526 struct function_addrs
*addrs
;
2529 /* Use FVEC if it is not NULL. Otherwise use our own vector. */
2534 memset (&lvec
, 0, sizeof lvec
);
2538 unit_buf
.name
= ".debug_info";
2539 unit_buf
.start
= ddata
->dwarf_info
;
2540 unit_buf
.buf
= u
->unit_data
;
2541 unit_buf
.left
= u
->unit_data_len
;
2542 unit_buf
.is_bigendian
= ddata
->is_bigendian
;
2543 unit_buf
.error_callback
= error_callback
;
2544 unit_buf
.data
= data
;
2545 unit_buf
.reported_underflow
= 0;
2547 while (unit_buf
.left
> 0)
2549 if (!read_function_entry (state
, ddata
, u
, 0, &unit_buf
, lhdr
,
2550 error_callback
, data
, pfvec
, pfvec
))
2554 if (pfvec
->count
== 0)
2557 addrs_count
= pfvec
->count
;
2561 if (!backtrace_vector_release (state
, &lvec
.vec
, error_callback
, data
))
2563 addrs
= (struct function_addrs
*) pfvec
->vec
.base
;
2567 /* Finish this list of addresses, but leave the remaining space in
2568 the vector available for the next function unit. */
2569 addrs
= ((struct function_addrs
*)
2570 backtrace_vector_finish (state
, &fvec
->vec
,
2571 error_callback
, data
));
2577 backtrace_qsort (addrs
, addrs_count
, sizeof (struct function_addrs
),
2578 function_addrs_compare
);
2581 *ret_addrs_count
= addrs_count
;
2584 /* See if PC is inlined in FUNCTION. If it is, print out the inlined
2585 information, and update FILENAME and LINENO for the caller.
2586 Returns whatever CALLBACK returns, or 0 to keep going. */
2589 report_inlined_functions (uintptr_t pc
, struct function
*function
,
2590 backtrace_full_callback callback
, void *data
,
2591 const char **filename
, int *lineno
)
2593 struct function_addrs
*function_addrs
;
2594 struct function
*inlined
;
2597 if (function
->function_addrs_count
== 0)
2600 function_addrs
= ((struct function_addrs
*)
2601 bsearch (&pc
, function
->function_addrs
,
2602 function
->function_addrs_count
,
2603 sizeof (struct function_addrs
),
2604 function_addrs_search
));
2605 if (function_addrs
== NULL
)
2608 while (((size_t) (function_addrs
- function
->function_addrs
) + 1
2609 < function
->function_addrs_count
)
2610 && pc
>= (function_addrs
+ 1)->low
2611 && pc
< (function_addrs
+ 1)->high
)
2614 /* We found an inlined call. */
2616 inlined
= function_addrs
->function
;
2618 /* Report any calls inlined into this one. */
2619 ret
= report_inlined_functions (pc
, inlined
, callback
, data
,
2624 /* Report this inlined call. */
2625 ret
= callback (data
, pc
, *filename
, *lineno
, inlined
->name
);
2629 /* Our caller will report the caller of the inlined function; tell
2630 it the appropriate filename and line number. */
2631 *filename
= inlined
->caller_filename
;
2632 *lineno
= inlined
->caller_lineno
;
2637 /* Look for a PC in the DWARF mapping for one module. On success,
2638 call CALLBACK and return whatever it returns. On error, call
2639 ERROR_CALLBACK and return 0. Sets *FOUND to 1 if the PC is found,
2643 dwarf_lookup_pc (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
2644 uintptr_t pc
, backtrace_full_callback callback
,
2645 backtrace_error_callback error_callback
, void *data
,
2648 struct unit_addrs
*entry
;
2653 struct function_addrs
*function_addrs
;
2654 struct function
*function
;
2655 const char *filename
;
2661 /* Find an address range that includes PC. */
2662 entry
= bsearch (&pc
, ddata
->addrs
, ddata
->addrs_count
,
2663 sizeof (struct unit_addrs
), unit_addrs_search
);
2671 /* If there are multiple ranges that contain PC, use the last one,
2672 in order to produce predictable results. If we assume that all
2673 ranges are properly nested, then the last range will be the
2675 while ((size_t) (entry
- ddata
->addrs
) + 1 < ddata
->addrs_count
2676 && pc
>= (entry
+ 1)->low
2677 && pc
< (entry
+ 1)->high
)
2680 /* We need the lines, lines_count, function_addrs,
2681 function_addrs_count fields of u. If they are not set, we need
2682 to set them. When running in threaded mode, we need to allow for
2683 the possibility that some other thread is setting them
2689 /* Skip units with no useful line number information by walking
2690 backward. Useless line number information is marked by setting
2692 while (entry
> ddata
->addrs
2693 && pc
>= (entry
- 1)->low
2694 && pc
< (entry
- 1)->high
)
2696 if (state
->threaded
)
2697 lines
= (struct line
*) backtrace_atomic_load_pointer (&u
->lines
);
2699 if (lines
!= (struct line
*) (uintptr_t) -1)
2708 if (state
->threaded
)
2709 lines
= backtrace_atomic_load_pointer (&u
->lines
);
2714 size_t function_addrs_count
;
2715 struct line_header lhdr
;
2718 /* We have never read the line information for this unit. Read
2721 function_addrs
= NULL
;
2722 function_addrs_count
= 0;
2723 if (read_line_info (state
, ddata
, error_callback
, data
, entry
->u
, &lhdr
,
2726 struct function_vector
*pfvec
;
2728 /* If not threaded, reuse DDATA->FVEC for better memory
2730 if (state
->threaded
)
2733 pfvec
= &ddata
->fvec
;
2734 read_function_info (state
, ddata
, &lhdr
, error_callback
, data
,
2735 entry
->u
, pfvec
, &function_addrs
,
2736 &function_addrs_count
);
2737 free_line_header (state
, &lhdr
, error_callback
, data
);
2741 /* Atomically store the information we just read into the unit.
2742 If another thread is simultaneously writing, it presumably
2743 read the same information, and we don't care which one we
2744 wind up with; we just leak the other one. We do have to
2745 write the lines field last, so that the acquire-loads above
2746 ensure that the other fields are set. */
2748 if (!state
->threaded
)
2750 u
->lines_count
= count
;
2751 u
->function_addrs
= function_addrs
;
2752 u
->function_addrs_count
= function_addrs_count
;
2757 backtrace_atomic_store_size_t (&u
->lines_count
, count
);
2758 backtrace_atomic_store_pointer (&u
->function_addrs
, function_addrs
);
2759 backtrace_atomic_store_size_t (&u
->function_addrs_count
,
2760 function_addrs_count
);
2761 backtrace_atomic_store_pointer (&u
->lines
, lines
);
2765 /* Now all fields of U have been initialized. */
2767 if (lines
== (struct line
*) (uintptr_t) -1)
2769 /* If reading the line number information failed in some way,
2770 try again to see if there is a better compilation unit for
2773 return dwarf_lookup_pc (state
, ddata
, pc
, callback
, error_callback
,
2775 return callback (data
, pc
, NULL
, 0, NULL
);
2778 /* Search for PC within this unit. */
2780 ln
= (struct line
*) bsearch (&pc
, lines
, entry
->u
->lines_count
,
2781 sizeof (struct line
), line_search
);
2784 /* The PC is between the low_pc and high_pc attributes of the
2785 compilation unit, but no entry in the line table covers it.
2786 This implies that the start of the compilation unit has no
2787 line number information. */
2789 if (entry
->u
->abs_filename
== NULL
)
2791 const char *filename
;
2793 filename
= entry
->u
->filename
;
2794 if (filename
!= NULL
2795 && !IS_ABSOLUTE_PATH (filename
)
2796 && entry
->u
->comp_dir
!= NULL
)
2798 size_t filename_len
;
2803 filename_len
= strlen (filename
);
2804 dir
= entry
->u
->comp_dir
;
2805 dir_len
= strlen (dir
);
2806 s
= (char *) backtrace_alloc (state
, dir_len
+ filename_len
+ 2,
2807 error_callback
, data
);
2813 memcpy (s
, dir
, dir_len
);
2814 /* FIXME: Should use backslash if DOS file system. */
2816 memcpy (s
+ dir_len
+ 1, filename
, filename_len
+ 1);
2819 entry
->u
->abs_filename
= filename
;
2822 return callback (data
, pc
, entry
->u
->abs_filename
, 0, NULL
);
2825 /* Search for function name within this unit. */
2827 if (entry
->u
->function_addrs_count
== 0)
2828 return callback (data
, pc
, ln
->filename
, ln
->lineno
, NULL
);
2830 function_addrs
= ((struct function_addrs
*)
2831 bsearch (&pc
, entry
->u
->function_addrs
,
2832 entry
->u
->function_addrs_count
,
2833 sizeof (struct function_addrs
),
2834 function_addrs_search
));
2835 if (function_addrs
== NULL
)
2836 return callback (data
, pc
, ln
->filename
, ln
->lineno
, NULL
);
2838 /* If there are multiple function ranges that contain PC, use the
2839 last one, in order to produce predictable results. */
2841 while (((size_t) (function_addrs
- entry
->u
->function_addrs
+ 1)
2842 < entry
->u
->function_addrs_count
)
2843 && pc
>= (function_addrs
+ 1)->low
2844 && pc
< (function_addrs
+ 1)->high
)
2847 function
= function_addrs
->function
;
2849 filename
= ln
->filename
;
2850 lineno
= ln
->lineno
;
2852 ret
= report_inlined_functions (pc
, function
, callback
, data
,
2853 &filename
, &lineno
);
2857 return callback (data
, pc
, filename
, lineno
, function
->name
);
2861 /* Return the file/line information for a PC using the DWARF mapping
2862 we built earlier. */
2865 dwarf_fileline (struct backtrace_state
*state
, uintptr_t pc
,
2866 backtrace_full_callback callback
,
2867 backtrace_error_callback error_callback
, void *data
)
2869 struct dwarf_data
*ddata
;
2873 if (!state
->threaded
)
2875 for (ddata
= (struct dwarf_data
*) state
->fileline_data
;
2877 ddata
= ddata
->next
)
2879 ret
= dwarf_lookup_pc (state
, ddata
, pc
, callback
, error_callback
,
2881 if (ret
!= 0 || found
)
2887 struct dwarf_data
**pp
;
2889 pp
= (struct dwarf_data
**) (void *) &state
->fileline_data
;
2892 ddata
= backtrace_atomic_load_pointer (pp
);
2896 ret
= dwarf_lookup_pc (state
, ddata
, pc
, callback
, error_callback
,
2898 if (ret
!= 0 || found
)
2905 /* FIXME: See if any libraries have been dlopen'ed. */
2907 return callback (data
, pc
, NULL
, 0, NULL
);
2910 /* Initialize our data structures from the DWARF debug info for a
2911 file. Return NULL on failure. */
2913 static struct dwarf_data
*
2914 build_dwarf_data (struct backtrace_state
*state
,
2915 uintptr_t base_address
,
2916 const unsigned char *dwarf_info
,
2917 size_t dwarf_info_size
,
2918 const unsigned char *dwarf_line
,
2919 size_t dwarf_line_size
,
2920 const unsigned char *dwarf_abbrev
,
2921 size_t dwarf_abbrev_size
,
2922 const unsigned char *dwarf_ranges
,
2923 size_t dwarf_ranges_size
,
2924 const unsigned char *dwarf_str
,
2925 size_t dwarf_str_size
,
2927 backtrace_error_callback error_callback
,
2930 struct unit_addrs_vector addrs_vec
;
2931 struct unit_addrs
*addrs
;
2933 struct dwarf_data
*fdata
;
2935 if (!build_address_map (state
, base_address
, dwarf_info
, dwarf_info_size
,
2936 dwarf_abbrev
, dwarf_abbrev_size
, dwarf_ranges
,
2937 dwarf_ranges_size
, dwarf_str
, dwarf_str_size
,
2938 is_bigendian
, error_callback
, data
, &addrs_vec
))
2941 if (!backtrace_vector_release (state
, &addrs_vec
.vec
, error_callback
, data
))
2943 addrs
= (struct unit_addrs
*) addrs_vec
.vec
.base
;
2944 addrs_count
= addrs_vec
.count
;
2945 backtrace_qsort (addrs
, addrs_count
, sizeof (struct unit_addrs
),
2946 unit_addrs_compare
);
2948 fdata
= ((struct dwarf_data
*)
2949 backtrace_alloc (state
, sizeof (struct dwarf_data
),
2950 error_callback
, data
));
2955 fdata
->base_address
= base_address
;
2956 fdata
->addrs
= addrs
;
2957 fdata
->addrs_count
= addrs_count
;
2958 fdata
->dwarf_info
= dwarf_info
;
2959 fdata
->dwarf_info_size
= dwarf_info_size
;
2960 fdata
->dwarf_line
= dwarf_line
;
2961 fdata
->dwarf_line_size
= dwarf_line_size
;
2962 fdata
->dwarf_ranges
= dwarf_ranges
;
2963 fdata
->dwarf_ranges_size
= dwarf_ranges_size
;
2964 fdata
->dwarf_str
= dwarf_str
;
2965 fdata
->dwarf_str_size
= dwarf_str_size
;
2966 fdata
->is_bigendian
= is_bigendian
;
2967 memset (&fdata
->fvec
, 0, sizeof fdata
->fvec
);
2972 /* Build our data structures from the DWARF sections for a module.
2973 Set FILELINE_FN and STATE->FILELINE_DATA. Return 1 on success, 0
2977 backtrace_dwarf_add (struct backtrace_state
*state
,
2978 uintptr_t base_address
,
2979 const unsigned char *dwarf_info
,
2980 size_t dwarf_info_size
,
2981 const unsigned char *dwarf_line
,
2982 size_t dwarf_line_size
,
2983 const unsigned char *dwarf_abbrev
,
2984 size_t dwarf_abbrev_size
,
2985 const unsigned char *dwarf_ranges
,
2986 size_t dwarf_ranges_size
,
2987 const unsigned char *dwarf_str
,
2988 size_t dwarf_str_size
,
2990 backtrace_error_callback error_callback
,
2991 void *data
, fileline
*fileline_fn
)
2993 struct dwarf_data
*fdata
;
2995 fdata
= build_dwarf_data (state
, base_address
, dwarf_info
, dwarf_info_size
,
2996 dwarf_line
, dwarf_line_size
, dwarf_abbrev
,
2997 dwarf_abbrev_size
, dwarf_ranges
, dwarf_ranges_size
,
2998 dwarf_str
, dwarf_str_size
, is_bigendian
,
2999 error_callback
, data
);
3003 if (!state
->threaded
)
3005 struct dwarf_data
**pp
;
3007 for (pp
= (struct dwarf_data
**) (void *) &state
->fileline_data
;
3017 struct dwarf_data
**pp
;
3019 pp
= (struct dwarf_data
**) (void *) &state
->fileline_data
;
3023 struct dwarf_data
*p
;
3025 p
= backtrace_atomic_load_pointer (pp
);
3033 if (__sync_bool_compare_and_swap (pp
, NULL
, fdata
))
3038 *fileline_fn
= dwarf_fileline
;