1 /* dwarf.c -- Get file/line information from DWARF for backtraces.
2 Copyright (C) 2012-2021 Free Software Foundation, Inc.
3 Written by Ian Lance Taylor, Google.
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. */
95 /* The attribute value, for DW_FORM_implicit_const. */
99 /* A single DWARF abbreviation. */
103 /* The abbrev code--the number used to refer to the abbrev. */
107 /* Non-zero if this abbrev has child entries. */
109 /* The number of attributes. */
111 /* The attributes. */
115 /* The DWARF abbreviations for a compilation unit. This structure
116 only exists while reading the compilation unit. Most DWARF readers
117 seem to a hash table to map abbrev ID's to abbrev entries.
118 However, we primarily care about GCC, and GCC simply issues ID's in
119 numerical order starting at 1. So we simply keep a sorted vector,
120 and try to just look up the code. */
124 /* The number of abbrevs in the vector. */
126 /* The abbrevs, sorted by the code field. */
127 struct abbrev
*abbrevs
;
130 /* The different kinds of attribute values. */
132 enum attr_val_encoding
134 /* No attribute value. */
138 /* An index into the .debug_addr section, whose value is relative to
139 * the DW_AT_addr_base attribute of the compilation unit. */
140 ATTR_VAL_ADDRESS_INDEX
,
141 /* A unsigned integer. */
143 /* A sigd integer. */
147 /* An index into the .debug_str_offsets section. */
148 ATTR_VAL_STRING_INDEX
,
149 /* An offset to other data in the containing unit. */
151 /* An offset to other data within the .debug_info section. */
153 /* An offset to other data within the alt .debug_info section. */
154 ATTR_VAL_REF_ALT_INFO
,
155 /* An offset to data in some other section. */
156 ATTR_VAL_REF_SECTION
,
157 /* A type signature. */
159 /* An index into the .debug_rnglists section. */
160 ATTR_VAL_RNGLISTS_INDEX
,
161 /* A block of data (not represented). */
163 /* An expression (not represented). */
167 /* An attribute value. */
171 /* How the value is stored in the field u. */
172 enum attr_val_encoding encoding
;
175 /* ATTR_VAL_ADDRESS*, ATTR_VAL_UINT, ATTR_VAL_REF*. */
179 /* ATTR_VAL_STRING. */
181 /* ATTR_VAL_BLOCK not stored. */
185 /* The line number program header. */
189 /* The version of the line number information. */
193 /* The minimum instruction length. */
194 unsigned int min_insn_len
;
195 /* The maximum number of ops per instruction. */
196 unsigned int max_ops_per_insn
;
197 /* The line base for special opcodes. */
199 /* The line range for special opcodes. */
200 unsigned int line_range
;
201 /* The opcode base--the first special opcode. */
202 unsigned int opcode_base
;
203 /* Opcode lengths, indexed by opcode - 1. */
204 const unsigned char *opcode_lengths
;
205 /* The number of directory entries. */
207 /* The directory entries. */
209 /* The number of filenames. */
210 size_t filenames_count
;
212 const char **filenames
;
215 /* A format description from a line header. */
217 struct line_header_format
219 int lnct
; /* LNCT code. */
220 enum dwarf_form form
; /* Form of entry data. */
223 /* Map a single PC value to a file/line. We will keep a vector of
224 these sorted by PC value. Each file/line will be correct from the
225 PC up to the PC of the next entry if there is one. We allocate one
226 extra entry at the end so that we can use bsearch. */
232 /* File name. Many entries in the array are expected to point to
233 the same file name. */
234 const char *filename
;
237 /* Index of the object in the original array read from the DWARF
238 section, before it has been sorted. The index makes it possible
239 to use Quicksort and maintain stability. */
243 /* A growable vector of line number information. This is used while
244 reading the line numbers. */
248 /* Memory. This is an array of struct line. */
249 struct backtrace_vector vec
;
250 /* Number of valid mappings. */
254 /* A function described in the debug info. */
258 /* The name of the function. */
260 /* If this is an inlined function, the filename of the call
262 const char *caller_filename
;
263 /* If this is an inlined function, the line number of the call
266 /* Map PC ranges to inlined functions. */
267 struct function_addrs
*function_addrs
;
268 size_t function_addrs_count
;
271 /* An address range for a function. This maps a PC value to a
272 specific function. */
274 struct function_addrs
276 /* Range is LOW <= PC < HIGH. */
279 /* Function for this address range. */
280 struct function
*function
;
283 /* A growable vector of function address ranges. */
285 struct function_vector
287 /* Memory. This is an array of struct function_addrs. */
288 struct backtrace_vector vec
;
289 /* Number of address ranges present. */
293 /* A DWARF compilation unit. This only holds the information we need
294 to map a PC to a file and line. */
298 /* The first entry for this compilation unit. */
299 const unsigned char *unit_data
;
300 /* The length of the data for this compilation unit. */
301 size_t unit_data_len
;
302 /* The offset of UNIT_DATA from the start of the information for
303 this compilation unit. */
304 size_t unit_data_offset
;
305 /* Offset of the start of the compilation unit from the start of the
306 .debug_info section. */
308 /* Offset of the end of the compilation unit from the start of the
309 .debug_info section. */
313 /* Whether unit is DWARF64. */
317 /* Offset into line number information. */
319 /* Offset of compilation unit in .debug_str_offsets. */
320 uint64_t str_offsets_base
;
321 /* Offset of compilation unit in .debug_addr. */
323 /* Offset of compilation unit in .debug_rnglists. */
324 uint64_t rnglists_base
;
325 /* Primary source file. */
326 const char *filename
;
327 /* Compilation command working directory. */
328 const char *comp_dir
;
329 /* Absolute file name, only set if needed. */
330 const char *abs_filename
;
331 /* The abbreviations for this unit. */
332 struct abbrevs abbrevs
;
334 /* The fields above this point are read in during initialization and
335 may be accessed freely. The fields below this point are read in
336 as needed, and therefore require care, as different threads may
337 try to initialize them simultaneously. */
339 /* PC to line number mapping. This is NULL if the values have not
340 been read. This is (struct line *) -1 if there was an error
341 reading the values. */
343 /* Number of entries in lines. */
345 /* PC ranges to function. */
346 struct function_addrs
*function_addrs
;
347 size_t function_addrs_count
;
350 /* An address range for a compilation unit. This maps a PC value to a
351 specific compilation unit. Note that we invert the representation
352 in DWARF: instead of listing the units and attaching a list of
353 ranges, we list the ranges and have each one point to the unit.
354 This lets us do a binary search to find the unit. */
358 /* Range is LOW <= PC < HIGH. */
361 /* Compilation unit for this address range. */
365 /* A growable vector of compilation unit address ranges. */
367 struct unit_addrs_vector
369 /* Memory. This is an array of struct unit_addrs. */
370 struct backtrace_vector vec
;
371 /* Number of address ranges present. */
375 /* A growable vector of compilation unit pointer. */
379 struct backtrace_vector vec
;
383 /* The information we need to map a PC to a file and line. */
387 /* The data for the next file we know about. */
388 struct dwarf_data
*next
;
389 /* The data for .gnu_debugaltlink. */
390 struct dwarf_data
*altlink
;
391 /* The base address for this file. */
392 uintptr_t base_address
;
393 /* A sorted list of address ranges. */
394 struct unit_addrs
*addrs
;
395 /* Number of address ranges in list. */
397 /* A sorted list of units. */
399 /* Number of units in the list. */
401 /* The unparsed DWARF debug data. */
402 struct dwarf_sections dwarf_sections
;
403 /* Whether the data is big-endian or not. */
405 /* A vector used for function addresses. We keep this here so that
406 we can grow the vector as we read more functions. */
407 struct function_vector fvec
;
410 /* Report an error for a DWARF buffer. */
413 dwarf_buf_error (struct dwarf_buf
*buf
, const char *msg
, int errnum
)
417 snprintf (b
, sizeof b
, "%s in %s at %d",
418 msg
, buf
->name
, (int) (buf
->buf
- buf
->start
));
419 buf
->error_callback (buf
->data
, b
, errnum
);
422 /* Require at least COUNT bytes in BUF. Return 1 if all is well, 0 on
426 require (struct dwarf_buf
*buf
, size_t count
)
428 if (buf
->left
>= count
)
431 if (!buf
->reported_underflow
)
433 dwarf_buf_error (buf
, "DWARF underflow", 0);
434 buf
->reported_underflow
= 1;
440 /* Advance COUNT bytes in BUF. Return 1 if all is well, 0 on
444 advance (struct dwarf_buf
*buf
, size_t count
)
446 if (!require (buf
, count
))
453 /* Read one zero-terminated string from BUF and advance past the string. */
456 read_string (struct dwarf_buf
*buf
)
458 const char *p
= (const char *)buf
->buf
;
459 size_t len
= strnlen (p
, buf
->left
);
461 /* - If len == left, we ran out of buffer before finding the zero terminator.
462 Generate an error by advancing len + 1.
463 - If len < left, advance by len + 1 to skip past the zero terminator. */
464 size_t count
= len
+ 1;
466 if (!advance (buf
, count
))
472 /* Read one byte from BUF and advance 1 byte. */
475 read_byte (struct dwarf_buf
*buf
)
477 const unsigned char *p
= buf
->buf
;
479 if (!advance (buf
, 1))
484 /* Read a signed char from BUF and advance 1 byte. */
487 read_sbyte (struct dwarf_buf
*buf
)
489 const unsigned char *p
= buf
->buf
;
491 if (!advance (buf
, 1))
493 return (*p
^ 0x80) - 0x80;
496 /* Read a uint16 from BUF and advance 2 bytes. */
499 read_uint16 (struct dwarf_buf
*buf
)
501 const unsigned char *p
= buf
->buf
;
503 if (!advance (buf
, 2))
505 if (buf
->is_bigendian
)
506 return ((uint16_t) p
[0] << 8) | (uint16_t) p
[1];
508 return ((uint16_t) p
[1] << 8) | (uint16_t) p
[0];
511 /* Read a 24 bit value from BUF and advance 3 bytes. */
514 read_uint24 (struct dwarf_buf
*buf
)
516 const unsigned char *p
= buf
->buf
;
518 if (!advance (buf
, 3))
520 if (buf
->is_bigendian
)
521 return (((uint32_t) p
[0] << 16) | ((uint32_t) p
[1] << 8)
524 return (((uint32_t) p
[2] << 16) | ((uint32_t) p
[1] << 8)
528 /* Read a uint32 from BUF and advance 4 bytes. */
531 read_uint32 (struct dwarf_buf
*buf
)
533 const unsigned char *p
= buf
->buf
;
535 if (!advance (buf
, 4))
537 if (buf
->is_bigendian
)
538 return (((uint32_t) p
[0] << 24) | ((uint32_t) p
[1] << 16)
539 | ((uint32_t) p
[2] << 8) | (uint32_t) p
[3]);
541 return (((uint32_t) p
[3] << 24) | ((uint32_t) p
[2] << 16)
542 | ((uint32_t) p
[1] << 8) | (uint32_t) p
[0]);
545 /* Read a uint64 from BUF and advance 8 bytes. */
548 read_uint64 (struct dwarf_buf
*buf
)
550 const unsigned char *p
= buf
->buf
;
552 if (!advance (buf
, 8))
554 if (buf
->is_bigendian
)
555 return (((uint64_t) p
[0] << 56) | ((uint64_t) p
[1] << 48)
556 | ((uint64_t) p
[2] << 40) | ((uint64_t) p
[3] << 32)
557 | ((uint64_t) p
[4] << 24) | ((uint64_t) p
[5] << 16)
558 | ((uint64_t) p
[6] << 8) | (uint64_t) p
[7]);
560 return (((uint64_t) p
[7] << 56) | ((uint64_t) p
[6] << 48)
561 | ((uint64_t) p
[5] << 40) | ((uint64_t) p
[4] << 32)
562 | ((uint64_t) p
[3] << 24) | ((uint64_t) p
[2] << 16)
563 | ((uint64_t) p
[1] << 8) | (uint64_t) p
[0]);
566 /* Read an offset from BUF and advance the appropriate number of
570 read_offset (struct dwarf_buf
*buf
, int is_dwarf64
)
573 return read_uint64 (buf
);
575 return read_uint32 (buf
);
578 /* Read an address from BUF and advance the appropriate number of
582 read_address (struct dwarf_buf
*buf
, int addrsize
)
587 return read_byte (buf
);
589 return read_uint16 (buf
);
591 return read_uint32 (buf
);
593 return read_uint64 (buf
);
595 dwarf_buf_error (buf
, "unrecognized address size", 0);
600 /* Return whether a value is the highest possible address, given the
604 is_highest_address (uint64_t address
, int addrsize
)
609 return address
== (unsigned char) -1;
611 return address
== (uint16_t) -1;
613 return address
== (uint32_t) -1;
615 return address
== (uint64_t) -1;
621 /* Read an unsigned LEB128 number. */
624 read_uleb128 (struct dwarf_buf
*buf
)
636 const unsigned char *p
;
639 if (!advance (buf
, 1))
643 ret
|= ((uint64_t) (b
& 0x7f)) << shift
;
646 dwarf_buf_error (buf
, "LEB128 overflows uint64_t", 0);
651 while ((b
& 0x80) != 0);
656 /* Read a signed LEB128 number. */
659 read_sleb128 (struct dwarf_buf
*buf
)
671 const unsigned char *p
;
674 if (!advance (buf
, 1))
678 val
|= ((uint64_t) (b
& 0x7f)) << shift
;
681 dwarf_buf_error (buf
, "signed LEB128 overflows uint64_t", 0);
686 while ((b
& 0x80) != 0);
688 if ((b
& 0x40) != 0 && shift
< 64)
689 val
|= ((uint64_t) -1) << shift
;
691 return (int64_t) val
;
694 /* Return the length of an LEB128 number. */
697 leb128_len (const unsigned char *p
)
702 while ((*p
& 0x80) != 0)
710 /* Read initial_length from BUF and advance the appropriate number of bytes. */
713 read_initial_length (struct dwarf_buf
*buf
, int *is_dwarf64
)
717 len
= read_uint32 (buf
);
718 if (len
== 0xffffffff)
720 len
= read_uint64 (buf
);
729 /* Free an abbreviations structure. */
732 free_abbrevs (struct backtrace_state
*state
, struct abbrevs
*abbrevs
,
733 backtrace_error_callback error_callback
, void *data
)
737 for (i
= 0; i
< abbrevs
->num_abbrevs
; ++i
)
738 backtrace_free (state
, abbrevs
->abbrevs
[i
].attrs
,
739 abbrevs
->abbrevs
[i
].num_attrs
* sizeof (struct attr
),
740 error_callback
, data
);
741 backtrace_free (state
, abbrevs
->abbrevs
,
742 abbrevs
->num_abbrevs
* sizeof (struct abbrev
),
743 error_callback
, data
);
744 abbrevs
->num_abbrevs
= 0;
745 abbrevs
->abbrevs
= NULL
;
748 /* Read an attribute value. Returns 1 on success, 0 on failure. If
749 the value can be represented as a uint64_t, sets *VAL and sets
750 *IS_VALID to 1. We don't try to store the value of other attribute
751 forms, because we don't care about them. */
754 read_attribute (enum dwarf_form form
, uint64_t implicit_val
,
755 struct dwarf_buf
*buf
, int is_dwarf64
, int version
,
756 int addrsize
, const struct dwarf_sections
*dwarf_sections
,
757 struct dwarf_data
*altlink
, struct attr_val
*val
)
759 /* Avoid warnings about val.u.FIELD may be used uninitialized if
760 this function is inlined. The warnings aren't valid but can
761 occur because the different fields are set and used
763 memset (val
, 0, sizeof *val
);
768 val
->encoding
= ATTR_VAL_ADDRESS
;
769 val
->u
.uint
= read_address (buf
, addrsize
);
772 val
->encoding
= ATTR_VAL_BLOCK
;
773 return advance (buf
, read_uint16 (buf
));
775 val
->encoding
= ATTR_VAL_BLOCK
;
776 return advance (buf
, read_uint32 (buf
));
778 val
->encoding
= ATTR_VAL_UINT
;
779 val
->u
.uint
= read_uint16 (buf
);
782 val
->encoding
= ATTR_VAL_UINT
;
783 val
->u
.uint
= read_uint32 (buf
);
786 val
->encoding
= ATTR_VAL_UINT
;
787 val
->u
.uint
= read_uint64 (buf
);
790 val
->encoding
= ATTR_VAL_BLOCK
;
791 return advance (buf
, 16);
793 val
->encoding
= ATTR_VAL_STRING
;
794 val
->u
.string
= read_string (buf
);
795 return val
->u
.string
== NULL
? 0 : 1;
797 val
->encoding
= ATTR_VAL_BLOCK
;
798 return advance (buf
, read_uleb128 (buf
));
800 val
->encoding
= ATTR_VAL_BLOCK
;
801 return advance (buf
, read_byte (buf
));
803 val
->encoding
= ATTR_VAL_UINT
;
804 val
->u
.uint
= read_byte (buf
);
807 val
->encoding
= ATTR_VAL_UINT
;
808 val
->u
.uint
= read_byte (buf
);
811 val
->encoding
= ATTR_VAL_SINT
;
812 val
->u
.sint
= read_sleb128 (buf
);
818 offset
= read_offset (buf
, is_dwarf64
);
819 if (offset
>= dwarf_sections
->size
[DEBUG_STR
])
821 dwarf_buf_error (buf
, "DW_FORM_strp out of range", 0);
824 val
->encoding
= ATTR_VAL_STRING
;
826 (const char *) dwarf_sections
->data
[DEBUG_STR
] + offset
;
829 case DW_FORM_line_strp
:
833 offset
= read_offset (buf
, is_dwarf64
);
834 if (offset
>= dwarf_sections
->size
[DEBUG_LINE_STR
])
836 dwarf_buf_error (buf
, "DW_FORM_line_strp out of range", 0);
839 val
->encoding
= ATTR_VAL_STRING
;
841 (const char *) dwarf_sections
->data
[DEBUG_LINE_STR
] + offset
;
845 val
->encoding
= ATTR_VAL_UINT
;
846 val
->u
.uint
= read_uleb128 (buf
);
848 case DW_FORM_ref_addr
:
849 val
->encoding
= ATTR_VAL_REF_INFO
;
851 val
->u
.uint
= read_address (buf
, addrsize
);
853 val
->u
.uint
= read_offset (buf
, is_dwarf64
);
856 val
->encoding
= ATTR_VAL_REF_UNIT
;
857 val
->u
.uint
= read_byte (buf
);
860 val
->encoding
= ATTR_VAL_REF_UNIT
;
861 val
->u
.uint
= read_uint16 (buf
);
864 val
->encoding
= ATTR_VAL_REF_UNIT
;
865 val
->u
.uint
= read_uint32 (buf
);
868 val
->encoding
= ATTR_VAL_REF_UNIT
;
869 val
->u
.uint
= read_uint64 (buf
);
871 case DW_FORM_ref_udata
:
872 val
->encoding
= ATTR_VAL_REF_UNIT
;
873 val
->u
.uint
= read_uleb128 (buf
);
875 case DW_FORM_indirect
:
879 form
= read_uleb128 (buf
);
880 if (form
== DW_FORM_implicit_const
)
882 dwarf_buf_error (buf
,
883 "DW_FORM_indirect to DW_FORM_implicit_const",
887 return read_attribute ((enum dwarf_form
) form
, 0, buf
, is_dwarf64
,
888 version
, addrsize
, dwarf_sections
, altlink
,
891 case DW_FORM_sec_offset
:
892 val
->encoding
= ATTR_VAL_REF_SECTION
;
893 val
->u
.uint
= read_offset (buf
, is_dwarf64
);
895 case DW_FORM_exprloc
:
896 val
->encoding
= ATTR_VAL_EXPR
;
897 return advance (buf
, read_uleb128 (buf
));
898 case DW_FORM_flag_present
:
899 val
->encoding
= ATTR_VAL_UINT
;
902 case DW_FORM_ref_sig8
:
903 val
->encoding
= ATTR_VAL_REF_TYPE
;
904 val
->u
.uint
= read_uint64 (buf
);
906 case DW_FORM_strx
: case DW_FORM_strx1
: case DW_FORM_strx2
:
907 case DW_FORM_strx3
: case DW_FORM_strx4
:
914 offset
= read_uleb128 (buf
);
917 offset
= read_byte (buf
);
920 offset
= read_uint16 (buf
);
923 offset
= read_uint24 (buf
);
926 offset
= read_uint32 (buf
);
929 /* This case can't happen. */
932 val
->encoding
= ATTR_VAL_STRING_INDEX
;
933 val
->u
.uint
= offset
;
936 case DW_FORM_addrx
: case DW_FORM_addrx1
: case DW_FORM_addrx2
:
937 case DW_FORM_addrx3
: case DW_FORM_addrx4
:
944 offset
= read_uleb128 (buf
);
947 offset
= read_byte (buf
);
950 offset
= read_uint16 (buf
);
953 offset
= read_uint24 (buf
);
956 offset
= read_uint32 (buf
);
959 /* This case can't happen. */
962 val
->encoding
= ATTR_VAL_ADDRESS_INDEX
;
963 val
->u
.uint
= offset
;
966 case DW_FORM_ref_sup4
:
967 val
->encoding
= ATTR_VAL_REF_SECTION
;
968 val
->u
.uint
= read_uint32 (buf
);
970 case DW_FORM_ref_sup8
:
971 val
->encoding
= ATTR_VAL_REF_SECTION
;
972 val
->u
.uint
= read_uint64 (buf
);
974 case DW_FORM_implicit_const
:
975 val
->encoding
= ATTR_VAL_UINT
;
976 val
->u
.uint
= implicit_val
;
978 case DW_FORM_loclistx
:
979 /* We don't distinguish this from DW_FORM_sec_offset. It
980 * shouldn't matter since we don't care about loclists. */
981 val
->encoding
= ATTR_VAL_REF_SECTION
;
982 val
->u
.uint
= read_uleb128 (buf
);
984 case DW_FORM_rnglistx
:
985 val
->encoding
= ATTR_VAL_RNGLISTS_INDEX
;
986 val
->u
.uint
= read_uleb128 (buf
);
988 case DW_FORM_GNU_addr_index
:
989 val
->encoding
= ATTR_VAL_REF_SECTION
;
990 val
->u
.uint
= read_uleb128 (buf
);
992 case DW_FORM_GNU_str_index
:
993 val
->encoding
= ATTR_VAL_REF_SECTION
;
994 val
->u
.uint
= read_uleb128 (buf
);
996 case DW_FORM_GNU_ref_alt
:
997 val
->u
.uint
= read_offset (buf
, is_dwarf64
);
1000 val
->encoding
= ATTR_VAL_NONE
;
1003 val
->encoding
= ATTR_VAL_REF_ALT_INFO
;
1005 case DW_FORM_strp_sup
: case DW_FORM_GNU_strp_alt
:
1009 offset
= read_offset (buf
, is_dwarf64
);
1010 if (altlink
== NULL
)
1012 val
->encoding
= ATTR_VAL_NONE
;
1015 if (offset
>= altlink
->dwarf_sections
.size
[DEBUG_STR
])
1017 dwarf_buf_error (buf
, "DW_FORM_strp_sup out of range", 0);
1020 val
->encoding
= ATTR_VAL_STRING
;
1022 (const char *) altlink
->dwarf_sections
.data
[DEBUG_STR
] + offset
;
1026 dwarf_buf_error (buf
, "unrecognized DWARF form", -1);
1031 /* If we can determine the value of a string attribute, set *STRING to
1032 point to the string. Return 1 on success, 0 on error. If we don't
1033 know the value, we consider that a success, and we don't change
1034 *STRING. An error is only reported for some sort of out of range
1038 resolve_string (const struct dwarf_sections
*dwarf_sections
, int is_dwarf64
,
1039 int is_bigendian
, uint64_t str_offsets_base
,
1040 const struct attr_val
*val
,
1041 backtrace_error_callback error_callback
, void *data
,
1042 const char **string
)
1044 switch (val
->encoding
)
1046 case ATTR_VAL_STRING
:
1047 *string
= val
->u
.string
;
1050 case ATTR_VAL_STRING_INDEX
:
1053 struct dwarf_buf offset_buf
;
1055 offset
= val
->u
.uint
* (is_dwarf64
? 8 : 4) + str_offsets_base
;
1056 if (offset
+ (is_dwarf64
? 8 : 4)
1057 > dwarf_sections
->size
[DEBUG_STR_OFFSETS
])
1059 error_callback (data
, "DW_FORM_strx value out of range", 0);
1063 offset_buf
.name
= ".debug_str_offsets";
1064 offset_buf
.start
= dwarf_sections
->data
[DEBUG_STR_OFFSETS
];
1065 offset_buf
.buf
= dwarf_sections
->data
[DEBUG_STR_OFFSETS
] + offset
;
1066 offset_buf
.left
= dwarf_sections
->size
[DEBUG_STR_OFFSETS
] - offset
;
1067 offset_buf
.is_bigendian
= is_bigendian
;
1068 offset_buf
.error_callback
= error_callback
;
1069 offset_buf
.data
= data
;
1070 offset_buf
.reported_underflow
= 0;
1072 offset
= read_offset (&offset_buf
, is_dwarf64
);
1073 if (offset
>= dwarf_sections
->size
[DEBUG_STR
])
1075 dwarf_buf_error (&offset_buf
,
1076 "DW_FORM_strx offset out of range",
1080 *string
= (const char *) dwarf_sections
->data
[DEBUG_STR
] + offset
;
1089 /* Set *ADDRESS to the real address for a ATTR_VAL_ADDRESS_INDEX.
1090 Return 1 on success, 0 on error. */
1093 resolve_addr_index (const struct dwarf_sections
*dwarf_sections
,
1094 uint64_t addr_base
, int addrsize
, int is_bigendian
,
1095 uint64_t addr_index
,
1096 backtrace_error_callback error_callback
, void *data
,
1100 struct dwarf_buf addr_buf
;
1102 offset
= addr_index
* addrsize
+ addr_base
;
1103 if (offset
+ addrsize
> dwarf_sections
->size
[DEBUG_ADDR
])
1105 error_callback (data
, "DW_FORM_addrx value out of range", 0);
1109 addr_buf
.name
= ".debug_addr";
1110 addr_buf
.start
= dwarf_sections
->data
[DEBUG_ADDR
];
1111 addr_buf
.buf
= dwarf_sections
->data
[DEBUG_ADDR
] + offset
;
1112 addr_buf
.left
= dwarf_sections
->size
[DEBUG_ADDR
] - offset
;
1113 addr_buf
.is_bigendian
= is_bigendian
;
1114 addr_buf
.error_callback
= error_callback
;
1115 addr_buf
.data
= data
;
1116 addr_buf
.reported_underflow
= 0;
1118 *address
= read_address (&addr_buf
, addrsize
);
1122 /* Compare a unit offset against a unit for bsearch. */
1125 units_search (const void *vkey
, const void *ventry
)
1127 const size_t *key
= (const size_t *) vkey
;
1128 const struct unit
*entry
= *((const struct unit
*const *) ventry
);
1132 if (offset
< entry
->low_offset
)
1134 else if (offset
>= entry
->high_offset
)
1140 /* Find a unit in PU containing OFFSET. */
1142 static struct unit
*
1143 find_unit (struct unit
**pu
, size_t units_count
, size_t offset
)
1146 u
= bsearch (&offset
, pu
, units_count
, sizeof (struct unit
*), units_search
);
1147 return u
== NULL
? NULL
: *u
;
1150 /* Compare function_addrs for qsort. When ranges are nested, make the
1151 smallest one sort last. */
1154 function_addrs_compare (const void *v1
, const void *v2
)
1156 const struct function_addrs
*a1
= (const struct function_addrs
*) v1
;
1157 const struct function_addrs
*a2
= (const struct function_addrs
*) v2
;
1159 if (a1
->low
< a2
->low
)
1161 if (a1
->low
> a2
->low
)
1163 if (a1
->high
< a2
->high
)
1165 if (a1
->high
> a2
->high
)
1167 return strcmp (a1
->function
->name
, a2
->function
->name
);
1170 /* Compare a PC against a function_addrs for bsearch. We always
1171 allocate an entra entry at the end of the vector, so that this
1172 routine can safely look at the next entry. Note that if there are
1173 multiple ranges containing PC, which one will be returned is
1174 unpredictable. We compensate for that in dwarf_fileline. */
1177 function_addrs_search (const void *vkey
, const void *ventry
)
1179 const uintptr_t *key
= (const uintptr_t *) vkey
;
1180 const struct function_addrs
*entry
= (const struct function_addrs
*) ventry
;
1184 if (pc
< entry
->low
)
1186 else if (pc
> (entry
+ 1)->low
)
1192 /* Add a new compilation unit address range to a vector. This is
1193 called via add_ranges. Returns 1 on success, 0 on failure. */
1196 add_unit_addr (struct backtrace_state
*state
, void *rdata
,
1197 uint64_t lowpc
, uint64_t highpc
,
1198 backtrace_error_callback error_callback
, void *data
,
1201 struct unit
*u
= (struct unit
*) rdata
;
1202 struct unit_addrs_vector
*vec
= (struct unit_addrs_vector
*) pvec
;
1203 struct unit_addrs
*p
;
1205 /* Try to merge with the last entry. */
1208 p
= (struct unit_addrs
*) vec
->vec
.base
+ (vec
->count
- 1);
1209 if ((lowpc
== p
->high
|| lowpc
== p
->high
+ 1)
1212 if (highpc
> p
->high
)
1218 p
= ((struct unit_addrs
*)
1219 backtrace_vector_grow (state
, sizeof (struct unit_addrs
),
1220 error_callback
, data
, &vec
->vec
));
1233 /* Compare unit_addrs for qsort. When ranges are nested, make the
1234 smallest one sort last. */
1237 unit_addrs_compare (const void *v1
, const void *v2
)
1239 const struct unit_addrs
*a1
= (const struct unit_addrs
*) v1
;
1240 const struct unit_addrs
*a2
= (const struct unit_addrs
*) v2
;
1242 if (a1
->low
< a2
->low
)
1244 if (a1
->low
> a2
->low
)
1246 if (a1
->high
< a2
->high
)
1248 if (a1
->high
> a2
->high
)
1250 if (a1
->u
->lineoff
< a2
->u
->lineoff
)
1252 if (a1
->u
->lineoff
> a2
->u
->lineoff
)
1257 /* Compare a PC against a unit_addrs for bsearch. We always allocate
1258 an entry entry at the end of the vector, so that this routine can
1259 safely look at the next entry. Note that if there are multiple
1260 ranges containing PC, which one will be returned is unpredictable.
1261 We compensate for that in dwarf_fileline. */
1264 unit_addrs_search (const void *vkey
, const void *ventry
)
1266 const uintptr_t *key
= (const uintptr_t *) vkey
;
1267 const struct unit_addrs
*entry
= (const struct unit_addrs
*) ventry
;
1271 if (pc
< entry
->low
)
1273 else if (pc
> (entry
+ 1)->low
)
1279 /* Sort the line vector by PC. We want a stable sort here to maintain
1280 the order of lines for the same PC values. Since the sequence is
1281 being sorted in place, their addresses cannot be relied on to
1282 maintain stability. That is the purpose of the index member. */
1285 line_compare (const void *v1
, const void *v2
)
1287 const struct line
*ln1
= (const struct line
*) v1
;
1288 const struct line
*ln2
= (const struct line
*) v2
;
1290 if (ln1
->pc
< ln2
->pc
)
1292 else if (ln1
->pc
> ln2
->pc
)
1294 else if (ln1
->idx
< ln2
->idx
)
1296 else if (ln1
->idx
> ln2
->idx
)
1302 /* Find a PC in a line vector. We always allocate an extra entry at
1303 the end of the lines vector, so that this routine can safely look
1304 at the next entry. Note that when there are multiple mappings for
1305 the same PC value, this will return the last one. */
1308 line_search (const void *vkey
, const void *ventry
)
1310 const uintptr_t *key
= (const uintptr_t *) vkey
;
1311 const struct line
*entry
= (const struct line
*) ventry
;
1317 else if (pc
>= (entry
+ 1)->pc
)
1323 /* Sort the abbrevs by the abbrev code. This function is passed to
1324 both qsort and bsearch. */
1327 abbrev_compare (const void *v1
, const void *v2
)
1329 const struct abbrev
*a1
= (const struct abbrev
*) v1
;
1330 const struct abbrev
*a2
= (const struct abbrev
*) v2
;
1332 if (a1
->code
< a2
->code
)
1334 else if (a1
->code
> a2
->code
)
1338 /* This really shouldn't happen. It means there are two
1339 different abbrevs with the same code, and that means we don't
1340 know which one lookup_abbrev should return. */
1345 /* Read the abbreviation table for a compilation unit. Returns 1 on
1346 success, 0 on failure. */
1349 read_abbrevs (struct backtrace_state
*state
, uint64_t abbrev_offset
,
1350 const unsigned char *dwarf_abbrev
, size_t dwarf_abbrev_size
,
1351 int is_bigendian
, backtrace_error_callback error_callback
,
1352 void *data
, struct abbrevs
*abbrevs
)
1354 struct dwarf_buf abbrev_buf
;
1355 struct dwarf_buf count_buf
;
1358 abbrevs
->num_abbrevs
= 0;
1359 abbrevs
->abbrevs
= NULL
;
1361 if (abbrev_offset
>= dwarf_abbrev_size
)
1363 error_callback (data
, "abbrev offset out of range", 0);
1367 abbrev_buf
.name
= ".debug_abbrev";
1368 abbrev_buf
.start
= dwarf_abbrev
;
1369 abbrev_buf
.buf
= dwarf_abbrev
+ abbrev_offset
;
1370 abbrev_buf
.left
= dwarf_abbrev_size
- abbrev_offset
;
1371 abbrev_buf
.is_bigendian
= is_bigendian
;
1372 abbrev_buf
.error_callback
= error_callback
;
1373 abbrev_buf
.data
= data
;
1374 abbrev_buf
.reported_underflow
= 0;
1376 /* Count the number of abbrevs in this list. */
1378 count_buf
= abbrev_buf
;
1380 while (read_uleb128 (&count_buf
) != 0)
1382 if (count_buf
.reported_underflow
)
1386 read_uleb128 (&count_buf
);
1387 // Skip has_children.
1388 read_byte (&count_buf
);
1390 while (read_uleb128 (&count_buf
) != 0)
1394 form
= read_uleb128 (&count_buf
);
1395 if ((enum dwarf_form
) form
== DW_FORM_implicit_const
)
1396 read_sleb128 (&count_buf
);
1398 // Skip form of last attribute.
1399 read_uleb128 (&count_buf
);
1402 if (count_buf
.reported_underflow
)
1405 if (num_abbrevs
== 0)
1408 abbrevs
->abbrevs
= ((struct abbrev
*)
1409 backtrace_alloc (state
,
1410 num_abbrevs
* sizeof (struct abbrev
),
1411 error_callback
, data
));
1412 if (abbrevs
->abbrevs
== NULL
)
1414 abbrevs
->num_abbrevs
= num_abbrevs
;
1415 memset (abbrevs
->abbrevs
, 0, num_abbrevs
* sizeof (struct abbrev
));
1425 if (abbrev_buf
.reported_underflow
)
1428 code
= read_uleb128 (&abbrev_buf
);
1433 a
.tag
= (enum dwarf_tag
) read_uleb128 (&abbrev_buf
);
1434 a
.has_children
= read_byte (&abbrev_buf
);
1436 count_buf
= abbrev_buf
;
1438 while (read_uleb128 (&count_buf
) != 0)
1443 form
= read_uleb128 (&count_buf
);
1444 if ((enum dwarf_form
) form
== DW_FORM_implicit_const
)
1445 read_sleb128 (&count_buf
);
1451 read_uleb128 (&abbrev_buf
);
1452 read_uleb128 (&abbrev_buf
);
1456 attrs
= ((struct attr
*)
1457 backtrace_alloc (state
, num_attrs
* sizeof *attrs
,
1458 error_callback
, data
));
1467 name
= read_uleb128 (&abbrev_buf
);
1468 form
= read_uleb128 (&abbrev_buf
);
1471 attrs
[num_attrs
].name
= (enum dwarf_attribute
) name
;
1472 attrs
[num_attrs
].form
= (enum dwarf_form
) form
;
1473 if ((enum dwarf_form
) form
== DW_FORM_implicit_const
)
1474 attrs
[num_attrs
].val
= read_sleb128 (&abbrev_buf
);
1476 attrs
[num_attrs
].val
= 0;
1481 a
.num_attrs
= num_attrs
;
1484 abbrevs
->abbrevs
[num_abbrevs
] = a
;
1488 backtrace_qsort (abbrevs
->abbrevs
, abbrevs
->num_abbrevs
,
1489 sizeof (struct abbrev
), abbrev_compare
);
1494 free_abbrevs (state
, abbrevs
, error_callback
, data
);
1498 /* Return the abbrev information for an abbrev code. */
1500 static const struct abbrev
*
1501 lookup_abbrev (struct abbrevs
*abbrevs
, uint64_t code
,
1502 backtrace_error_callback error_callback
, void *data
)
1507 /* With GCC, where abbrevs are simply numbered in order, we should
1508 be able to just look up the entry. */
1509 if (code
- 1 < abbrevs
->num_abbrevs
1510 && abbrevs
->abbrevs
[code
- 1].code
== code
)
1511 return &abbrevs
->abbrevs
[code
- 1];
1513 /* Otherwise we have to search. */
1514 memset (&key
, 0, sizeof key
);
1516 p
= bsearch (&key
, abbrevs
->abbrevs
, abbrevs
->num_abbrevs
,
1517 sizeof (struct abbrev
), abbrev_compare
);
1520 error_callback (data
, "invalid abbreviation code", 0);
1523 return (const struct abbrev
*) p
;
1526 /* This struct is used to gather address range information while
1527 reading attributes. We use this while building a mapping from
1528 address ranges to compilation units and then again while mapping
1529 from address ranges to function entries. Normally either
1530 lowpc/highpc is set or ranges is set. */
1533 uint64_t lowpc
; /* The low PC value. */
1534 int have_lowpc
; /* Whether a low PC value was found. */
1535 int lowpc_is_addr_index
; /* Whether lowpc is in .debug_addr. */
1536 uint64_t highpc
; /* The high PC value. */
1537 int have_highpc
; /* Whether a high PC value was found. */
1538 int highpc_is_relative
; /* Whether highpc is relative to lowpc. */
1539 int highpc_is_addr_index
; /* Whether highpc is in .debug_addr. */
1540 uint64_t ranges
; /* Offset in ranges section. */
1541 int have_ranges
; /* Whether ranges is valid. */
1542 int ranges_is_index
; /* Whether ranges is DW_FORM_rnglistx. */
1545 /* Update PCRANGE from an attribute value. */
1548 update_pcrange (const struct attr
* attr
, const struct attr_val
* val
,
1549 struct pcrange
*pcrange
)
1554 if (val
->encoding
== ATTR_VAL_ADDRESS
)
1556 pcrange
->lowpc
= val
->u
.uint
;
1557 pcrange
->have_lowpc
= 1;
1559 else if (val
->encoding
== ATTR_VAL_ADDRESS_INDEX
)
1561 pcrange
->lowpc
= val
->u
.uint
;
1562 pcrange
->have_lowpc
= 1;
1563 pcrange
->lowpc_is_addr_index
= 1;
1568 if (val
->encoding
== ATTR_VAL_ADDRESS
)
1570 pcrange
->highpc
= val
->u
.uint
;
1571 pcrange
->have_highpc
= 1;
1573 else if (val
->encoding
== ATTR_VAL_UINT
)
1575 pcrange
->highpc
= val
->u
.uint
;
1576 pcrange
->have_highpc
= 1;
1577 pcrange
->highpc_is_relative
= 1;
1579 else if (val
->encoding
== ATTR_VAL_ADDRESS_INDEX
)
1581 pcrange
->highpc
= val
->u
.uint
;
1582 pcrange
->have_highpc
= 1;
1583 pcrange
->highpc_is_addr_index
= 1;
1588 if (val
->encoding
== ATTR_VAL_UINT
1589 || val
->encoding
== ATTR_VAL_REF_SECTION
)
1591 pcrange
->ranges
= val
->u
.uint
;
1592 pcrange
->have_ranges
= 1;
1594 else if (val
->encoding
== ATTR_VAL_RNGLISTS_INDEX
)
1596 pcrange
->ranges
= val
->u
.uint
;
1597 pcrange
->have_ranges
= 1;
1598 pcrange
->ranges_is_index
= 1;
1607 /* Call ADD_RANGE for a low/high PC pair. Returns 1 on success, 0 on
1611 add_low_high_range (struct backtrace_state
*state
,
1612 const struct dwarf_sections
*dwarf_sections
,
1613 uintptr_t base_address
, int is_bigendian
,
1614 struct unit
*u
, const struct pcrange
*pcrange
,
1615 int (*add_range
) (struct backtrace_state
*state
,
1616 void *rdata
, uint64_t lowpc
,
1618 backtrace_error_callback error_callback
,
1619 void *data
, void *vec
),
1621 backtrace_error_callback error_callback
, void *data
,
1627 lowpc
= pcrange
->lowpc
;
1628 if (pcrange
->lowpc_is_addr_index
)
1630 if (!resolve_addr_index (dwarf_sections
, u
->addr_base
, u
->addrsize
,
1631 is_bigendian
, lowpc
, error_callback
, data
,
1636 highpc
= pcrange
->highpc
;
1637 if (pcrange
->highpc_is_addr_index
)
1639 if (!resolve_addr_index (dwarf_sections
, u
->addr_base
, u
->addrsize
,
1640 is_bigendian
, highpc
, error_callback
, data
,
1644 if (pcrange
->highpc_is_relative
)
1647 /* Add in the base address of the module when recording PC values,
1648 so that we can look up the PC directly. */
1649 lowpc
+= base_address
;
1650 highpc
+= base_address
;
1652 return add_range (state
, rdata
, lowpc
, highpc
, error_callback
, data
, vec
);
1655 /* Call ADD_RANGE for each range read from .debug_ranges, as used in
1656 DWARF versions 2 through 4. */
1659 add_ranges_from_ranges (
1660 struct backtrace_state
*state
,
1661 const struct dwarf_sections
*dwarf_sections
,
1662 uintptr_t base_address
, int is_bigendian
,
1663 struct unit
*u
, uint64_t base
,
1664 const struct pcrange
*pcrange
,
1665 int (*add_range
) (struct backtrace_state
*state
, void *rdata
,
1666 uint64_t lowpc
, uint64_t highpc
,
1667 backtrace_error_callback error_callback
, void *data
,
1670 backtrace_error_callback error_callback
, void *data
,
1673 struct dwarf_buf ranges_buf
;
1675 if (pcrange
->ranges
>= dwarf_sections
->size
[DEBUG_RANGES
])
1677 error_callback (data
, "ranges offset out of range", 0);
1681 ranges_buf
.name
= ".debug_ranges";
1682 ranges_buf
.start
= dwarf_sections
->data
[DEBUG_RANGES
];
1683 ranges_buf
.buf
= dwarf_sections
->data
[DEBUG_RANGES
] + pcrange
->ranges
;
1684 ranges_buf
.left
= dwarf_sections
->size
[DEBUG_RANGES
] - pcrange
->ranges
;
1685 ranges_buf
.is_bigendian
= is_bigendian
;
1686 ranges_buf
.error_callback
= error_callback
;
1687 ranges_buf
.data
= data
;
1688 ranges_buf
.reported_underflow
= 0;
1695 if (ranges_buf
.reported_underflow
)
1698 low
= read_address (&ranges_buf
, u
->addrsize
);
1699 high
= read_address (&ranges_buf
, u
->addrsize
);
1701 if (low
== 0 && high
== 0)
1704 if (is_highest_address (low
, u
->addrsize
))
1708 if (!add_range (state
, rdata
,
1709 low
+ base
+ base_address
,
1710 high
+ base
+ base_address
,
1711 error_callback
, data
, vec
))
1716 if (ranges_buf
.reported_underflow
)
1722 /* Call ADD_RANGE for each range read from .debug_rnglists, as used in
1726 add_ranges_from_rnglists (
1727 struct backtrace_state
*state
,
1728 const struct dwarf_sections
*dwarf_sections
,
1729 uintptr_t base_address
, int is_bigendian
,
1730 struct unit
*u
, uint64_t base
,
1731 const struct pcrange
*pcrange
,
1732 int (*add_range
) (struct backtrace_state
*state
, void *rdata
,
1733 uint64_t lowpc
, uint64_t highpc
,
1734 backtrace_error_callback error_callback
, void *data
,
1737 backtrace_error_callback error_callback
, void *data
,
1741 struct dwarf_buf rnglists_buf
;
1743 if (!pcrange
->ranges_is_index
)
1744 offset
= pcrange
->ranges
;
1746 offset
= u
->rnglists_base
+ pcrange
->ranges
* (u
->is_dwarf64
? 8 : 4);
1747 if (offset
>= dwarf_sections
->size
[DEBUG_RNGLISTS
])
1749 error_callback (data
, "rnglists offset out of range", 0);
1753 rnglists_buf
.name
= ".debug_rnglists";
1754 rnglists_buf
.start
= dwarf_sections
->data
[DEBUG_RNGLISTS
];
1755 rnglists_buf
.buf
= dwarf_sections
->data
[DEBUG_RNGLISTS
] + offset
;
1756 rnglists_buf
.left
= dwarf_sections
->size
[DEBUG_RNGLISTS
] - offset
;
1757 rnglists_buf
.is_bigendian
= is_bigendian
;
1758 rnglists_buf
.error_callback
= error_callback
;
1759 rnglists_buf
.data
= data
;
1760 rnglists_buf
.reported_underflow
= 0;
1762 if (pcrange
->ranges_is_index
)
1764 offset
= read_offset (&rnglists_buf
, u
->is_dwarf64
);
1765 offset
+= u
->rnglists_base
;
1766 if (offset
>= dwarf_sections
->size
[DEBUG_RNGLISTS
])
1768 error_callback (data
, "rnglists index offset out of range", 0);
1771 rnglists_buf
.buf
= dwarf_sections
->data
[DEBUG_RNGLISTS
] + offset
;
1772 rnglists_buf
.left
= dwarf_sections
->size
[DEBUG_RNGLISTS
] - offset
;
1779 rle
= read_byte (&rnglists_buf
);
1780 if (rle
== DW_RLE_end_of_list
)
1784 case DW_RLE_base_addressx
:
1788 index
= read_uleb128 (&rnglists_buf
);
1789 if (!resolve_addr_index (dwarf_sections
, u
->addr_base
,
1790 u
->addrsize
, is_bigendian
, index
,
1791 error_callback
, data
, &base
))
1796 case DW_RLE_startx_endx
:
1802 index
= read_uleb128 (&rnglists_buf
);
1803 if (!resolve_addr_index (dwarf_sections
, u
->addr_base
,
1804 u
->addrsize
, is_bigendian
, index
,
1805 error_callback
, data
, &low
))
1807 index
= read_uleb128 (&rnglists_buf
);
1808 if (!resolve_addr_index (dwarf_sections
, u
->addr_base
,
1809 u
->addrsize
, is_bigendian
, index
,
1810 error_callback
, data
, &high
))
1812 if (!add_range (state
, rdata
, low
+ base_address
,
1813 high
+ base_address
, error_callback
, data
,
1819 case DW_RLE_startx_length
:
1825 index
= read_uleb128 (&rnglists_buf
);
1826 if (!resolve_addr_index (dwarf_sections
, u
->addr_base
,
1827 u
->addrsize
, is_bigendian
, index
,
1828 error_callback
, data
, &low
))
1830 length
= read_uleb128 (&rnglists_buf
);
1831 low
+= base_address
;
1832 if (!add_range (state
, rdata
, low
, low
+ length
,
1833 error_callback
, data
, vec
))
1838 case DW_RLE_offset_pair
:
1843 low
= read_uleb128 (&rnglists_buf
);
1844 high
= read_uleb128 (&rnglists_buf
);
1845 if (!add_range (state
, rdata
, low
+ base
+ base_address
,
1846 high
+ base
+ base_address
,
1847 error_callback
, data
, vec
))
1852 case DW_RLE_base_address
:
1853 base
= read_address (&rnglists_buf
, u
->addrsize
);
1856 case DW_RLE_start_end
:
1861 low
= read_address (&rnglists_buf
, u
->addrsize
);
1862 high
= read_address (&rnglists_buf
, u
->addrsize
);
1863 if (!add_range (state
, rdata
, low
+ base_address
,
1864 high
+ base_address
, error_callback
, data
,
1870 case DW_RLE_start_length
:
1875 low
= read_address (&rnglists_buf
, u
->addrsize
);
1876 length
= read_uleb128 (&rnglists_buf
);
1877 low
+= base_address
;
1878 if (!add_range (state
, rdata
, low
, low
+ length
,
1879 error_callback
, data
, vec
))
1885 dwarf_buf_error (&rnglists_buf
, "unrecognized DW_RLE value", -1);
1890 if (rnglists_buf
.reported_underflow
)
1896 /* Call ADD_RANGE for each lowpc/highpc pair in PCRANGE. RDATA is
1897 passed to ADD_RANGE, and is either a struct unit * or a struct
1898 function *. VEC is the vector we are adding ranges to, and is
1899 either a struct unit_addrs_vector * or a struct function_vector *.
1900 Returns 1 on success, 0 on error. */
1903 add_ranges (struct backtrace_state
*state
,
1904 const struct dwarf_sections
*dwarf_sections
,
1905 uintptr_t base_address
, int is_bigendian
,
1906 struct unit
*u
, uint64_t base
, const struct pcrange
*pcrange
,
1907 int (*add_range
) (struct backtrace_state
*state
, void *rdata
,
1908 uint64_t lowpc
, uint64_t highpc
,
1909 backtrace_error_callback error_callback
,
1910 void *data
, void *vec
),
1912 backtrace_error_callback error_callback
, void *data
,
1915 if (pcrange
->have_lowpc
&& pcrange
->have_highpc
)
1916 return add_low_high_range (state
, dwarf_sections
, base_address
,
1917 is_bigendian
, u
, pcrange
, add_range
, rdata
,
1918 error_callback
, data
, vec
);
1920 if (!pcrange
->have_ranges
)
1922 /* Did not find any address ranges to add. */
1927 return add_ranges_from_ranges (state
, dwarf_sections
, base_address
,
1928 is_bigendian
, u
, base
, pcrange
, add_range
,
1929 rdata
, error_callback
, data
, vec
);
1931 return add_ranges_from_rnglists (state
, dwarf_sections
, base_address
,
1932 is_bigendian
, u
, base
, pcrange
, add_range
,
1933 rdata
, error_callback
, data
, vec
);
1936 /* Find the address range covered by a compilation unit, reading from
1937 UNIT_BUF and adding values to U. Returns 1 if all data could be
1938 read, 0 if there is some error. */
1941 find_address_ranges (struct backtrace_state
*state
, uintptr_t base_address
,
1942 struct dwarf_buf
*unit_buf
,
1943 const struct dwarf_sections
*dwarf_sections
,
1944 int is_bigendian
, struct dwarf_data
*altlink
,
1945 backtrace_error_callback error_callback
, void *data
,
1946 struct unit
*u
, struct unit_addrs_vector
*addrs
,
1947 enum dwarf_tag
*unit_tag
)
1949 while (unit_buf
->left
> 0)
1952 const struct abbrev
*abbrev
;
1953 struct pcrange pcrange
;
1954 struct attr_val name_val
;
1956 struct attr_val comp_dir_val
;
1957 int have_comp_dir_val
;
1960 code
= read_uleb128 (unit_buf
);
1964 abbrev
= lookup_abbrev (&u
->abbrevs
, code
, error_callback
, data
);
1968 if (unit_tag
!= NULL
)
1969 *unit_tag
= abbrev
->tag
;
1971 memset (&pcrange
, 0, sizeof pcrange
);
1972 memset (&name_val
, 0, sizeof name_val
);
1974 memset (&comp_dir_val
, 0, sizeof comp_dir_val
);
1975 have_comp_dir_val
= 0;
1976 for (i
= 0; i
< abbrev
->num_attrs
; ++i
)
1978 struct attr_val val
;
1980 if (!read_attribute (abbrev
->attrs
[i
].form
, abbrev
->attrs
[i
].val
,
1981 unit_buf
, u
->is_dwarf64
, u
->version
,
1982 u
->addrsize
, dwarf_sections
, altlink
, &val
))
1985 switch (abbrev
->attrs
[i
].name
)
1987 case DW_AT_low_pc
: case DW_AT_high_pc
: case DW_AT_ranges
:
1988 update_pcrange (&abbrev
->attrs
[i
], &val
, &pcrange
);
1991 case DW_AT_stmt_list
:
1992 if (abbrev
->tag
== DW_TAG_compile_unit
1993 && (val
.encoding
== ATTR_VAL_UINT
1994 || val
.encoding
== ATTR_VAL_REF_SECTION
))
1995 u
->lineoff
= val
.u
.uint
;
1999 if (abbrev
->tag
== DW_TAG_compile_unit
)
2006 case DW_AT_comp_dir
:
2007 if (abbrev
->tag
== DW_TAG_compile_unit
)
2010 have_comp_dir_val
= 1;
2014 case DW_AT_str_offsets_base
:
2015 if (abbrev
->tag
== DW_TAG_compile_unit
2016 && val
.encoding
== ATTR_VAL_REF_SECTION
)
2017 u
->str_offsets_base
= val
.u
.uint
;
2020 case DW_AT_addr_base
:
2021 if (abbrev
->tag
== DW_TAG_compile_unit
2022 && val
.encoding
== ATTR_VAL_REF_SECTION
)
2023 u
->addr_base
= val
.u
.uint
;
2026 case DW_AT_rnglists_base
:
2027 if (abbrev
->tag
== DW_TAG_compile_unit
2028 && val
.encoding
== ATTR_VAL_REF_SECTION
)
2029 u
->rnglists_base
= val
.u
.uint
;
2037 // Resolve strings after we're sure that we have seen
2038 // DW_AT_str_offsets_base.
2041 if (!resolve_string (dwarf_sections
, u
->is_dwarf64
, is_bigendian
,
2042 u
->str_offsets_base
, &name_val
,
2043 error_callback
, data
, &u
->filename
))
2046 if (have_comp_dir_val
)
2048 if (!resolve_string (dwarf_sections
, u
->is_dwarf64
, is_bigendian
,
2049 u
->str_offsets_base
, &comp_dir_val
,
2050 error_callback
, data
, &u
->comp_dir
))
2054 if (abbrev
->tag
== DW_TAG_compile_unit
2055 || abbrev
->tag
== DW_TAG_subprogram
)
2057 if (!add_ranges (state
, dwarf_sections
, base_address
,
2058 is_bigendian
, u
, pcrange
.lowpc
, &pcrange
,
2059 add_unit_addr
, (void *) u
, error_callback
, data
,
2063 /* If we found the PC range in the DW_TAG_compile_unit, we
2065 if (abbrev
->tag
== DW_TAG_compile_unit
2066 && (pcrange
.have_ranges
2067 || (pcrange
.have_lowpc
&& pcrange
.have_highpc
)))
2071 if (abbrev
->has_children
)
2073 if (!find_address_ranges (state
, base_address
, unit_buf
,
2074 dwarf_sections
, is_bigendian
, altlink
,
2075 error_callback
, data
, u
, addrs
, NULL
))
2083 /* Build a mapping from address ranges to the compilation units where
2084 the line number information for that range can be found. Returns 1
2085 on success, 0 on failure. */
2088 build_address_map (struct backtrace_state
*state
, uintptr_t base_address
,
2089 const struct dwarf_sections
*dwarf_sections
,
2090 int is_bigendian
, struct dwarf_data
*altlink
,
2091 backtrace_error_callback error_callback
, void *data
,
2092 struct unit_addrs_vector
*addrs
,
2093 struct unit_vector
*unit_vec
)
2095 struct dwarf_buf info
;
2096 struct backtrace_vector units
;
2100 size_t unit_offset
= 0;
2101 struct unit_addrs
*pa
;
2103 memset (&addrs
->vec
, 0, sizeof addrs
->vec
);
2104 memset (&unit_vec
->vec
, 0, sizeof unit_vec
->vec
);
2106 unit_vec
->count
= 0;
2108 /* Read through the .debug_info section. FIXME: Should we use the
2109 .debug_aranges section? gdb and addr2line don't use it, but I'm
2112 info
.name
= ".debug_info";
2113 info
.start
= dwarf_sections
->data
[DEBUG_INFO
];
2114 info
.buf
= info
.start
;
2115 info
.left
= dwarf_sections
->size
[DEBUG_INFO
];
2116 info
.is_bigendian
= is_bigendian
;
2117 info
.error_callback
= error_callback
;
2119 info
.reported_underflow
= 0;
2121 memset (&units
, 0, sizeof units
);
2124 while (info
.left
> 0)
2126 const unsigned char *unit_data_start
;
2129 struct dwarf_buf unit_buf
;
2132 uint64_t abbrev_offset
;
2135 enum dwarf_tag unit_tag
;
2137 if (info
.reported_underflow
)
2140 unit_data_start
= info
.buf
;
2142 len
= read_initial_length (&info
, &is_dwarf64
);
2144 unit_buf
.left
= len
;
2146 if (!advance (&info
, len
))
2149 version
= read_uint16 (&unit_buf
);
2150 if (version
< 2 || version
> 5)
2152 dwarf_buf_error (&unit_buf
, "unrecognized DWARF version", -1);
2160 unit_type
= read_byte (&unit_buf
);
2161 if (unit_type
== DW_UT_type
|| unit_type
== DW_UT_split_type
)
2163 /* This unit doesn't have anything we need. */
2168 pu
= ((struct unit
**)
2169 backtrace_vector_grow (state
, sizeof (struct unit
*),
2170 error_callback
, data
, &units
));
2174 u
= ((struct unit
*)
2175 backtrace_alloc (state
, sizeof *u
, error_callback
, data
));
2183 addrsize
= 0; /* Set below. */
2185 addrsize
= read_byte (&unit_buf
);
2187 memset (&u
->abbrevs
, 0, sizeof u
->abbrevs
);
2188 abbrev_offset
= read_offset (&unit_buf
, is_dwarf64
);
2189 if (!read_abbrevs (state
, abbrev_offset
,
2190 dwarf_sections
->data
[DEBUG_ABBREV
],
2191 dwarf_sections
->size
[DEBUG_ABBREV
],
2192 is_bigendian
, error_callback
, data
, &u
->abbrevs
))
2196 addrsize
= read_byte (&unit_buf
);
2202 case DW_UT_compile
: case DW_UT_partial
:
2204 case DW_UT_skeleton
: case DW_UT_split_compile
:
2205 read_uint64 (&unit_buf
); /* dwo_id */
2211 u
->low_offset
= unit_offset
;
2212 unit_offset
+= len
+ (is_dwarf64
? 12 : 4);
2213 u
->high_offset
= unit_offset
;
2214 u
->unit_data
= unit_buf
.buf
;
2215 u
->unit_data_len
= unit_buf
.left
;
2216 u
->unit_data_offset
= unit_buf
.buf
- unit_data_start
;
2217 u
->version
= version
;
2218 u
->is_dwarf64
= is_dwarf64
;
2219 u
->addrsize
= addrsize
;
2222 u
->abs_filename
= NULL
;
2225 /* The actual line number mappings will be read as needed. */
2228 u
->function_addrs
= NULL
;
2229 u
->function_addrs_count
= 0;
2231 if (!find_address_ranges (state
, base_address
, &unit_buf
, dwarf_sections
,
2232 is_bigendian
, altlink
, error_callback
, data
,
2233 u
, addrs
, &unit_tag
))
2236 if (unit_buf
.reported_underflow
)
2239 if (info
.reported_underflow
)
2242 /* Add a trailing addrs entry, but don't include it in addrs->count. */
2243 pa
= ((struct unit_addrs
*)
2244 backtrace_vector_grow (state
, sizeof (struct unit_addrs
),
2245 error_callback
, data
, &addrs
->vec
));
2253 unit_vec
->vec
= units
;
2254 unit_vec
->count
= units_count
;
2258 if (units_count
> 0)
2260 pu
= (struct unit
**) units
.base
;
2261 for (i
= 0; i
< units_count
; i
++)
2263 free_abbrevs (state
, &pu
[i
]->abbrevs
, error_callback
, data
);
2264 backtrace_free (state
, pu
[i
], sizeof **pu
, error_callback
, data
);
2266 backtrace_vector_free (state
, &units
, error_callback
, data
);
2268 if (addrs
->count
> 0)
2270 backtrace_vector_free (state
, &addrs
->vec
, error_callback
, data
);
2276 /* Add a new mapping to the vector of line mappings that we are
2277 building. Returns 1 on success, 0 on failure. */
2280 add_line (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
2281 uintptr_t pc
, const char *filename
, int lineno
,
2282 backtrace_error_callback error_callback
, void *data
,
2283 struct line_vector
*vec
)
2287 /* If we are adding the same mapping, ignore it. This can happen
2288 when using discriminators. */
2291 ln
= (struct line
*) vec
->vec
.base
+ (vec
->count
- 1);
2292 if (pc
== ln
->pc
&& filename
== ln
->filename
&& lineno
== ln
->lineno
)
2296 ln
= ((struct line
*)
2297 backtrace_vector_grow (state
, sizeof (struct line
), error_callback
,
2302 /* Add in the base address here, so that we can look up the PC
2304 ln
->pc
= pc
+ ddata
->base_address
;
2306 ln
->filename
= filename
;
2307 ln
->lineno
= lineno
;
2308 ln
->idx
= vec
->count
;
2315 /* Free the line header information. */
2318 free_line_header (struct backtrace_state
*state
, struct line_header
*hdr
,
2319 backtrace_error_callback error_callback
, void *data
)
2321 if (hdr
->dirs_count
!= 0)
2322 backtrace_free (state
, hdr
->dirs
, hdr
->dirs_count
* sizeof (const char *),
2323 error_callback
, data
);
2324 backtrace_free (state
, hdr
->filenames
,
2325 hdr
->filenames_count
* sizeof (char *),
2326 error_callback
, data
);
2329 /* Read the directories and file names for a line header for version
2330 2, setting fields in HDR. Return 1 on success, 0 on failure. */
2333 read_v2_paths (struct backtrace_state
*state
, struct unit
*u
,
2334 struct dwarf_buf
*hdr_buf
, struct line_header
*hdr
)
2336 const unsigned char *p
;
2337 const unsigned char *pend
;
2340 /* Count the number of directory entries. */
2341 hdr
->dirs_count
= 0;
2343 pend
= p
+ hdr_buf
->left
;
2344 while (p
< pend
&& *p
!= '\0')
2346 p
+= strnlen((const char *) p
, pend
- p
) + 1;
2350 /* The index of the first entry in the list of directories is 1. Index 0 is
2351 used for the current directory of the compilation. To simplify index
2352 handling, we set entry 0 to the compilation unit directory. */
2354 hdr
->dirs
= ((const char **)
2355 backtrace_alloc (state
,
2356 hdr
->dirs_count
* sizeof (const char *),
2357 hdr_buf
->error_callback
,
2359 if (hdr
->dirs
== NULL
)
2362 hdr
->dirs
[0] = u
->comp_dir
;
2364 while (*hdr_buf
->buf
!= '\0')
2366 if (hdr_buf
->reported_underflow
)
2369 hdr
->dirs
[i
] = read_string (hdr_buf
);
2370 if (hdr
->dirs
[i
] == NULL
)
2374 if (!advance (hdr_buf
, 1))
2377 /* Count the number of file entries. */
2378 hdr
->filenames_count
= 0;
2380 pend
= p
+ hdr_buf
->left
;
2381 while (p
< pend
&& *p
!= '\0')
2383 p
+= strnlen ((const char *) p
, pend
- p
) + 1;
2384 p
+= leb128_len (p
);
2385 p
+= leb128_len (p
);
2386 p
+= leb128_len (p
);
2387 ++hdr
->filenames_count
;
2390 /* The index of the first entry in the list of file names is 1. Index 0 is
2391 used for the DW_AT_name of the compilation unit. To simplify index
2392 handling, we set entry 0 to the compilation unit file name. */
2393 ++hdr
->filenames_count
;
2394 hdr
->filenames
= ((const char **)
2395 backtrace_alloc (state
,
2396 hdr
->filenames_count
* sizeof (char *),
2397 hdr_buf
->error_callback
,
2399 if (hdr
->filenames
== NULL
)
2401 hdr
->filenames
[0] = u
->filename
;
2403 while (*hdr_buf
->buf
!= '\0')
2405 const char *filename
;
2408 if (hdr_buf
->reported_underflow
)
2411 filename
= read_string (hdr_buf
);
2412 if (filename
== NULL
)
2414 dir_index
= read_uleb128 (hdr_buf
);
2415 if (IS_ABSOLUTE_PATH (filename
)
2416 || (dir_index
< hdr
->dirs_count
&& hdr
->dirs
[dir_index
] == NULL
))
2417 hdr
->filenames
[i
] = filename
;
2422 size_t filename_len
;
2425 if (dir_index
< hdr
->dirs_count
)
2426 dir
= hdr
->dirs
[dir_index
];
2429 dwarf_buf_error (hdr_buf
,
2430 ("invalid directory index in "
2431 "line number program header"),
2435 dir_len
= strlen (dir
);
2436 filename_len
= strlen (filename
);
2437 s
= ((char *) backtrace_alloc (state
, dir_len
+ filename_len
+ 2,
2438 hdr_buf
->error_callback
,
2442 memcpy (s
, dir
, dir_len
);
2443 /* FIXME: If we are on a DOS-based file system, and the
2444 directory or the file name use backslashes, then we
2445 should use a backslash here. */
2447 memcpy (s
+ dir_len
+ 1, filename
, filename_len
+ 1);
2448 hdr
->filenames
[i
] = s
;
2451 /* Ignore the modification time and size. */
2452 read_uleb128 (hdr_buf
);
2453 read_uleb128 (hdr_buf
);
2461 /* Read a single version 5 LNCT entry for a directory or file name in a
2462 line header. Sets *STRING to the resulting name, ignoring other
2463 data. Return 1 on success, 0 on failure. */
2466 read_lnct (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
2467 struct unit
*u
, struct dwarf_buf
*hdr_buf
,
2468 const struct line_header
*hdr
, size_t formats_count
,
2469 const struct line_header_format
*formats
, const char **string
)
2477 for (i
= 0; i
< formats_count
; i
++)
2479 struct attr_val val
;
2481 if (!read_attribute (formats
[i
].form
, 0, hdr_buf
, u
->is_dwarf64
,
2482 u
->version
, hdr
->addrsize
, &ddata
->dwarf_sections
,
2483 ddata
->altlink
, &val
))
2485 switch (formats
[i
].lnct
)
2488 if (!resolve_string (&ddata
->dwarf_sections
, u
->is_dwarf64
,
2489 ddata
->is_bigendian
, u
->str_offsets_base
,
2490 &val
, hdr_buf
->error_callback
, hdr_buf
->data
,
2494 case DW_LNCT_directory_index
:
2495 if (val
.encoding
== ATTR_VAL_UINT
)
2497 if (val
.u
.uint
>= hdr
->dirs_count
)
2499 dwarf_buf_error (hdr_buf
,
2500 ("invalid directory index in "
2501 "line number program header"),
2505 dir
= hdr
->dirs
[val
.u
.uint
];
2509 /* We don't care about timestamps or sizes or hashes. */
2516 dwarf_buf_error (hdr_buf
,
2517 "missing file name in line number program header",
2530 dir_len
= strlen (dir
);
2531 path_len
= strlen (path
);
2532 s
= (char *) backtrace_alloc (state
, dir_len
+ path_len
+ 2,
2533 hdr_buf
->error_callback
, hdr_buf
->data
);
2536 memcpy (s
, dir
, dir_len
);
2537 /* FIXME: If we are on a DOS-based file system, and the
2538 directory or the path name use backslashes, then we should
2539 use a backslash here. */
2541 memcpy (s
+ dir_len
+ 1, path
, path_len
+ 1);
2548 /* Read a set of DWARF 5 line header format entries, setting *PCOUNT
2549 and *PPATHS. Return 1 on success, 0 on failure. */
2552 read_line_header_format_entries (struct backtrace_state
*state
,
2553 struct dwarf_data
*ddata
,
2555 struct dwarf_buf
*hdr_buf
,
2556 struct line_header
*hdr
,
2558 const char ***ppaths
)
2560 size_t formats_count
;
2561 struct line_header_format
*formats
;
2567 formats_count
= read_byte (hdr_buf
);
2568 if (formats_count
== 0)
2572 formats
= ((struct line_header_format
*)
2573 backtrace_alloc (state
,
2575 * sizeof (struct line_header_format
)),
2576 hdr_buf
->error_callback
,
2578 if (formats
== NULL
)
2581 for (i
= 0; i
< formats_count
; i
++)
2583 formats
[i
].lnct
= (int) read_uleb128(hdr_buf
);
2584 formats
[i
].form
= (enum dwarf_form
) read_uleb128 (hdr_buf
);
2588 paths_count
= read_uleb128 (hdr_buf
);
2589 if (paths_count
== 0)
2597 paths
= ((const char **)
2598 backtrace_alloc (state
, paths_count
* sizeof (const char *),
2599 hdr_buf
->error_callback
, hdr_buf
->data
));
2605 for (i
= 0; i
< paths_count
; i
++)
2607 if (!read_lnct (state
, ddata
, u
, hdr_buf
, hdr
, formats_count
,
2608 formats
, &paths
[i
]))
2610 backtrace_free (state
, paths
,
2611 paths_count
* sizeof (const char *),
2612 hdr_buf
->error_callback
, hdr_buf
->data
);
2618 *pcount
= paths_count
;
2624 if (formats
!= NULL
)
2625 backtrace_free (state
, formats
,
2626 formats_count
* sizeof (struct line_header_format
),
2627 hdr_buf
->error_callback
, hdr_buf
->data
);
2632 /* Read the line header. Return 1 on success, 0 on failure. */
2635 read_line_header (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
2636 struct unit
*u
, int is_dwarf64
, struct dwarf_buf
*line_buf
,
2637 struct line_header
*hdr
)
2640 struct dwarf_buf hdr_buf
;
2642 hdr
->version
= read_uint16 (line_buf
);
2643 if (hdr
->version
< 2 || hdr
->version
> 5)
2645 dwarf_buf_error (line_buf
, "unsupported line number version", -1);
2649 if (hdr
->version
< 5)
2650 hdr
->addrsize
= u
->addrsize
;
2653 hdr
->addrsize
= read_byte (line_buf
);
2654 /* We could support a non-zero segment_selector_size but I doubt
2655 we'll ever see it. */
2656 if (read_byte (line_buf
) != 0)
2658 dwarf_buf_error (line_buf
,
2659 "non-zero segment_selector_size not supported",
2665 hdrlen
= read_offset (line_buf
, is_dwarf64
);
2667 hdr_buf
= *line_buf
;
2668 hdr_buf
.left
= hdrlen
;
2670 if (!advance (line_buf
, hdrlen
))
2673 hdr
->min_insn_len
= read_byte (&hdr_buf
);
2674 if (hdr
->version
< 4)
2675 hdr
->max_ops_per_insn
= 1;
2677 hdr
->max_ops_per_insn
= read_byte (&hdr_buf
);
2679 /* We don't care about default_is_stmt. */
2680 read_byte (&hdr_buf
);
2682 hdr
->line_base
= read_sbyte (&hdr_buf
);
2683 hdr
->line_range
= read_byte (&hdr_buf
);
2685 hdr
->opcode_base
= read_byte (&hdr_buf
);
2686 hdr
->opcode_lengths
= hdr_buf
.buf
;
2687 if (!advance (&hdr_buf
, hdr
->opcode_base
- 1))
2690 if (hdr
->version
< 5)
2692 if (!read_v2_paths (state
, u
, &hdr_buf
, hdr
))
2697 if (!read_line_header_format_entries (state
, ddata
, u
, &hdr_buf
, hdr
,
2701 if (!read_line_header_format_entries (state
, ddata
, u
, &hdr_buf
, hdr
,
2702 &hdr
->filenames_count
,
2707 if (hdr_buf
.reported_underflow
)
2713 /* Read the line program, adding line mappings to VEC. Return 1 on
2714 success, 0 on failure. */
2717 read_line_program (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
2718 const struct line_header
*hdr
, struct dwarf_buf
*line_buf
,
2719 struct line_vector
*vec
)
2722 unsigned int op_index
;
2723 const char *reset_filename
;
2724 const char *filename
;
2729 if (hdr
->filenames_count
> 1)
2730 reset_filename
= hdr
->filenames
[1];
2732 reset_filename
= "";
2733 filename
= reset_filename
;
2735 while (line_buf
->left
> 0)
2739 op
= read_byte (line_buf
);
2740 if (op
>= hdr
->opcode_base
)
2742 unsigned int advance
;
2744 /* Special opcode. */
2745 op
-= hdr
->opcode_base
;
2746 advance
= op
/ hdr
->line_range
;
2747 address
+= (hdr
->min_insn_len
* (op_index
+ advance
)
2748 / hdr
->max_ops_per_insn
);
2749 op_index
= (op_index
+ advance
) % hdr
->max_ops_per_insn
;
2750 lineno
+= hdr
->line_base
+ (int) (op
% hdr
->line_range
);
2751 add_line (state
, ddata
, address
, filename
, lineno
,
2752 line_buf
->error_callback
, line_buf
->data
, vec
);
2754 else if (op
== DW_LNS_extended_op
)
2758 len
= read_uleb128 (line_buf
);
2759 op
= read_byte (line_buf
);
2762 case DW_LNE_end_sequence
:
2763 /* FIXME: Should we mark the high PC here? It seems
2764 that we already have that information from the
2765 compilation unit. */
2768 filename
= reset_filename
;
2771 case DW_LNE_set_address
:
2772 address
= read_address (line_buf
, hdr
->addrsize
);
2774 case DW_LNE_define_file
:
2777 unsigned int dir_index
;
2779 f
= read_string (line_buf
);
2782 dir_index
= read_uleb128 (line_buf
);
2783 /* Ignore that time and length. */
2784 read_uleb128 (line_buf
);
2785 read_uleb128 (line_buf
);
2786 if (IS_ABSOLUTE_PATH (f
))
2795 if (dir_index
< hdr
->dirs_count
)
2796 dir
= hdr
->dirs
[dir_index
];
2799 dwarf_buf_error (line_buf
,
2800 ("invalid directory index "
2801 "in line number program"),
2805 dir_len
= strlen (dir
);
2808 backtrace_alloc (state
, dir_len
+ f_len
+ 2,
2809 line_buf
->error_callback
,
2813 memcpy (p
, dir
, dir_len
);
2814 /* FIXME: If we are on a DOS-based file system,
2815 and the directory or the file name use
2816 backslashes, then we should use a backslash
2819 memcpy (p
+ dir_len
+ 1, f
, f_len
+ 1);
2824 case DW_LNE_set_discriminator
:
2825 /* We don't care about discriminators. */
2826 read_uleb128 (line_buf
);
2829 if (!advance (line_buf
, len
- 1))
2839 add_line (state
, ddata
, address
, filename
, lineno
,
2840 line_buf
->error_callback
, line_buf
->data
, vec
);
2842 case DW_LNS_advance_pc
:
2846 advance
= read_uleb128 (line_buf
);
2847 address
+= (hdr
->min_insn_len
* (op_index
+ advance
)
2848 / hdr
->max_ops_per_insn
);
2849 op_index
= (op_index
+ advance
) % hdr
->max_ops_per_insn
;
2852 case DW_LNS_advance_line
:
2853 lineno
+= (int) read_sleb128 (line_buf
);
2855 case DW_LNS_set_file
:
2859 fileno
= read_uleb128 (line_buf
);
2860 if (fileno
>= hdr
->filenames_count
)
2862 dwarf_buf_error (line_buf
,
2863 ("invalid file number in "
2864 "line number program"),
2868 filename
= hdr
->filenames
[fileno
];
2871 case DW_LNS_set_column
:
2872 read_uleb128 (line_buf
);
2874 case DW_LNS_negate_stmt
:
2876 case DW_LNS_set_basic_block
:
2878 case DW_LNS_const_add_pc
:
2880 unsigned int advance
;
2882 op
= 255 - hdr
->opcode_base
;
2883 advance
= op
/ hdr
->line_range
;
2884 address
+= (hdr
->min_insn_len
* (op_index
+ advance
)
2885 / hdr
->max_ops_per_insn
);
2886 op_index
= (op_index
+ advance
) % hdr
->max_ops_per_insn
;
2889 case DW_LNS_fixed_advance_pc
:
2890 address
+= read_uint16 (line_buf
);
2893 case DW_LNS_set_prologue_end
:
2895 case DW_LNS_set_epilogue_begin
:
2897 case DW_LNS_set_isa
:
2898 read_uleb128 (line_buf
);
2904 for (i
= hdr
->opcode_lengths
[op
- 1]; i
> 0; --i
)
2905 read_uleb128 (line_buf
);
2915 /* Read the line number information for a compilation unit. Returns 1
2916 on success, 0 on failure. */
2919 read_line_info (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
2920 backtrace_error_callback error_callback
, void *data
,
2921 struct unit
*u
, struct line_header
*hdr
, struct line
**lines
,
2922 size_t *lines_count
)
2924 struct line_vector vec
;
2925 struct dwarf_buf line_buf
;
2930 memset (&vec
.vec
, 0, sizeof vec
.vec
);
2933 memset (hdr
, 0, sizeof *hdr
);
2935 if (u
->lineoff
!= (off_t
) (size_t) u
->lineoff
2936 || (size_t) u
->lineoff
>= ddata
->dwarf_sections
.size
[DEBUG_LINE
])
2938 error_callback (data
, "unit line offset out of range", 0);
2942 line_buf
.name
= ".debug_line";
2943 line_buf
.start
= ddata
->dwarf_sections
.data
[DEBUG_LINE
];
2944 line_buf
.buf
= ddata
->dwarf_sections
.data
[DEBUG_LINE
] + u
->lineoff
;
2945 line_buf
.left
= ddata
->dwarf_sections
.size
[DEBUG_LINE
] - u
->lineoff
;
2946 line_buf
.is_bigendian
= ddata
->is_bigendian
;
2947 line_buf
.error_callback
= error_callback
;
2948 line_buf
.data
= data
;
2949 line_buf
.reported_underflow
= 0;
2951 len
= read_initial_length (&line_buf
, &is_dwarf64
);
2952 line_buf
.left
= len
;
2954 if (!read_line_header (state
, ddata
, u
, is_dwarf64
, &line_buf
, hdr
))
2957 if (!read_line_program (state
, ddata
, hdr
, &line_buf
, &vec
))
2960 if (line_buf
.reported_underflow
)
2965 /* This is not a failure in the sense of a generating an error,
2966 but it is a failure in that sense that we have no useful
2971 /* Allocate one extra entry at the end. */
2972 ln
= ((struct line
*)
2973 backtrace_vector_grow (state
, sizeof (struct line
), error_callback
,
2977 ln
->pc
= (uintptr_t) -1;
2978 ln
->filename
= NULL
;
2982 if (!backtrace_vector_release (state
, &vec
.vec
, error_callback
, data
))
2985 ln
= (struct line
*) vec
.vec
.base
;
2986 backtrace_qsort (ln
, vec
.count
, sizeof (struct line
), line_compare
);
2989 *lines_count
= vec
.count
;
2994 backtrace_vector_free (state
, &vec
.vec
, error_callback
, data
);
2995 free_line_header (state
, hdr
, error_callback
, data
);
2996 *lines
= (struct line
*) (uintptr_t) -1;
3001 static const char *read_referenced_name (struct dwarf_data
*, struct unit
*,
3002 uint64_t, backtrace_error_callback
,
3005 /* Read the name of a function from a DIE referenced by ATTR with VAL. */
3008 read_referenced_name_from_attr (struct dwarf_data
*ddata
, struct unit
*u
,
3009 struct attr
*attr
, struct attr_val
*val
,
3010 backtrace_error_callback error_callback
,
3015 case DW_AT_abstract_origin
:
3016 case DW_AT_specification
:
3022 if (attr
->form
== DW_FORM_ref_sig8
)
3025 if (val
->encoding
== ATTR_VAL_REF_INFO
)
3028 = find_unit (ddata
->units
, ddata
->units_count
,
3033 uint64_t offset
= val
->u
.uint
- unit
->low_offset
;
3034 return read_referenced_name (ddata
, unit
, offset
, error_callback
, data
);
3037 if (val
->encoding
== ATTR_VAL_UINT
3038 || val
->encoding
== ATTR_VAL_REF_UNIT
)
3039 return read_referenced_name (ddata
, u
, val
->u
.uint
, error_callback
, data
);
3041 if (val
->encoding
== ATTR_VAL_REF_ALT_INFO
)
3043 struct unit
*alt_unit
3044 = find_unit (ddata
->altlink
->units
, ddata
->altlink
->units_count
,
3046 if (alt_unit
== NULL
)
3049 uint64_t offset
= val
->u
.uint
- alt_unit
->low_offset
;
3050 return read_referenced_name (ddata
->altlink
, alt_unit
, offset
,
3051 error_callback
, data
);
3057 /* Read the name of a function from a DIE referenced by a
3058 DW_AT_abstract_origin or DW_AT_specification tag. OFFSET is within
3059 the same compilation unit. */
3062 read_referenced_name (struct dwarf_data
*ddata
, struct unit
*u
,
3063 uint64_t offset
, backtrace_error_callback error_callback
,
3066 struct dwarf_buf unit_buf
;
3068 const struct abbrev
*abbrev
;
3072 /* OFFSET is from the start of the data for this compilation unit.
3073 U->unit_data is the data, but it starts U->unit_data_offset bytes
3074 from the beginning. */
3076 if (offset
< u
->unit_data_offset
3077 || offset
- u
->unit_data_offset
>= u
->unit_data_len
)
3079 error_callback (data
,
3080 "abstract origin or specification out of range",
3085 offset
-= u
->unit_data_offset
;
3087 unit_buf
.name
= ".debug_info";
3088 unit_buf
.start
= ddata
->dwarf_sections
.data
[DEBUG_INFO
];
3089 unit_buf
.buf
= u
->unit_data
+ offset
;
3090 unit_buf
.left
= u
->unit_data_len
- offset
;
3091 unit_buf
.is_bigendian
= ddata
->is_bigendian
;
3092 unit_buf
.error_callback
= error_callback
;
3093 unit_buf
.data
= data
;
3094 unit_buf
.reported_underflow
= 0;
3096 code
= read_uleb128 (&unit_buf
);
3099 dwarf_buf_error (&unit_buf
,
3100 "invalid abstract origin or specification",
3105 abbrev
= lookup_abbrev (&u
->abbrevs
, code
, error_callback
, data
);
3110 for (i
= 0; i
< abbrev
->num_attrs
; ++i
)
3112 struct attr_val val
;
3114 if (!read_attribute (abbrev
->attrs
[i
].form
, abbrev
->attrs
[i
].val
,
3115 &unit_buf
, u
->is_dwarf64
, u
->version
, u
->addrsize
,
3116 &ddata
->dwarf_sections
, ddata
->altlink
, &val
))
3119 switch (abbrev
->attrs
[i
].name
)
3122 /* Third name preference: don't override. A name we found in some
3123 other way, will normally be more useful -- e.g., this name is
3124 normally not mangled. */
3127 if (!resolve_string (&ddata
->dwarf_sections
, u
->is_dwarf64
,
3128 ddata
->is_bigendian
, u
->str_offsets_base
,
3129 &val
, error_callback
, data
, &ret
))
3133 case DW_AT_linkage_name
:
3134 case DW_AT_MIPS_linkage_name
:
3135 /* First name preference: override all. */
3140 if (!resolve_string (&ddata
->dwarf_sections
, u
->is_dwarf64
,
3141 ddata
->is_bigendian
, u
->str_offsets_base
,
3142 &val
, error_callback
, data
, &s
))
3149 case DW_AT_specification
:
3150 /* Second name preference: override DW_AT_name, don't override
3151 DW_AT_linkage_name. */
3155 name
= read_referenced_name_from_attr (ddata
, u
, &abbrev
->attrs
[i
],
3156 &val
, error_callback
, data
);
3170 /* Add a range to a unit that maps to a function. This is called via
3171 add_ranges. Returns 1 on success, 0 on error. */
3174 add_function_range (struct backtrace_state
*state
, void *rdata
,
3175 uint64_t lowpc
, uint64_t highpc
,
3176 backtrace_error_callback error_callback
, void *data
,
3179 struct function
*function
= (struct function
*) rdata
;
3180 struct function_vector
*vec
= (struct function_vector
*) pvec
;
3181 struct function_addrs
*p
;
3185 p
= (struct function_addrs
*) vec
->vec
.base
+ (vec
->count
- 1);
3186 if ((lowpc
== p
->high
|| lowpc
== p
->high
+ 1)
3187 && function
== p
->function
)
3189 if (highpc
> p
->high
)
3195 p
= ((struct function_addrs
*)
3196 backtrace_vector_grow (state
, sizeof (struct function_addrs
),
3197 error_callback
, data
, &vec
->vec
));
3203 p
->function
= function
;
3210 /* Read one entry plus all its children. Add function addresses to
3211 VEC. Returns 1 on success, 0 on error. */
3214 read_function_entry (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
3215 struct unit
*u
, uint64_t base
, struct dwarf_buf
*unit_buf
,
3216 const struct line_header
*lhdr
,
3217 backtrace_error_callback error_callback
, void *data
,
3218 struct function_vector
*vec_function
,
3219 struct function_vector
*vec_inlined
)
3221 while (unit_buf
->left
> 0)
3224 const struct abbrev
*abbrev
;
3226 struct function
*function
;
3227 struct function_vector
*vec
;
3229 struct pcrange pcrange
;
3230 int have_linkage_name
;
3232 code
= read_uleb128 (unit_buf
);
3236 abbrev
= lookup_abbrev (&u
->abbrevs
, code
, error_callback
, data
);
3240 is_function
= (abbrev
->tag
== DW_TAG_subprogram
3241 || abbrev
->tag
== DW_TAG_entry_point
3242 || abbrev
->tag
== DW_TAG_inlined_subroutine
);
3244 if (abbrev
->tag
== DW_TAG_inlined_subroutine
)
3252 function
= ((struct function
*)
3253 backtrace_alloc (state
, sizeof *function
,
3254 error_callback
, data
));
3255 if (function
== NULL
)
3257 memset (function
, 0, sizeof *function
);
3260 memset (&pcrange
, 0, sizeof pcrange
);
3261 have_linkage_name
= 0;
3262 for (i
= 0; i
< abbrev
->num_attrs
; ++i
)
3264 struct attr_val val
;
3266 if (!read_attribute (abbrev
->attrs
[i
].form
, abbrev
->attrs
[i
].val
,
3267 unit_buf
, u
->is_dwarf64
, u
->version
,
3268 u
->addrsize
, &ddata
->dwarf_sections
,
3269 ddata
->altlink
, &val
))
3272 /* The compile unit sets the base address for any address
3273 ranges in the function entries. */
3274 if (abbrev
->tag
== DW_TAG_compile_unit
3275 && abbrev
->attrs
[i
].name
== DW_AT_low_pc
)
3277 if (val
.encoding
== ATTR_VAL_ADDRESS
)
3279 else if (val
.encoding
== ATTR_VAL_ADDRESS_INDEX
)
3281 if (!resolve_addr_index (&ddata
->dwarf_sections
,
3282 u
->addr_base
, u
->addrsize
,
3283 ddata
->is_bigendian
, val
.u
.uint
,
3284 error_callback
, data
, &base
))
3291 switch (abbrev
->attrs
[i
].name
)
3293 case DW_AT_call_file
:
3294 if (val
.encoding
== ATTR_VAL_UINT
)
3296 if (val
.u
.uint
>= lhdr
->filenames_count
)
3298 dwarf_buf_error (unit_buf
,
3299 ("invalid file number in "
3300 "DW_AT_call_file attribute"),
3304 function
->caller_filename
= lhdr
->filenames
[val
.u
.uint
];
3308 case DW_AT_call_line
:
3309 if (val
.encoding
== ATTR_VAL_UINT
)
3310 function
->caller_lineno
= val
.u
.uint
;
3313 case DW_AT_abstract_origin
:
3314 case DW_AT_specification
:
3315 /* Second name preference: override DW_AT_name, don't override
3316 DW_AT_linkage_name. */
3317 if (have_linkage_name
)
3323 = read_referenced_name_from_attr (ddata
, u
,
3324 &abbrev
->attrs
[i
], &val
,
3325 error_callback
, data
);
3327 function
->name
= name
;
3332 /* Third name preference: don't override. */
3333 if (function
->name
!= NULL
)
3335 if (!resolve_string (&ddata
->dwarf_sections
, u
->is_dwarf64
,
3336 ddata
->is_bigendian
,
3337 u
->str_offsets_base
, &val
,
3338 error_callback
, data
, &function
->name
))
3342 case DW_AT_linkage_name
:
3343 case DW_AT_MIPS_linkage_name
:
3344 /* First name preference: override all. */
3349 if (!resolve_string (&ddata
->dwarf_sections
, u
->is_dwarf64
,
3350 ddata
->is_bigendian
,
3351 u
->str_offsets_base
, &val
,
3352 error_callback
, data
, &s
))
3357 have_linkage_name
= 1;
3362 case DW_AT_low_pc
: case DW_AT_high_pc
: case DW_AT_ranges
:
3363 update_pcrange (&abbrev
->attrs
[i
], &val
, &pcrange
);
3372 /* If we couldn't find a name for the function, we have no use
3374 if (is_function
&& function
->name
== NULL
)
3376 backtrace_free (state
, function
, sizeof *function
,
3377 error_callback
, data
);
3383 if (pcrange
.have_ranges
3384 || (pcrange
.have_lowpc
&& pcrange
.have_highpc
))
3386 if (!add_ranges (state
, &ddata
->dwarf_sections
,
3387 ddata
->base_address
, ddata
->is_bigendian
,
3388 u
, base
, &pcrange
, add_function_range
,
3389 (void *) function
, error_callback
, data
,
3395 backtrace_free (state
, function
, sizeof *function
,
3396 error_callback
, data
);
3401 if (abbrev
->has_children
)
3405 if (!read_function_entry (state
, ddata
, u
, base
, unit_buf
, lhdr
,
3406 error_callback
, data
, vec_function
,
3412 struct function_vector fvec
;
3414 /* Gather any information for inlined functions in
3417 memset (&fvec
, 0, sizeof fvec
);
3419 if (!read_function_entry (state
, ddata
, u
, base
, unit_buf
, lhdr
,
3420 error_callback
, data
, vec_function
,
3426 struct function_addrs
*p
;
3427 struct function_addrs
*faddrs
;
3429 /* Allocate a trailing entry, but don't include it
3431 p
= ((struct function_addrs
*)
3432 backtrace_vector_grow (state
,
3433 sizeof (struct function_addrs
),
3434 error_callback
, data
,
3443 if (!backtrace_vector_release (state
, &fvec
.vec
,
3444 error_callback
, data
))
3447 faddrs
= (struct function_addrs
*) fvec
.vec
.base
;
3448 backtrace_qsort (faddrs
, fvec
.count
,
3449 sizeof (struct function_addrs
),
3450 function_addrs_compare
);
3452 function
->function_addrs
= faddrs
;
3453 function
->function_addrs_count
= fvec
.count
;
3462 /* Read function name information for a compilation unit. We look
3463 through the whole unit looking for function tags. */
3466 read_function_info (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
3467 const struct line_header
*lhdr
,
3468 backtrace_error_callback error_callback
, void *data
,
3469 struct unit
*u
, struct function_vector
*fvec
,
3470 struct function_addrs
**ret_addrs
,
3471 size_t *ret_addrs_count
)
3473 struct function_vector lvec
;
3474 struct function_vector
*pfvec
;
3475 struct dwarf_buf unit_buf
;
3476 struct function_addrs
*p
;
3477 struct function_addrs
*addrs
;
3480 /* Use FVEC if it is not NULL. Otherwise use our own vector. */
3485 memset (&lvec
, 0, sizeof lvec
);
3489 unit_buf
.name
= ".debug_info";
3490 unit_buf
.start
= ddata
->dwarf_sections
.data
[DEBUG_INFO
];
3491 unit_buf
.buf
= u
->unit_data
;
3492 unit_buf
.left
= u
->unit_data_len
;
3493 unit_buf
.is_bigendian
= ddata
->is_bigendian
;
3494 unit_buf
.error_callback
= error_callback
;
3495 unit_buf
.data
= data
;
3496 unit_buf
.reported_underflow
= 0;
3498 while (unit_buf
.left
> 0)
3500 if (!read_function_entry (state
, ddata
, u
, 0, &unit_buf
, lhdr
,
3501 error_callback
, data
, pfvec
, pfvec
))
3505 if (pfvec
->count
== 0)
3508 /* Allocate a trailing entry, but don't include it in
3510 p
= ((struct function_addrs
*)
3511 backtrace_vector_grow (state
, sizeof (struct function_addrs
),
3512 error_callback
, data
, &pfvec
->vec
));
3520 addrs_count
= pfvec
->count
;
3524 if (!backtrace_vector_release (state
, &lvec
.vec
, error_callback
, data
))
3526 addrs
= (struct function_addrs
*) pfvec
->vec
.base
;
3530 /* Finish this list of addresses, but leave the remaining space in
3531 the vector available for the next function unit. */
3532 addrs
= ((struct function_addrs
*)
3533 backtrace_vector_finish (state
, &fvec
->vec
,
3534 error_callback
, data
));
3540 backtrace_qsort (addrs
, addrs_count
, sizeof (struct function_addrs
),
3541 function_addrs_compare
);
3544 *ret_addrs_count
= addrs_count
;
3547 /* See if PC is inlined in FUNCTION. If it is, print out the inlined
3548 information, and update FILENAME and LINENO for the caller.
3549 Returns whatever CALLBACK returns, or 0 to keep going. */
3552 report_inlined_functions (uintptr_t pc
, struct function
*function
,
3553 backtrace_full_callback callback
, void *data
,
3554 const char **filename
, int *lineno
)
3556 struct function_addrs
*p
;
3557 struct function_addrs
*match
;
3558 struct function
*inlined
;
3561 if (function
->function_addrs_count
== 0)
3564 /* Our search isn't safe if pc == -1, as that is the sentinel
3569 p
= ((struct function_addrs
*)
3570 bsearch (&pc
, function
->function_addrs
,
3571 function
->function_addrs_count
,
3572 sizeof (struct function_addrs
),
3573 function_addrs_search
));
3577 /* Here pc >= p->low && pc < (p + 1)->low. The function_addrs are
3578 sorted by low, so if pc > p->low we are at the end of a range of
3579 function_addrs with the same low value. If pc == p->low walk
3580 forward to the end of the range with that low value. Then walk
3581 backward and use the first range that includes pc. */
3582 while (pc
== (p
+ 1)->low
)
3592 if (p
== function
->function_addrs
)
3594 if ((p
- 1)->low
< p
->low
)
3601 /* We found an inlined call. */
3603 inlined
= match
->function
;
3605 /* Report any calls inlined into this one. */
3606 ret
= report_inlined_functions (pc
, inlined
, callback
, data
,
3611 /* Report this inlined call. */
3612 ret
= callback (data
, pc
, *filename
, *lineno
, inlined
->name
);
3616 /* Our caller will report the caller of the inlined function; tell
3617 it the appropriate filename and line number. */
3618 *filename
= inlined
->caller_filename
;
3619 *lineno
= inlined
->caller_lineno
;
3624 /* Look for a PC in the DWARF mapping for one module. On success,
3625 call CALLBACK and return whatever it returns. On error, call
3626 ERROR_CALLBACK and return 0. Sets *FOUND to 1 if the PC is found,
3630 dwarf_lookup_pc (struct backtrace_state
*state
, struct dwarf_data
*ddata
,
3631 uintptr_t pc
, backtrace_full_callback callback
,
3632 backtrace_error_callback error_callback
, void *data
,
3635 struct unit_addrs
*entry
;
3641 struct function_addrs
*p
;
3642 struct function_addrs
*fmatch
;
3643 struct function
*function
;
3644 const char *filename
;
3650 /* Find an address range that includes PC. Our search isn't safe if
3651 PC == -1, as we use that as a sentinel value, so skip the search
3653 entry
= (ddata
->addrs_count
== 0 || pc
+ 1 == 0
3655 : bsearch (&pc
, ddata
->addrs
, ddata
->addrs_count
,
3656 sizeof (struct unit_addrs
), unit_addrs_search
));
3664 /* Here pc >= entry->low && pc < (entry + 1)->low. The unit_addrs
3665 are sorted by low, so if pc > p->low we are at the end of a range
3666 of unit_addrs with the same low value. If pc == p->low walk
3667 forward to the end of the range with that low value. Then walk
3668 backward and use the first range that includes pc. */
3669 while (pc
== (entry
+ 1)->low
)
3674 if (pc
< entry
->high
)
3679 if (entry
== ddata
->addrs
)
3681 if ((entry
- 1)->low
< entry
->low
)
3691 /* We need the lines, lines_count, function_addrs,
3692 function_addrs_count fields of u. If they are not set, we need
3693 to set them. When running in threaded mode, we need to allow for
3694 the possibility that some other thread is setting them
3700 /* Skip units with no useful line number information by walking
3701 backward. Useless line number information is marked by setting
3703 while (entry
> ddata
->addrs
3704 && pc
>= (entry
- 1)->low
3705 && pc
< (entry
- 1)->high
)
3707 if (state
->threaded
)
3708 lines
= (struct line
*) backtrace_atomic_load_pointer (&u
->lines
);
3710 if (lines
!= (struct line
*) (uintptr_t) -1)
3719 if (state
->threaded
)
3720 lines
= backtrace_atomic_load_pointer (&u
->lines
);
3725 struct function_addrs
*function_addrs
;
3726 size_t function_addrs_count
;
3727 struct line_header lhdr
;
3730 /* We have never read the line information for this unit. Read
3733 function_addrs
= NULL
;
3734 function_addrs_count
= 0;
3735 if (read_line_info (state
, ddata
, error_callback
, data
, entry
->u
, &lhdr
,
3738 struct function_vector
*pfvec
;
3740 /* If not threaded, reuse DDATA->FVEC for better memory
3742 if (state
->threaded
)
3745 pfvec
= &ddata
->fvec
;
3746 read_function_info (state
, ddata
, &lhdr
, error_callback
, data
,
3747 entry
->u
, pfvec
, &function_addrs
,
3748 &function_addrs_count
);
3749 free_line_header (state
, &lhdr
, error_callback
, data
);
3753 /* Atomically store the information we just read into the unit.
3754 If another thread is simultaneously writing, it presumably
3755 read the same information, and we don't care which one we
3756 wind up with; we just leak the other one. We do have to
3757 write the lines field last, so that the acquire-loads above
3758 ensure that the other fields are set. */
3760 if (!state
->threaded
)
3762 u
->lines_count
= count
;
3763 u
->function_addrs
= function_addrs
;
3764 u
->function_addrs_count
= function_addrs_count
;
3769 backtrace_atomic_store_size_t (&u
->lines_count
, count
);
3770 backtrace_atomic_store_pointer (&u
->function_addrs
, function_addrs
);
3771 backtrace_atomic_store_size_t (&u
->function_addrs_count
,
3772 function_addrs_count
);
3773 backtrace_atomic_store_pointer (&u
->lines
, lines
);
3777 /* Now all fields of U have been initialized. */
3779 if (lines
== (struct line
*) (uintptr_t) -1)
3781 /* If reading the line number information failed in some way,
3782 try again to see if there is a better compilation unit for
3785 return dwarf_lookup_pc (state
, ddata
, pc
, callback
, error_callback
,
3787 return callback (data
, pc
, NULL
, 0, NULL
);
3790 /* Search for PC within this unit. */
3792 ln
= (struct line
*) bsearch (&pc
, lines
, entry
->u
->lines_count
,
3793 sizeof (struct line
), line_search
);
3796 /* The PC is between the low_pc and high_pc attributes of the
3797 compilation unit, but no entry in the line table covers it.
3798 This implies that the start of the compilation unit has no
3799 line number information. */
3801 if (entry
->u
->abs_filename
== NULL
)
3803 const char *filename
;
3805 filename
= entry
->u
->filename
;
3806 if (filename
!= NULL
3807 && !IS_ABSOLUTE_PATH (filename
)
3808 && entry
->u
->comp_dir
!= NULL
)
3810 size_t filename_len
;
3815 filename_len
= strlen (filename
);
3816 dir
= entry
->u
->comp_dir
;
3817 dir_len
= strlen (dir
);
3818 s
= (char *) backtrace_alloc (state
, dir_len
+ filename_len
+ 2,
3819 error_callback
, data
);
3825 memcpy (s
, dir
, dir_len
);
3826 /* FIXME: Should use backslash if DOS file system. */
3828 memcpy (s
+ dir_len
+ 1, filename
, filename_len
+ 1);
3831 entry
->u
->abs_filename
= filename
;
3834 return callback (data
, pc
, entry
->u
->abs_filename
, 0, NULL
);
3837 /* Search for function name within this unit. */
3839 if (entry
->u
->function_addrs_count
== 0)
3840 return callback (data
, pc
, ln
->filename
, ln
->lineno
, NULL
);
3842 p
= ((struct function_addrs
*)
3843 bsearch (&pc
, entry
->u
->function_addrs
,
3844 entry
->u
->function_addrs_count
,
3845 sizeof (struct function_addrs
),
3846 function_addrs_search
));
3848 return callback (data
, pc
, ln
->filename
, ln
->lineno
, NULL
);
3850 /* Here pc >= p->low && pc < (p + 1)->low. The function_addrs are
3851 sorted by low, so if pc > p->low we are at the end of a range of
3852 function_addrs with the same low value. If pc == p->low walk
3853 forward to the end of the range with that low value. Then walk
3854 backward and use the first range that includes pc. */
3855 while (pc
== (p
+ 1)->low
)
3865 if (p
== entry
->u
->function_addrs
)
3867 if ((p
- 1)->low
< p
->low
)
3872 return callback (data
, pc
, ln
->filename
, ln
->lineno
, NULL
);
3874 function
= fmatch
->function
;
3876 filename
= ln
->filename
;
3877 lineno
= ln
->lineno
;
3879 ret
= report_inlined_functions (pc
, function
, callback
, data
,
3880 &filename
, &lineno
);
3884 return callback (data
, pc
, filename
, lineno
, function
->name
);
3888 /* Return the file/line information for a PC using the DWARF mapping
3889 we built earlier. */
3892 dwarf_fileline (struct backtrace_state
*state
, uintptr_t pc
,
3893 backtrace_full_callback callback
,
3894 backtrace_error_callback error_callback
, void *data
)
3896 struct dwarf_data
*ddata
;
3900 if (!state
->threaded
)
3902 for (ddata
= (struct dwarf_data
*) state
->fileline_data
;
3904 ddata
= ddata
->next
)
3906 ret
= dwarf_lookup_pc (state
, ddata
, pc
, callback
, error_callback
,
3908 if (ret
!= 0 || found
)
3914 struct dwarf_data
**pp
;
3916 pp
= (struct dwarf_data
**) (void *) &state
->fileline_data
;
3919 ddata
= backtrace_atomic_load_pointer (pp
);
3923 ret
= dwarf_lookup_pc (state
, ddata
, pc
, callback
, error_callback
,
3925 if (ret
!= 0 || found
)
3932 /* FIXME: See if any libraries have been dlopen'ed. */
3934 return callback (data
, pc
, NULL
, 0, NULL
);
3937 /* Initialize our data structures from the DWARF debug info for a
3938 file. Return NULL on failure. */
3940 static struct dwarf_data
*
3941 build_dwarf_data (struct backtrace_state
*state
,
3942 uintptr_t base_address
,
3943 const struct dwarf_sections
*dwarf_sections
,
3945 struct dwarf_data
*altlink
,
3946 backtrace_error_callback error_callback
,
3949 struct unit_addrs_vector addrs_vec
;
3950 struct unit_addrs
*addrs
;
3952 struct unit_vector units_vec
;
3953 struct unit
**units
;
3955 struct dwarf_data
*fdata
;
3957 if (!build_address_map (state
, base_address
, dwarf_sections
, is_bigendian
,
3958 altlink
, error_callback
, data
, &addrs_vec
,
3962 if (!backtrace_vector_release (state
, &addrs_vec
.vec
, error_callback
, data
))
3964 if (!backtrace_vector_release (state
, &units_vec
.vec
, error_callback
, data
))
3966 addrs
= (struct unit_addrs
*) addrs_vec
.vec
.base
;
3967 units
= (struct unit
**) units_vec
.vec
.base
;
3968 addrs_count
= addrs_vec
.count
;
3969 units_count
= units_vec
.count
;
3970 backtrace_qsort (addrs
, addrs_count
, sizeof (struct unit_addrs
),
3971 unit_addrs_compare
);
3972 /* No qsort for units required, already sorted. */
3974 fdata
= ((struct dwarf_data
*)
3975 backtrace_alloc (state
, sizeof (struct dwarf_data
),
3976 error_callback
, data
));
3981 fdata
->altlink
= altlink
;
3982 fdata
->base_address
= base_address
;
3983 fdata
->addrs
= addrs
;
3984 fdata
->addrs_count
= addrs_count
;
3985 fdata
->units
= units
;
3986 fdata
->units_count
= units_count
;
3987 fdata
->dwarf_sections
= *dwarf_sections
;
3988 fdata
->is_bigendian
= is_bigendian
;
3989 memset (&fdata
->fvec
, 0, sizeof fdata
->fvec
);
3994 /* Build our data structures from the DWARF sections for a module.
3995 Set FILELINE_FN and STATE->FILELINE_DATA. Return 1 on success, 0
3999 backtrace_dwarf_add (struct backtrace_state
*state
,
4000 uintptr_t base_address
,
4001 const struct dwarf_sections
*dwarf_sections
,
4003 struct dwarf_data
*fileline_altlink
,
4004 backtrace_error_callback error_callback
,
4005 void *data
, fileline
*fileline_fn
,
4006 struct dwarf_data
**fileline_entry
)
4008 struct dwarf_data
*fdata
;
4010 fdata
= build_dwarf_data (state
, base_address
, dwarf_sections
, is_bigendian
,
4011 fileline_altlink
, error_callback
, data
);
4015 if (fileline_entry
!= NULL
)
4016 *fileline_entry
= fdata
;
4018 if (!state
->threaded
)
4020 struct dwarf_data
**pp
;
4022 for (pp
= (struct dwarf_data
**) (void *) &state
->fileline_data
;
4032 struct dwarf_data
**pp
;
4034 pp
= (struct dwarf_data
**) (void *) &state
->fileline_data
;
4038 struct dwarf_data
*p
;
4040 p
= backtrace_atomic_load_pointer (pp
);
4048 if (__sync_bool_compare_and_swap (pp
, NULL
, fdata
))
4053 *fileline_fn
= dwarf_fileline
;