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