]> git.ipfire.org Git - thirdparty/gcc.git/blame - libbacktrace/dwarf.c
Move 2 mklog scripts to legacy subfolder.
[thirdparty/gcc.git] / libbacktrace / dwarf.c
CommitLineData
eff02e4f 1/* dwarf.c -- Get file/line information from DWARF for backtraces.
8d9254fc 2 Copyright (C) 2012-2020 Free Software Foundation, Inc.
eff02e4f
ILT
3 Written by Ian Lance Taylor, Google.
4
5Redistribution and use in source and binary forms, with or without
6modification, are permitted provided that the following conditions are
7met:
8
9 (1) Redistributions of source code must retain the above copyright
84ebf639 10 notice, this list of conditions and the following disclaimer.
eff02e4f
ILT
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
84ebf639
CL
15 distribution.
16
eff02e4f
ILT
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
21THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
25INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
30IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31POSSIBILITY OF SUCH DAMAGE. */
32
33#include "config.h"
34
35#include <errno.h>
eff02e4f
ILT
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
30e15876 46#if !defined(HAVE_DECL_STRNLEN) || !HAVE_DECL_STRNLEN
244e2d9c
ILT
47
48/* If strnlen is not declared, provide our own version. */
49
50static size_t
51xstrnlen (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
772a71a9
ILT
63#endif
64
eff02e4f
ILT
65/* A buffer to read DWARF info. */
66
67struct 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
89struct attr
90{
91 /* The attribute name. */
92 enum dwarf_attribute name;
93 /* The attribute form. */
94 enum dwarf_form form;
c926fd82
ILT
95 /* The attribute value, for DW_FORM_implicit_const. */
96 int64_t val;
eff02e4f
ILT
97};
98
99/* A single DWARF abbreviation. */
100
101struct 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
122struct 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
132enum attr_val_encoding
133{
944f59ff
TV
134 /* No attribute value. */
135 ATTR_VAL_NONE,
eff02e4f
ILT
136 /* An address. */
137 ATTR_VAL_ADDRESS,
c926fd82
ILT
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,
eff02e4f
ILT
141 /* A unsigned integer. */
142 ATTR_VAL_UINT,
143 /* A sigd integer. */
144 ATTR_VAL_SINT,
145 /* A string. */
146 ATTR_VAL_STRING,
c926fd82
ILT
147 /* An index into the .debug_str_offsets section. */
148 ATTR_VAL_STRING_INDEX,
eff02e4f
ILT
149 /* An offset to other data in the containing unit. */
150 ATTR_VAL_REF_UNIT,
c926fd82 151 /* An offset to other data within the .debug_info section. */
eff02e4f 152 ATTR_VAL_REF_INFO,
c926fd82 153 /* An offset to other data within the alt .debug_info section. */
1c2a9a37 154 ATTR_VAL_REF_ALT_INFO,
eff02e4f
ILT
155 /* An offset to data in some other section. */
156 ATTR_VAL_REF_SECTION,
157 /* A type signature. */
158 ATTR_VAL_REF_TYPE,
c926fd82
ILT
159 /* An index into the .debug_rnglists section. */
160 ATTR_VAL_RNGLISTS_INDEX,
eff02e4f
ILT
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
169struct attr_val
170{
171 /* How the value is stored in the field u. */
172 enum attr_val_encoding encoding;
173 union
174 {
c926fd82 175 /* ATTR_VAL_ADDRESS*, ATTR_VAL_UINT, ATTR_VAL_REF*. */
eff02e4f
ILT
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
187struct line_header
188{
189 /* The version of the line number information. */
190 int version;
c926fd82
ILT
191 /* Address size. */
192 int addrsize;
eff02e4f
ILT
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
c926fd82
ILT
215/* A format description from a line header. */
216
217struct line_header_format
218{
219 int lnct; /* LNCT code. */
220 enum dwarf_form form; /* Form of entry data. */
221};
222
eff02e4f
ILT
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
228struct 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;
d99a7b4d
MS
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;
eff02e4f
ILT
241};
242
243/* A growable vector of line number information. This is used while
244 reading the line numbers. */
245
246struct 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
256struct 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
274struct 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
285struct 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
296struct 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;
9d576782
TV
305 /* Offset of the start of the compilation unit from the start of the
306 .debug_info section. */
3f5d2012 307 size_t low_offset;
9d576782
TV
308 /* Offset of the end of the compilation unit from the start of the
309 .debug_info section. */
3f5d2012 310 size_t high_offset;
eff02e4f
ILT
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;
c926fd82
ILT
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;
6b514c53
ILT
325 /* Primary source file. */
326 const char *filename;
eff02e4f
ILT
327 /* Compilation command working directory. */
328 const char *comp_dir;
6b514c53
ILT
329 /* Absolute file name, only set if needed. */
330 const char *abs_filename;
eff02e4f
ILT
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
356struct 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
367struct 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
9d576782
TV
375/* A growable vector of compilation unit pointer. */
376
377struct unit_vector
378{
379 struct backtrace_vector vec;
380 size_t count;
381};
382
eff02e4f
ILT
383/* The information we need to map a PC to a file and line. */
384
385struct dwarf_data
386{
e561a992
ILT
387 /* The data for the next file we know about. */
388 struct dwarf_data *next;
9ad458d5
TV
389 /* The data for .gnu_debugaltlink. */
390 struct dwarf_data *altlink;
e561a992
ILT
391 /* The base address for this file. */
392 uintptr_t base_address;
eff02e4f
ILT
393 /* A sorted list of address ranges. */
394 struct unit_addrs *addrs;
395 /* Number of address ranges in list. */
396 size_t addrs_count;
9d576782
TV
397 /* A sorted list of units. */
398 struct unit **units;
399 /* Number of units in the list. */
400 size_t units_count;
66ab5839
ILT
401 /* The unparsed DWARF debug data. */
402 struct dwarf_sections dwarf_sections;
eff02e4f
ILT
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
412static void
413dwarf_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
425static int
426require (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
443static int
444advance (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
17112570
TV
453/* Read one zero-terminated string from BUF and advance past the string. */
454
455static const char *
456read_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
eff02e4f
ILT
472/* Read one byte from BUF and advance 1 byte. */
473
474static unsigned char
475read_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
486static signed char
487read_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
498static uint16_t
499read_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
c926fd82
ILT
511/* Read a 24 bit value from BUF and advance 3 bytes. */
512
513static uint32_t
514read_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
eff02e4f
ILT
528/* Read a uint32 from BUF and advance 4 bytes. */
529
530static uint32_t
531read_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
547static uint64_t
548read_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
569static uint64_t
570read_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
581static uint64_t
582read_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
603static int
604is_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
623static uint64_t
624read_uleb128 (struct dwarf_buf *buf)
625{
626 uint64_t ret;
627 unsigned int shift;
be4ba8ae 628 int overflow;
eff02e4f
ILT
629 unsigned char b;
630
631 ret = 0;
632 shift = 0;
be4ba8ae 633 overflow = 0;
eff02e4f
ILT
634 do
635 {
636 const unsigned char *p;
637
638 p = buf->buf;
639 if (!advance (buf, 1))
640 return 0;
641 b = *p;
be4ba8ae
ILT
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 }
eff02e4f
ILT
649 shift += 7;
650 }
651 while ((b & 0x80) != 0);
652
eff02e4f
ILT
653 return ret;
654}
655
656/* Read a signed LEB128 number. */
657
658static int64_t
659read_sleb128 (struct dwarf_buf *buf)
660{
661 uint64_t val;
662 unsigned int shift;
be4ba8ae 663 int overflow;
eff02e4f
ILT
664 unsigned char b;
665
666 val = 0;
667 shift = 0;
be4ba8ae 668 overflow = 0;
eff02e4f
ILT
669 do
670 {
671 const unsigned char *p;
672
673 p = buf->buf;
674 if (!advance (buf, 1))
675 return 0;
676 b = *p;
be4ba8ae
ILT
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 }
eff02e4f
ILT
684 shift += 7;
685 }
686 while ((b & 0x80) != 0);
687
be4ba8ae 688 if ((b & 0x40) != 0 && shift < 64)
eff02e4f
ILT
689 val |= ((uint64_t) -1) << shift;
690
691 return (int64_t) val;
692}
693
694/* Return the length of an LEB128 number. */
695
696static size_t
697leb128_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
292592c5
TV
710/* Read initial_length from BUF and advance the appropriate number of bytes. */
711
712static uint64_t
713read_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
eff02e4f
ILT
729/* Free an abbreviations structure. */
730
731static void
732free_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
753static int
c926fd82
ILT
754read_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,
944f59ff 757 struct dwarf_data *altlink, struct attr_val *val)
eff02e4f 758{
b20ade36
ILT
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
eff02e4f
ILT
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;
c926fd82
ILT
789 case DW_FORM_data16:
790 val->encoding = ATTR_VAL_BLOCK;
791 return advance (buf, 16);
eff02e4f
ILT
792 case DW_FORM_string:
793 val->encoding = ATTR_VAL_STRING;
17112570
TV
794 val->u.string = read_string (buf);
795 return val->u.string == NULL ? 0 : 1;
eff02e4f
ILT
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);
c926fd82 819 if (offset >= dwarf_sections->size[DEBUG_STR])
eff02e4f
ILT
820 {
821 dwarf_buf_error (buf, "DW_FORM_strp out of range");
822 return 0;
823 }
824 val->encoding = ATTR_VAL_STRING;
c926fd82
ILT
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;
eff02e4f
ILT
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);
c926fd82
ILT
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);
eff02e4f
ILT
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;
c926fd82
ILT
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;
eff02e4f
ILT
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:
eff02e4f 996 val->u.uint = read_offset (buf, is_dwarf64);
944f59ff
TV
997 if (altlink == NULL)
998 {
999 val->encoding = ATTR_VAL_NONE;
1000 return 1;
1001 }
1c2a9a37 1002 val->encoding = ATTR_VAL_REF_ALT_INFO;
eff02e4f 1003 return 1;
c926fd82 1004 case DW_FORM_strp_sup: case DW_FORM_GNU_strp_alt:
f2f00d3a
TV
1005 {
1006 uint64_t offset;
c926fd82 1007
f2f00d3a
TV
1008 offset = read_offset (buf, is_dwarf64);
1009 if (altlink == NULL)
1010 {
1011 val->encoding = ATTR_VAL_NONE;
1012 return 1;
1013 }
66ab5839 1014 if (offset >= altlink->dwarf_sections.size[DEBUG_STR])
f2f00d3a 1015 {
c926fd82 1016 dwarf_buf_error (buf, "DW_FORM_strp_sup out of range");
f2f00d3a
TV
1017 return 0;
1018 }
1019 val->encoding = ATTR_VAL_STRING;
66ab5839
ILT
1020 val->u.string =
1021 (const char *) altlink->dwarf_sections.data[DEBUG_STR] + offset;
f2f00d3a
TV
1022 return 1;
1023 }
eff02e4f
ILT
1024 default:
1025 dwarf_buf_error (buf, "unrecognized DWARF form");
1026 return 0;
1027 }
1028}
1029
c926fd82
ILT
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
1036static int
1037resolve_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
1089static int
1090resolve_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
9d576782
TV
1119/* Compare a unit offset against a unit for bsearch. */
1120
1121static int
1122units_search (const void *vkey, const void *ventry)
1123{
3f5d2012 1124 const size_t *key = (const size_t *) vkey;
9d576782 1125 const struct unit *entry = *((const struct unit *const *) ventry);
3f5d2012 1126 size_t offset;
9d576782
TV
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
1139static struct unit *
3f5d2012 1140find_unit (struct unit **pu, size_t units_count, size_t offset)
9d576782
TV
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
eff02e4f
ILT
1147/* Compare function_addrs for qsort. When ranges are nested, make the
1148 smallest one sort last. */
1149
1150static int
1151function_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. Note that if
1168 there are multiple ranges containing PC, which one will be returned
1169 is unpredictable. We compensate for that in dwarf_fileline. */
1170
1171static int
1172function_addrs_search (const void *vkey, const void *ventry)
1173{
1174 const uintptr_t *key = (const uintptr_t *) vkey;
1175 const struct function_addrs *entry = (const struct function_addrs *) ventry;
1176 uintptr_t pc;
1177
1178 pc = *key;
1179 if (pc < entry->low)
1180 return -1;
1181 else if (pc >= entry->high)
1182 return 1;
1183 else
1184 return 0;
1185}
1186
4b3fc188
ILT
1187/* Add a new compilation unit address range to a vector. This is
1188 called via add_ranges. Returns 1 on success, 0 on failure. */
eff02e4f
ILT
1189
1190static int
4b3fc188
ILT
1191add_unit_addr (struct backtrace_state *state, void *rdata,
1192 uint64_t lowpc, uint64_t highpc,
eff02e4f 1193 backtrace_error_callback error_callback, void *data,
4b3fc188 1194 void *pvec)
eff02e4f 1195{
4b3fc188
ILT
1196 struct unit *u = (struct unit *) rdata;
1197 struct unit_addrs_vector *vec = (struct unit_addrs_vector *) pvec;
eff02e4f
ILT
1198 struct unit_addrs *p;
1199
1200 /* Try to merge with the last entry. */
1201 if (vec->count > 0)
1202 {
1203 p = (struct unit_addrs *) vec->vec.base + (vec->count - 1);
4b3fc188
ILT
1204 if ((lowpc == p->high || lowpc == p->high + 1)
1205 && u == p->u)
eff02e4f 1206 {
4b3fc188
ILT
1207 if (highpc > p->high)
1208 p->high = highpc;
eff02e4f
ILT
1209 return 1;
1210 }
1211 }
1212
1213 p = ((struct unit_addrs *)
1214 backtrace_vector_grow (state, sizeof (struct unit_addrs),
1215 error_callback, data, &vec->vec));
1216 if (p == NULL)
1217 return 0;
1218
4b3fc188
ILT
1219 p->low = lowpc;
1220 p->high = highpc;
1221 p->u = u;
1222
eff02e4f 1223 ++vec->count;
4b3fc188 1224
eff02e4f
ILT
1225 return 1;
1226}
1227
eff02e4f
ILT
1228/* Compare unit_addrs for qsort. When ranges are nested, make the
1229 smallest one sort last. */
1230
1231static int
1232unit_addrs_compare (const void *v1, const void *v2)
1233{
1234 const struct unit_addrs *a1 = (const struct unit_addrs *) v1;
1235 const struct unit_addrs *a2 = (const struct unit_addrs *) v2;
1236
1237 if (a1->low < a2->low)
1238 return -1;
1239 if (a1->low > a2->low)
1240 return 1;
1241 if (a1->high < a2->high)
1242 return 1;
1243 if (a1->high > a2->high)
1244 return -1;
1245 if (a1->u->lineoff < a2->u->lineoff)
1246 return -1;
1247 if (a1->u->lineoff > a2->u->lineoff)
1248 return 1;
1249 return 0;
1250}
1251
1252/* Compare a PC against a unit_addrs for bsearch. Note that if there
1253 are multiple ranges containing PC, which one will be returned is
1254 unpredictable. We compensate for that in dwarf_fileline. */
1255
1256static int
1257unit_addrs_search (const void *vkey, const void *ventry)
1258{
1259 const uintptr_t *key = (const uintptr_t *) vkey;
1260 const struct unit_addrs *entry = (const struct unit_addrs *) ventry;
1261 uintptr_t pc;
1262
1263 pc = *key;
1264 if (pc < entry->low)
1265 return -1;
1266 else if (pc >= entry->high)
1267 return 1;
1268 else
1269 return 0;
1270}
1271
d99a7b4d
MS
1272/* Sort the line vector by PC. We want a stable sort here to maintain
1273 the order of lines for the same PC values. Since the sequence is
1274 being sorted in place, their addresses cannot be relied on to
1275 maintain stability. That is the purpose of the index member. */
eff02e4f
ILT
1276
1277static int
1278line_compare (const void *v1, const void *v2)
1279{
1280 const struct line *ln1 = (const struct line *) v1;
1281 const struct line *ln2 = (const struct line *) v2;
1282
1283 if (ln1->pc < ln2->pc)
1284 return -1;
1285 else if (ln1->pc > ln2->pc)
1286 return 1;
d99a7b4d 1287 else if (ln1->idx < ln2->idx)
eff02e4f 1288 return -1;
d99a7b4d 1289 else if (ln1->idx > ln2->idx)
eff02e4f
ILT
1290 return 1;
1291 else
1292 return 0;
1293}
1294
1295/* Find a PC in a line vector. We always allocate an extra entry at
1296 the end of the lines vector, so that this routine can safely look
1297 at the next entry. Note that when there are multiple mappings for
1298 the same PC value, this will return the last one. */
1299
1300static int
1301line_search (const void *vkey, const void *ventry)
1302{
1303 const uintptr_t *key = (const uintptr_t *) vkey;
1304 const struct line *entry = (const struct line *) ventry;
1305 uintptr_t pc;
1306
1307 pc = *key;
1308 if (pc < entry->pc)
1309 return -1;
1310 else if (pc >= (entry + 1)->pc)
1311 return 1;
1312 else
1313 return 0;
1314}
1315
1316/* Sort the abbrevs by the abbrev code. This function is passed to
1317 both qsort and bsearch. */
1318
1319static int
1320abbrev_compare (const void *v1, const void *v2)
1321{
1322 const struct abbrev *a1 = (const struct abbrev *) v1;
1323 const struct abbrev *a2 = (const struct abbrev *) v2;
1324
1325 if (a1->code < a2->code)
1326 return -1;
1327 else if (a1->code > a2->code)
1328 return 1;
1329 else
1330 {
1331 /* This really shouldn't happen. It means there are two
1332 different abbrevs with the same code, and that means we don't
1333 know which one lookup_abbrev should return. */
1334 return 0;
1335 }
1336}
1337
1338/* Read the abbreviation table for a compilation unit. Returns 1 on
1339 success, 0 on failure. */
1340
1341static int
1342read_abbrevs (struct backtrace_state *state, uint64_t abbrev_offset,
1343 const unsigned char *dwarf_abbrev, size_t dwarf_abbrev_size,
1344 int is_bigendian, backtrace_error_callback error_callback,
1345 void *data, struct abbrevs *abbrevs)
1346{
1347 struct dwarf_buf abbrev_buf;
1348 struct dwarf_buf count_buf;
1349 size_t num_abbrevs;
1350
1351 abbrevs->num_abbrevs = 0;
1352 abbrevs->abbrevs = NULL;
1353
1354 if (abbrev_offset >= dwarf_abbrev_size)
1355 {
1356 error_callback (data, "abbrev offset out of range", 0);
1357 return 0;
1358 }
1359
1360 abbrev_buf.name = ".debug_abbrev";
1361 abbrev_buf.start = dwarf_abbrev;
1362 abbrev_buf.buf = dwarf_abbrev + abbrev_offset;
1363 abbrev_buf.left = dwarf_abbrev_size - abbrev_offset;
1364 abbrev_buf.is_bigendian = is_bigendian;
1365 abbrev_buf.error_callback = error_callback;
1366 abbrev_buf.data = data;
1367 abbrev_buf.reported_underflow = 0;
1368
1369 /* Count the number of abbrevs in this list. */
1370
1371 count_buf = abbrev_buf;
1372 num_abbrevs = 0;
1373 while (read_uleb128 (&count_buf) != 0)
1374 {
1375 if (count_buf.reported_underflow)
1376 return 0;
1377 ++num_abbrevs;
1378 // Skip tag.
1379 read_uleb128 (&count_buf);
1380 // Skip has_children.
1381 read_byte (&count_buf);
1382 // Skip attributes.
1383 while (read_uleb128 (&count_buf) != 0)
c926fd82
ILT
1384 {
1385 uint64_t form;
1386
1387 form = read_uleb128 (&count_buf);
1388 if ((enum dwarf_form) form == DW_FORM_implicit_const)
1389 read_sleb128 (&count_buf);
1390 }
eff02e4f
ILT
1391 // Skip form of last attribute.
1392 read_uleb128 (&count_buf);
1393 }
1394
1395 if (count_buf.reported_underflow)
1396 return 0;
1397
1398 if (num_abbrevs == 0)
1399 return 1;
1400
eff02e4f
ILT
1401 abbrevs->abbrevs = ((struct abbrev *)
1402 backtrace_alloc (state,
1403 num_abbrevs * sizeof (struct abbrev),
1404 error_callback, data));
1405 if (abbrevs->abbrevs == NULL)
1406 return 0;
18c742b5 1407 abbrevs->num_abbrevs = num_abbrevs;
eff02e4f
ILT
1408 memset (abbrevs->abbrevs, 0, num_abbrevs * sizeof (struct abbrev));
1409
1410 num_abbrevs = 0;
1411 while (1)
1412 {
1413 uint64_t code;
1414 struct abbrev a;
1415 size_t num_attrs;
1416 struct attr *attrs;
1417
1418 if (abbrev_buf.reported_underflow)
1419 goto fail;
1420
1421 code = read_uleb128 (&abbrev_buf);
1422 if (code == 0)
1423 break;
1424
1425 a.code = code;
1426 a.tag = (enum dwarf_tag) read_uleb128 (&abbrev_buf);
1427 a.has_children = read_byte (&abbrev_buf);
1428
1429 count_buf = abbrev_buf;
1430 num_attrs = 0;
1431 while (read_uleb128 (&count_buf) != 0)
1432 {
c926fd82
ILT
1433 uint64_t form;
1434
eff02e4f 1435 ++num_attrs;
c926fd82
ILT
1436 form = read_uleb128 (&count_buf);
1437 if ((enum dwarf_form) form == DW_FORM_implicit_const)
1438 read_sleb128 (&count_buf);
eff02e4f
ILT
1439 }
1440
1441 if (num_attrs == 0)
1442 {
1443 attrs = NULL;
1444 read_uleb128 (&abbrev_buf);
1445 read_uleb128 (&abbrev_buf);
1446 }
1447 else
1448 {
1449 attrs = ((struct attr *)
1450 backtrace_alloc (state, num_attrs * sizeof *attrs,
1451 error_callback, data));
1452 if (attrs == NULL)
1453 goto fail;
1454 num_attrs = 0;
1455 while (1)
1456 {
1457 uint64_t name;
1458 uint64_t form;
1459
1460 name = read_uleb128 (&abbrev_buf);
1461 form = read_uleb128 (&abbrev_buf);
1462 if (name == 0)
1463 break;
1464 attrs[num_attrs].name = (enum dwarf_attribute) name;
1465 attrs[num_attrs].form = (enum dwarf_form) form;
c926fd82
ILT
1466 if ((enum dwarf_form) form == DW_FORM_implicit_const)
1467 attrs[num_attrs].val = read_sleb128 (&abbrev_buf);
1468 else
1469 attrs[num_attrs].val = 0;
eff02e4f
ILT
1470 ++num_attrs;
1471 }
1472 }
1473
1474 a.num_attrs = num_attrs;
1475 a.attrs = attrs;
1476
1477 abbrevs->abbrevs[num_abbrevs] = a;
1478 ++num_abbrevs;
1479 }
1480
c5604b48
ILT
1481 backtrace_qsort (abbrevs->abbrevs, abbrevs->num_abbrevs,
1482 sizeof (struct abbrev), abbrev_compare);
eff02e4f
ILT
1483
1484 return 1;
1485
1486 fail:
1487 free_abbrevs (state, abbrevs, error_callback, data);
1488 return 0;
1489}
1490
1491/* Return the abbrev information for an abbrev code. */
1492
1493static const struct abbrev *
1494lookup_abbrev (struct abbrevs *abbrevs, uint64_t code,
1495 backtrace_error_callback error_callback, void *data)
1496{
1497 struct abbrev key;
1498 void *p;
1499
1500 /* With GCC, where abbrevs are simply numbered in order, we should
1501 be able to just look up the entry. */
1502 if (code - 1 < abbrevs->num_abbrevs
1503 && abbrevs->abbrevs[code - 1].code == code)
1504 return &abbrevs->abbrevs[code - 1];
1505
1506 /* Otherwise we have to search. */
1507 memset (&key, 0, sizeof key);
1508 key.code = code;
1509 p = bsearch (&key, abbrevs->abbrevs, abbrevs->num_abbrevs,
1510 sizeof (struct abbrev), abbrev_compare);
1511 if (p == NULL)
1512 {
1513 error_callback (data, "invalid abbreviation code", 0);
1514 return NULL;
1515 }
1516 return (const struct abbrev *) p;
1517}
1518
4b3fc188
ILT
1519/* This struct is used to gather address range information while
1520 reading attributes. We use this while building a mapping from
1521 address ranges to compilation units and then again while mapping
1522 from address ranges to function entries. Normally either
1523 lowpc/highpc is set or ranges is set. */
1524
1525struct pcrange {
1526 uint64_t lowpc; /* The low PC value. */
1527 int have_lowpc; /* Whether a low PC value was found. */
c926fd82 1528 int lowpc_is_addr_index; /* Whether lowpc is in .debug_addr. */
4b3fc188
ILT
1529 uint64_t highpc; /* The high PC value. */
1530 int have_highpc; /* Whether a high PC value was found. */
1531 int highpc_is_relative; /* Whether highpc is relative to lowpc. */
c926fd82 1532 int highpc_is_addr_index; /* Whether highpc is in .debug_addr. */
4b3fc188
ILT
1533 uint64_t ranges; /* Offset in ranges section. */
1534 int have_ranges; /* Whether ranges is valid. */
c926fd82 1535 int ranges_is_index; /* Whether ranges is DW_FORM_rnglistx. */
4b3fc188
ILT
1536};
1537
1538/* Update PCRANGE from an attribute value. */
1539
1540static void
1541update_pcrange (const struct attr* attr, const struct attr_val* val,
1542 struct pcrange *pcrange)
1543{
1544 switch (attr->name)
1545 {
1546 case DW_AT_low_pc:
1547 if (val->encoding == ATTR_VAL_ADDRESS)
1548 {
1549 pcrange->lowpc = val->u.uint;
1550 pcrange->have_lowpc = 1;
1551 }
c926fd82
ILT
1552 else if (val->encoding == ATTR_VAL_ADDRESS_INDEX)
1553 {
1554 pcrange->lowpc = val->u.uint;
1555 pcrange->have_lowpc = 1;
1556 pcrange->lowpc_is_addr_index = 1;
1557 }
4b3fc188
ILT
1558 break;
1559
1560 case DW_AT_high_pc:
1561 if (val->encoding == ATTR_VAL_ADDRESS)
1562 {
1563 pcrange->highpc = val->u.uint;
1564 pcrange->have_highpc = 1;
1565 }
1566 else if (val->encoding == ATTR_VAL_UINT)
1567 {
1568 pcrange->highpc = val->u.uint;
1569 pcrange->have_highpc = 1;
1570 pcrange->highpc_is_relative = 1;
1571 }
c926fd82
ILT
1572 else if (val->encoding == ATTR_VAL_ADDRESS_INDEX)
1573 {
1574 pcrange->highpc = val->u.uint;
1575 pcrange->have_highpc = 1;
1576 pcrange->highpc_is_addr_index = 1;
1577 }
4b3fc188
ILT
1578 break;
1579
1580 case DW_AT_ranges:
1581 if (val->encoding == ATTR_VAL_UINT
1582 || val->encoding == ATTR_VAL_REF_SECTION)
1583 {
1584 pcrange->ranges = val->u.uint;
1585 pcrange->have_ranges = 1;
1586 }
c926fd82
ILT
1587 else if (val->encoding == ATTR_VAL_RNGLISTS_INDEX)
1588 {
1589 pcrange->ranges = val->u.uint;
1590 pcrange->have_ranges = 1;
1591 pcrange->ranges_is_index = 1;
1592 }
4b3fc188
ILT
1593 break;
1594
1595 default:
1596 break;
1597 }
1598}
1599
c926fd82
ILT
1600/* Call ADD_RANGE for a low/high PC pair. Returns 1 on success, 0 on
1601 error. */
eff02e4f
ILT
1602
1603static int
c926fd82
ILT
1604add_low_high_range (struct backtrace_state *state,
1605 const struct dwarf_sections *dwarf_sections,
1606 uintptr_t base_address, int is_bigendian,
1607 struct unit *u, const struct pcrange *pcrange,
1608 int (*add_range) (struct backtrace_state *state,
1609 void *rdata, uint64_t lowpc,
1610 uint64_t highpc,
1611 backtrace_error_callback error_callback,
1612 void *data, void *vec),
1613 void *rdata,
1614 backtrace_error_callback error_callback, void *data,
1615 void *vec)
eff02e4f 1616{
c926fd82
ILT
1617 uint64_t lowpc;
1618 uint64_t highpc;
eff02e4f 1619
c926fd82
ILT
1620 lowpc = pcrange->lowpc;
1621 if (pcrange->lowpc_is_addr_index)
4b3fc188 1622 {
c926fd82
ILT
1623 if (!resolve_addr_index (dwarf_sections, u->addr_base, u->addrsize,
1624 is_bigendian, lowpc, error_callback, data,
1625 &lowpc))
1626 return 0;
4b3fc188
ILT
1627 }
1628
c926fd82
ILT
1629 highpc = pcrange->highpc;
1630 if (pcrange->highpc_is_addr_index)
4b3fc188 1631 {
c926fd82
ILT
1632 if (!resolve_addr_index (dwarf_sections, u->addr_base, u->addrsize,
1633 is_bigendian, highpc, error_callback, data,
1634 &highpc))
1635 return 0;
4b3fc188 1636 }
c926fd82
ILT
1637 if (pcrange->highpc_is_relative)
1638 highpc += lowpc;
1639
1640 /* Add in the base address of the module when recording PC values,
1641 so that we can look up the PC directly. */
1642 lowpc += base_address;
1643 highpc += base_address;
1644
1645 return add_range (state, rdata, lowpc, highpc, error_callback, data, vec);
1646}
1647
1648/* Call ADD_RANGE for each range read from .debug_ranges, as used in
1649 DWARF versions 2 through 4. */
1650
1651static int
1652add_ranges_from_ranges (
1653 struct backtrace_state *state,
1654 const struct dwarf_sections *dwarf_sections,
1655 uintptr_t base_address, int is_bigendian,
1656 struct unit *u, uint64_t base,
1657 const struct pcrange *pcrange,
1658 int (*add_range) (struct backtrace_state *state, void *rdata,
1659 uint64_t lowpc, uint64_t highpc,
1660 backtrace_error_callback error_callback, void *data,
1661 void *vec),
1662 void *rdata,
1663 backtrace_error_callback error_callback, void *data,
1664 void *vec)
1665{
1666 struct dwarf_buf ranges_buf;
4b3fc188
ILT
1667
1668 if (pcrange->ranges >= dwarf_sections->size[DEBUG_RANGES])
eff02e4f
ILT
1669 {
1670 error_callback (data, "ranges offset out of range", 0);
1671 return 0;
1672 }
1673
1674 ranges_buf.name = ".debug_ranges";
4b3fc188
ILT
1675 ranges_buf.start = dwarf_sections->data[DEBUG_RANGES];
1676 ranges_buf.buf = dwarf_sections->data[DEBUG_RANGES] + pcrange->ranges;
1677 ranges_buf.left = dwarf_sections->size[DEBUG_RANGES] - pcrange->ranges;
eff02e4f
ILT
1678 ranges_buf.is_bigendian = is_bigendian;
1679 ranges_buf.error_callback = error_callback;
1680 ranges_buf.data = data;
1681 ranges_buf.reported_underflow = 0;
1682
1683 while (1)
1684 {
1685 uint64_t low;
1686 uint64_t high;
1687
1688 if (ranges_buf.reported_underflow)
1689 return 0;
1690
1691 low = read_address (&ranges_buf, u->addrsize);
1692 high = read_address (&ranges_buf, u->addrsize);
1693
1694 if (low == 0 && high == 0)
1695 break;
1696
1697 if (is_highest_address (low, u->addrsize))
1698 base = high;
1699 else
1700 {
4b3fc188
ILT
1701 if (!add_range (state, rdata,
1702 low + base + base_address,
1703 high + base + base_address,
1704 error_callback, data, vec))
eff02e4f
ILT
1705 return 0;
1706 }
1707 }
1708
1709 if (ranges_buf.reported_underflow)
1710 return 0;
1711
1712 return 1;
1713}
1714
c926fd82
ILT
1715/* Call ADD_RANGE for each range read from .debug_rnglists, as used in
1716 DWARF version 5. */
1717
1718static int
1719add_ranges_from_rnglists (
1720 struct backtrace_state *state,
1721 const struct dwarf_sections *dwarf_sections,
1722 uintptr_t base_address, int is_bigendian,
1723 struct unit *u, uint64_t base,
1724 const struct pcrange *pcrange,
1725 int (*add_range) (struct backtrace_state *state, void *rdata,
1726 uint64_t lowpc, uint64_t highpc,
1727 backtrace_error_callback error_callback, void *data,
1728 void *vec),
1729 void *rdata,
1730 backtrace_error_callback error_callback, void *data,
1731 void *vec)
1732{
1733 uint64_t offset;
1734 struct dwarf_buf rnglists_buf;
1735
1736 if (!pcrange->ranges_is_index)
1737 offset = pcrange->ranges;
1738 else
1739 offset = u->rnglists_base + pcrange->ranges * (u->is_dwarf64 ? 8 : 4);
1740 if (offset >= dwarf_sections->size[DEBUG_RNGLISTS])
1741 {
1742 error_callback (data, "rnglists offset out of range", 0);
1743 return 0;
1744 }
1745
1746 rnglists_buf.name = ".debug_rnglists";
1747 rnglists_buf.start = dwarf_sections->data[DEBUG_RNGLISTS];
1748 rnglists_buf.buf = dwarf_sections->data[DEBUG_RNGLISTS] + offset;
1749 rnglists_buf.left = dwarf_sections->size[DEBUG_RNGLISTS] - offset;
1750 rnglists_buf.is_bigendian = is_bigendian;
1751 rnglists_buf.error_callback = error_callback;
1752 rnglists_buf.data = data;
1753 rnglists_buf.reported_underflow = 0;
1754
1755 if (pcrange->ranges_is_index)
1756 {
1757 offset = read_offset (&rnglists_buf, u->is_dwarf64);
1758 offset += u->rnglists_base;
1759 if (offset >= dwarf_sections->size[DEBUG_RNGLISTS])
1760 {
1761 error_callback (data, "rnglists index offset out of range", 0);
1762 return 0;
1763 }
1764 rnglists_buf.buf = dwarf_sections->data[DEBUG_RNGLISTS] + offset;
1765 rnglists_buf.left = dwarf_sections->size[DEBUG_RNGLISTS] - offset;
1766 }
1767
1768 while (1)
1769 {
1770 unsigned char rle;
1771
1772 rle = read_byte (&rnglists_buf);
1773 if (rle == DW_RLE_end_of_list)
1774 break;
1775 switch (rle)
1776 {
1777 case DW_RLE_base_addressx:
1778 {
1779 uint64_t index;
1780
1781 index = read_uleb128 (&rnglists_buf);
1782 if (!resolve_addr_index (dwarf_sections, u->addr_base,
1783 u->addrsize, is_bigendian, index,
1784 error_callback, data, &base))
1785 return 0;
1786 }
1787 break;
1788
1789 case DW_RLE_startx_endx:
1790 {
1791 uint64_t index;
1792 uint64_t low;
1793 uint64_t high;
1794
1795 index = read_uleb128 (&rnglists_buf);
1796 if (!resolve_addr_index (dwarf_sections, u->addr_base,
1797 u->addrsize, is_bigendian, index,
1798 error_callback, data, &low))
1799 return 0;
1800 index = read_uleb128 (&rnglists_buf);
1801 if (!resolve_addr_index (dwarf_sections, u->addr_base,
1802 u->addrsize, is_bigendian, index,
1803 error_callback, data, &high))
1804 return 0;
1805 if (!add_range (state, rdata, low + base_address,
1806 high + base_address, error_callback, data,
1807 vec))
1808 return 0;
1809 }
1810 break;
1811
1812 case DW_RLE_startx_length:
1813 {
1814 uint64_t index;
1815 uint64_t low;
1816 uint64_t length;
1817
1818 index = read_uleb128 (&rnglists_buf);
1819 if (!resolve_addr_index (dwarf_sections, u->addr_base,
1820 u->addrsize, is_bigendian, index,
1821 error_callback, data, &low))
1822 return 0;
1823 length = read_uleb128 (&rnglists_buf);
1824 low += base_address;
1825 if (!add_range (state, rdata, low, low + length,
1826 error_callback, data, vec))
1827 return 0;
1828 }
1829 break;
1830
1831 case DW_RLE_offset_pair:
1832 {
1833 uint64_t low;
1834 uint64_t high;
1835
1836 low = read_uleb128 (&rnglists_buf);
1837 high = read_uleb128 (&rnglists_buf);
1838 if (!add_range (state, rdata, low + base + base_address,
1839 high + base + base_address,
1840 error_callback, data, vec))
1841 return 0;
1842 }
1843 break;
1844
1845 case DW_RLE_base_address:
1846 base = read_address (&rnglists_buf, u->addrsize);
1847 break;
1848
1849 case DW_RLE_start_end:
1850 {
1851 uint64_t low;
1852 uint64_t high;
1853
1854 low = read_address (&rnglists_buf, u->addrsize);
1855 high = read_address (&rnglists_buf, u->addrsize);
1856 if (!add_range (state, rdata, low + base_address,
1857 high + base_address, error_callback, data,
1858 vec))
1859 return 0;
1860 }
1861 break;
1862
1863 case DW_RLE_start_length:
1864 {
1865 uint64_t low;
1866 uint64_t length;
1867
1868 low = read_address (&rnglists_buf, u->addrsize);
1869 length = read_uleb128 (&rnglists_buf);
1870 low += base_address;
1871 if (!add_range (state, rdata, low, low + length,
1872 error_callback, data, vec))
1873 return 0;
1874 }
1875 break;
1876
1877 default:
1878 dwarf_buf_error (&rnglists_buf, "unrecognized DW_RLE value");
1879 return 0;
1880 }
1881 }
1882
1883 if (rnglists_buf.reported_underflow)
1884 return 0;
1885
1886 return 1;
1887}
1888
1889/* Call ADD_RANGE for each lowpc/highpc pair in PCRANGE. RDATA is
1890 passed to ADD_RANGE, and is either a struct unit * or a struct
1891 function *. VEC is the vector we are adding ranges to, and is
1892 either a struct unit_addrs_vector * or a struct function_vector *.
1893 Returns 1 on success, 0 on error. */
1894
1895static int
1896add_ranges (struct backtrace_state *state,
1897 const struct dwarf_sections *dwarf_sections,
1898 uintptr_t base_address, int is_bigendian,
1899 struct unit *u, uint64_t base, const struct pcrange *pcrange,
1900 int (*add_range) (struct backtrace_state *state, void *rdata,
1901 uint64_t lowpc, uint64_t highpc,
1902 backtrace_error_callback error_callback,
1903 void *data, void *vec),
1904 void *rdata,
1905 backtrace_error_callback error_callback, void *data,
1906 void *vec)
1907{
1908 if (pcrange->have_lowpc && pcrange->have_highpc)
1909 return add_low_high_range (state, dwarf_sections, base_address,
1910 is_bigendian, u, pcrange, add_range, rdata,
1911 error_callback, data, vec);
1912
1913 if (!pcrange->have_ranges)
1914 {
1915 /* Did not find any address ranges to add. */
1916 return 1;
1917 }
1918
1919 if (u->version < 5)
1920 return add_ranges_from_ranges (state, dwarf_sections, base_address,
1921 is_bigendian, u, base, pcrange, add_range,
1922 rdata, error_callback, data, vec);
1923 else
1924 return add_ranges_from_rnglists (state, dwarf_sections, base_address,
1925 is_bigendian, u, base, pcrange, add_range,
1926 rdata, error_callback, data, vec);
1927}
1928
b8ddd61b
ILT
1929/* Find the address range covered by a compilation unit, reading from
1930 UNIT_BUF and adding values to U. Returns 1 if all data could be
1931 read, 0 if there is some error. */
eff02e4f
ILT
1932
1933static int
b8ddd61b 1934find_address_ranges (struct backtrace_state *state, uintptr_t base_address,
84ebf639 1935 struct dwarf_buf *unit_buf,
4b3fc188 1936 const struct dwarf_sections *dwarf_sections,
944f59ff
TV
1937 int is_bigendian, struct dwarf_data *altlink,
1938 backtrace_error_callback error_callback, void *data,
9d576782
TV
1939 struct unit *u, struct unit_addrs_vector *addrs,
1940 enum dwarf_tag *unit_tag)
eff02e4f 1941{
b8ddd61b 1942 while (unit_buf->left > 0)
eff02e4f 1943 {
eff02e4f 1944 uint64_t code;
b8ddd61b 1945 const struct abbrev *abbrev;
4b3fc188 1946 struct pcrange pcrange;
c926fd82
ILT
1947 struct attr_val name_val;
1948 int have_name_val;
1949 struct attr_val comp_dir_val;
1950 int have_comp_dir_val;
b8ddd61b 1951 size_t i;
eff02e4f 1952
b8ddd61b
ILT
1953 code = read_uleb128 (unit_buf);
1954 if (code == 0)
1955 return 1;
eff02e4f 1956
b8ddd61b 1957 abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
eff02e4f 1958 if (abbrev == NULL)
b8ddd61b 1959 return 0;
eff02e4f 1960
9d576782
TV
1961 if (unit_tag != NULL)
1962 *unit_tag = abbrev->tag;
1963
4b3fc188 1964 memset (&pcrange, 0, sizeof pcrange);
c926fd82
ILT
1965 memset (&name_val, 0, sizeof name_val);
1966 have_name_val = 0;
1967 memset (&comp_dir_val, 0, sizeof comp_dir_val);
1968 have_comp_dir_val = 0;
eff02e4f
ILT
1969 for (i = 0; i < abbrev->num_attrs; ++i)
1970 {
1971 struct attr_val val;
1972
c926fd82
ILT
1973 if (!read_attribute (abbrev->attrs[i].form, abbrev->attrs[i].val,
1974 unit_buf, u->is_dwarf64, u->version,
1975 u->addrsize, dwarf_sections, altlink, &val))
b8ddd61b 1976 return 0;
eff02e4f
ILT
1977
1978 switch (abbrev->attrs[i].name)
1979 {
4b3fc188
ILT
1980 case DW_AT_low_pc: case DW_AT_high_pc: case DW_AT_ranges:
1981 update_pcrange (&abbrev->attrs[i], &val, &pcrange);
eff02e4f 1982 break;
b8ddd61b 1983
eff02e4f 1984 case DW_AT_stmt_list:
b8ddd61b
ILT
1985 if (abbrev->tag == DW_TAG_compile_unit
1986 && (val.encoding == ATTR_VAL_UINT
1987 || val.encoding == ATTR_VAL_REF_SECTION))
1988 u->lineoff = val.u.uint;
eff02e4f 1989 break;
b8ddd61b 1990
6b514c53 1991 case DW_AT_name:
c926fd82
ILT
1992 if (abbrev->tag == DW_TAG_compile_unit)
1993 {
1994 name_val = val;
1995 have_name_val = 1;
1996 }
6b514c53 1997 break;
b8ddd61b 1998
eff02e4f 1999 case DW_AT_comp_dir:
c926fd82
ILT
2000 if (abbrev->tag == DW_TAG_compile_unit)
2001 {
2002 comp_dir_val = val;
2003 have_comp_dir_val = 1;
2004 }
2005 break;
2006
2007 case DW_AT_str_offsets_base:
2008 if (abbrev->tag == DW_TAG_compile_unit
2009 && val.encoding == ATTR_VAL_REF_SECTION)
2010 u->str_offsets_base = val.u.uint;
2011 break;
2012
2013 case DW_AT_addr_base:
2014 if (abbrev->tag == DW_TAG_compile_unit
2015 && val.encoding == ATTR_VAL_REF_SECTION)
2016 u->addr_base = val.u.uint;
2017 break;
2018
2019 case DW_AT_rnglists_base:
b8ddd61b 2020 if (abbrev->tag == DW_TAG_compile_unit
c926fd82
ILT
2021 && val.encoding == ATTR_VAL_REF_SECTION)
2022 u->rnglists_base = val.u.uint;
eff02e4f 2023 break;
b8ddd61b 2024
eff02e4f
ILT
2025 default:
2026 break;
2027 }
2028 }
2029
c926fd82
ILT
2030 // Resolve strings after we're sure that we have seen
2031 // DW_AT_str_offsets_base.
2032 if (have_name_val)
2033 {
2034 if (!resolve_string (dwarf_sections, u->is_dwarf64, is_bigendian,
2035 u->str_offsets_base, &name_val,
2036 error_callback, data, &u->filename))
2037 return 0;
2038 }
2039 if (have_comp_dir_val)
2040 {
2041 if (!resolve_string (dwarf_sections, u->is_dwarf64, is_bigendian,
2042 u->str_offsets_base, &comp_dir_val,
2043 error_callback, data, &u->comp_dir))
2044 return 0;
2045 }
2046
b8ddd61b
ILT
2047 if (abbrev->tag == DW_TAG_compile_unit
2048 || abbrev->tag == DW_TAG_subprogram)
eff02e4f 2049 {
4b3fc188
ILT
2050 if (!add_ranges (state, dwarf_sections, base_address,
2051 is_bigendian, u, pcrange.lowpc, &pcrange,
2052 add_unit_addr, (void *) u, error_callback, data,
2053 (void *) addrs))
2054 return 0;
b8ddd61b
ILT
2055
2056 /* If we found the PC range in the DW_TAG_compile_unit, we
2057 can stop now. */
2058 if (abbrev->tag == DW_TAG_compile_unit
4b3fc188
ILT
2059 && (pcrange.have_ranges
2060 || (pcrange.have_lowpc && pcrange.have_highpc)))
b8ddd61b 2061 return 1;
eff02e4f 2062 }
b8ddd61b
ILT
2063
2064 if (abbrev->has_children)
eff02e4f 2065 {
b8ddd61b 2066 if (!find_address_ranges (state, base_address, unit_buf,
4b3fc188
ILT
2067 dwarf_sections, is_bigendian, altlink,
2068 error_callback, data, u, addrs, NULL))
b8ddd61b
ILT
2069 return 0;
2070 }
2071 }
2072
2073 return 1;
2074}
2075
2076/* Build a mapping from address ranges to the compilation units where
2077 the line number information for that range can be found. Returns 1
2078 on success, 0 on failure. */
2079
2080static int
2081build_address_map (struct backtrace_state *state, uintptr_t base_address,
66ab5839 2082 const struct dwarf_sections *dwarf_sections,
944f59ff
TV
2083 int is_bigendian, struct dwarf_data *altlink,
2084 backtrace_error_callback error_callback, void *data,
9d576782
TV
2085 struct unit_addrs_vector *addrs,
2086 struct unit_vector *unit_vec)
b8ddd61b
ILT
2087{
2088 struct dwarf_buf info;
40b8d3b2
ILT
2089 struct backtrace_vector units;
2090 size_t units_count;
2091 size_t i;
2092 struct unit **pu;
3f5d2012 2093 size_t unit_offset = 0;
b8ddd61b
ILT
2094
2095 memset (&addrs->vec, 0, sizeof addrs->vec);
9d576782 2096 memset (&unit_vec->vec, 0, sizeof unit_vec->vec);
b8ddd61b 2097 addrs->count = 0;
9d576782 2098 unit_vec->count = 0;
b8ddd61b
ILT
2099
2100 /* Read through the .debug_info section. FIXME: Should we use the
2101 .debug_aranges section? gdb and addr2line don't use it, but I'm
2102 not sure why. */
2103
2104 info.name = ".debug_info";
66ab5839
ILT
2105 info.start = dwarf_sections->data[DEBUG_INFO];
2106 info.buf = info.start;
2107 info.left = dwarf_sections->size[DEBUG_INFO];
b8ddd61b
ILT
2108 info.is_bigendian = is_bigendian;
2109 info.error_callback = error_callback;
2110 info.data = data;
2111 info.reported_underflow = 0;
2112
40b8d3b2
ILT
2113 memset (&units, 0, sizeof units);
2114 units_count = 0;
2115
b8ddd61b
ILT
2116 while (info.left > 0)
2117 {
2118 const unsigned char *unit_data_start;
2119 uint64_t len;
2120 int is_dwarf64;
2121 struct dwarf_buf unit_buf;
2122 int version;
c926fd82 2123 int unit_type;
b8ddd61b
ILT
2124 uint64_t abbrev_offset;
2125 int addrsize;
2126 struct unit *u;
9d576782 2127 enum dwarf_tag unit_tag;
b8ddd61b
ILT
2128
2129 if (info.reported_underflow)
2130 goto fail;
2131
2132 unit_data_start = info.buf;
2133
292592c5 2134 len = read_initial_length (&info, &is_dwarf64);
b8ddd61b
ILT
2135 unit_buf = info;
2136 unit_buf.left = len;
2137
2138 if (!advance (&info, len))
2139 goto fail;
2140
2141 version = read_uint16 (&unit_buf);
c926fd82 2142 if (version < 2 || version > 5)
b8ddd61b
ILT
2143 {
2144 dwarf_buf_error (&unit_buf, "unrecognized DWARF version");
2145 goto fail;
2146 }
2147
c926fd82
ILT
2148 if (version < 5)
2149 unit_type = 0;
2150 else
2151 {
2152 unit_type = read_byte (&unit_buf);
2153 if (unit_type == DW_UT_type || unit_type == DW_UT_split_type)
2154 {
2155 /* This unit doesn't have anything we need. */
2156 continue;
2157 }
2158 }
2159
40b8d3b2
ILT
2160 pu = ((struct unit **)
2161 backtrace_vector_grow (state, sizeof (struct unit *),
2162 error_callback, data, &units));
2163 if (pu == NULL)
2164 goto fail;
2165
b8ddd61b
ILT
2166 u = ((struct unit *)
2167 backtrace_alloc (state, sizeof *u, error_callback, data));
2168 if (u == NULL)
2169 goto fail;
40b8d3b2
ILT
2170
2171 *pu = u;
2172 ++units_count;
2173
c926fd82
ILT
2174 if (version < 5)
2175 addrsize = 0; /* Set below. */
2176 else
2177 addrsize = read_byte (&unit_buf);
2178
d9aa0961
TV
2179 memset (&u->abbrevs, 0, sizeof u->abbrevs);
2180 abbrev_offset = read_offset (&unit_buf, is_dwarf64);
66ab5839
ILT
2181 if (!read_abbrevs (state, abbrev_offset,
2182 dwarf_sections->data[DEBUG_ABBREV],
2183 dwarf_sections->size[DEBUG_ABBREV],
d9aa0961
TV
2184 is_bigendian, error_callback, data, &u->abbrevs))
2185 goto fail;
2186
c926fd82
ILT
2187 if (version < 5)
2188 addrsize = read_byte (&unit_buf);
2189
2190 switch (unit_type)
2191 {
2192 case 0:
2193 break;
2194 case DW_UT_compile: case DW_UT_partial:
2195 break;
2196 case DW_UT_skeleton: case DW_UT_split_compile:
2197 read_uint64 (&unit_buf); /* dwo_id */
2198 break;
2199 default:
2200 break;
2201 }
d9aa0961 2202
9d576782
TV
2203 u->low_offset = unit_offset;
2204 unit_offset += len + (is_dwarf64 ? 12 : 4);
2205 u->high_offset = unit_offset;
b8ddd61b
ILT
2206 u->unit_data = unit_buf.buf;
2207 u->unit_data_len = unit_buf.left;
2208 u->unit_data_offset = unit_buf.buf - unit_data_start;
2209 u->version = version;
2210 u->is_dwarf64 = is_dwarf64;
2211 u->addrsize = addrsize;
2212 u->filename = NULL;
2213 u->comp_dir = NULL;
2214 u->abs_filename = NULL;
2215 u->lineoff = 0;
b8ddd61b
ILT
2216
2217 /* The actual line number mappings will be read as needed. */
2218 u->lines = NULL;
2219 u->lines_count = 0;
2220 u->function_addrs = NULL;
2221 u->function_addrs_count = 0;
2222
4b3fc188 2223 if (!find_address_ranges (state, base_address, &unit_buf, dwarf_sections,
944f59ff 2224 is_bigendian, altlink, error_callback, data,
9d576782 2225 u, addrs, &unit_tag))
40b8d3b2 2226 goto fail;
b8ddd61b
ILT
2227
2228 if (unit_buf.reported_underflow)
40b8d3b2 2229 goto fail;
eff02e4f
ILT
2230 }
2231 if (info.reported_underflow)
2232 goto fail;
2233
9d576782
TV
2234 unit_vec->vec = units;
2235 unit_vec->count = units_count;
eff02e4f
ILT
2236 return 1;
2237
2238 fail:
40b8d3b2
ILT
2239 if (units_count > 0)
2240 {
2241 pu = (struct unit **) units.base;
2242 for (i = 0; i < units_count; i++)
2243 {
2244 free_abbrevs (state, &pu[i]->abbrevs, error_callback, data);
2245 backtrace_free (state, pu[i], sizeof **pu, error_callback, data);
2246 }
2247 backtrace_vector_free (state, &units, error_callback, data);
2248 }
53a52133
TV
2249 if (addrs->count > 0)
2250 {
2251 backtrace_vector_free (state, &addrs->vec, error_callback, data);
2252 addrs->count = 0;
2253 }
eff02e4f
ILT
2254 return 0;
2255}
2256
2257/* Add a new mapping to the vector of line mappings that we are
2258 building. Returns 1 on success, 0 on failure. */
2259
2260static int
e561a992
ILT
2261add_line (struct backtrace_state *state, struct dwarf_data *ddata,
2262 uintptr_t pc, const char *filename, int lineno,
2263 backtrace_error_callback error_callback, void *data,
eff02e4f
ILT
2264 struct line_vector *vec)
2265{
2266 struct line *ln;
2267
2268 /* If we are adding the same mapping, ignore it. This can happen
2269 when using discriminators. */
2270 if (vec->count > 0)
2271 {
2272 ln = (struct line *) vec->vec.base + (vec->count - 1);
2273 if (pc == ln->pc && filename == ln->filename && lineno == ln->lineno)
2274 return 1;
2275 }
2276
2277 ln = ((struct line *)
2278 backtrace_vector_grow (state, sizeof (struct line), error_callback,
2279 data, &vec->vec));
2280 if (ln == NULL)
2281 return 0;
2282
e561a992
ILT
2283 /* Add in the base address here, so that we can look up the PC
2284 directly. */
2285 ln->pc = pc + ddata->base_address;
2286
eff02e4f
ILT
2287 ln->filename = filename;
2288 ln->lineno = lineno;
d99a7b4d 2289 ln->idx = vec->count;
eff02e4f
ILT
2290
2291 ++vec->count;
2292
2293 return 1;
2294}
2295
281161d1 2296/* Free the line header information. */
eff02e4f
ILT
2297
2298static void
2299free_line_header (struct backtrace_state *state, struct line_header *hdr,
2300 backtrace_error_callback error_callback, void *data)
2301{
281161d1
TM
2302 if (hdr->dirs_count != 0)
2303 backtrace_free (state, hdr->dirs, hdr->dirs_count * sizeof (const char *),
2304 error_callback, data);
eff02e4f
ILT
2305 backtrace_free (state, hdr->filenames,
2306 hdr->filenames_count * sizeof (char *),
2307 error_callback, data);
2308}
2309
c926fd82
ILT
2310/* Read the directories and file names for a line header for version
2311 2, setting fields in HDR. Return 1 on success, 0 on failure. */
eff02e4f
ILT
2312
2313static int
c926fd82
ILT
2314read_v2_paths (struct backtrace_state *state, struct unit *u,
2315 struct dwarf_buf *hdr_buf, struct line_header *hdr)
eff02e4f 2316{
eff02e4f
ILT
2317 const unsigned char *p;
2318 const unsigned char *pend;
2319 size_t i;
2320
eff02e4f
ILT
2321 /* Count the number of directory entries. */
2322 hdr->dirs_count = 0;
c926fd82
ILT
2323 p = hdr_buf->buf;
2324 pend = p + hdr_buf->left;
eff02e4f
ILT
2325 while (p < pend && *p != '\0')
2326 {
2327 p += strnlen((const char *) p, pend - p) + 1;
2328 ++hdr->dirs_count;
2329 }
2330
281161d1
TM
2331 hdr->dirs = NULL;
2332 if (hdr->dirs_count != 0)
2333 {
2334 hdr->dirs = ((const char **)
2335 backtrace_alloc (state,
2336 hdr->dirs_count * sizeof (const char *),
c926fd82
ILT
2337 hdr_buf->error_callback,
2338 hdr_buf->data));
281161d1
TM
2339 if (hdr->dirs == NULL)
2340 return 0;
2341 }
eff02e4f
ILT
2342
2343 i = 0;
c926fd82 2344 while (*hdr_buf->buf != '\0')
eff02e4f 2345 {
c926fd82 2346 if (hdr_buf->reported_underflow)
eff02e4f
ILT
2347 return 0;
2348
c926fd82 2349 hdr->dirs[i] = read_string (hdr_buf);
17112570 2350 if (hdr->dirs[i] == NULL)
eff02e4f 2351 return 0;
17112570 2352 ++i;
eff02e4f 2353 }
c926fd82 2354 if (!advance (hdr_buf, 1))
eff02e4f
ILT
2355 return 0;
2356
2357 /* Count the number of file entries. */
2358 hdr->filenames_count = 0;
c926fd82
ILT
2359 p = hdr_buf->buf;
2360 pend = p + hdr_buf->left;
eff02e4f
ILT
2361 while (p < pend && *p != '\0')
2362 {
2363 p += strnlen ((const char *) p, pend - p) + 1;
2364 p += leb128_len (p);
2365 p += leb128_len (p);
2366 p += leb128_len (p);
2367 ++hdr->filenames_count;
2368 }
2369
2370 hdr->filenames = ((const char **)
2371 backtrace_alloc (state,
2372 hdr->filenames_count * sizeof (char *),
c926fd82
ILT
2373 hdr_buf->error_callback,
2374 hdr_buf->data));
eff02e4f
ILT
2375 if (hdr->filenames == NULL)
2376 return 0;
2377 i = 0;
c926fd82 2378 while (*hdr_buf->buf != '\0')
eff02e4f
ILT
2379 {
2380 const char *filename;
2381 uint64_t dir_index;
2382
c926fd82 2383 if (hdr_buf->reported_underflow)
eff02e4f
ILT
2384 return 0;
2385
c926fd82 2386 filename = read_string (hdr_buf);
17112570 2387 if (filename == NULL)
eff02e4f 2388 return 0;
c926fd82 2389 dir_index = read_uleb128 (hdr_buf);
1e678aed
JJ
2390 if (IS_ABSOLUTE_PATH (filename)
2391 || (dir_index == 0 && u->comp_dir == NULL))
eff02e4f
ILT
2392 hdr->filenames[i] = filename;
2393 else
2394 {
2395 const char *dir;
2396 size_t dir_len;
2397 size_t filename_len;
2398 char *s;
2399
2400 if (dir_index == 0)
2401 dir = u->comp_dir;
2402 else if (dir_index - 1 < hdr->dirs_count)
2403 dir = hdr->dirs[dir_index - 1];
2404 else
2405 {
c926fd82 2406 dwarf_buf_error (hdr_buf,
eff02e4f
ILT
2407 ("invalid directory index in "
2408 "line number program header"));
2409 return 0;
2410 }
2411 dir_len = strlen (dir);
2412 filename_len = strlen (filename);
c926fd82
ILT
2413 s = ((char *) backtrace_alloc (state, dir_len + filename_len + 2,
2414 hdr_buf->error_callback,
2415 hdr_buf->data));
eff02e4f
ILT
2416 if (s == NULL)
2417 return 0;
2418 memcpy (s, dir, dir_len);
2419 /* FIXME: If we are on a DOS-based file system, and the
2420 directory or the file name use backslashes, then we
2421 should use a backslash here. */
2422 s[dir_len] = '/';
2423 memcpy (s + dir_len + 1, filename, filename_len + 1);
2424 hdr->filenames[i] = s;
2425 }
2426
2427 /* Ignore the modification time and size. */
c926fd82
ILT
2428 read_uleb128 (hdr_buf);
2429 read_uleb128 (hdr_buf);
eff02e4f
ILT
2430
2431 ++i;
2432 }
2433
c926fd82
ILT
2434 return 1;
2435}
2436
2437/* Read a single version 5 LNCT entry for a directory or file name in a
2438 line header. Sets *STRING to the resulting name, ignoring other
2439 data. Return 1 on success, 0 on failure. */
2440
2441static int
2442read_lnct (struct backtrace_state *state, struct dwarf_data *ddata,
2443 struct unit *u, struct dwarf_buf *hdr_buf,
2444 const struct line_header *hdr, size_t formats_count,
2445 const struct line_header_format *formats, const char **string)
2446{
2447 size_t i;
2448 const char *dir;
2449 const char *path;
2450
2451 dir = NULL;
2452 path = NULL;
2453 for (i = 0; i < formats_count; i++)
2454 {
2455 struct attr_val val;
2456
2457 if (!read_attribute (formats[i].form, 0, hdr_buf, u->is_dwarf64,
2458 u->version, hdr->addrsize, &ddata->dwarf_sections,
2459 ddata->altlink, &val))
2460 return 0;
2461 switch (formats[i].lnct)
2462 {
2463 case DW_LNCT_path:
2464 if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
2465 ddata->is_bigendian, u->str_offsets_base,
2466 &val, hdr_buf->error_callback, hdr_buf->data,
2467 &path))
2468 return 0;
2469 break;
2470 case DW_LNCT_directory_index:
2471 if (val.encoding == ATTR_VAL_UINT)
2472 {
2473 if (val.u.uint >= hdr->dirs_count)
2474 {
2475 dwarf_buf_error (hdr_buf,
2476 ("invalid directory index in "
2477 "line number program header"));
2478 return 0;
2479 }
2480 dir = hdr->dirs[val.u.uint];
2481 }
2482 break;
2483 default:
2484 /* We don't care about timestamps or sizes or hashes. */
2485 break;
2486 }
2487 }
2488
2489 if (path == NULL)
2490 {
2491 dwarf_buf_error (hdr_buf,
2492 "missing file name in line number program header");
2493 return 0;
2494 }
2495
2496 if (dir == NULL)
2497 *string = path;
2498 else
2499 {
2500 size_t dir_len;
2501 size_t path_len;
2502 char *s;
2503
2504 dir_len = strlen (dir);
2505 path_len = strlen (path);
2506 s = (char *) backtrace_alloc (state, dir_len + path_len + 2,
2507 hdr_buf->error_callback, hdr_buf->data);
2508 if (s == NULL)
2509 return 0;
2510 memcpy (s, dir, dir_len);
2511 /* FIXME: If we are on a DOS-based file system, and the
2512 directory or the path name use backslashes, then we should
2513 use a backslash here. */
2514 s[dir_len] = '/';
2515 memcpy (s + dir_len + 1, path, path_len + 1);
2516 *string = s;
2517 }
2518
2519 return 1;
2520}
2521
2522/* Read a set of DWARF 5 line header format entries, setting *PCOUNT
2523 and *PPATHS. Return 1 on success, 0 on failure. */
2524
2525static int
2526read_line_header_format_entries (struct backtrace_state *state,
2527 struct dwarf_data *ddata,
2528 struct unit *u,
2529 struct dwarf_buf *hdr_buf,
2530 struct line_header *hdr,
2531 size_t *pcount,
2532 const char ***ppaths)
2533{
2534 size_t formats_count;
2535 struct line_header_format *formats;
2536 size_t paths_count;
2537 const char **paths;
2538 size_t i;
2539 int ret;
2540
2541 formats_count = read_byte (hdr_buf);
2542 if (formats_count == 0)
2543 formats = NULL;
2544 else
2545 {
2546 formats = ((struct line_header_format *)
2547 backtrace_alloc (state,
2548 (formats_count
2549 * sizeof (struct line_header_format)),
2550 hdr_buf->error_callback,
2551 hdr_buf->data));
2552 if (formats == NULL)
2553 return 0;
2554
2555 for (i = 0; i < formats_count; i++)
2556 {
2557 formats[i].lnct = (int) read_uleb128(hdr_buf);
2558 formats[i].form = (enum dwarf_form) read_uleb128 (hdr_buf);
2559 }
2560 }
2561
2562 paths_count = read_uleb128 (hdr_buf);
2563 if (paths_count == 0)
2564 {
2565 *pcount = 0;
2566 *ppaths = NULL;
2567 ret = 1;
2568 goto exit;
2569 }
2570
2571 paths = ((const char **)
2572 backtrace_alloc (state, paths_count * sizeof (const char *),
2573 hdr_buf->error_callback, hdr_buf->data));
2574 if (paths == NULL)
2575 {
2576 ret = 0;
2577 goto exit;
2578 }
2579 for (i = 0; i < paths_count; i++)
2580 {
2581 if (!read_lnct (state, ddata, u, hdr_buf, hdr, formats_count,
2582 formats, &paths[i]))
2583 {
2584 backtrace_free (state, paths,
2585 paths_count * sizeof (const char *),
2586 hdr_buf->error_callback, hdr_buf->data);
2587 ret = 0;
2588 goto exit;
2589 }
2590 }
2591
2592 *pcount = paths_count;
2593 *ppaths = paths;
2594
2595 ret = 1;
2596
2597 exit:
2598 if (formats != NULL)
2599 backtrace_free (state, formats,
2600 formats_count * sizeof (struct line_header_format),
2601 hdr_buf->error_callback, hdr_buf->data);
2602
2603 return ret;
2604}
2605
2606/* Read the line header. Return 1 on success, 0 on failure. */
2607
2608static int
2609read_line_header (struct backtrace_state *state, struct dwarf_data *ddata,
2610 struct unit *u, int is_dwarf64, struct dwarf_buf *line_buf,
2611 struct line_header *hdr)
2612{
2613 uint64_t hdrlen;
2614 struct dwarf_buf hdr_buf;
2615
2616 hdr->version = read_uint16 (line_buf);
2617 if (hdr->version < 2 || hdr->version > 5)
2618 {
2619 dwarf_buf_error (line_buf, "unsupported line number version");
2620 return 0;
2621 }
2622
2623 if (hdr->version < 5)
2624 hdr->addrsize = u->addrsize;
2625 else
2626 {
2627 hdr->addrsize = read_byte (line_buf);
2628 /* We could support a non-zero segment_selector_size but I doubt
2629 we'll ever see it. */
2630 if (read_byte (line_buf) != 0)
2631 {
2632 dwarf_buf_error (line_buf,
2633 "non-zero segment_selector_size not supported");
2634 return 0;
2635 }
2636 }
2637
2638 hdrlen = read_offset (line_buf, is_dwarf64);
2639
2640 hdr_buf = *line_buf;
2641 hdr_buf.left = hdrlen;
2642
2643 if (!advance (line_buf, hdrlen))
2644 return 0;
2645
2646 hdr->min_insn_len = read_byte (&hdr_buf);
2647 if (hdr->version < 4)
2648 hdr->max_ops_per_insn = 1;
2649 else
2650 hdr->max_ops_per_insn = read_byte (&hdr_buf);
2651
2652 /* We don't care about default_is_stmt. */
2653 read_byte (&hdr_buf);
2654
2655 hdr->line_base = read_sbyte (&hdr_buf);
2656 hdr->line_range = read_byte (&hdr_buf);
2657
2658 hdr->opcode_base = read_byte (&hdr_buf);
2659 hdr->opcode_lengths = hdr_buf.buf;
2660 if (!advance (&hdr_buf, hdr->opcode_base - 1))
2661 return 0;
2662
2663 if (hdr->version < 5)
2664 {
2665 if (!read_v2_paths (state, u, &hdr_buf, hdr))
2666 return 0;
2667 }
2668 else
2669 {
2670 if (!read_line_header_format_entries (state, ddata, u, &hdr_buf, hdr,
2671 &hdr->dirs_count,
2672 &hdr->dirs))
2673 return 0;
2674 if (!read_line_header_format_entries (state, ddata, u, &hdr_buf, hdr,
2675 &hdr->filenames_count,
2676 &hdr->filenames))
2677 return 0;
2678 }
2679
eff02e4f
ILT
2680 if (hdr_buf.reported_underflow)
2681 return 0;
2682
2683 return 1;
2684}
2685
2686/* Read the line program, adding line mappings to VEC. Return 1 on
2687 success, 0 on failure. */
2688
2689static int
e561a992
ILT
2690read_line_program (struct backtrace_state *state, struct dwarf_data *ddata,
2691 struct unit *u, const struct line_header *hdr,
2692 struct dwarf_buf *line_buf, struct line_vector *vec)
eff02e4f
ILT
2693{
2694 uint64_t address;
2695 unsigned int op_index;
2696 const char *reset_filename;
2697 const char *filename;
2698 int lineno;
2699
2700 address = 0;
2701 op_index = 0;
2702 if (hdr->filenames_count > 0)
2703 reset_filename = hdr->filenames[0];
2704 else
2705 reset_filename = "";
2706 filename = reset_filename;
2707 lineno = 1;
2708 while (line_buf->left > 0)
2709 {
2710 unsigned int op;
2711
2712 op = read_byte (line_buf);
2713 if (op >= hdr->opcode_base)
2714 {
2715 unsigned int advance;
2716
2717 /* Special opcode. */
2718 op -= hdr->opcode_base;
2719 advance = op / hdr->line_range;
2720 address += (hdr->min_insn_len * (op_index + advance)
2721 / hdr->max_ops_per_insn);
2722 op_index = (op_index + advance) % hdr->max_ops_per_insn;
2723 lineno += hdr->line_base + (int) (op % hdr->line_range);
e561a992
ILT
2724 add_line (state, ddata, address, filename, lineno,
2725 line_buf->error_callback, line_buf->data, vec);
eff02e4f
ILT
2726 }
2727 else if (op == DW_LNS_extended_op)
2728 {
2729 uint64_t len;
2730
2731 len = read_uleb128 (line_buf);
2732 op = read_byte (line_buf);
2733 switch (op)
2734 {
2735 case DW_LNE_end_sequence:
2736 /* FIXME: Should we mark the high PC here? It seems
2737 that we already have that information from the
2738 compilation unit. */
2739 address = 0;
2740 op_index = 0;
2741 filename = reset_filename;
2742 lineno = 1;
2743 break;
2744 case DW_LNE_set_address:
c926fd82 2745 address = read_address (line_buf, hdr->addrsize);
eff02e4f
ILT
2746 break;
2747 case DW_LNE_define_file:
2748 {
2749 const char *f;
2750 unsigned int dir_index;
2751
17112570
TV
2752 f = read_string (line_buf);
2753 if (f == NULL)
eff02e4f
ILT
2754 return 0;
2755 dir_index = read_uleb128 (line_buf);
2756 /* Ignore that time and length. */
2757 read_uleb128 (line_buf);
2758 read_uleb128 (line_buf);
2759 if (IS_ABSOLUTE_PATH (f))
2760 filename = f;
2761 else
2762 {
2763 const char *dir;
2764 size_t dir_len;
2765 size_t f_len;
2766 char *p;
2767
c926fd82 2768 if (dir_index == 0 && hdr->version < 5)
eff02e4f
ILT
2769 dir = u->comp_dir;
2770 else if (dir_index - 1 < hdr->dirs_count)
2771 dir = hdr->dirs[dir_index - 1];
2772 else
2773 {
2774 dwarf_buf_error (line_buf,
2775 ("invalid directory index "
2776 "in line number program"));
2777 return 0;
2778 }
2779 dir_len = strlen (dir);
2780 f_len = strlen (f);
2781 p = ((char *)
2782 backtrace_alloc (state, dir_len + f_len + 2,
2783 line_buf->error_callback,
2784 line_buf->data));
2785 if (p == NULL)
2786 return 0;
2787 memcpy (p, dir, dir_len);
2788 /* FIXME: If we are on a DOS-based file system,
2789 and the directory or the file name use
2790 backslashes, then we should use a backslash
2791 here. */
2792 p[dir_len] = '/';
2793 memcpy (p + dir_len + 1, f, f_len + 1);
2794 filename = p;
2795 }
2796 }
2797 break;
2798 case DW_LNE_set_discriminator:
2799 /* We don't care about discriminators. */
2800 read_uleb128 (line_buf);
2801 break;
2802 default:
2803 if (!advance (line_buf, len - 1))
2804 return 0;
2805 break;
2806 }
2807 }
2808 else
2809 {
2810 switch (op)
2811 {
2812 case DW_LNS_copy:
e561a992 2813 add_line (state, ddata, address, filename, lineno,
eff02e4f
ILT
2814 line_buf->error_callback, line_buf->data, vec);
2815 break;
2816 case DW_LNS_advance_pc:
2817 {
2818 uint64_t advance;
2819
2820 advance = read_uleb128 (line_buf);
2821 address += (hdr->min_insn_len * (op_index + advance)
2822 / hdr->max_ops_per_insn);
2823 op_index = (op_index + advance) % hdr->max_ops_per_insn;
2824 }
2825 break;
2826 case DW_LNS_advance_line:
2827 lineno += (int) read_sleb128 (line_buf);
2828 break;
2829 case DW_LNS_set_file:
2830 {
2831 uint64_t fileno;
2832
2833 fileno = read_uleb128 (line_buf);
2834 if (fileno == 0)
2835 filename = "";
2836 else
2837 {
2838 if (fileno - 1 >= hdr->filenames_count)
2839 {
2840 dwarf_buf_error (line_buf,
2841 ("invalid file number in "
2842 "line number program"));
2843 return 0;
2844 }
2845 filename = hdr->filenames[fileno - 1];
2846 }
2847 }
2848 break;
2849 case DW_LNS_set_column:
2850 read_uleb128 (line_buf);
2851 break;
2852 case DW_LNS_negate_stmt:
2853 break;
2854 case DW_LNS_set_basic_block:
2855 break;
2856 case DW_LNS_const_add_pc:
2857 {
2858 unsigned int advance;
2859
2860 op = 255 - hdr->opcode_base;
2861 advance = op / hdr->line_range;
2862 address += (hdr->min_insn_len * (op_index + advance)
2863 / hdr->max_ops_per_insn);
2864 op_index = (op_index + advance) % hdr->max_ops_per_insn;
2865 }
2866 break;
2867 case DW_LNS_fixed_advance_pc:
2868 address += read_uint16 (line_buf);
2869 op_index = 0;
2870 break;
2871 case DW_LNS_set_prologue_end:
2872 break;
2873 case DW_LNS_set_epilogue_begin:
2874 break;
2875 case DW_LNS_set_isa:
2876 read_uleb128 (line_buf);
2877 break;
2878 default:
2879 {
2880 unsigned int i;
2881
2882 for (i = hdr->opcode_lengths[op - 1]; i > 0; --i)
2883 read_uleb128 (line_buf);
2884 }
2885 break;
2886 }
2887 }
2888 }
2889
2890 return 1;
2891}
2892
2893/* Read the line number information for a compilation unit. Returns 1
2894 on success, 0 on failure. */
2895
2896static int
2897read_line_info (struct backtrace_state *state, struct dwarf_data *ddata,
2898 backtrace_error_callback error_callback, void *data,
2899 struct unit *u, struct line_header *hdr, struct line **lines,
2900 size_t *lines_count)
2901{
2902 struct line_vector vec;
2903 struct dwarf_buf line_buf;
2904 uint64_t len;
2905 int is_dwarf64;
2906 struct line *ln;
2907
2908 memset (&vec.vec, 0, sizeof vec.vec);
2909 vec.count = 0;
2910
2911 memset (hdr, 0, sizeof *hdr);
2912
2913 if (u->lineoff != (off_t) (size_t) u->lineoff
66ab5839 2914 || (size_t) u->lineoff >= ddata->dwarf_sections.size[DEBUG_LINE])
eff02e4f
ILT
2915 {
2916 error_callback (data, "unit line offset out of range", 0);
2917 goto fail;
2918 }
2919
2920 line_buf.name = ".debug_line";
66ab5839
ILT
2921 line_buf.start = ddata->dwarf_sections.data[DEBUG_LINE];
2922 line_buf.buf = ddata->dwarf_sections.data[DEBUG_LINE] + u->lineoff;
2923 line_buf.left = ddata->dwarf_sections.size[DEBUG_LINE] - u->lineoff;
eff02e4f
ILT
2924 line_buf.is_bigendian = ddata->is_bigendian;
2925 line_buf.error_callback = error_callback;
2926 line_buf.data = data;
2927 line_buf.reported_underflow = 0;
2928
292592c5 2929 len = read_initial_length (&line_buf, &is_dwarf64);
eff02e4f
ILT
2930 line_buf.left = len;
2931
c926fd82 2932 if (!read_line_header (state, ddata, u, is_dwarf64, &line_buf, hdr))
eff02e4f
ILT
2933 goto fail;
2934
e561a992 2935 if (!read_line_program (state, ddata, u, hdr, &line_buf, &vec))
eff02e4f
ILT
2936 goto fail;
2937
2938 if (line_buf.reported_underflow)
2939 goto fail;
2940
2941 if (vec.count == 0)
2942 {
2943 /* This is not a failure in the sense of a generating an error,
2944 but it is a failure in that sense that we have no useful
2945 information. */
2946 goto fail;
2947 }
2948
2949 /* Allocate one extra entry at the end. */
2950 ln = ((struct line *)
2951 backtrace_vector_grow (state, sizeof (struct line), error_callback,
2952 data, &vec.vec));
2953 if (ln == NULL)
2954 goto fail;
2955 ln->pc = (uintptr_t) -1;
2956 ln->filename = NULL;
2957 ln->lineno = 0;
d99a7b4d 2958 ln->idx = 0;
eff02e4f
ILT
2959
2960 if (!backtrace_vector_release (state, &vec.vec, error_callback, data))
2961 goto fail;
2962
2963 ln = (struct line *) vec.vec.base;
c5604b48 2964 backtrace_qsort (ln, vec.count, sizeof (struct line), line_compare);
eff02e4f
ILT
2965
2966 *lines = ln;
2967 *lines_count = vec.count;
2968
2969 return 1;
2970
2971 fail:
518a3a21 2972 backtrace_vector_free (state, &vec.vec, error_callback, data);
eff02e4f
ILT
2973 free_line_header (state, hdr, error_callback, data);
2974 *lines = (struct line *) (uintptr_t) -1;
2975 *lines_count = 0;
2976 return 0;
2977}
2978
07e1534f
TV
2979static const char *read_referenced_name (struct dwarf_data *, struct unit *,
2980 uint64_t, backtrace_error_callback,
2981 void *);
2982
2983/* Read the name of a function from a DIE referenced by ATTR with VAL. */
2984
2985static const char *
2986read_referenced_name_from_attr (struct dwarf_data *ddata, struct unit *u,
2987 struct attr *attr, struct attr_val *val,
2988 backtrace_error_callback error_callback,
2989 void *data)
2990{
2991 switch (attr->name)
2992 {
2993 case DW_AT_abstract_origin:
2994 case DW_AT_specification:
2995 break;
2996 default:
2997 return NULL;
2998 }
2999
2bd0a246
TV
3000 if (attr->form == DW_FORM_ref_sig8)
3001 return NULL;
3002
3003 if (val->encoding == ATTR_VAL_REF_INFO)
07e1534f 3004 {
2bd0a246
TV
3005 struct unit *unit
3006 = find_unit (ddata->units, ddata->units_count,
3007 val->u.uint);
3008 if (unit == NULL)
3009 return NULL;
3010
3011 uint64_t offset = val->u.uint - unit->low_offset;
3012 return read_referenced_name (ddata, unit, offset, error_callback, data);
07e1534f
TV
3013 }
3014
3015 if (val->encoding == ATTR_VAL_UINT
3016 || val->encoding == ATTR_VAL_REF_UNIT)
3017 return read_referenced_name (ddata, u, val->u.uint, error_callback, data);
3018
1c2a9a37
TV
3019 if (val->encoding == ATTR_VAL_REF_ALT_INFO)
3020 {
3021 struct unit *alt_unit
3022 = find_unit (ddata->altlink->units, ddata->altlink->units_count,
3023 val->u.uint);
3024 if (alt_unit == NULL)
3025 return NULL;
3026
3027 uint64_t offset = val->u.uint - alt_unit->low_offset;
3028 return read_referenced_name (ddata->altlink, alt_unit, offset,
3029 error_callback, data);
3030 }
3031
07e1534f
TV
3032 return NULL;
3033}
3034
eff02e4f
ILT
3035/* Read the name of a function from a DIE referenced by a
3036 DW_AT_abstract_origin or DW_AT_specification tag. OFFSET is within
3037 the same compilation unit. */
3038
3039static const char *
3040read_referenced_name (struct dwarf_data *ddata, struct unit *u,
3041 uint64_t offset, backtrace_error_callback error_callback,
3042 void *data)
3043{
3044 struct dwarf_buf unit_buf;
3045 uint64_t code;
3046 const struct abbrev *abbrev;
3047 const char *ret;
3048 size_t i;
3049
3050 /* OFFSET is from the start of the data for this compilation unit.
3051 U->unit_data is the data, but it starts U->unit_data_offset bytes
3052 from the beginning. */
3053
3054 if (offset < u->unit_data_offset
3055 || offset - u->unit_data_offset >= u->unit_data_len)
3056 {
3057 error_callback (data,
3058 "abstract origin or specification out of range",
3059 0);
3060 return NULL;
3061 }
3062
3063 offset -= u->unit_data_offset;
3064
3065 unit_buf.name = ".debug_info";
66ab5839 3066 unit_buf.start = ddata->dwarf_sections.data[DEBUG_INFO];
eff02e4f
ILT
3067 unit_buf.buf = u->unit_data + offset;
3068 unit_buf.left = u->unit_data_len - offset;
3069 unit_buf.is_bigendian = ddata->is_bigendian;
3070 unit_buf.error_callback = error_callback;
3071 unit_buf.data = data;
3072 unit_buf.reported_underflow = 0;
3073
3074 code = read_uleb128 (&unit_buf);
3075 if (code == 0)
3076 {
3077 dwarf_buf_error (&unit_buf, "invalid abstract origin or specification");
3078 return NULL;
3079 }
3080
3081 abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
3082 if (abbrev == NULL)
3083 return NULL;
3084
3085 ret = NULL;
3086 for (i = 0; i < abbrev->num_attrs; ++i)
3087 {
3088 struct attr_val val;
3089
c926fd82
ILT
3090 if (!read_attribute (abbrev->attrs[i].form, abbrev->attrs[i].val,
3091 &unit_buf, u->is_dwarf64, u->version, u->addrsize,
3092 &ddata->dwarf_sections, ddata->altlink, &val))
eff02e4f
ILT
3093 return NULL;
3094
3095 switch (abbrev->attrs[i].name)
3096 {
3097 case DW_AT_name:
df1de064
TV
3098 /* Third name preference: don't override. A name we found in some
3099 other way, will normally be more useful -- e.g., this name is
3100 normally not mangled. */
3101 if (ret != NULL)
3102 break;
c926fd82
ILT
3103 if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
3104 ddata->is_bigendian, u->str_offsets_base,
3105 &val, error_callback, data, &ret))
3106 return NULL;
eff02e4f
ILT
3107 break;
3108
3109 case DW_AT_linkage_name:
3110 case DW_AT_MIPS_linkage_name:
df1de064 3111 /* First name preference: override all. */
c926fd82
ILT
3112 {
3113 const char *s;
3114
3115 s = NULL;
3116 if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
3117 ddata->is_bigendian, u->str_offsets_base,
3118 &val, error_callback, data, &s))
3119 return NULL;
3120 if (s != NULL)
3121 return s;
3122 }
eff02e4f
ILT
3123 break;
3124
3125 case DW_AT_specification:
df1de064
TV
3126 /* Second name preference: override DW_AT_name, don't override
3127 DW_AT_linkage_name. */
07e1534f
TV
3128 {
3129 const char *name;
eff02e4f 3130
07e1534f
TV
3131 name = read_referenced_name_from_attr (ddata, u, &abbrev->attrs[i],
3132 &val, error_callback, data);
3133 if (name != NULL)
3134 ret = name;
3135 }
eff02e4f
ILT
3136 break;
3137
3138 default:
3139 break;
3140 }
3141 }
3142
3143 return ret;
3144}
3145
4b3fc188
ILT
3146/* Add a range to a unit that maps to a function. This is called via
3147 add_ranges. Returns 1 on success, 0 on error. */
eff02e4f
ILT
3148
3149static int
4b3fc188
ILT
3150add_function_range (struct backtrace_state *state, void *rdata,
3151 uint64_t lowpc, uint64_t highpc,
3152 backtrace_error_callback error_callback, void *data,
3153 void *pvec)
eff02e4f 3154{
4b3fc188
ILT
3155 struct function *function = (struct function *) rdata;
3156 struct function_vector *vec = (struct function_vector *) pvec;
eff02e4f
ILT
3157 struct function_addrs *p;
3158
3159 if (vec->count > 0)
3160 {
4b3fc188 3161 p = (struct function_addrs *) vec->vec.base + (vec->count - 1);
eff02e4f
ILT
3162 if ((lowpc == p->high || lowpc == p->high + 1)
3163 && function == p->function)
3164 {
3165 if (highpc > p->high)
3166 p->high = highpc;
3167 return 1;
3168 }
3169 }
3170
3171 p = ((struct function_addrs *)
3172 backtrace_vector_grow (state, sizeof (struct function_addrs),
3173 error_callback, data, &vec->vec));
3174 if (p == NULL)
3175 return 0;
3176
3177 p->low = lowpc;
3178 p->high = highpc;
3179 p->function = function;
eff02e4f 3180
4b3fc188 3181 ++vec->count;
eff02e4f
ILT
3182
3183 return 1;
3184}
3185
3186/* Read one entry plus all its children. Add function addresses to
3187 VEC. Returns 1 on success, 0 on error. */
3188
3189static int
3190read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata,
3191 struct unit *u, uint64_t base, struct dwarf_buf *unit_buf,
3192 const struct line_header *lhdr,
3193 backtrace_error_callback error_callback, void *data,
d96fa208
ILT
3194 struct function_vector *vec_function,
3195 struct function_vector *vec_inlined)
eff02e4f
ILT
3196{
3197 while (unit_buf->left > 0)
3198 {
3199 uint64_t code;
3200 const struct abbrev *abbrev;
3201 int is_function;
3202 struct function *function;
d96fa208 3203 struct function_vector *vec;
eff02e4f 3204 size_t i;
4b3fc188 3205 struct pcrange pcrange;
df1de064 3206 int have_linkage_name;
eff02e4f
ILT
3207
3208 code = read_uleb128 (unit_buf);
3209 if (code == 0)
3210 return 1;
3211
3212 abbrev = lookup_abbrev (&u->abbrevs, code, error_callback, data);
3213 if (abbrev == NULL)
3214 return 0;
3215
3216 is_function = (abbrev->tag == DW_TAG_subprogram
3217 || abbrev->tag == DW_TAG_entry_point
3218 || abbrev->tag == DW_TAG_inlined_subroutine);
3219
d96fa208
ILT
3220 if (abbrev->tag == DW_TAG_inlined_subroutine)
3221 vec = vec_inlined;
3222 else
3223 vec = vec_function;
3224
eff02e4f
ILT
3225 function = NULL;
3226 if (is_function)
3227 {
3228 function = ((struct function *)
3229 backtrace_alloc (state, sizeof *function,
3230 error_callback, data));
3231 if (function == NULL)
3232 return 0;
3233 memset (function, 0, sizeof *function);
3234 }
3235
4b3fc188 3236 memset (&pcrange, 0, sizeof pcrange);
df1de064 3237 have_linkage_name = 0;
eff02e4f
ILT
3238 for (i = 0; i < abbrev->num_attrs; ++i)
3239 {
3240 struct attr_val val;
3241
c926fd82
ILT
3242 if (!read_attribute (abbrev->attrs[i].form, abbrev->attrs[i].val,
3243 unit_buf, u->is_dwarf64, u->version,
3244 u->addrsize, &ddata->dwarf_sections,
944f59ff 3245 ddata->altlink, &val))
eff02e4f
ILT
3246 return 0;
3247
3248 /* The compile unit sets the base address for any address
3249 ranges in the function entries. */
3250 if (abbrev->tag == DW_TAG_compile_unit
c926fd82
ILT
3251 && abbrev->attrs[i].name == DW_AT_low_pc)
3252 {
3253 if (val.encoding == ATTR_VAL_ADDRESS)
3254 base = val.u.uint;
3255 else if (val.encoding == ATTR_VAL_ADDRESS_INDEX)
3256 {
3257 if (!resolve_addr_index (&ddata->dwarf_sections,
3258 u->addr_base, u->addrsize,
3259 ddata->is_bigendian, val.u.uint,
3260 error_callback, data, &base))
3261 return 0;
3262 }
3263 }
eff02e4f
ILT
3264
3265 if (is_function)
3266 {
3267 switch (abbrev->attrs[i].name)
3268 {
3269 case DW_AT_call_file:
3270 if (val.encoding == ATTR_VAL_UINT)
3271 {
3272 if (val.u.uint == 0)
3273 function->caller_filename = "";
3274 else
3275 {
3276 if (val.u.uint - 1 >= lhdr->filenames_count)
3277 {
3278 dwarf_buf_error (unit_buf,
3279 ("invalid file number in "
3280 "DW_AT_call_file attribute"));
3281 return 0;
3282 }
3283 function->caller_filename =
3284 lhdr->filenames[val.u.uint - 1];
3285 }
3286 }
3287 break;
3288
3289 case DW_AT_call_line:
3290 if (val.encoding == ATTR_VAL_UINT)
3291 function->caller_lineno = val.u.uint;
3292 break;
3293
3294 case DW_AT_abstract_origin:
3295 case DW_AT_specification:
df1de064
TV
3296 /* Second name preference: override DW_AT_name, don't override
3297 DW_AT_linkage_name. */
3298 if (have_linkage_name)
3299 break;
07e1534f
TV
3300 {
3301 const char *name;
3302
3303 name
3304 = read_referenced_name_from_attr (ddata, u,
3305 &abbrev->attrs[i], &val,
3306 error_callback, data);
3307 if (name != NULL)
3308 function->name = name;
3309 }
eff02e4f
ILT
3310 break;
3311
3312 case DW_AT_name:
df1de064
TV
3313 /* Third name preference: don't override. */
3314 if (function->name != NULL)
3315 break;
c926fd82
ILT
3316 if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
3317 ddata->is_bigendian,
3318 u->str_offsets_base, &val,
3319 error_callback, data, &function->name))
3320 return 0;
eff02e4f
ILT
3321 break;
3322
3323 case DW_AT_linkage_name:
3324 case DW_AT_MIPS_linkage_name:
df1de064 3325 /* First name preference: override all. */
c926fd82
ILT
3326 {
3327 const char *s;
3328
3329 s = NULL;
3330 if (!resolve_string (&ddata->dwarf_sections, u->is_dwarf64,
3331 ddata->is_bigendian,
3332 u->str_offsets_base, &val,
3333 error_callback, data, &s))
3334 return 0;
3335 if (s != NULL)
3336 {
3337 function->name = s;
3338 have_linkage_name = 1;
3339 }
3340 }
eff02e4f
ILT
3341 break;
3342
4b3fc188
ILT
3343 case DW_AT_low_pc: case DW_AT_high_pc: case DW_AT_ranges:
3344 update_pcrange (&abbrev->attrs[i], &val, &pcrange);
eff02e4f
ILT
3345 break;
3346
3347 default:
3348 break;
3349 }
3350 }
3351 }
3352
3353 /* If we couldn't find a name for the function, we have no use
3354 for it. */
3355 if (is_function && function->name == NULL)
3356 {
3357 backtrace_free (state, function, sizeof *function,
3358 error_callback, data);
3359 is_function = 0;
3360 }
3361
3362 if (is_function)
3363 {
4b3fc188
ILT
3364 if (pcrange.have_ranges
3365 || (pcrange.have_lowpc && pcrange.have_highpc))
eff02e4f 3366 {
4b3fc188
ILT
3367 if (!add_ranges (state, &ddata->dwarf_sections,
3368 ddata->base_address, ddata->is_bigendian,
3369 u, base, &pcrange, add_function_range,
3370 (void *) function, error_callback, data,
3371 (void *) vec))
eff02e4f
ILT
3372 return 0;
3373 }
3374 else
3375 {
3376 backtrace_free (state, function, sizeof *function,
3377 error_callback, data);
3378 is_function = 0;
3379 }
3380 }
3381
3382 if (abbrev->has_children)
3383 {
3384 if (!is_function)
3385 {
3386 if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
d96fa208
ILT
3387 error_callback, data, vec_function,
3388 vec_inlined))
eff02e4f
ILT
3389 return 0;
3390 }
3391 else
3392 {
3393 struct function_vector fvec;
3394
3395 /* Gather any information for inlined functions in
3396 FVEC. */
3397
3398 memset (&fvec, 0, sizeof fvec);
3399
3400 if (!read_function_entry (state, ddata, u, base, unit_buf, lhdr,
d96fa208
ILT
3401 error_callback, data, vec_function,
3402 &fvec))
eff02e4f
ILT
3403 return 0;
3404
3405 if (fvec.count > 0)
3406 {
3407 struct function_addrs *faddrs;
3408
3409 if (!backtrace_vector_release (state, &fvec.vec,
3410 error_callback, data))
3411 return 0;
3412
3413 faddrs = (struct function_addrs *) fvec.vec.base;
c5604b48
ILT
3414 backtrace_qsort (faddrs, fvec.count,
3415 sizeof (struct function_addrs),
3416 function_addrs_compare);
eff02e4f
ILT
3417
3418 function->function_addrs = faddrs;
3419 function->function_addrs_count = fvec.count;
3420 }
3421 }
3422 }
3423 }
3424
3425 return 1;
3426}
3427
3428/* Read function name information for a compilation unit. We look
3429 through the whole unit looking for function tags. */
3430
3431static void
3432read_function_info (struct backtrace_state *state, struct dwarf_data *ddata,
3433 const struct line_header *lhdr,
3434 backtrace_error_callback error_callback, void *data,
3435 struct unit *u, struct function_vector *fvec,
3436 struct function_addrs **ret_addrs,
3437 size_t *ret_addrs_count)
3438{
38811401
ILT
3439 struct function_vector lvec;
3440 struct function_vector *pfvec;
eff02e4f
ILT
3441 struct dwarf_buf unit_buf;
3442 struct function_addrs *addrs;
3443 size_t addrs_count;
3444
38811401
ILT
3445 /* Use FVEC if it is not NULL. Otherwise use our own vector. */
3446 if (fvec != NULL)
3447 pfvec = fvec;
3448 else
3449 {
3450 memset (&lvec, 0, sizeof lvec);
3451 pfvec = &lvec;
3452 }
3453
eff02e4f 3454 unit_buf.name = ".debug_info";
66ab5839 3455 unit_buf.start = ddata->dwarf_sections.data[DEBUG_INFO];
eff02e4f
ILT
3456 unit_buf.buf = u->unit_data;
3457 unit_buf.left = u->unit_data_len;
3458 unit_buf.is_bigendian = ddata->is_bigendian;
3459 unit_buf.error_callback = error_callback;
3460 unit_buf.data = data;
3461 unit_buf.reported_underflow = 0;
3462
3463 while (unit_buf.left > 0)
3464 {
3465 if (!read_function_entry (state, ddata, u, 0, &unit_buf, lhdr,
d96fa208 3466 error_callback, data, pfvec, pfvec))
eff02e4f
ILT
3467 return;
3468 }
3469
38811401 3470 if (pfvec->count == 0)
eff02e4f
ILT
3471 return;
3472
38811401 3473 addrs_count = pfvec->count;
eff02e4f 3474
38811401
ILT
3475 if (fvec == NULL)
3476 {
3477 if (!backtrace_vector_release (state, &lvec.vec, error_callback, data))
3478 return;
bfd74f22 3479 addrs = (struct function_addrs *) pfvec->vec.base;
38811401
ILT
3480 }
3481 else
3482 {
3483 /* Finish this list of addresses, but leave the remaining space in
3484 the vector available for the next function unit. */
bfd74f22
ILT
3485 addrs = ((struct function_addrs *)
3486 backtrace_vector_finish (state, &fvec->vec,
3487 error_callback, data));
3488 if (addrs == NULL)
3489 return;
38811401
ILT
3490 fvec->count = 0;
3491 }
eff02e4f 3492
c5604b48
ILT
3493 backtrace_qsort (addrs, addrs_count, sizeof (struct function_addrs),
3494 function_addrs_compare);
eff02e4f
ILT
3495
3496 *ret_addrs = addrs;
3497 *ret_addrs_count = addrs_count;
3498}
3499
3500/* See if PC is inlined in FUNCTION. If it is, print out the inlined
3501 information, and update FILENAME and LINENO for the caller.
3502 Returns whatever CALLBACK returns, or 0 to keep going. */
3503
3504static int
3505report_inlined_functions (uintptr_t pc, struct function *function,
3506 backtrace_full_callback callback, void *data,
3507 const char **filename, int *lineno)
3508{
3509 struct function_addrs *function_addrs;
3510 struct function *inlined;
3511 int ret;
3512
3513 if (function->function_addrs_count == 0)
3514 return 0;
3515
3516 function_addrs = ((struct function_addrs *)
3517 bsearch (&pc, function->function_addrs,
3518 function->function_addrs_count,
3519 sizeof (struct function_addrs),
3520 function_addrs_search));
3521 if (function_addrs == NULL)
3522 return 0;
3523
3524 while (((size_t) (function_addrs - function->function_addrs) + 1
3525 < function->function_addrs_count)
3526 && pc >= (function_addrs + 1)->low
3527 && pc < (function_addrs + 1)->high)
3528 ++function_addrs;
3529
3530 /* We found an inlined call. */
3531
3532 inlined = function_addrs->function;
3533
3534 /* Report any calls inlined into this one. */
3535 ret = report_inlined_functions (pc, inlined, callback, data,
3536 filename, lineno);
3537 if (ret != 0)
3538 return ret;
3539
3540 /* Report this inlined call. */
3541 ret = callback (data, pc, *filename, *lineno, inlined->name);
3542 if (ret != 0)
3543 return ret;
3544
3545 /* Our caller will report the caller of the inlined function; tell
3546 it the appropriate filename and line number. */
3547 *filename = inlined->caller_filename;
3548 *lineno = inlined->caller_lineno;
3549
3550 return 0;
3551}
3552
e561a992
ILT
3553/* Look for a PC in the DWARF mapping for one module. On success,
3554 call CALLBACK and return whatever it returns. On error, call
3555 ERROR_CALLBACK and return 0. Sets *FOUND to 1 if the PC is found,
3556 0 if not. */
eff02e4f
ILT
3557
3558static int
e561a992
ILT
3559dwarf_lookup_pc (struct backtrace_state *state, struct dwarf_data *ddata,
3560 uintptr_t pc, backtrace_full_callback callback,
3561 backtrace_error_callback error_callback, void *data,
3562 int *found)
eff02e4f 3563{
eff02e4f
ILT
3564 struct unit_addrs *entry;
3565 struct unit *u;
3566 int new_data;
3567 struct line *lines;
3568 struct line *ln;
3569 struct function_addrs *function_addrs;
3570 struct function *function;
3571 const char *filename;
3572 int lineno;
3573 int ret;
3574
e561a992 3575 *found = 1;
eff02e4f
ILT
3576
3577 /* Find an address range that includes PC. */
68641fb7
TV
3578 entry = (ddata->addrs_count == 0
3579 ? NULL
3580 : bsearch (&pc, ddata->addrs, ddata->addrs_count,
3581 sizeof (struct unit_addrs), unit_addrs_search));
eff02e4f
ILT
3582
3583 if (entry == NULL)
e561a992
ILT
3584 {
3585 *found = 0;
3586 return 0;
3587 }
eff02e4f
ILT
3588
3589 /* If there are multiple ranges that contain PC, use the last one,
3590 in order to produce predictable results. If we assume that all
3591 ranges are properly nested, then the last range will be the
3592 smallest one. */
3593 while ((size_t) (entry - ddata->addrs) + 1 < ddata->addrs_count
3594 && pc >= (entry + 1)->low
3595 && pc < (entry + 1)->high)
3596 ++entry;
3597
3598 /* We need the lines, lines_count, function_addrs,
3599 function_addrs_count fields of u. If they are not set, we need
3600 to set them. When running in threaded mode, we need to allow for
3601 the possibility that some other thread is setting them
3602 simultaneously. */
3603
3604 u = entry->u;
3605 lines = u->lines;
3606
3607 /* Skip units with no useful line number information by walking
3608 backward. Useless line number information is marked by setting
3609 lines == -1. */
3610 while (entry > ddata->addrs
3611 && pc >= (entry - 1)->low
3612 && pc < (entry - 1)->high)
3613 {
3614 if (state->threaded)
49579c7e 3615 lines = (struct line *) backtrace_atomic_load_pointer (&u->lines);
eff02e4f
ILT
3616
3617 if (lines != (struct line *) (uintptr_t) -1)
3618 break;
3619
3620 --entry;
3621
3622 u = entry->u;
3623 lines = u->lines;
3624 }
3625
eff02e4f 3626 if (state->threaded)
49579c7e 3627 lines = backtrace_atomic_load_pointer (&u->lines);
eff02e4f
ILT
3628
3629 new_data = 0;
3630 if (lines == NULL)
3631 {
3632 size_t function_addrs_count;
3633 struct line_header lhdr;
3634 size_t count;
3635
3636 /* We have never read the line information for this unit. Read
3637 it now. */
3638
3639 function_addrs = NULL;
3640 function_addrs_count = 0;
3641 if (read_line_info (state, ddata, error_callback, data, entry->u, &lhdr,
3642 &lines, &count))
3643 {
38811401
ILT
3644 struct function_vector *pfvec;
3645
3646 /* If not threaded, reuse DDATA->FVEC for better memory
3647 consumption. */
3648 if (state->threaded)
3649 pfvec = NULL;
3650 else
3651 pfvec = &ddata->fvec;
eff02e4f 3652 read_function_info (state, ddata, &lhdr, error_callback, data,
38811401 3653 entry->u, pfvec, &function_addrs,
eff02e4f
ILT
3654 &function_addrs_count);
3655 free_line_header (state, &lhdr, error_callback, data);
3656 new_data = 1;
3657 }
3658
3659 /* Atomically store the information we just read into the unit.
3660 If another thread is simultaneously writing, it presumably
3661 read the same information, and we don't care which one we
3662 wind up with; we just leak the other one. We do have to
3663 write the lines field last, so that the acquire-loads above
3664 ensure that the other fields are set. */
3665
3666 if (!state->threaded)
3667 {
3668 u->lines_count = count;
3669 u->function_addrs = function_addrs;
3670 u->function_addrs_count = function_addrs_count;
3671 u->lines = lines;
3672 }
3673 else
3674 {
49579c7e
ILT
3675 backtrace_atomic_store_size_t (&u->lines_count, count);
3676 backtrace_atomic_store_pointer (&u->function_addrs, function_addrs);
3677 backtrace_atomic_store_size_t (&u->function_addrs_count,
3678 function_addrs_count);
3679 backtrace_atomic_store_pointer (&u->lines, lines);
eff02e4f
ILT
3680 }
3681 }
3682
3683 /* Now all fields of U have been initialized. */
3684
3685 if (lines == (struct line *) (uintptr_t) -1)
3686 {
3687 /* If reading the line number information failed in some way,
3688 try again to see if there is a better compilation unit for
3689 this PC. */
3690 if (new_data)
e561a992
ILT
3691 return dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
3692 data, found);
eff02e4f
ILT
3693 return callback (data, pc, NULL, 0, NULL);
3694 }
3695
3696 /* Search for PC within this unit. */
3697
3698 ln = (struct line *) bsearch (&pc, lines, entry->u->lines_count,
3699 sizeof (struct line), line_search);
3700 if (ln == NULL)
3701 {
6b514c53
ILT
3702 /* The PC is between the low_pc and high_pc attributes of the
3703 compilation unit, but no entry in the line table covers it.
3704 This implies that the start of the compilation unit has no
3705 line number information. */
3706
3707 if (entry->u->abs_filename == NULL)
3708 {
3709 const char *filename;
3710
3711 filename = entry->u->filename;
3712 if (filename != NULL
3713 && !IS_ABSOLUTE_PATH (filename)
3714 && entry->u->comp_dir != NULL)
3715 {
3716 size_t filename_len;
3717 const char *dir;
3718 size_t dir_len;
3719 char *s;
3720
3721 filename_len = strlen (filename);
3722 dir = entry->u->comp_dir;
3723 dir_len = strlen (dir);
3724 s = (char *) backtrace_alloc (state, dir_len + filename_len + 2,
3725 error_callback, data);
3726 if (s == NULL)
3727 {
3728 *found = 0;
3729 return 0;
3730 }
3731 memcpy (s, dir, dir_len);
3732 /* FIXME: Should use backslash if DOS file system. */
3733 s[dir_len] = '/';
3734 memcpy (s + dir_len + 1, filename, filename_len + 1);
3735 filename = s;
3736 }
3737 entry->u->abs_filename = filename;
3738 }
3739
3740 return callback (data, pc, entry->u->abs_filename, 0, NULL);
eff02e4f
ILT
3741 }
3742
3743 /* Search for function name within this unit. */
3744
3745 if (entry->u->function_addrs_count == 0)
3746 return callback (data, pc, ln->filename, ln->lineno, NULL);
3747
3748 function_addrs = ((struct function_addrs *)
3749 bsearch (&pc, entry->u->function_addrs,
3750 entry->u->function_addrs_count,
3751 sizeof (struct function_addrs),
3752 function_addrs_search));
3753 if (function_addrs == NULL)
3754 return callback (data, pc, ln->filename, ln->lineno, NULL);
3755
3756 /* If there are multiple function ranges that contain PC, use the
3757 last one, in order to produce predictable results. */
3758
3759 while (((size_t) (function_addrs - entry->u->function_addrs + 1)
3760 < entry->u->function_addrs_count)
3761 && pc >= (function_addrs + 1)->low
3762 && pc < (function_addrs + 1)->high)
3763 ++function_addrs;
3764
3765 function = function_addrs->function;
3766
3767 filename = ln->filename;
3768 lineno = ln->lineno;
3769
3770 ret = report_inlined_functions (pc, function, callback, data,
3771 &filename, &lineno);
3772 if (ret != 0)
3773 return ret;
3774
3775 return callback (data, pc, filename, lineno, function->name);
3776}
3777
eff02e4f 3778
e561a992
ILT
3779/* Return the file/line information for a PC using the DWARF mapping
3780 we built earlier. */
3781
3782static int
3783dwarf_fileline (struct backtrace_state *state, uintptr_t pc,
3784 backtrace_full_callback callback,
3785 backtrace_error_callback error_callback, void *data)
3786{
3787 struct dwarf_data *ddata;
3788 int found;
3789 int ret;
3790
3791 if (!state->threaded)
3792 {
3793 for (ddata = (struct dwarf_data *) state->fileline_data;
3794 ddata != NULL;
3795 ddata = ddata->next)
3796 {
3797 ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
3798 data, &found);
3799 if (ret != 0 || found)
3800 return ret;
3801 }
3802 }
3803 else
3804 {
3805 struct dwarf_data **pp;
3806
ce8aa074 3807 pp = (struct dwarf_data **) (void *) &state->fileline_data;
e561a992
ILT
3808 while (1)
3809 {
49579c7e 3810 ddata = backtrace_atomic_load_pointer (pp);
e561a992
ILT
3811 if (ddata == NULL)
3812 break;
3813
3814 ret = dwarf_lookup_pc (state, ddata, pc, callback, error_callback,
3815 data, &found);
3816 if (ret != 0 || found)
3817 return ret;
3818
3819 pp = &ddata->next;
3820 }
3821 }
3822
3823 /* FIXME: See if any libraries have been dlopen'ed. */
3824
3825 return callback (data, pc, NULL, 0, NULL);
3826}
3827
3828/* Initialize our data structures from the DWARF debug info for a
3829 file. Return NULL on failure. */
3830
3831static struct dwarf_data *
3832build_dwarf_data (struct backtrace_state *state,
3833 uintptr_t base_address,
66ab5839 3834 const struct dwarf_sections *dwarf_sections,
e561a992 3835 int is_bigendian,
9ad458d5 3836 struct dwarf_data *altlink,
e561a992
ILT
3837 backtrace_error_callback error_callback,
3838 void *data)
eff02e4f
ILT
3839{
3840 struct unit_addrs_vector addrs_vec;
3841 struct unit_addrs *addrs;
3842 size_t addrs_count;
9d576782
TV
3843 struct unit_vector units_vec;
3844 struct unit **units;
3845 size_t units_count;
eff02e4f
ILT
3846 struct dwarf_data *fdata;
3847
66ab5839
ILT
3848 if (!build_address_map (state, base_address, dwarf_sections, is_bigendian,
3849 altlink, error_callback, data, &addrs_vec,
3850 &units_vec))
e561a992 3851 return NULL;
eff02e4f
ILT
3852
3853 if (!backtrace_vector_release (state, &addrs_vec.vec, error_callback, data))
e561a992 3854 return NULL;
9d576782
TV
3855 if (!backtrace_vector_release (state, &units_vec.vec, error_callback, data))
3856 return NULL;
eff02e4f 3857 addrs = (struct unit_addrs *) addrs_vec.vec.base;
9d576782 3858 units = (struct unit **) units_vec.vec.base;
eff02e4f 3859 addrs_count = addrs_vec.count;
9d576782 3860 units_count = units_vec.count;
c5604b48
ILT
3861 backtrace_qsort (addrs, addrs_count, sizeof (struct unit_addrs),
3862 unit_addrs_compare);
9d576782 3863 /* No qsort for units required, already sorted. */
eff02e4f
ILT
3864
3865 fdata = ((struct dwarf_data *)
3866 backtrace_alloc (state, sizeof (struct dwarf_data),
3867 error_callback, data));
3868 if (fdata == NULL)
e561a992 3869 return NULL;
eff02e4f 3870
e561a992 3871 fdata->next = NULL;
9ad458d5 3872 fdata->altlink = altlink;
e561a992 3873 fdata->base_address = base_address;
eff02e4f
ILT
3874 fdata->addrs = addrs;
3875 fdata->addrs_count = addrs_count;
9d576782
TV
3876 fdata->units = units;
3877 fdata->units_count = units_count;
66ab5839 3878 fdata->dwarf_sections = *dwarf_sections;
eff02e4f
ILT
3879 fdata->is_bigendian = is_bigendian;
3880 memset (&fdata->fvec, 0, sizeof fdata->fvec);
3881
e561a992
ILT
3882 return fdata;
3883}
3884
3885/* Build our data structures from the DWARF sections for a module.
3886 Set FILELINE_FN and STATE->FILELINE_DATA. Return 1 on success, 0
3887 on failure. */
3888
3889int
3890backtrace_dwarf_add (struct backtrace_state *state,
3891 uintptr_t base_address,
66ab5839 3892 const struct dwarf_sections *dwarf_sections,
e561a992 3893 int is_bigendian,
9ad458d5 3894 struct dwarf_data *fileline_altlink,
e561a992 3895 backtrace_error_callback error_callback,
e6f00c83
TV
3896 void *data, fileline *fileline_fn,
3897 struct dwarf_data **fileline_entry)
e561a992
ILT
3898{
3899 struct dwarf_data *fdata;
3900
66ab5839 3901 fdata = build_dwarf_data (state, base_address, dwarf_sections, is_bigendian,
9ad458d5 3902 fileline_altlink, error_callback, data);
e561a992
ILT
3903 if (fdata == NULL)
3904 return 0;
3905
e6f00c83
TV
3906 if (fileline_entry != NULL)
3907 *fileline_entry = fdata;
3908
e561a992
ILT
3909 if (!state->threaded)
3910 {
3911 struct dwarf_data **pp;
3912
ce8aa074 3913 for (pp = (struct dwarf_data **) (void *) &state->fileline_data;
e561a992
ILT
3914 *pp != NULL;
3915 pp = &(*pp)->next)
3916 ;
3917 *pp = fdata;
3918 }
3919 else
3920 {
3921 while (1)
3922 {
3923 struct dwarf_data **pp;
3924
ce8aa074 3925 pp = (struct dwarf_data **) (void *) &state->fileline_data;
e561a992
ILT
3926
3927 while (1)
3928 {
3929 struct dwarf_data *p;
3930
49579c7e 3931 p = backtrace_atomic_load_pointer (pp);
e561a992
ILT
3932
3933 if (p == NULL)
3934 break;
3935
3936 pp = &p->next;
3937 }
3938
3939 if (__sync_bool_compare_and_swap (pp, NULL, fdata))
3940 break;
3941 }
3942 }
eff02e4f
ILT
3943
3944 *fileline_fn = dwarf_fileline;
3945
3946 return 1;
3947}