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