gdb: fix vfork with multiple threads
[deliverable/binutils-gdb.git] / gold / dwarf_reader.cc
CommitLineData
5c2c6c95
ILT
1// dwarf_reader.cc -- parse dwarf2/3 debug information
2
250d07de 3// Copyright (C) 2007-2021 Free Software Foundation, Inc.
5c2c6c95
ILT
4// Written by Ian Lance Taylor <iant@google.com>.
5
6// This file is part of gold.
7
8// This program is free software; you can redistribute it and/or modify
9// it under the terms of the GNU General Public License as published by
10// the Free Software Foundation; either version 3 of the License, or
11// (at your option) any later version.
12
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21// MA 02110-1301, USA.
22
23#include "gold.h"
24
04bf7072 25#include <algorithm>
ec673e64 26#include <utility>
e4e5049b 27#include <vector>
04bf7072 28
5cde809b 29#include "debug.h"
5c2c6c95
ILT
30#include "elfcpp_swap.h"
31#include "dwarf.h"
24badc65 32#include "object.h"
4c50553d 33#include "reloc.h"
5c2c6c95 34#include "dwarf_reader.h"
4f787271 35#include "int_encoding.h"
a2e47362 36#include "compressed_output.h"
5c2c6c95 37
62b01cb5 38namespace gold {
5c2c6c95 39
c1027032
CC
40// Class Sized_elf_reloc_mapper
41
42// Initialize the relocation tracker for section RELOC_SHNDX.
43
44template<int size, bool big_endian>
45bool
46Sized_elf_reloc_mapper<size, big_endian>::do_initialize(
47 unsigned int reloc_shndx, unsigned int reloc_type)
48{
49 this->reloc_type_ = reloc_type;
50 return this->track_relocs_.initialize(this->object_, reloc_shndx,
51 reloc_type);
52}
53
54// Looks in the symtab to see what section a symbol is in.
55
56template<int size, bool big_endian>
57unsigned int
58Sized_elf_reloc_mapper<size, big_endian>::symbol_section(
59 unsigned int symndx, Address* value, bool* is_ordinary)
60{
61 const int symsize = elfcpp::Elf_sizes<size>::sym_size;
50ed5eb1 62 gold_assert(static_cast<off_t>((symndx + 1) * symsize) <= this->symtab_size_);
c1027032
CC
63 elfcpp::Sym<size, big_endian> elfsym(this->symtab_ + symndx * symsize);
64 *value = elfsym.get_st_value();
65 return this->object_->adjust_sym_shndx(symndx, elfsym.get_st_shndx(),
66 is_ordinary);
67}
68
69// Return the section index and offset within the section of
70// the target of the relocation for RELOC_OFFSET.
71
72template<int size, bool big_endian>
73unsigned int
74Sized_elf_reloc_mapper<size, big_endian>::do_get_reloc_target(
75 off_t reloc_offset, off_t* target_offset)
76{
77 this->track_relocs_.advance(reloc_offset);
78 if (reloc_offset != this->track_relocs_.next_offset())
79 return 0;
80 unsigned int symndx = this->track_relocs_.next_symndx();
81 typename elfcpp::Elf_types<size>::Elf_Addr value;
82 bool is_ordinary;
83 unsigned int target_shndx = this->symbol_section(symndx, &value,
84 &is_ordinary);
85 if (!is_ordinary)
86 return 0;
87 if (this->reloc_type_ == elfcpp::SHT_RELA)
88 value += this->track_relocs_.next_addend();
89 *target_offset = value;
90 return target_shndx;
91}
92
93static inline Elf_reloc_mapper*
9fc236f3 94make_elf_reloc_mapper(Relobj* object, const unsigned char* symtab,
c1027032
CC
95 off_t symtab_size)
96{
9fc236f3 97 if (object->elfsize() == 32)
c1027032 98 {
9fc236f3
CC
99 if (object->is_big_endian())
100 {
c1027032 101#ifdef HAVE_TARGET_32_BIG
9fc236f3
CC
102 return new Sized_elf_reloc_mapper<32, true>(object, symtab,
103 symtab_size);
104#else
105 gold_unreachable();
c1027032 106#endif
9fc236f3
CC
107 }
108 else
109 {
110#ifdef HAVE_TARGET_32_LITTLE
111 return new Sized_elf_reloc_mapper<32, false>(object, symtab,
112 symtab_size);
113#else
114 gold_unreachable();
c1027032 115#endif
9fc236f3
CC
116 }
117 }
118 else if (object->elfsize() == 64)
119 {
120 if (object->is_big_endian())
121 {
c1027032 122#ifdef HAVE_TARGET_64_BIG
9fc236f3
CC
123 return new Sized_elf_reloc_mapper<64, true>(object, symtab,
124 symtab_size);
125#else
126 gold_unreachable();
c1027032 127#endif
9fc236f3
CC
128 }
129 else
130 {
131#ifdef HAVE_TARGET_64_LITTLE
132 return new Sized_elf_reloc_mapper<64, false>(object, symtab,
133 symtab_size);
134#else
135 gold_unreachable();
136#endif
137 }
c1027032 138 }
9fc236f3
CC
139 else
140 gold_unreachable();
c1027032
CC
141}
142
143// class Dwarf_abbrev_table
144
145void
146Dwarf_abbrev_table::clear_abbrev_codes()
147{
148 for (unsigned int code = 0; code < this->low_abbrev_code_max_; ++code)
149 {
150 if (this->low_abbrev_codes_[code] != NULL)
151 {
152 delete this->low_abbrev_codes_[code];
153 this->low_abbrev_codes_[code] = NULL;
154 }
155 }
156 for (Abbrev_code_table::iterator it = this->high_abbrev_codes_.begin();
157 it != this->high_abbrev_codes_.end();
158 ++it)
159 {
160 if (it->second != NULL)
161 delete it->second;
162 }
163 this->high_abbrev_codes_.clear();
164}
165
166// Read the abbrev table from an object file.
167
168bool
169Dwarf_abbrev_table::do_read_abbrevs(
170 Relobj* object,
171 unsigned int abbrev_shndx,
172 off_t abbrev_offset)
173{
174 this->clear_abbrev_codes();
175
176 // If we don't have relocations, abbrev_shndx will be 0, and
177 // we'll have to hunt for the .debug_abbrev section.
178 if (abbrev_shndx == 0 && this->abbrev_shndx_ > 0)
179 abbrev_shndx = this->abbrev_shndx_;
180 else if (abbrev_shndx == 0)
181 {
182 for (unsigned int i = 1; i < object->shnum(); ++i)
183 {
184 std::string name = object->section_name(i);
ec673e64 185 if (name == ".debug_abbrev" || name == ".zdebug_abbrev")
c1027032
CC
186 {
187 abbrev_shndx = i;
188 // Correct the offset. For incremental update links, we have a
189 // relocated offset that is relative to the output section, but
190 // here we need an offset relative to the input section.
191 abbrev_offset -= object->output_section_offset(i);
192 break;
193 }
194 }
195 if (abbrev_shndx == 0)
196 return false;
197 }
198
199 // Get the section contents and decompress if necessary.
200 if (abbrev_shndx != this->abbrev_shndx_)
201 {
202 if (this->owns_buffer_ && this->buffer_ != NULL)
203 {
204 delete[] this->buffer_;
205 this->owns_buffer_ = false;
206 }
207
208 section_size_type buffer_size;
209 this->buffer_ =
210 object->decompressed_section_contents(abbrev_shndx,
211 &buffer_size,
212 &this->owns_buffer_);
213 this->buffer_end_ = this->buffer_ + buffer_size;
214 this->abbrev_shndx_ = abbrev_shndx;
215 }
216
217 this->buffer_pos_ = this->buffer_ + abbrev_offset;
218 return true;
219}
220
221// Lookup the abbrev code entry for CODE. This function is called
222// only when the abbrev code is not in the direct lookup table.
223// It may be in the hash table, it may not have been read yet,
224// or it may not exist in the abbrev table.
225
226const Dwarf_abbrev_table::Abbrev_code*
227Dwarf_abbrev_table::do_get_abbrev(unsigned int code)
228{
229 // See if the abbrev code is already in the hash table.
230 Abbrev_code_table::const_iterator it = this->high_abbrev_codes_.find(code);
231 if (it != this->high_abbrev_codes_.end())
232 return it->second;
233
234 // Read and store abbrev code definitions until we find the
235 // one we're looking for.
236 for (;;)
237 {
238 // Read the abbrev code. A zero here indicates the end of the
239 // abbrev table.
240 size_t len;
241 if (this->buffer_pos_ >= this->buffer_end_)
242 return NULL;
243 uint64_t nextcode = read_unsigned_LEB_128(this->buffer_pos_, &len);
244 if (nextcode == 0)
245 {
246 this->buffer_pos_ = this->buffer_end_;
247 return NULL;
248 }
249 this->buffer_pos_ += len;
250
251 // Read the tag.
252 if (this->buffer_pos_ >= this->buffer_end_)
253 return NULL;
254 uint64_t tag = read_unsigned_LEB_128(this->buffer_pos_, &len);
255 this->buffer_pos_ += len;
256
257 // Read the has_children flag.
258 if (this->buffer_pos_ >= this->buffer_end_)
259 return NULL;
260 bool has_children = *this->buffer_pos_ == elfcpp::DW_CHILDREN_yes;
261 this->buffer_pos_ += 1;
262
263 // Read the list of (attribute, form) pairs.
264 Abbrev_code* entry = new Abbrev_code(tag, has_children);
265 for (;;)
266 {
267 // Read the attribute.
268 if (this->buffer_pos_ >= this->buffer_end_)
269 return NULL;
270 uint64_t attr = read_unsigned_LEB_128(this->buffer_pos_, &len);
271 this->buffer_pos_ += len;
272
273 // Read the form.
274 if (this->buffer_pos_ >= this->buffer_end_)
275 return NULL;
276 uint64_t form = read_unsigned_LEB_128(this->buffer_pos_, &len);
277 this->buffer_pos_ += len;
278
5cde809b
CC
279 // For DW_FORM_implicit_const, read the constant.
280 int64_t implicit_const = 0;
281 if (form == elfcpp::DW_FORM_implicit_const)
282 {
283 implicit_const = read_signed_LEB_128(this->buffer_pos_, &len);
284 this->buffer_pos_ += len;
285 }
286
c1027032
CC
287 // A (0,0) pair terminates the list.
288 if (attr == 0 && form == 0)
289 break;
290
291 if (attr == elfcpp::DW_AT_sibling)
292 entry->has_sibling_attribute = true;
293
5cde809b 294 entry->add_attribute(attr, form, implicit_const);
c1027032
CC
295 }
296
297 this->store_abbrev(nextcode, entry);
298 if (nextcode == code)
299 return entry;
300 }
301
302 return NULL;
303}
304
305// class Dwarf_ranges_table
306
307// Read the ranges table from an object file.
308
309bool
310Dwarf_ranges_table::read_ranges_table(
311 Relobj* object,
312 const unsigned char* symtab,
313 off_t symtab_size,
5cde809b
CC
314 unsigned int ranges_shndx,
315 unsigned int version)
c1027032 316{
5cde809b
CC
317 const std::string section_name(version < 5
318 ? ".debug_ranges"
319 : ".debug_rnglists");
320 const std::string compressed_section_name(version < 5
321 ? ".zdebug_ranges"
322 : ".zdebug_rnglists");
323
c1027032
CC
324 // If we've already read this abbrev table, return immediately.
325 if (this->ranges_shndx_ > 0
326 && this->ranges_shndx_ == ranges_shndx)
327 return true;
328
329 // If we don't have relocations, ranges_shndx will be 0, and
330 // we'll have to hunt for the .debug_ranges section.
331 if (ranges_shndx == 0 && this->ranges_shndx_ > 0)
332 ranges_shndx = this->ranges_shndx_;
333 else if (ranges_shndx == 0)
334 {
335 for (unsigned int i = 1; i < object->shnum(); ++i)
336 {
337 std::string name = object->section_name(i);
5cde809b 338 if (name == section_name || name == compressed_section_name)
c1027032
CC
339 {
340 ranges_shndx = i;
341 this->output_section_offset_ = object->output_section_offset(i);
342 break;
343 }
344 }
345 if (ranges_shndx == 0)
346 return false;
347 }
348
349 // Get the section contents and decompress if necessary.
350 if (ranges_shndx != this->ranges_shndx_)
351 {
352 if (this->owns_ranges_buffer_ && this->ranges_buffer_ != NULL)
353 {
354 delete[] this->ranges_buffer_;
355 this->owns_ranges_buffer_ = false;
356 }
357
358 section_size_type buffer_size;
359 this->ranges_buffer_ =
360 object->decompressed_section_contents(ranges_shndx,
361 &buffer_size,
362 &this->owns_ranges_buffer_);
363 this->ranges_buffer_end_ = this->ranges_buffer_ + buffer_size;
364 this->ranges_shndx_ = ranges_shndx;
365 }
366
367 if (this->ranges_reloc_mapper_ != NULL)
368 {
369 delete this->ranges_reloc_mapper_;
370 this->ranges_reloc_mapper_ = NULL;
371 }
372
373 // For incremental objects, we have no relocations.
374 if (object->is_incremental())
375 return true;
376
377 // Find the relocation section for ".debug_ranges".
378 unsigned int reloc_shndx = 0;
379 unsigned int reloc_type = 0;
380 for (unsigned int i = 0; i < object->shnum(); ++i)
381 {
382 reloc_type = object->section_type(i);
383 if ((reloc_type == elfcpp::SHT_REL
384 || reloc_type == elfcpp::SHT_RELA)
385 && object->section_info(i) == ranges_shndx)
386 {
387 reloc_shndx = i;
388 break;
389 }
390 }
391
392 this->ranges_reloc_mapper_ = make_elf_reloc_mapper(object, symtab,
393 symtab_size);
394 this->ranges_reloc_mapper_->initialize(reloc_shndx, reloc_type);
267257d2 395 this->reloc_type_ = reloc_type;
c1027032
CC
396
397 return true;
398}
399
400// Read a range list from section RANGES_SHNDX at offset RANGES_OFFSET.
401
402Dwarf_range_list*
403Dwarf_ranges_table::read_range_list(
404 Relobj* object,
405 const unsigned char* symtab,
406 off_t symtab_size,
407 unsigned int addr_size,
408 unsigned int ranges_shndx,
409 off_t offset)
410{
411 Dwarf_range_list* ranges;
412
5cde809b 413 if (!this->read_ranges_table(object, symtab, symtab_size, ranges_shndx, 4))
c1027032
CC
414 return NULL;
415
416 // Correct the offset. For incremental update links, we have a
417 // relocated offset that is relative to the output section, but
418 // here we need an offset relative to the input section.
419 offset -= this->output_section_offset_;
420
421 // Read the range list at OFFSET.
422 ranges = new Dwarf_range_list();
423 off_t base = 0;
424 for (;
425 this->ranges_buffer_ + offset < this->ranges_buffer_end_;
426 offset += 2 * addr_size)
427 {
428 off_t start;
429 off_t end;
430
431 // Read the raw contents of the section.
432 if (addr_size == 4)
433 {
ed5d6712
CC
434 start = this->dwinfo_->read_from_pointer<32>(this->ranges_buffer_
435 + offset);
436 end = this->dwinfo_->read_from_pointer<32>(this->ranges_buffer_
437 + offset + 4);
c1027032
CC
438 }
439 else
440 {
ed5d6712
CC
441 start = this->dwinfo_->read_from_pointer<64>(this->ranges_buffer_
442 + offset);
443 end = this->dwinfo_->read_from_pointer<64>(this->ranges_buffer_
444 + offset + 8);
c1027032
CC
445 }
446
447 // Check for relocations and adjust the values.
448 unsigned int shndx1 = 0;
449 unsigned int shndx2 = 0;
450 if (this->ranges_reloc_mapper_ != NULL)
451 {
267257d2
CC
452 shndx1 = this->lookup_reloc(offset, &start);
453 shndx2 = this->lookup_reloc(offset + addr_size, &end);
c1027032
CC
454 }
455
456 // End of list is marked by a pair of zeroes.
457 if (shndx1 == 0 && start == 0 && end == 0)
458 break;
459
460 // A "base address selection entry" is identified by
461 // 0xffffffff for the first value of the pair. The second
462 // value is used as a base for subsequent range list entries.
463 if (shndx1 == 0 && start == -1)
464 base = end;
465 else if (shndx1 == shndx2)
466 {
467 if (shndx1 == 0 || object->is_section_included(shndx1))
468 ranges->add(shndx1, base + start, base + end);
469 }
470 else
471 gold_warning(_("%s: DWARF info may be corrupt; offsets in a "
472 "range list entry are in different sections"),
473 object->name().c_str());
474 }
475
476 return ranges;
477}
478
5cde809b
CC
479// Read a DWARF 5 range list from section RANGES_SHNDX at offset RANGES_OFFSET.
480
481Dwarf_range_list*
482Dwarf_ranges_table::read_range_list_v5(
483 Relobj* object,
484 const unsigned char* symtab,
485 off_t symtab_size,
486 unsigned int addr_size,
487 unsigned int ranges_shndx,
488 off_t offset)
489{
490 Dwarf_range_list* ranges;
491
492 if (!this->read_ranges_table(object, symtab, symtab_size, ranges_shndx, 5))
493 return NULL;
494
495 ranges = new Dwarf_range_list();
496 off_t base = 0;
497 unsigned int shndx0 = 0;
498
499 // Correct the offset. For incremental update links, we have a
500 // relocated offset that is relative to the output section, but
501 // here we need an offset relative to the input section.
502 offset -= this->output_section_offset_;
503
504 // Read the range list at OFFSET.
505 const unsigned char* prle = this->ranges_buffer_ + offset;
506 while (prle < this->ranges_buffer_end_)
507 {
508 off_t start;
509 off_t end;
510 unsigned int shndx1 = 0;
511 unsigned int shndx2 = 0;
512 size_t len;
513
514 // Read the entry type.
515 unsigned int rle_type = *prle++;
516 offset += 1;
517
518 if (rle_type == elfcpp::DW_RLE_end_of_list)
519 break;
520
521 switch (rle_type)
522 {
523 case elfcpp::DW_RLE_base_address:
524 if (addr_size == 4)
525 base = this->dwinfo_->read_from_pointer<32>(prle);
526 else
527 base = this->dwinfo_->read_from_pointer<64>(prle);
528 if (this->ranges_reloc_mapper_ != NULL)
529 shndx0 = this->lookup_reloc(offset, &base);
530 prle += addr_size;
531 offset += addr_size;
532 break;
533
534 case elfcpp::DW_RLE_offset_pair:
535 start = read_unsigned_LEB_128(prle, &len);
536 prle += len;
537 offset += len;
538 end = read_unsigned_LEB_128(prle, &len);
539 prle += len;
540 offset += len;
541 if (shndx0 == 0 || object->is_section_included(shndx0))
542 ranges->add(shndx0, base + start, base + end);
543 break;
544
545 case elfcpp::DW_RLE_start_end:
546 if (addr_size == 4)
547 {
548 start = this->dwinfo_->read_from_pointer<32>(prle);
549 end = this->dwinfo_->read_from_pointer<32>(prle + 4);
550 }
551 else
552 {
553 start = this->dwinfo_->read_from_pointer<64>(prle);
554 end = this->dwinfo_->read_from_pointer<64>(prle + 8);
555 }
556 if (this->ranges_reloc_mapper_ != NULL)
557 {
558 shndx1 = this->lookup_reloc(offset, &start);
559 shndx2 = this->lookup_reloc(offset + addr_size, &end);
560 if (shndx1 != shndx2)
561 gold_warning(_("%s: DWARF info may be corrupt; offsets in a "
562 "range list entry are in different sections"),
563 object->name().c_str());
564 }
565 prle += addr_size * 2;
566 offset += addr_size * 2;
567 if (shndx1 == 0 || object->is_section_included(shndx1))
568 ranges->add(shndx1, start, end);
569 break;
570
571 case elfcpp::DW_RLE_start_length:
572 if (addr_size == 4)
573 start = this->dwinfo_->read_from_pointer<32>(prle);
574 else
575 start = this->dwinfo_->read_from_pointer<64>(prle);
576 if (this->ranges_reloc_mapper_ != NULL)
577 shndx1 = this->lookup_reloc(offset, &start);
578 prle += addr_size;
579 offset += addr_size;
580 end = start + read_unsigned_LEB_128(prle, &len);
581 prle += len;
582 offset += len;
583 if (shndx1 == 0 || object->is_section_included(shndx1))
584 ranges->add(shndx1, start, end);
585 break;
586
587 default:
588 gold_warning(_("%s: DWARF range list contains "
589 "unsupported entry type (%d)"),
590 object->name().c_str(), rle_type);
591 break;
592 }
593 }
594
595 return ranges;
596}
597
267257d2
CC
598// Look for a relocation at offset OFF in the range table,
599// and return the section index and offset of the target.
600
601unsigned int
602Dwarf_ranges_table::lookup_reloc(off_t off, off_t* target_off)
603{
604 off_t value;
605 unsigned int shndx =
606 this->ranges_reloc_mapper_->get_reloc_target(off, &value);
607 if (shndx == 0)
608 return 0;
609 if (this->reloc_type_ == elfcpp::SHT_REL)
610 *target_off += value;
611 else
612 *target_off = value;
613 return shndx;
614}
615
c1027032
CC
616// class Dwarf_pubnames_table
617
234d4ab8 618// Read the pubnames section from the object file.
c1027032
CC
619
620bool
234d4ab8
SA
621Dwarf_pubnames_table::read_section(Relobj* object, const unsigned char* symtab,
622 off_t symtab_size)
c1027032
CC
623{
624 section_size_type buffer_size;
234d4ab8 625 unsigned int shndx = 0;
ec673e64
CC
626 const char* name = this->is_pubtypes_ ? "pubtypes" : "pubnames";
627 const char* gnu_name = (this->is_pubtypes_
628 ? "gnu_pubtypes"
629 : "gnu_pubnames");
c1027032 630
234d4ab8 631 for (unsigned int i = 1; i < object->shnum(); ++i)
c1027032 632 {
ec673e64
CC
633 std::string section_name = object->section_name(i);
634 const char* section_name_suffix = section_name.c_str();
635 if (is_prefix_of(".debug_", section_name_suffix))
636 section_name_suffix += 7;
637 else if (is_prefix_of(".zdebug_", section_name_suffix))
638 section_name_suffix += 8;
639 else
640 continue;
641 if (strcmp(section_name_suffix, name) == 0)
642 {
643 shndx = i;
ec673e64
CC
644 break;
645 }
646 else if (strcmp(section_name_suffix, gnu_name) == 0)
234d4ab8
SA
647 {
648 shndx = i;
ec673e64 649 this->is_gnu_style_ = true;
234d4ab8
SA
650 break;
651 }
c1027032 652 }
234d4ab8
SA
653 if (shndx == 0)
654 return false;
655
c1027032
CC
656 this->buffer_ = object->decompressed_section_contents(shndx,
657 &buffer_size,
658 &this->owns_buffer_);
659 if (this->buffer_ == NULL)
660 return false;
661 this->buffer_end_ = this->buffer_ + buffer_size;
234d4ab8
SA
662
663 // For incremental objects, we have no relocations.
664 if (object->is_incremental())
665 return true;
666
667 // Find the relocation section
668 unsigned int reloc_shndx = 0;
669 unsigned int reloc_type = 0;
670 for (unsigned int i = 0; i < object->shnum(); ++i)
671 {
672 reloc_type = object->section_type(i);
673 if ((reloc_type == elfcpp::SHT_REL
674 || reloc_type == elfcpp::SHT_RELA)
675 && object->section_info(i) == shndx)
676 {
677 reloc_shndx = i;
678 break;
679 }
680 }
681
682 this->reloc_mapper_ = make_elf_reloc_mapper(object, symtab, symtab_size);
683 this->reloc_mapper_->initialize(reloc_shndx, reloc_type);
684 this->reloc_type_ = reloc_type;
685
c1027032
CC
686 return true;
687}
688
689// Read the header for the set at OFFSET.
690
691bool
692Dwarf_pubnames_table::read_header(off_t offset)
693{
234d4ab8
SA
694 // Make sure we have actually read the section.
695 gold_assert(this->buffer_ != NULL);
696
c1027032
CC
697 if (offset < 0 || offset + 14 >= this->buffer_end_ - this->buffer_)
698 return false;
699
700 const unsigned char* pinfo = this->buffer_ + offset;
701
702 // Read the unit_length field.
234d4ab8 703 uint64_t unit_length = this->dwinfo_->read_from_pointer<32>(pinfo);
c1027032
CC
704 pinfo += 4;
705 if (unit_length == 0xffffffff)
706 {
ed5d6712 707 unit_length = this->dwinfo_->read_from_pointer<64>(pinfo);
234d4ab8 708 this->unit_length_ = unit_length + 12;
c1027032
CC
709 pinfo += 8;
710 this->offset_size_ = 8;
711 }
712 else
234d4ab8
SA
713 {
714 this->unit_length_ = unit_length + 4;
715 this->offset_size_ = 4;
716 }
ec673e64 717 this->end_of_table_ = pinfo + unit_length;
c1027032 718
9baa787b
CC
719 // If unit_length is too big, maybe we should reject the whole table,
720 // but in cases we know about, it seems OK to assume that the table
721 // is valid through the actual end of the section.
722 if (this->end_of_table_ > this->buffer_end_)
723 this->end_of_table_ = this->buffer_end_;
724
c1027032 725 // Check the version.
ed5d6712 726 unsigned int version = this->dwinfo_->read_from_pointer<16>(pinfo);
c1027032
CC
727 pinfo += 2;
728 if (version != 2)
729 return false;
50ed5eb1 730
234d4ab8
SA
731 this->reloc_mapper_->get_reloc_target(pinfo - this->buffer_,
732 &this->cu_offset_);
733
c1027032
CC
734 // Skip the debug_info_offset and debug_info_size fields.
735 pinfo += 2 * this->offset_size_;
736
737 if (pinfo >= this->buffer_end_)
738 return false;
739
740 this->pinfo_ = pinfo;
741 return true;
742}
743
744// Read the next name from the set.
745
746const char*
ec673e64 747Dwarf_pubnames_table::next_name(uint8_t* flag_byte)
c1027032
CC
748{
749 const unsigned char* pinfo = this->pinfo_;
750
ec673e64
CC
751 // Check for end of list. The table should be terminated by an
752 // entry containing nothing but a DIE offset of 0.
753 if (pinfo + this->offset_size_ >= this->end_of_table_)
c1027032
CC
754 return NULL;
755
ec673e64
CC
756 // Skip the offset within the CU. If this is zero, but we're not
757 // at the end of the table, then we have a real pubnames entry
758 // whose DIE offset is 0 (likely to be a GCC bug). Since we
759 // don't actually use the DIE offset in building .gdb_index,
760 // it's harmless.
761 pinfo += this->offset_size_;
762
763 if (this->is_gnu_style_)
764 *flag_byte = *pinfo++;
765 else
766 *flag_byte = 0;
767
c1027032
CC
768 // Return a pointer to the string at the current location,
769 // and advance the pointer to the next entry.
770 const char* ret = reinterpret_cast<const char*>(pinfo);
771 while (pinfo < this->buffer_end_ && *pinfo != '\0')
772 ++pinfo;
773 if (pinfo < this->buffer_end_)
774 ++pinfo;
775
776 this->pinfo_ = pinfo;
777 return ret;
778}
779
780// class Dwarf_die
781
782Dwarf_die::Dwarf_die(
783 Dwarf_info_reader* dwinfo,
784 off_t die_offset,
785 Dwarf_die* parent)
786 : dwinfo_(dwinfo), parent_(parent), die_offset_(die_offset),
787 child_offset_(0), sibling_offset_(0), abbrev_code_(NULL), attributes_(),
788 attributes_read_(false), name_(NULL), name_off_(-1), linkage_name_(NULL),
789 linkage_name_off_(-1), string_shndx_(0), specification_(0),
790 abstract_origin_(0)
791{
792 size_t len;
793 const unsigned char* pdie = dwinfo->buffer_at_offset(die_offset);
794 if (pdie == NULL)
795 return;
796 unsigned int code = read_unsigned_LEB_128(pdie, &len);
797 if (code == 0)
798 {
799 if (parent != NULL)
800 parent->set_sibling_offset(die_offset + len);
801 return;
802 }
803 this->attr_offset_ = len;
804
805 // Lookup the abbrev code in the abbrev table.
806 this->abbrev_code_ = dwinfo->get_abbrev(code);
807}
808
809// Read all the attributes of the DIE.
810
811bool
812Dwarf_die::read_attributes()
813{
814 if (this->attributes_read_)
815 return true;
816
817 gold_assert(this->abbrev_code_ != NULL);
818
819 const unsigned char* pdie =
820 this->dwinfo_->buffer_at_offset(this->die_offset_);
821 if (pdie == NULL)
822 return false;
823 const unsigned char* pattr = pdie + this->attr_offset_;
824
825 unsigned int nattr = this->abbrev_code_->attributes.size();
826 this->attributes_.reserve(nattr);
827 for (unsigned int i = 0; i < nattr; ++i)
828 {
829 size_t len;
830 unsigned int attr = this->abbrev_code_->attributes[i].attr;
831 unsigned int form = this->abbrev_code_->attributes[i].form;
832 if (form == elfcpp::DW_FORM_indirect)
833 {
834 form = read_unsigned_LEB_128(pattr, &len);
835 pattr += len;
836 }
837 off_t attr_off = this->die_offset_ + (pattr - pdie);
838 bool ref_form = false;
839 Attribute_value attr_value;
840 attr_value.attr = attr;
841 attr_value.form = form;
842 attr_value.aux.shndx = 0;
843 switch(form)
844 {
c1027032
CC
845 case elfcpp::DW_FORM_flag_present:
846 attr_value.val.intval = 1;
847 break;
5cde809b
CC
848 case elfcpp::DW_FORM_implicit_const:
849 attr_value.val.intval =
850 this->abbrev_code_->attributes[i].implicit_const;
851 break;
c1027032 852 case elfcpp::DW_FORM_strp:
5cde809b
CC
853 case elfcpp::DW_FORM_strp_sup:
854 case elfcpp::DW_FORM_line_strp:
c1027032
CC
855 {
856 off_t str_off;
857 if (this->dwinfo_->offset_size() == 4)
ed5d6712 858 str_off = this->dwinfo_->read_from_pointer<32>(&pattr);
c1027032 859 else
ed5d6712 860 str_off = this->dwinfo_->read_from_pointer<64>(&pattr);
c1027032
CC
861 unsigned int shndx =
862 this->dwinfo_->lookup_reloc(attr_off, &str_off);
863 attr_value.aux.shndx = shndx;
864 attr_value.val.refval = str_off;
865 break;
866 }
5cde809b
CC
867 case elfcpp::DW_FORM_strx:
868 case elfcpp::DW_FORM_GNU_str_index:
869 attr_value.val.uintval = read_unsigned_LEB_128(pattr, &len);
870 pattr += len;
871 break;
872 case elfcpp::DW_FORM_strx1:
873 attr_value.val.uintval = *pattr++;
874 break;
875 case elfcpp::DW_FORM_strx2:
876 attr_value.val.uintval =
877 this->dwinfo_->read_from_pointer<16>(&pattr);
878 break;
879 case elfcpp::DW_FORM_strx3:
880 attr_value.val.uintval =
881 this->dwinfo_->read_3bytes_from_pointer(&pattr);
882 break;
883 case elfcpp::DW_FORM_strx4:
884 attr_value.val.uintval =
885 this->dwinfo_->read_from_pointer<32>(&pattr);
886 break;
c1027032
CC
887 case elfcpp::DW_FORM_sec_offset:
888 {
889 off_t sec_off;
890 if (this->dwinfo_->offset_size() == 4)
ed5d6712 891 sec_off = this->dwinfo_->read_from_pointer<32>(&pattr);
c1027032 892 else
ed5d6712 893 sec_off = this->dwinfo_->read_from_pointer<64>(&pattr);
c1027032
CC
894 unsigned int shndx =
895 this->dwinfo_->lookup_reloc(attr_off, &sec_off);
896 attr_value.aux.shndx = shndx;
897 attr_value.val.refval = sec_off;
898 ref_form = true;
899 break;
900 }
901 case elfcpp::DW_FORM_addr:
c1027032
CC
902 {
903 off_t sec_off;
904 if (this->dwinfo_->address_size() == 4)
ed5d6712 905 sec_off = this->dwinfo_->read_from_pointer<32>(&pattr);
c1027032 906 else
ed5d6712 907 sec_off = this->dwinfo_->read_from_pointer<64>(&pattr);
c1027032
CC
908 unsigned int shndx =
909 this->dwinfo_->lookup_reloc(attr_off, &sec_off);
910 attr_value.aux.shndx = shndx;
911 attr_value.val.refval = sec_off;
c1027032
CC
912 break;
913 }
20dd9c21
CC
914 case elfcpp::DW_FORM_ref_addr:
915 {
916 off_t sec_off;
917 if (this->dwinfo_->ref_addr_size() == 4)
918 sec_off = this->dwinfo_->read_from_pointer<32>(&pattr);
919 else
920 sec_off = this->dwinfo_->read_from_pointer<64>(&pattr);
921 unsigned int shndx =
922 this->dwinfo_->lookup_reloc(attr_off, &sec_off);
923 attr_value.aux.shndx = shndx;
924 attr_value.val.refval = sec_off;
925 ref_form = true;
926 break;
927 }
c1027032
CC
928 case elfcpp::DW_FORM_block1:
929 attr_value.aux.blocklen = *pattr++;
930 attr_value.val.blockval = pattr;
931 pattr += attr_value.aux.blocklen;
932 break;
933 case elfcpp::DW_FORM_block2:
ed5d6712
CC
934 attr_value.aux.blocklen =
935 this->dwinfo_->read_from_pointer<16>(&pattr);
c1027032
CC
936 attr_value.val.blockval = pattr;
937 pattr += attr_value.aux.blocklen;
938 break;
939 case elfcpp::DW_FORM_block4:
ed5d6712
CC
940 attr_value.aux.blocklen =
941 this->dwinfo_->read_from_pointer<32>(&pattr);
c1027032
CC
942 attr_value.val.blockval = pattr;
943 pattr += attr_value.aux.blocklen;
944 break;
945 case elfcpp::DW_FORM_block:
946 case elfcpp::DW_FORM_exprloc:
947 attr_value.aux.blocklen = read_unsigned_LEB_128(pattr, &len);
948 attr_value.val.blockval = pattr + len;
949 pattr += len + attr_value.aux.blocklen;
950 break;
951 case elfcpp::DW_FORM_data1:
952 case elfcpp::DW_FORM_flag:
953 attr_value.val.intval = *pattr++;
954 break;
955 case elfcpp::DW_FORM_ref1:
956 attr_value.val.refval = *pattr++;
957 ref_form = true;
958 break;
959 case elfcpp::DW_FORM_data2:
ed5d6712
CC
960 attr_value.val.intval =
961 this->dwinfo_->read_from_pointer<16>(&pattr);
c1027032
CC
962 break;
963 case elfcpp::DW_FORM_ref2:
ed5d6712
CC
964 attr_value.val.refval =
965 this->dwinfo_->read_from_pointer<16>(&pattr);
c1027032
CC
966 ref_form = true;
967 break;
968 case elfcpp::DW_FORM_data4:
969 {
970 off_t sec_off;
ed5d6712 971 sec_off = this->dwinfo_->read_from_pointer<32>(&pattr);
c1027032
CC
972 unsigned int shndx =
973 this->dwinfo_->lookup_reloc(attr_off, &sec_off);
974 attr_value.aux.shndx = shndx;
975 attr_value.val.intval = sec_off;
976 break;
977 }
978 case elfcpp::DW_FORM_ref4:
5cde809b 979 case elfcpp::DW_FORM_ref_sup4:
c1027032
CC
980 {
981 off_t sec_off;
ed5d6712 982 sec_off = this->dwinfo_->read_from_pointer<32>(&pattr);
c1027032
CC
983 unsigned int shndx =
984 this->dwinfo_->lookup_reloc(attr_off, &sec_off);
985 attr_value.aux.shndx = shndx;
986 attr_value.val.refval = sec_off;
987 ref_form = true;
988 break;
989 }
990 case elfcpp::DW_FORM_data8:
991 {
992 off_t sec_off;
ed5d6712 993 sec_off = this->dwinfo_->read_from_pointer<64>(&pattr);
c1027032
CC
994 unsigned int shndx =
995 this->dwinfo_->lookup_reloc(attr_off, &sec_off);
996 attr_value.aux.shndx = shndx;
997 attr_value.val.intval = sec_off;
998 break;
999 }
5cde809b
CC
1000 case elfcpp::DW_FORM_data16:
1001 {
1002 // For now, treat this as a 16-byte block.
1003 attr_value.val.blockval = pattr;
1004 attr_value.aux.blocklen = 16;
1005 pattr += 16;
1006 break;
1007 }
c1027032 1008 case elfcpp::DW_FORM_ref_sig8:
ed5d6712
CC
1009 attr_value.val.uintval =
1010 this->dwinfo_->read_from_pointer<64>(&pattr);
c1027032
CC
1011 break;
1012 case elfcpp::DW_FORM_ref8:
5cde809b 1013 case elfcpp::DW_FORM_ref_sup8:
c1027032
CC
1014 {
1015 off_t sec_off;
ed5d6712 1016 sec_off = this->dwinfo_->read_from_pointer<64>(&pattr);
c1027032
CC
1017 unsigned int shndx =
1018 this->dwinfo_->lookup_reloc(attr_off, &sec_off);
1019 attr_value.aux.shndx = shndx;
1020 attr_value.val.refval = sec_off;
1021 ref_form = true;
1022 break;
1023 }
1024 case elfcpp::DW_FORM_ref_udata:
1025 attr_value.val.refval = read_unsigned_LEB_128(pattr, &len);
1026 ref_form = true;
1027 pattr += len;
1028 break;
1029 case elfcpp::DW_FORM_udata:
5cde809b
CC
1030 attr_value.val.uintval = read_unsigned_LEB_128(pattr, &len);
1031 pattr += len;
1032 break;
1033 case elfcpp::DW_FORM_addrx:
d2d60eef 1034 case elfcpp::DW_FORM_GNU_addr_index:
c1027032
CC
1035 attr_value.val.uintval = read_unsigned_LEB_128(pattr, &len);
1036 pattr += len;
1037 break;
5cde809b
CC
1038 case elfcpp::DW_FORM_addrx1:
1039 attr_value.val.uintval = *pattr++;
1040 break;
1041 case elfcpp::DW_FORM_addrx2:
1042 attr_value.val.uintval =
1043 this->dwinfo_->read_from_pointer<16>(&pattr);
1044 break;
1045 case elfcpp::DW_FORM_addrx3:
1046 attr_value.val.uintval =
1047 this->dwinfo_->read_3bytes_from_pointer(&pattr);
1048 break;
1049 case elfcpp::DW_FORM_addrx4:
1050 attr_value.val.uintval =
1051 this->dwinfo_->read_from_pointer<32>(&pattr);
1052 break;
c1027032
CC
1053 case elfcpp::DW_FORM_sdata:
1054 attr_value.val.intval = read_signed_LEB_128(pattr, &len);
1055 pattr += len;
1056 break;
1057 case elfcpp::DW_FORM_string:
1058 attr_value.val.stringval = reinterpret_cast<const char*>(pattr);
1059 len = strlen(attr_value.val.stringval);
1060 pattr += len + 1;
1061 break;
5cde809b
CC
1062 case elfcpp::DW_FORM_loclistx:
1063 case elfcpp::DW_FORM_rnglistx:
1064 attr_value.val.uintval = read_unsigned_LEB_128(pattr, &len);
1065 pattr += len;
1066 break;
c1027032
CC
1067 default:
1068 return false;
1069 }
1070
1071 // Cache the most frequently-requested attributes.
1072 switch (attr)
1073 {
1074 case elfcpp::DW_AT_name:
1075 if (form == elfcpp::DW_FORM_string)
1076 this->name_ = attr_value.val.stringval;
1077 else if (form == elfcpp::DW_FORM_strp)
1078 {
1079 // All indirect strings should refer to the same
1080 // string section, so we just save the last one seen.
1081 this->string_shndx_ = attr_value.aux.shndx;
1082 this->name_off_ = attr_value.val.refval;
1083 }
1084 break;
1085 case elfcpp::DW_AT_linkage_name:
1086 case elfcpp::DW_AT_MIPS_linkage_name:
1087 if (form == elfcpp::DW_FORM_string)
1088 this->linkage_name_ = attr_value.val.stringval;
1089 else if (form == elfcpp::DW_FORM_strp)
1090 {
1091 // All indirect strings should refer to the same
1092 // string section, so we just save the last one seen.
1093 this->string_shndx_ = attr_value.aux.shndx;
1094 this->linkage_name_off_ = attr_value.val.refval;
1095 }
1096 break;
1097 case elfcpp::DW_AT_specification:
1098 if (ref_form)
1099 this->specification_ = attr_value.val.refval;
1100 break;
1101 case elfcpp::DW_AT_abstract_origin:
1102 if (ref_form)
1103 this->abstract_origin_ = attr_value.val.refval;
1104 break;
1105 case elfcpp::DW_AT_sibling:
1106 if (ref_form && attr_value.aux.shndx == 0)
1107 this->sibling_offset_ = attr_value.val.refval;
1108 default:
1109 break;
1110 }
1111
1112 this->attributes_.push_back(attr_value);
1113 }
1114
1115 // Now that we know where the next DIE begins, record the offset
1116 // to avoid later recalculation.
1117 if (this->has_children())
1118 this->child_offset_ = this->die_offset_ + (pattr - pdie);
1119 else
1120 this->sibling_offset_ = this->die_offset_ + (pattr - pdie);
1121
1122 this->attributes_read_ = true;
1123 return true;
1124}
1125
1126// Skip all the attributes of the DIE and return the offset of the next DIE.
1127
1128off_t
1129Dwarf_die::skip_attributes()
1130{
c1027032
CC
1131 gold_assert(this->abbrev_code_ != NULL);
1132
1133 const unsigned char* pdie =
1134 this->dwinfo_->buffer_at_offset(this->die_offset_);
1135 if (pdie == NULL)
1136 return 0;
1137 const unsigned char* pattr = pdie + this->attr_offset_;
1138
1139 for (unsigned int i = 0; i < this->abbrev_code_->attributes.size(); ++i)
1140 {
1141 size_t len;
1142 unsigned int form = this->abbrev_code_->attributes[i].form;
1143 if (form == elfcpp::DW_FORM_indirect)
1144 {
1145 form = read_unsigned_LEB_128(pattr, &len);
1146 pattr += len;
1147 }
1148 switch(form)
1149 {
c1027032 1150 case elfcpp::DW_FORM_flag_present:
5cde809b 1151 case elfcpp::DW_FORM_implicit_const:
c1027032
CC
1152 break;
1153 case elfcpp::DW_FORM_strp:
1154 case elfcpp::DW_FORM_sec_offset:
5cde809b
CC
1155 case elfcpp::DW_FORM_strp_sup:
1156 case elfcpp::DW_FORM_line_strp:
c1027032
CC
1157 pattr += this->dwinfo_->offset_size();
1158 break;
1159 case elfcpp::DW_FORM_addr:
c1027032
CC
1160 pattr += this->dwinfo_->address_size();
1161 break;
20dd9c21
CC
1162 case elfcpp::DW_FORM_ref_addr:
1163 pattr += this->dwinfo_->ref_addr_size();
1164 break;
c1027032
CC
1165 case elfcpp::DW_FORM_block1:
1166 pattr += 1 + *pattr;
1167 break;
1168 case elfcpp::DW_FORM_block2:
1169 {
1170 uint16_t block_size;
ed5d6712 1171 block_size = this->dwinfo_->read_from_pointer<16>(&pattr);
c1027032
CC
1172 pattr += block_size;
1173 break;
1174 }
1175 case elfcpp::DW_FORM_block4:
1176 {
1177 uint32_t block_size;
ed5d6712 1178 block_size = this->dwinfo_->read_from_pointer<32>(&pattr);
c1027032
CC
1179 pattr += block_size;
1180 break;
1181 }
1182 case elfcpp::DW_FORM_block:
1183 case elfcpp::DW_FORM_exprloc:
1184 {
1185 uint64_t block_size;
1186 block_size = read_unsigned_LEB_128(pattr, &len);
1187 pattr += len + block_size;
1188 break;
1189 }
1190 case elfcpp::DW_FORM_data1:
1191 case elfcpp::DW_FORM_ref1:
1192 case elfcpp::DW_FORM_flag:
5cde809b
CC
1193 case elfcpp::DW_FORM_strx1:
1194 case elfcpp::DW_FORM_addrx1:
c1027032
CC
1195 pattr += 1;
1196 break;
1197 case elfcpp::DW_FORM_data2:
1198 case elfcpp::DW_FORM_ref2:
5cde809b
CC
1199 case elfcpp::DW_FORM_strx2:
1200 case elfcpp::DW_FORM_addrx2:
c1027032
CC
1201 pattr += 2;
1202 break;
5cde809b
CC
1203 case elfcpp::DW_FORM_strx3:
1204 case elfcpp::DW_FORM_addrx3:
1205 pattr += 3;
1206 break;
c1027032
CC
1207 case elfcpp::DW_FORM_data4:
1208 case elfcpp::DW_FORM_ref4:
5cde809b
CC
1209 case elfcpp::DW_FORM_ref_sup4:
1210 case elfcpp::DW_FORM_strx4:
1211 case elfcpp::DW_FORM_addrx4:
c1027032
CC
1212 pattr += 4;
1213 break;
1214 case elfcpp::DW_FORM_data8:
1215 case elfcpp::DW_FORM_ref8:
1216 case elfcpp::DW_FORM_ref_sig8:
5cde809b 1217 case elfcpp::DW_FORM_ref_sup8:
c1027032
CC
1218 pattr += 8;
1219 break;
5cde809b
CC
1220 case elfcpp::DW_FORM_data16:
1221 pattr += 16;
1222 break;
c1027032
CC
1223 case elfcpp::DW_FORM_ref_udata:
1224 case elfcpp::DW_FORM_udata:
5cde809b
CC
1225 case elfcpp::DW_FORM_addrx:
1226 case elfcpp::DW_FORM_strx:
1227 case elfcpp::DW_FORM_loclistx:
1228 case elfcpp::DW_FORM_rnglistx:
d2d60eef
CC
1229 case elfcpp::DW_FORM_GNU_addr_index:
1230 case elfcpp::DW_FORM_GNU_str_index:
c1027032
CC
1231 read_unsigned_LEB_128(pattr, &len);
1232 pattr += len;
1233 break;
1234 case elfcpp::DW_FORM_sdata:
1235 read_signed_LEB_128(pattr, &len);
1236 pattr += len;
1237 break;
1238 case elfcpp::DW_FORM_string:
1239 len = strlen(reinterpret_cast<const char*>(pattr));
1240 pattr += len + 1;
1241 break;
1242 default:
1243 return 0;
1244 }
1245 }
1246
1247 return this->die_offset_ + (pattr - pdie);
1248}
1249
1250// Get the name of the DIE and cache it.
1251
1252void
1253Dwarf_die::set_name()
1254{
1255 if (this->name_ != NULL || !this->read_attributes())
1256 return;
1257 if (this->name_off_ != -1)
1258 this->name_ = this->dwinfo_->get_string(this->name_off_,
1259 this->string_shndx_);
1260}
1261
1262// Get the linkage name of the DIE and cache it.
1263
1264void
1265Dwarf_die::set_linkage_name()
1266{
1267 if (this->linkage_name_ != NULL || !this->read_attributes())
1268 return;
1269 if (this->linkage_name_off_ != -1)
1270 this->linkage_name_ = this->dwinfo_->get_string(this->linkage_name_off_,
1271 this->string_shndx_);
1272}
1273
1274// Return the value of attribute ATTR.
1275
1276const Dwarf_die::Attribute_value*
1277Dwarf_die::attribute(unsigned int attr)
1278{
1279 if (!this->read_attributes())
1280 return NULL;
1281 for (unsigned int i = 0; i < this->attributes_.size(); ++i)
1282 {
1283 if (this->attributes_[i].attr == attr)
1284 return &this->attributes_[i];
1285 }
1286 return NULL;
1287}
1288
1289const char*
1290Dwarf_die::string_attribute(unsigned int attr)
1291{
1292 const Attribute_value* attr_val = this->attribute(attr);
1293 if (attr_val == NULL)
1294 return NULL;
1295 switch (attr_val->form)
1296 {
1297 case elfcpp::DW_FORM_string:
1298 return attr_val->val.stringval;
1299 case elfcpp::DW_FORM_strp:
1300 return this->dwinfo_->get_string(attr_val->val.refval,
1301 attr_val->aux.shndx);
1302 default:
1303 return NULL;
1304 }
1305}
1306
1307int64_t
1308Dwarf_die::int_attribute(unsigned int attr)
1309{
1310 const Attribute_value* attr_val = this->attribute(attr);
1311 if (attr_val == NULL)
1312 return 0;
1313 switch (attr_val->form)
1314 {
c1027032
CC
1315 case elfcpp::DW_FORM_flag_present:
1316 case elfcpp::DW_FORM_data1:
1317 case elfcpp::DW_FORM_flag:
1318 case elfcpp::DW_FORM_data2:
1319 case elfcpp::DW_FORM_data4:
1320 case elfcpp::DW_FORM_data8:
1321 case elfcpp::DW_FORM_sdata:
1322 return attr_val->val.intval;
1323 default:
1324 return 0;
1325 }
1326}
1327
1328uint64_t
1329Dwarf_die::uint_attribute(unsigned int attr)
1330{
1331 const Attribute_value* attr_val = this->attribute(attr);
1332 if (attr_val == NULL)
1333 return 0;
1334 switch (attr_val->form)
1335 {
c1027032
CC
1336 case elfcpp::DW_FORM_flag_present:
1337 case elfcpp::DW_FORM_data1:
1338 case elfcpp::DW_FORM_flag:
1339 case elfcpp::DW_FORM_data4:
1340 case elfcpp::DW_FORM_data8:
1341 case elfcpp::DW_FORM_ref_sig8:
1342 case elfcpp::DW_FORM_udata:
1343 return attr_val->val.uintval;
1344 default:
1345 return 0;
1346 }
1347}
1348
1349off_t
1350Dwarf_die::ref_attribute(unsigned int attr, unsigned int* shndx)
1351{
1352 const Attribute_value* attr_val = this->attribute(attr);
1353 if (attr_val == NULL)
1354 return -1;
1355 switch (attr_val->form)
1356 {
1357 case elfcpp::DW_FORM_sec_offset:
1358 case elfcpp::DW_FORM_addr:
1359 case elfcpp::DW_FORM_ref_addr:
1360 case elfcpp::DW_FORM_ref1:
1361 case elfcpp::DW_FORM_ref2:
1362 case elfcpp::DW_FORM_ref4:
1363 case elfcpp::DW_FORM_ref8:
1364 case elfcpp::DW_FORM_ref_udata:
1365 *shndx = attr_val->aux.shndx;
1366 return attr_val->val.refval;
1367 case elfcpp::DW_FORM_ref_sig8:
1368 *shndx = attr_val->aux.shndx;
1369 return attr_val->val.uintval;
1370 case elfcpp::DW_FORM_data4:
1371 case elfcpp::DW_FORM_data8:
1372 *shndx = attr_val->aux.shndx;
1373 return attr_val->val.intval;
1374 default:
1375 return -1;
1376 }
1377}
1378
57923f48
MW
1379off_t
1380Dwarf_die::address_attribute(unsigned int attr, unsigned int* shndx)
1381{
1382 const Attribute_value* attr_val = this->attribute(attr);
1383 if (attr_val == NULL || attr_val->form != elfcpp::DW_FORM_addr)
1384 return -1;
1385
1386 *shndx = attr_val->aux.shndx;
1387 return attr_val->val.refval;
1388}
1389
c1027032
CC
1390// Return the offset of this DIE's first child.
1391
1392off_t
1393Dwarf_die::child_offset()
1394{
1395 gold_assert(this->abbrev_code_ != NULL);
1396 if (!this->has_children())
1397 return 0;
1398 if (this->child_offset_ == 0)
1399 this->child_offset_ = this->skip_attributes();
1400 return this->child_offset_;
1401}
1402
1403// Return the offset of this DIE's next sibling.
1404
1405off_t
1406Dwarf_die::sibling_offset()
1407{
1408 gold_assert(this->abbrev_code_ != NULL);
1409
1410 if (this->sibling_offset_ != 0)
1411 return this->sibling_offset_;
1412
1413 if (!this->has_children())
1414 {
1415 this->sibling_offset_ = this->skip_attributes();
1416 return this->sibling_offset_;
1417 }
1418
1419 if (this->has_sibling_attribute())
1420 {
1421 if (!this->read_attributes())
1422 return 0;
1423 if (this->sibling_offset_ != 0)
1424 return this->sibling_offset_;
1425 }
1426
1427 // Skip over the children.
1428 off_t child_offset = this->child_offset();
1429 while (child_offset > 0)
1430 {
1431 Dwarf_die die(this->dwinfo_, child_offset, this);
1432 // The Dwarf_die ctor will set this DIE's sibling offset
1433 // when it reads a zero abbrev code.
1434 if (die.tag() == 0)
1435 break;
1436 child_offset = die.sibling_offset();
1437 }
1438
1439 // This should be set by now. If not, there was a problem reading
1440 // the DWARF info, and we return 0.
1441 return this->sibling_offset_;
1442}
1443
1444// class Dwarf_info_reader
1445
c1027032
CC
1446// Begin parsing the debug info. This calls visit_compilation_unit()
1447// or visit_type_unit() for each compilation or type unit found in the
1448// section, and visit_die() for each top-level DIE.
1449
1450void
1451Dwarf_info_reader::parse()
1452{
9fc236f3 1453 if (this->object_->is_big_endian())
c1027032 1454 {
9fc236f3
CC
1455#if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_64_BIG)
1456 this->do_parse<true>();
1457#else
1458 gold_unreachable();
c1027032 1459#endif
9fc236f3
CC
1460 }
1461 else
1462 {
1463#if defined(HAVE_TARGET_32_LITTLE) || defined(HAVE_TARGET_64_LITTLE)
1464 this->do_parse<false>();
1465#else
1466 gold_unreachable();
c1027032 1467#endif
c1027032
CC
1468 }
1469}
1470
1471template<bool big_endian>
1472void
1473Dwarf_info_reader::do_parse()
1474{
1475 // Get the section contents and decompress if necessary.
1476 section_size_type buffer_size;
1477 bool buffer_is_new;
1478 this->buffer_ = this->object_->decompressed_section_contents(this->shndx_,
1479 &buffer_size,
1480 &buffer_is_new);
1481 if (this->buffer_ == NULL || buffer_size == 0)
1482 return;
1483 this->buffer_end_ = this->buffer_ + buffer_size;
1484
1485 // The offset of this input section in the output section.
1486 off_t section_offset = this->object_->output_section_offset(this->shndx_);
1487
1488 // Start tracking relocations for this section.
1489 this->reloc_mapper_ = make_elf_reloc_mapper(this->object_, this->symtab_,
1490 this->symtab_size_);
1491 this->reloc_mapper_->initialize(this->reloc_shndx_, this->reloc_type_);
1492
1493 // Loop over compilation units (or type units).
8787852d 1494 unsigned int abbrev_shndx = this->abbrev_shndx_;
c1027032
CC
1495 off_t abbrev_offset = 0;
1496 const unsigned char* pinfo = this->buffer_;
1497 while (pinfo < this->buffer_end_)
1498 {
1499 // Read the compilation (or type) unit header.
1500 const unsigned char* cu_start = pinfo;
1501 this->cu_offset_ = cu_start - this->buffer_;
1502 this->cu_length_ = this->buffer_end_ - cu_start;
1503
1504 // Read unit_length (4 or 12 bytes).
1505 if (!this->check_buffer(pinfo + 4))
1506 break;
1507 uint32_t unit_length =
1508 elfcpp::Swap_unaligned<32, big_endian>::readval(pinfo);
1509 pinfo += 4;
1510 if (unit_length == 0xffffffff)
1511 {
1512 if (!this->check_buffer(pinfo + 8))
1513 break;
1514 unit_length = elfcpp::Swap_unaligned<64, big_endian>::readval(pinfo);
1515 pinfo += 8;
1516 this->offset_size_ = 8;
1517 }
1518 else
1519 this->offset_size_ = 4;
1520 if (!this->check_buffer(pinfo + unit_length))
1521 break;
1522 const unsigned char* cu_end = pinfo + unit_length;
1523 this->cu_length_ = cu_end - cu_start;
1524 if (!this->check_buffer(pinfo + 2 + this->offset_size_ + 1))
1525 break;
1526
1527 // Read version (2 bytes).
1528 this->cu_version_ =
1529 elfcpp::Swap_unaligned<16, big_endian>::readval(pinfo);
1530 pinfo += 2;
1531
5cde809b
CC
1532 // DWARF 5: Read the unit type (1 byte) and address size (1 byte).
1533 if (this->cu_version_ >= 5)
1534 {
1535 this->unit_type_ = *pinfo++;
1536 this->address_size_ = *pinfo++;
1537 }
1538
c1027032
CC
1539 // Read debug_abbrev_offset (4 or 8 bytes).
1540 if (this->offset_size_ == 4)
1541 abbrev_offset = elfcpp::Swap_unaligned<32, big_endian>::readval(pinfo);
1542 else
1543 abbrev_offset = elfcpp::Swap_unaligned<64, big_endian>::readval(pinfo);
1544 if (this->reloc_shndx_ > 0)
1545 {
1546 off_t reloc_offset = pinfo - this->buffer_;
1547 off_t value;
1548 abbrev_shndx =
1549 this->reloc_mapper_->get_reloc_target(reloc_offset, &value);
1550 if (abbrev_shndx == 0)
1551 return;
1552 if (this->reloc_type_ == elfcpp::SHT_REL)
1553 abbrev_offset += value;
1554 else
1555 abbrev_offset = value;
1556 }
1557 pinfo += this->offset_size_;
1558
5cde809b
CC
1559 // DWARF 2-4: Read address_size (1 byte).
1560 if (this->cu_version_ < 5)
1561 this->address_size_ = *pinfo++;
c1027032
CC
1562
1563 // For type units, read the two extra fields.
1564 uint64_t signature = 0;
1565 off_t type_offset = 0;
5cde809b 1566 if (this->is_type_unit())
c1027032
CC
1567 {
1568 if (!this->check_buffer(pinfo + 8 + this->offset_size_))
1569 break;
1570
1571 // Read type_signature (8 bytes).
1572 signature = elfcpp::Swap_unaligned<64, big_endian>::readval(pinfo);
1573 pinfo += 8;
1574
1575 // Read type_offset (4 or 8 bytes).
1576 if (this->offset_size_ == 4)
1577 type_offset =
1578 elfcpp::Swap_unaligned<32, big_endian>::readval(pinfo);
1579 else
1580 type_offset =
1581 elfcpp::Swap_unaligned<64, big_endian>::readval(pinfo);
1582 pinfo += this->offset_size_;
1583 }
1584
1585 // Read the .debug_abbrev table.
1586 this->abbrev_table_.read_abbrevs(this->object_, abbrev_shndx,
1587 abbrev_offset);
1588
1589 // Visit the root DIE.
1590 Dwarf_die root_die(this,
1591 pinfo - (this->buffer_ + this->cu_offset_),
1592 NULL);
1593 if (root_die.tag() != 0)
1594 {
1595 // Visit the CU or TU.
5cde809b 1596 if (this->is_type_unit())
c1027032 1597 this->visit_type_unit(section_offset + this->cu_offset_,
908794a9
CC
1598 cu_end - cu_start, type_offset, signature,
1599 &root_die);
c1027032
CC
1600 else
1601 this->visit_compilation_unit(section_offset + this->cu_offset_,
1602 cu_end - cu_start, &root_die);
1603 }
1604
1605 // Advance to the next CU.
1606 pinfo = cu_end;
1607 }
1608
1609 if (buffer_is_new)
1610 {
1611 delete[] this->buffer_;
1612 this->buffer_ = NULL;
1613 }
1614}
1615
1616// Read the DWARF string table.
1617
1618bool
1619Dwarf_info_reader::do_read_string_table(unsigned int string_shndx)
1620{
1621 Relobj* object = this->object_;
1622
1623 // If we don't have relocations, string_shndx will be 0, and
1624 // we'll have to hunt for the .debug_str section.
1625 if (string_shndx == 0)
1626 {
1627 for (unsigned int i = 1; i < this->object_->shnum(); ++i)
1628 {
1629 std::string name = object->section_name(i);
ec673e64 1630 if (name == ".debug_str" || name == ".zdebug_str")
c1027032
CC
1631 {
1632 string_shndx = i;
1633 this->string_output_section_offset_ =
1634 object->output_section_offset(i);
1635 break;
1636 }
1637 }
1638 if (string_shndx == 0)
1639 return false;
1640 }
1641
1642 if (this->owns_string_buffer_ && this->string_buffer_ != NULL)
1643 {
1644 delete[] this->string_buffer_;
1645 this->owns_string_buffer_ = false;
1646 }
1647
1648 // Get the secton contents and decompress if necessary.
1649 section_size_type buffer_size;
1650 const unsigned char* buffer =
1651 object->decompressed_section_contents(string_shndx,
1652 &buffer_size,
1653 &this->owns_string_buffer_);
1654 this->string_buffer_ = reinterpret_cast<const char*>(buffer);
1655 this->string_buffer_end_ = this->string_buffer_ + buffer_size;
1656 this->string_shndx_ = string_shndx;
1657 return true;
1658}
1659
ed5d6712
CC
1660// Read a possibly unaligned integer of SIZE.
1661template <int valsize>
1662inline typename elfcpp::Valtype_base<valsize>::Valtype
1663Dwarf_info_reader::read_from_pointer(const unsigned char* source)
1664{
1665 typename elfcpp::Valtype_base<valsize>::Valtype return_value;
1666 if (this->object_->is_big_endian())
1667 return_value = elfcpp::Swap_unaligned<valsize, true>::readval(source);
1668 else
1669 return_value = elfcpp::Swap_unaligned<valsize, false>::readval(source);
1670 return return_value;
1671}
1672
1673// Read a possibly unaligned integer of SIZE. Update SOURCE after read.
1674template <int valsize>
1675inline typename elfcpp::Valtype_base<valsize>::Valtype
1676Dwarf_info_reader::read_from_pointer(const unsigned char** source)
1677{
1678 typename elfcpp::Valtype_base<valsize>::Valtype return_value;
1679 if (this->object_->is_big_endian())
1680 return_value = elfcpp::Swap_unaligned<valsize, true>::readval(*source);
1681 else
1682 return_value = elfcpp::Swap_unaligned<valsize, false>::readval(*source);
1683 *source += valsize / 8;
1684 return return_value;
1685}
1686
5cde809b
CC
1687// Read a 3-byte integer. Update SOURCE after read.
1688inline typename elfcpp::Valtype_base<32>::Valtype
1689Dwarf_info_reader::read_3bytes_from_pointer(const unsigned char** source)
1690{
1691 typename elfcpp::Valtype_base<32>::Valtype return_value;
1692 if (this->object_->is_big_endian())
1693 return_value = ((*source)[0] << 16) | ((*source)[1] << 8) | (*source)[2];
1694 else
1695 return_value = ((*source)[2] << 16) | ((*source)[1] << 8) | (*source)[0];
1696 *source += 3;
1697 return return_value;
1698}
1699
c1027032
CC
1700// Look for a relocation at offset ATTR_OFF in the dwarf info,
1701// and return the section index and offset of the target.
1702
1703unsigned int
1704Dwarf_info_reader::lookup_reloc(off_t attr_off, off_t* target_off)
1705{
1706 off_t value;
1707 attr_off += this->cu_offset_;
1708 unsigned int shndx = this->reloc_mapper_->get_reloc_target(attr_off, &value);
1709 if (shndx == 0)
1710 return 0;
1711 if (this->reloc_type_ == elfcpp::SHT_REL)
1712 *target_off += value;
1713 else
1714 *target_off = value;
1715 return shndx;
1716}
1717
1718// Return a string from the DWARF string table.
1719
1720const char*
1721Dwarf_info_reader::get_string(off_t str_off, unsigned int string_shndx)
1722{
1723 if (!this->read_string_table(string_shndx))
1724 return NULL;
1725
1726 // Correct the offset. For incremental update links, we have a
1727 // relocated offset that is relative to the output section, but
1728 // here we need an offset relative to the input section.
1729 str_off -= this->string_output_section_offset_;
1730
1731 const char* p = this->string_buffer_ + str_off;
1732
1733 if (p < this->string_buffer_ || p >= this->string_buffer_end_)
1734 return NULL;
1735
1736 return p;
1737}
1738
1739// The following are default, do-nothing, implementations of the
1740// hook methods normally provided by a derived class. We provide
1741// default implementations rather than no implementation so that
1742// a derived class needs to implement only the hooks that it needs
1743// to use.
1744
1745// Process a compilation unit and parse its child DIE.
1746
1747void
1748Dwarf_info_reader::visit_compilation_unit(off_t, off_t, Dwarf_die*)
1749{
1750}
1751
1752// Process a type unit and parse its child DIE.
1753
1754void
908794a9 1755Dwarf_info_reader::visit_type_unit(off_t, off_t, off_t, uint64_t, Dwarf_die*)
c1027032
CC
1756{
1757}
1758
a68a081d
CC
1759// Print a warning about a corrupt debug section.
1760
1761void
1762Dwarf_info_reader::warn_corrupt_debug_section() const
1763{
1764 gold_warning(_("%s: corrupt debug info in %s"),
1765 this->object_->name().c_str(),
1766 this->object_->section_name(this->shndx_).c_str());
1767}
1768
c1027032
CC
1769// class Sized_dwarf_line_info
1770
5c2c6c95
ILT
1771struct LineStateMachine
1772{
1773 int file_num;
1774 uint64_t address;
1775 int line_num;
1776 int column_num;
1777 unsigned int shndx; // the section address refers to
1778 bool is_stmt; // stmt means statement.
1779 bool basic_block;
1780 bool end_sequence;
1781};
1782
1783static void
1784ResetLineStateMachine(struct LineStateMachine* lsm, bool default_is_stmt)
1785{
1786 lsm->file_num = 1;
1787 lsm->address = 0;
1788 lsm->line_num = 1;
1789 lsm->column_num = 0;
338f2eba 1790 lsm->shndx = -1U;
5c2c6c95
ILT
1791 lsm->is_stmt = default_is_stmt;
1792 lsm->basic_block = false;
1793 lsm->end_sequence = false;
1794}
1795
24badc65 1796template<int size, bool big_endian>
5dd8762a
CC
1797Sized_dwarf_line_info<size, big_endian>::Sized_dwarf_line_info(
1798 Object* object,
1799 unsigned int read_shndx)
1800 : data_valid_(false), buffer_(NULL), buffer_start_(NULL),
5cde809b 1801 str_buffer_(NULL), str_buffer_start_(NULL),
c1027032 1802 reloc_mapper_(NULL), symtab_buffer_(NULL), directories_(), files_(),
5cde809b 1803 current_header_index_(-1), reloc_map_(), line_number_map_()
24badc65 1804{
5cde809b
CC
1805 unsigned int debug_line_shndx = 0;
1806 unsigned int debug_line_str_shndx = 0;
5dd8762a 1807
5cde809b 1808 for (unsigned int i = 1; i < object->shnum(); ++i)
ab8056e0 1809 {
5cde809b
CC
1810 section_size_type buffer_size;
1811 bool is_new = false;
1812
ab8056e0 1813 // FIXME: do this more efficiently: section_name() isn't super-fast
5cde809b 1814 std::string name = object->section_name(i);
ab8056e0
CC
1815 if (name == ".debug_line" || name == ".zdebug_line")
1816 {
5cde809b
CC
1817 this->buffer_ =
1818 object->decompressed_section_contents(i, &buffer_size, &is_new);
5dd8762a
CC
1819 if (is_new)
1820 this->buffer_start_ = this->buffer_;
ab8056e0 1821 this->buffer_end_ = this->buffer_ + buffer_size;
5cde809b
CC
1822 debug_line_shndx = i;
1823 }
1824 else if (name == ".debug_line_str" || name == ".zdebug_line_str")
1825 {
1826 this->str_buffer_ =
1827 object->decompressed_section_contents(i, &buffer_size, &is_new);
1828 if (is_new)
1829 this->str_buffer_start_ = this->str_buffer_;
1830 this->str_buffer_end_ = this->str_buffer_ + buffer_size;
1831 debug_line_str_shndx = i;
ab8056e0 1832 }
5cde809b
CC
1833 if (debug_line_shndx > 0 && debug_line_str_shndx > 0)
1834 break;
ab8056e0 1835 }
24badc65 1836 if (this->buffer_ == NULL)
c261a0be 1837 return;
24badc65
ILT
1838
1839 // Find the relocation section for ".debug_line".
af674d1d 1840 // We expect these for relobjs (.o's) but not dynobjs (.so's).
c1027032
CC
1841 unsigned int reloc_shndx = 0;
1842 for (unsigned int i = 0; i < object->shnum(); ++i)
24badc65 1843 {
c1027032 1844 unsigned int reloc_sh_type = object->section_type(i);
24badc65
ILT
1845 if ((reloc_sh_type == elfcpp::SHT_REL
1846 || reloc_sh_type == elfcpp::SHT_RELA)
5cde809b 1847 && object->section_info(i) == debug_line_shndx)
24badc65 1848 {
c1027032 1849 reloc_shndx = i;
4dbfafcc 1850 this->track_relocs_type_ = reloc_sh_type;
24badc65
ILT
1851 break;
1852 }
1853 }
24badc65
ILT
1854
1855 // Finally, we need the symtab section to interpret the relocs.
c1027032 1856 if (reloc_shndx != 0)
af674d1d
ILT
1857 {
1858 unsigned int symtab_shndx;
1859 for (symtab_shndx = 0; symtab_shndx < object->shnum(); ++symtab_shndx)
1860 if (object->section_type(symtab_shndx) == elfcpp::SHT_SYMTAB)
1861 {
c1027032
CC
1862 this->symtab_buffer_ = object->section_contents(
1863 symtab_shndx, &this->symtab_buffer_size_, false);
af674d1d
ILT
1864 break;
1865 }
1866 if (this->symtab_buffer_ == NULL)
1867 return;
1868 }
24badc65 1869
c1027032
CC
1870 this->reloc_mapper_ =
1871 new Sized_elf_reloc_mapper<size, big_endian>(object,
1872 this->symtab_buffer_,
1873 this->symtab_buffer_size_);
1874 if (!this->reloc_mapper_->initialize(reloc_shndx, this->track_relocs_type_))
1875 return;
1876
24badc65
ILT
1877 // Now that we have successfully read all the data, parse the debug
1878 // info.
c261a0be 1879 this->data_valid_ = true;
c1027032 1880 this->read_line_mappings(read_shndx);
24badc65
ILT
1881}
1882
5c2c6c95
ILT
1883// Read the DWARF header.
1884
1885template<int size, bool big_endian>
1886const unsigned char*
a55ce7fe 1887Sized_dwarf_line_info<size, big_endian>::read_header_prolog(
e43872e9 1888 const unsigned char* lineptr)
5c2c6c95 1889{
deae2a14 1890 uint32_t initial_length = elfcpp::Swap_unaligned<32, big_endian>::readval(lineptr);
5c2c6c95
ILT
1891 lineptr += 4;
1892
5cde809b 1893 // In DWARF, if the initial length is all 1 bits, then the offset
5c2c6c95
ILT
1894 // size is 8 and we need to read the next 8 bytes for the real length.
1895 if (initial_length == 0xffffffff)
1896 {
5cde809b 1897 this->header_.offset_size = 8;
deae2a14 1898 initial_length = elfcpp::Swap_unaligned<64, big_endian>::readval(lineptr);
5c2c6c95
ILT
1899 lineptr += 8;
1900 }
1901 else
5cde809b 1902 this->header_.offset_size = 4;
5c2c6c95 1903
5cde809b 1904 this->header_.total_length = initial_length;
5c2c6c95 1905
5cde809b
CC
1906 this->end_of_unit_ = lineptr + initial_length;
1907 gold_assert(this->end_of_unit_ <= buffer_end_);
5c2c6c95 1908
5cde809b
CC
1909 this->header_.version =
1910 elfcpp::Swap_unaligned<16, big_endian>::readval(lineptr);
5c2c6c95
ILT
1911 lineptr += 2;
1912
5cde809b
CC
1913 // We can only read versions 2-5 of the DWARF line number table.
1914 // For other versions, just skip the entire line number table.
1915 if (this->header_.version < 2 || this->header_.version > 5)
1916 return this->end_of_unit_;
0318cca4 1917
5cde809b
CC
1918 // DWARF 5 only: address size and segment selector.
1919 if (this->header_.version >= 5)
1920 {
1921 this->header_.address_size = *lineptr;
1922 // We ignore the segment selector.
1923 lineptr += 2;
1924 }
1925
1926 if (this->header_.offset_size == 4)
1927 this->header_.prologue_length =
1928 elfcpp::Swap_unaligned<32, big_endian>::readval(lineptr);
5c2c6c95 1929 else
5cde809b
CC
1930 this->header_.prologue_length =
1931 elfcpp::Swap_unaligned<64, big_endian>::readval(lineptr);
1932 lineptr += this->header_.offset_size;
5c2c6c95 1933
5cde809b
CC
1934 this->end_of_header_length_ = lineptr;
1935
1936 this->header_.min_insn_length = *lineptr;
5c2c6c95
ILT
1937 lineptr += 1;
1938
5cde809b
CC
1939 if (this->header_.version < 4)
1940 this->header_.max_ops_per_insn = 1;
c8334458
CC
1941 else
1942 {
1943 // DWARF 4 added the maximum_operations_per_instruction field.
5cde809b 1944 this->header_.max_ops_per_insn = *lineptr;
c8334458
CC
1945 lineptr += 1;
1946 // TODO: Add support for values other than 1.
5cde809b 1947 gold_assert(this->header_.max_ops_per_insn == 1);
c8334458
CC
1948 }
1949
5cde809b 1950 this->header_.default_is_stmt = *lineptr;
5c2c6c95
ILT
1951 lineptr += 1;
1952
5cde809b 1953 this->header_.line_base = *reinterpret_cast<const signed char*>(lineptr);
5c2c6c95
ILT
1954 lineptr += 1;
1955
5cde809b 1956 this->header_.line_range = *lineptr;
5c2c6c95
ILT
1957 lineptr += 1;
1958
5cde809b 1959 this->header_.opcode_base = *lineptr;
5c2c6c95
ILT
1960 lineptr += 1;
1961
5cde809b
CC
1962 this->header_.std_opcode_lengths.resize(this->header_.opcode_base + 1);
1963 this->header_.std_opcode_lengths[0] = 0;
1964 for (int i = 1; i < this->header_.opcode_base; i++)
5c2c6c95 1965 {
5cde809b 1966 this->header_.std_opcode_lengths[i] = *lineptr;
5c2c6c95
ILT
1967 lineptr += 1;
1968 }
1969
1970 return lineptr;
1971}
1972
1973// The header for a debug_line section is mildly complicated, because
1974// the line info is very tightly encoded.
5cde809b 1975// This routine is for DWARF versions 2, 3, and 4.
5c2c6c95 1976
e43872e9 1977template<int size, bool big_endian>
5c2c6c95 1978const unsigned char*
5cde809b 1979Sized_dwarf_line_info<size, big_endian>::read_header_tables_v2(
e43872e9 1980 const unsigned char* lineptr)
5c2c6c95 1981{
af674d1d
ILT
1982 ++this->current_header_index_;
1983
1984 // Create a new directories_ entry and a new files_ entry for our new
1985 // header. We initialize each with a single empty element, because
1986 // dwarf indexes directory and filenames starting at 1.
1987 gold_assert(static_cast<int>(this->directories_.size())
1988 == this->current_header_index_);
1989 gold_assert(static_cast<int>(this->files_.size())
1990 == this->current_header_index_);
1991 this->directories_.push_back(std::vector<std::string>(1));
1992 this->files_.push_back(std::vector<std::pair<int, std::string> >(1));
1993
5c2c6c95
ILT
1994 // It is legal for the directory entry table to be empty.
1995 if (*lineptr)
1996 {
1997 int dirindex = 1;
1998 while (*lineptr)
1999 {
af674d1d
ILT
2000 const char* dirname = reinterpret_cast<const char*>(lineptr);
2001 gold_assert(dirindex
2002 == static_cast<int>(this->directories_.back().size()));
2003 this->directories_.back().push_back(dirname);
2004 lineptr += this->directories_.back().back().size() + 1;
5c2c6c95
ILT
2005 dirindex++;
2006 }
2007 }
2008 lineptr++;
2009
2010 // It is also legal for the file entry table to be empty.
2011 if (*lineptr)
2012 {
2013 int fileindex = 1;
2014 size_t len;
2015 while (*lineptr)
2016 {
2017 const char* filename = reinterpret_cast<const char*>(lineptr);
2018 lineptr += strlen(filename) + 1;
2019
2020 uint64_t dirindex = read_unsigned_LEB_128(lineptr, &len);
5c2c6c95
ILT
2021 lineptr += len;
2022
af674d1d
ILT
2023 if (dirindex >= this->directories_.back().size())
2024 dirindex = 0;
2025 int dirindexi = static_cast<int>(dirindex);
2026
5c2c6c95
ILT
2027 read_unsigned_LEB_128(lineptr, &len); // mod_time
2028 lineptr += len;
2029
2030 read_unsigned_LEB_128(lineptr, &len); // filelength
2031 lineptr += len;
2032
af674d1d
ILT
2033 gold_assert(fileindex
2034 == static_cast<int>(this->files_.back().size()));
2035 this->files_.back().push_back(std::make_pair(dirindexi, filename));
5c2c6c95
ILT
2036 fileindex++;
2037 }
2038 }
2039 lineptr++;
2040
2041 return lineptr;
2042}
2043
5cde809b
CC
2044// This routine is for DWARF version 5.
2045
2046template<int size, bool big_endian>
2047const unsigned char*
2048Sized_dwarf_line_info<size, big_endian>::read_header_tables_v5(
2049 const unsigned char* lineptr)
2050{
2051 size_t len;
2052
2053 ++this->current_header_index_;
2054
2055 gold_assert(static_cast<int>(this->directories_.size())
2056 == this->current_header_index_);
2057 gold_assert(static_cast<int>(this->files_.size())
2058 == this->current_header_index_);
2059
2060 // Read the directory list.
2061 unsigned int format_count = *lineptr;
2062 lineptr += 1;
2063
2064 unsigned int *types = new unsigned int[format_count];
2065 unsigned int *forms = new unsigned int[format_count];
2066
2067 for (unsigned int i = 0; i < format_count; i++)
2068 {
2069 types[i] = read_unsigned_LEB_128(lineptr, &len);
2070 lineptr += len;
2071 forms[i] = read_unsigned_LEB_128(lineptr, &len);
2072 lineptr += len;
2073 }
2074
2075 uint64_t entry_count = read_unsigned_LEB_128(lineptr, &len);
2076 lineptr += len;
2077 this->directories_.push_back(std::vector<std::string>(0));
2078 std::vector<std::string>& dir_list = this->directories_.back();
2079
2080 for (unsigned int j = 0; j < entry_count; j++)
2081 {
2082 std::string dirname;
2083
2084 for (unsigned int i = 0; i < format_count; i++)
2085 {
2086 if (types[i] == elfcpp::DW_LNCT_path)
2087 {
2088 if (forms[i] == elfcpp::DW_FORM_string)
2089 {
2090 dirname = reinterpret_cast<const char*>(lineptr);
2091 lineptr += dirname.size() + 1;
2092 }
2093 else if (forms[i] == elfcpp::DW_FORM_line_strp)
2094 {
2095 uint64_t offset;
2096 if (this->header_.offset_size == 4)
2097 offset =
2098 elfcpp::Swap_unaligned<32, big_endian>::readval(lineptr);
2099 else
2100 offset =
2101 elfcpp::Swap_unaligned<64, big_endian>::readval(lineptr);
2102 typename Reloc_map::const_iterator it
2103 = this->reloc_map_.find(lineptr - this->buffer_);
2104 if (it != reloc_map_.end())
2105 {
2106 if (this->track_relocs_type_ == elfcpp::SHT_RELA)
2107 offset = 0;
2108 offset += it->second.second;
2109 }
2110 lineptr += this->header_.offset_size;
2111 dirname = reinterpret_cast<const char*>(this->str_buffer_
2112 + offset);
2113 }
2114 else
2115 return lineptr;
2116 }
2117 else
2118 return lineptr;
2119 }
2120 dir_list.push_back(dirname);
2121 }
2122
2123 delete[] types;
2124 delete[] forms;
2125
2126 // Read the filenames list.
2127 format_count = *lineptr;
2128 lineptr += 1;
2129
2130 types = new unsigned int[format_count];
2131 forms = new unsigned int[format_count];
2132
2133 for (unsigned int i = 0; i < format_count; i++)
2134 {
2135 types[i] = read_unsigned_LEB_128(lineptr, &len);
2136 lineptr += len;
2137 forms[i] = read_unsigned_LEB_128(lineptr, &len);
2138 lineptr += len;
2139 }
2140
2141 entry_count = read_unsigned_LEB_128(lineptr, &len);
2142 lineptr += len;
2143 this->files_.push_back(
2144 std::vector<std::pair<int, std::string> >(0));
2145 std::vector<std::pair<int, std::string> >& file_list = this->files_.back();
2146
2147 for (unsigned int j = 0; j < entry_count; j++)
2148 {
2149 const char* path = NULL;
2150 int dirindex = 0;
2151
2152 for (unsigned int i = 0; i < format_count; i++)
2153 {
2154 if (types[i] == elfcpp::DW_LNCT_path)
2155 {
2156 if (forms[i] == elfcpp::DW_FORM_string)
2157 {
2158 path = reinterpret_cast<const char*>(lineptr);
2159 lineptr += strlen(path) + 1;
2160 }
2161 else if (forms[i] == elfcpp::DW_FORM_line_strp)
2162 {
2163 uint64_t offset;
2164 if (this->header_.offset_size == 4)
2165 offset = elfcpp::Swap_unaligned<32, big_endian>::readval(lineptr);
2166 else
2167 offset = elfcpp::Swap_unaligned<64, big_endian>::readval(lineptr);
2168 typename Reloc_map::const_iterator it
2169 = this->reloc_map_.find(lineptr - this->buffer_);
2170 if (it != reloc_map_.end())
2171 {
2172 if (this->track_relocs_type_ == elfcpp::SHT_RELA)
2173 offset = 0;
2174 offset += it->second.second;
2175 }
2176 lineptr += this->header_.offset_size;
2177 path = reinterpret_cast<const char*>(this->str_buffer_
2178 + offset);
2179 }
2180 else
2181 return lineptr;
2182 }
2183 else if (types[i] == elfcpp::DW_LNCT_directory_index)
2184 {
2185 if (forms[i] == elfcpp::DW_FORM_udata)
2186 {
2187 dirindex = read_unsigned_LEB_128(lineptr, &len);
2188 lineptr += len;
2189 }
2190 else
2191 return lineptr;
2192 }
2193 else
2194 return lineptr;
2195 }
2196 gold_debug(DEBUG_LOCATION, "File %3d: %s",
2197 static_cast<int>(file_list.size()), path);
2198 file_list.push_back(std::make_pair(dirindex, path));
2199 }
2200
2201 delete[] types;
2202 delete[] forms;
2203
2204 return lineptr;
2205}
2206
5c2c6c95
ILT
2207// Process a single opcode in the .debug.line structure.
2208
e43872e9 2209template<int size, bool big_endian>
5c2c6c95 2210bool
a55ce7fe 2211Sized_dwarf_line_info<size, big_endian>::process_one_opcode(
e43872e9 2212 const unsigned char* start, struct LineStateMachine* lsm, size_t* len)
5c2c6c95
ILT
2213{
2214 size_t oplen = 0;
2215 size_t templen;
2216 unsigned char opcode = *start;
2217 oplen++;
2218 start++;
2219
2220 // If the opcode is great than the opcode_base, it is a special
2221 // opcode. Most line programs consist mainly of special opcodes.
5cde809b 2222 if (opcode >= this->header_.opcode_base)
5c2c6c95 2223 {
5cde809b
CC
2224 opcode -= this->header_.opcode_base;
2225 const int advance_address = ((opcode / this->header_.line_range)
2226 * this->header_.min_insn_length);
5c2c6c95
ILT
2227 lsm->address += advance_address;
2228
5cde809b
CC
2229 const int advance_line = ((opcode % this->header_.line_range)
2230 + this->header_.line_base);
5c2c6c95
ILT
2231 lsm->line_num += advance_line;
2232 lsm->basic_block = true;
2233 *len = oplen;
2234 return true;
2235 }
2236
2237 // Otherwise, we have the regular opcodes
2238 switch (opcode)
2239 {
2240 case elfcpp::DW_LNS_copy:
2241 lsm->basic_block = false;
2242 *len = oplen;
2243 return true;
2244
2245 case elfcpp::DW_LNS_advance_pc:
2246 {
2247 const uint64_t advance_address
2ea97941 2248 = read_unsigned_LEB_128(start, &templen);
5c2c6c95 2249 oplen += templen;
5cde809b 2250 lsm->address += this->header_.min_insn_length * advance_address;
5c2c6c95
ILT
2251 }
2252 break;
2253
2254 case elfcpp::DW_LNS_advance_line:
2255 {
5cde809b 2256 const int64_t advance_line = read_signed_LEB_128(start, &templen);
5c2c6c95
ILT
2257 oplen += templen;
2258 lsm->line_num += advance_line;
2259 }
2260 break;
2261
2262 case elfcpp::DW_LNS_set_file:
2263 {
2264 const uint64_t fileno = read_unsigned_LEB_128(start, &templen);
2265 oplen += templen;
2266 lsm->file_num = fileno;
2267 }
2268 break;
2269
2270 case elfcpp::DW_LNS_set_column:
2271 {
2272 const uint64_t colno = read_unsigned_LEB_128(start, &templen);
2273 oplen += templen;
2274 lsm->column_num = colno;
2275 }
2276 break;
2277
2278 case elfcpp::DW_LNS_negate_stmt:
2279 lsm->is_stmt = !lsm->is_stmt;
2280 break;
2281
2282 case elfcpp::DW_LNS_set_basic_block:
2283 lsm->basic_block = true;
2284 break;
2285
2286 case elfcpp::DW_LNS_fixed_advance_pc:
2287 {
2288 int advance_address;
deae2a14 2289 advance_address = elfcpp::Swap_unaligned<16, big_endian>::readval(start);
5c2c6c95
ILT
2290 oplen += 2;
2291 lsm->address += advance_address;
2292 }
2293 break;
2294
2295 case elfcpp::DW_LNS_const_add_pc:
2296 {
5cde809b
CC
2297 const int advance_address = (this->header_.min_insn_length
2298 * ((255 - this->header_.opcode_base)
2299 / this->header_.line_range));
5c2c6c95
ILT
2300 lsm->address += advance_address;
2301 }
2302 break;
2303
2304 case elfcpp::DW_LNS_extended_op:
2305 {
2306 const uint64_t extended_op_len
2ea97941 2307 = read_unsigned_LEB_128(start, &templen);
5c2c6c95
ILT
2308 start += templen;
2309 oplen += templen + extended_op_len;
2310
2311 const unsigned char extended_op = *start;
2312 start++;
2313
2314 switch (extended_op)
2315 {
2316 case elfcpp::DW_LNE_end_sequence:
124dfc89
ILT
2317 // This means that the current byte is the one immediately
2318 // after a set of instructions. Record the current line
2319 // for up to one less than the current address.
79e052ea 2320 lsm->line_num = -1;
5c2c6c95
ILT
2321 lsm->end_sequence = true;
2322 *len = oplen;
2323 return true;
2324
2325 case elfcpp::DW_LNE_set_address:
4c50553d 2326 {
4dbfafcc
ILT
2327 lsm->address =
2328 elfcpp::Swap_unaligned<size, big_endian>::readval(start);
4c50553d 2329 typename Reloc_map::const_iterator it
4dbfafcc 2330 = this->reloc_map_.find(start - this->buffer_);
4c50553d
ILT
2331 if (it != reloc_map_.end())
2332 {
4dbfafcc
ILT
2333 // If this is a SHT_RELA section, then ignore the
2334 // section contents. This assumes that this is a
2335 // straight reloc which just uses the reloc addend.
2336 // The reloc addend has already been included in the
2337 // symbol value.
2338 if (this->track_relocs_type_ == elfcpp::SHT_RELA)
2339 lsm->address = 0;
2340 // Add in the symbol value.
2341 lsm->address += it->second.second;
4c50553d
ILT
2342 lsm->shndx = it->second.first;
2343 }
2344 else
2345 {
af674d1d
ILT
2346 // If we're a normal .o file, with relocs, every
2347 // set_address should have an associated relocation.
2348 if (this->input_is_relobj())
2349 this->data_valid_ = false;
4c50553d
ILT
2350 }
2351 break;
24badc65 2352 }
5c2c6c95
ILT
2353 case elfcpp::DW_LNE_define_file:
2354 {
2355 const char* filename = reinterpret_cast<const char*>(start);
2356 templen = strlen(filename) + 1;
2357 start += templen;
2358
2359 uint64_t dirindex = read_unsigned_LEB_128(start, &templen);
5c2c6c95 2360
af674d1d
ILT
2361 if (dirindex >= this->directories_.back().size())
2362 dirindex = 0;
2363 int dirindexi = static_cast<int>(dirindex);
2364
e8dd54e1
CC
2365 // This opcode takes two additional ULEB128 parameters
2366 // (mod_time and filelength), but we don't use those
2367 // values. Because OPLEN already tells us how far to
2368 // skip to the next opcode, we don't need to read
2369 // them at all.
5c2c6c95 2370
af674d1d 2371 this->files_.back().push_back(std::make_pair(dirindexi,
5c2c6c95
ILT
2372 filename));
2373 }
2374 break;
2375 }
2376 }
2377 break;
2378
2379 default:
2380 {
2ea97941 2381 // Ignore unknown opcode silently
5cde809b 2382 for (int i = 0; i < this->header_.std_opcode_lengths[opcode]; i++)
5c2c6c95 2383 {
2ea97941 2384 size_t templen;
5c2c6c95
ILT
2385 read_unsigned_LEB_128(start, &templen);
2386 start += templen;
2387 oplen += templen;
2388 }
2389 }
2390 break;
2ea97941 2391 }
5c2c6c95
ILT
2392 *len = oplen;
2393 return false;
2394}
2395
2396// Read the debug information at LINEPTR and store it in the line
2397// number map.
2398
e43872e9 2399template<int size, bool big_endian>
5c2c6c95 2400unsigned const char*
9430daf8 2401Sized_dwarf_line_info<size, big_endian>::read_lines(unsigned const char* lineptr,
5cde809b 2402 unsigned const char* endptr,
75aea3d0 2403 unsigned int shndx)
5c2c6c95
ILT
2404{
2405 struct LineStateMachine lsm;
2406
5cde809b 2407 while (lineptr < endptr)
5c2c6c95 2408 {
5cde809b 2409 ResetLineStateMachine(&lsm, this->header_.default_is_stmt);
5c2c6c95
ILT
2410 while (!lsm.end_sequence)
2411 {
2412 size_t oplength;
5cde809b
CC
2413
2414 if (lineptr >= endptr)
2415 break;
2416
e43872e9 2417 bool add_line = this->process_one_opcode(lineptr, &lsm, &oplength);
5cde809b
CC
2418 lineptr += oplength;
2419
9430daf8
ILT
2420 if (add_line
2421 && (shndx == -1U || lsm.shndx == -1U || shndx == lsm.shndx))
5c2c6c95
ILT
2422 {
2423 Offset_to_lineno_entry entry
76677ad0
CC
2424 = { static_cast<off_t>(lsm.address),
2425 this->current_header_index_,
2426 static_cast<unsigned int>(lsm.file_num),
2427 true, lsm.line_num };
7500420b
ILT
2428 std::vector<Offset_to_lineno_entry>&
2429 map(this->line_number_map_[lsm.shndx]);
2430 // If we see two consecutive entries with the same
71ff8986
ILT
2431 // offset and a real line number, then mark the first
2432 // one as non-canonical.
7500420b
ILT
2433 if (!map.empty()
2434 && (map.back().offset == static_cast<off_t>(lsm.address))
2435 && lsm.line_num != -1
2436 && map.back().line_num != -1)
71ff8986
ILT
2437 map.back().last_line_for_offset = false;
2438 map.push_back(entry);
5c2c6c95 2439 }
5c2c6c95
ILT
2440 }
2441 }
2442
5cde809b 2443 return endptr;
5c2c6c95
ILT
2444}
2445
4c50553d
ILT
2446// Read the relocations into a Reloc_map.
2447
2448template<int size, bool big_endian>
2449void
c1027032 2450Sized_dwarf_line_info<size, big_endian>::read_relocs()
4c50553d
ILT
2451{
2452 if (this->symtab_buffer_ == NULL)
2453 return;
2454
c1027032 2455 off_t value;
4c50553d 2456 off_t reloc_offset;
c1027032 2457 while ((reloc_offset = this->reloc_mapper_->next_offset()) != -1)
4c50553d 2458 {
c1027032
CC
2459 const unsigned int shndx =
2460 this->reloc_mapper_->get_reloc_target(reloc_offset, &value);
d491d34e
ILT
2461
2462 // There is no reason to record non-ordinary section indexes, or
2463 // SHN_UNDEF, because they will never match the real section.
c1027032
CC
2464 if (shndx != 0)
2465 this->reloc_map_[reloc_offset] = std::make_pair(shndx, value);
d491d34e 2466
c1027032 2467 this->reloc_mapper_->advance(reloc_offset + 1);
4c50553d
ILT
2468 }
2469}
2470
2471// Read the line number info.
2472
e43872e9 2473template<int size, bool big_endian>
5c2c6c95 2474void
c1027032 2475Sized_dwarf_line_info<size, big_endian>::read_line_mappings(unsigned int shndx)
5c2c6c95 2476{
c261a0be 2477 gold_assert(this->data_valid_ == true);
24badc65 2478
c1027032 2479 this->read_relocs();
4c50553d 2480 while (this->buffer_ < this->buffer_end_)
e43872e9 2481 {
4c50553d 2482 const unsigned char* lineptr = this->buffer_;
e43872e9 2483 lineptr = this->read_header_prolog(lineptr);
5cde809b
CC
2484 if (this->header_.version >= 2 && this->header_.version <= 4)
2485 {
2486 lineptr = this->read_header_tables_v2(lineptr);
2487 lineptr = this->read_lines(lineptr, this->end_of_unit_, shndx);
2488 }
2489 else if (this->header_.version == 5)
2490 {
2491 lineptr = this->read_header_tables_v5(lineptr);
2492 lineptr = this->read_lines(lineptr, this->end_of_unit_, shndx);
2493 }
2494 this->buffer_ = this->end_of_unit_;
e43872e9
ILT
2495 }
2496
2497 // Sort the lines numbers, so addr2line can use binary search.
2498 for (typename Lineno_map::iterator it = line_number_map_.begin();
5c2c6c95
ILT
2499 it != line_number_map_.end();
2500 ++it)
2501 // Each vector needs to be sorted by offset.
4c50553d 2502 std::sort(it->second.begin(), it->second.end());
5c2c6c95
ILT
2503}
2504
af674d1d
ILT
2505// Some processing depends on whether the input is a .o file or not.
2506// For instance, .o files have relocs, and have .debug_lines
2507// information on a per section basis. .so files, on the other hand,
2508// lack relocs, and offsets are unique, so we can ignore the section
2509// information.
2510
2511template<int size, bool big_endian>
2512bool
a55ce7fe 2513Sized_dwarf_line_info<size, big_endian>::input_is_relobj()
af674d1d
ILT
2514{
2515 // Only .o files have relocs and the symtab buffer that goes with them.
2516 return this->symtab_buffer_ != NULL;
2517}
2518
79e052ea
ILT
2519// Given an Offset_to_lineno_entry vector, and an offset, figure out
2520// if the offset points into a function according to the vector (see
2521// comments below for the algorithm). If it does, return an iterator
2522// into the vector that points to the line-number that contains that
2523// offset. If not, it returns vector::end().
2524
2525static std::vector<Offset_to_lineno_entry>::const_iterator
2526offset_to_iterator(const std::vector<Offset_to_lineno_entry>* offsets,
2527 off_t offset)
2528{
71ff8986 2529 const Offset_to_lineno_entry lookup_key = { offset, 0, 0, true, 0 };
79e052ea
ILT
2530
2531 // lower_bound() returns the smallest offset which is >= lookup_key.
2532 // If no offset in offsets is >= lookup_key, returns end().
2533 std::vector<Offset_to_lineno_entry>::const_iterator it
2534 = std::lower_bound(offsets->begin(), offsets->end(), lookup_key);
2535
2536 // This code is easiest to understand with a concrete example.
2537 // Here's a possible offsets array:
71ff8986
ILT
2538 // {{offset = 3211, header_num = 0, file_num = 1, last, line_num = 16}, // 0
2539 // {offset = 3224, header_num = 0, file_num = 1, last, line_num = 20}, // 1
2540 // {offset = 3226, header_num = 0, file_num = 1, last, line_num = 22}, // 2
2541 // {offset = 3231, header_num = 0, file_num = 1, last, line_num = 25}, // 3
2542 // {offset = 3232, header_num = 0, file_num = 1, last, line_num = -1}, // 4
2543 // {offset = 3232, header_num = 0, file_num = 1, last, line_num = 65}, // 5
2544 // {offset = 3235, header_num = 0, file_num = 1, last, line_num = 66}, // 6
2545 // {offset = 3236, header_num = 0, file_num = 1, last, line_num = -1}, // 7
2546 // {offset = 5764, header_num = 0, file_num = 1, last, line_num = 48}, // 8
2547 // {offset = 5764, header_num = 0, file_num = 1,!last, line_num = 47}, // 9
2548 // {offset = 5765, header_num = 0, file_num = 1, last, line_num = 49}, // 10
2549 // {offset = 5767, header_num = 0, file_num = 1, last, line_num = 50}, // 11
2550 // {offset = 5768, header_num = 0, file_num = 1, last, line_num = 51}, // 12
2551 // {offset = 5773, header_num = 0, file_num = 1, last, line_num = -1}, // 13
2552 // {offset = 5787, header_num = 1, file_num = 1, last, line_num = 19}, // 14
2553 // {offset = 5790, header_num = 1, file_num = 1, last, line_num = 20}, // 15
2554 // {offset = 5793, header_num = 1, file_num = 1, last, line_num = 67}, // 16
2555 // {offset = 5793, header_num = 1, file_num = 1, last, line_num = -1}, // 17
2556 // {offset = 5793, header_num = 1, file_num = 1,!last, line_num = 66}, // 18
2557 // {offset = 5795, header_num = 1, file_num = 1, last, line_num = 68}, // 19
2558 // {offset = 5798, header_num = 1, file_num = 1, last, line_num = -1}, // 20
79e052ea
ILT
2559 // The entries with line_num == -1 mark the end of a function: the
2560 // associated offset is one past the last instruction in the
2561 // function. This can correspond to the beginning of the next
2562 // function (as is true for offset 3232); alternately, there can be
2563 // a gap between the end of one function and the start of the next
ef04e392 2564 // (as is true for some others, most obviously from 3236->5764).
79e052ea
ILT
2565 //
2566 // Case 1: lookup_key has offset == 10. lower_bound returns
2567 // offsets[0]. Since it's not an exact match and we're
ef04e392 2568 // at the beginning of offsets, we return end() (invalid).
79e052ea 2569 // Case 2: lookup_key has offset 10000. lower_bound returns
71ff8986 2570 // offset[21] (end()). We return end() (invalid).
79e052ea
ILT
2571 // Case 3: lookup_key has offset == 3211. lower_bound matches
2572 // offsets[0] exactly, and that's the entry we return.
2573 // Case 4: lookup_key has offset == 3232. lower_bound returns
2574 // offsets[4]. That's an exact match, but indicates
2575 // end-of-function. We check if offsets[5] is also an
2576 // exact match but not end-of-function. It is, so we
2577 // return offsets[5].
2578 // Case 5: lookup_key has offset == 3214. lower_bound returns
2579 // offsets[1]. Since it's not an exact match, we back
2580 // up to the offset that's < lookup_key, offsets[0].
2581 // We note offsets[0] is a valid entry (not end-of-function),
2582 // so that's the entry we return.
2583 // Case 6: lookup_key has offset == 4000. lower_bound returns
2584 // offsets[8]. Since it's not an exact match, we back
2585 // up to offsets[7]. Since offsets[7] indicates
2586 // end-of-function, we know lookup_key is between
ef04e392 2587 // functions, so we return end() (not a valid offset).
79e052ea 2588 // Case 7: lookup_key has offset == 5794. lower_bound returns
71ff8986
ILT
2589 // offsets[19]. Since it's not an exact match, we back
2590 // up to offsets[16]. Note we back up to the *first*
2591 // entry with offset 5793, not just offsets[19-1].
2592 // We note offsets[16] is a valid entry, so we return it.
2593 // If offsets[16] had had line_num == -1, we would have
2594 // checked offsets[17]. The reason for this is that
2595 // 16 and 17 can be in an arbitrary order, since we sort
2596 // only by offset and last_line_for_offset. (Note it
2597 // doesn't help to use line_number as a tertiary sort key,
2598 // since sometimes we want the -1 to be first and sometimes
2599 // we want it to be last.)
79e052ea
ILT
2600
2601 // This deals with cases (1) and (2).
2602 if ((it == offsets->begin() && offset < it->offset)
2603 || it == offsets->end())
2604 return offsets->end();
2605
2606 // This deals with cases (3) and (4).
2607 if (offset == it->offset)
2608 {
2609 while (it != offsets->end()
2610 && it->offset == offset
2611 && it->line_num == -1)
2612 ++it;
2613 if (it == offsets->end() || it->offset != offset)
2614 return offsets->end();
2615 else
2616 return it;
2617 }
2618
2619 // This handles the first part of case (7) -- we back up to the
2620 // *first* entry that has the offset that's behind us.
2621 gold_assert(it != offsets->begin());
2622 std::vector<Offset_to_lineno_entry>::const_iterator range_end = it;
2623 --it;
2624 const off_t range_value = it->offset;
2625 while (it != offsets->begin() && (it-1)->offset == range_value)
2626 --it;
2627
2628 // This handles cases (5), (6), and (7): if any entry in the
2629 // equal_range [it, range_end) has a line_num != -1, it's a valid
71ff8986
ILT
2630 // match. If not, we're not in a function. The line number we saw
2631 // last for an offset will be sorted first, so it'll get returned if
2632 // it's present.
79e052ea
ILT
2633 for (; it != range_end; ++it)
2634 if (it->line_num != -1)
2635 return it;
2636 return offsets->end();
2637}
af674d1d 2638
71ff8986
ILT
2639// Returns the canonical filename:lineno for the address passed in.
2640// If other_lines is not NULL, appends the non-canonical lines
2641// assigned to the same address.
5c2c6c95 2642
e43872e9 2643template<int size, bool big_endian>
5c2c6c95 2644std::string
71ff8986
ILT
2645Sized_dwarf_line_info<size, big_endian>::do_addr2line(
2646 unsigned int shndx,
2647 off_t offset,
2648 std::vector<std::string>* other_lines)
5c2c6c95 2649{
5cde809b
CC
2650 gold_debug(DEBUG_LOCATION, "do_addr2line: shndx %u offset %08x",
2651 shndx, static_cast<int>(offset));
2652
4c50553d
ILT
2653 if (this->data_valid_ == false)
2654 return "";
2655
af674d1d
ILT
2656 const std::vector<Offset_to_lineno_entry>* offsets;
2657 // If we do not have reloc information, then our input is a .so or
2658 // some similar data structure where all the information is held in
2659 // the offset. In that case, we ignore the input shndx.
2660 if (this->input_is_relobj())
2661 offsets = &this->line_number_map_[shndx];
2662 else
2663 offsets = &this->line_number_map_[-1U];
2664 if (offsets->empty())
4c50553d
ILT
2665 return "";
2666
e43872e9 2667 typename std::vector<Offset_to_lineno_entry>::const_iterator it
79e052ea
ILT
2668 = offset_to_iterator(offsets, offset);
2669 if (it == offsets->end())
2670 return "";
5c2c6c95 2671
71ff8986 2672 std::string result = this->format_file_lineno(*it);
437ddf0c
CC
2673 gold_debug(DEBUG_LOCATION, "do_addr2line: canonical result: %s",
2674 result.c_str());
71ff8986 2675 if (other_lines != NULL)
437ddf0c
CC
2676 {
2677 unsigned int last_file_num = it->file_num;
2678 int last_line_num = it->line_num;
2679 // Return up to 4 more locations from the beginning of the function
2680 // for fuzzy matching.
2681 for (++it; it != offsets->end(); ++it)
2682 {
2683 if (it->offset == offset && it->line_num == -1)
2684 continue; // The end of a previous function.
2685 if (it->line_num == -1)
2686 break; // The end of the current function.
2687 if (it->file_num != last_file_num || it->line_num != last_line_num)
2688 {
2689 other_lines->push_back(this->format_file_lineno(*it));
2690 gold_debug(DEBUG_LOCATION, "do_addr2line: other: %s",
2691 other_lines->back().c_str());
2692 last_file_num = it->file_num;
2693 last_line_num = it->line_num;
2694 }
2695 if (it->offset > offset && other_lines->size() >= 4)
2696 break;
2697 }
2698 }
2699
71ff8986
ILT
2700 return result;
2701}
2702
2703// Convert the file_num + line_num into a string.
2704
2705template<int size, bool big_endian>
2706std::string
2707Sized_dwarf_line_info<size, big_endian>::format_file_lineno(
2708 const Offset_to_lineno_entry& loc) const
2709{
5c2c6c95 2710 std::string ret;
af674d1d 2711
71ff8986
ILT
2712 gold_assert(loc.header_num < static_cast<int>(this->files_.size()));
2713 gold_assert(loc.file_num
c1027032 2714 < static_cast<unsigned int>(this->files_[loc.header_num].size()));
af674d1d 2715 const std::pair<int, std::string>& filename_pair
71ff8986 2716 = this->files_[loc.header_num][loc.file_num];
5c2c6c95 2717 const std::string& filename = filename_pair.second;
af674d1d 2718
71ff8986 2719 gold_assert(loc.header_num < static_cast<int>(this->directories_.size()));
af674d1d 2720 gold_assert(filename_pair.first
71ff8986 2721 < static_cast<int>(this->directories_[loc.header_num].size()));
af674d1d 2722 const std::string& dirname
71ff8986 2723 = this->directories_[loc.header_num][filename_pair.first];
af674d1d 2724
5c2c6c95
ILT
2725 if (!dirname.empty())
2726 {
2727 ret += dirname;
2728 ret += "/";
2729 }
2730 ret += filename;
2731 if (ret.empty())
2732 ret = "(unknown)";
2733
2734 char buffer[64]; // enough to hold a line number
71ff8986 2735 snprintf(buffer, sizeof(buffer), "%d", loc.line_num);
5c2c6c95
ILT
2736 ret += ":";
2737 ret += buffer;
2738
2739 return ret;
2740}
2741
a55ce7fe
ILT
2742// Dwarf_line_info routines.
2743
e4e5049b
CS
2744static unsigned int next_generation_count = 0;
2745
2746struct Addr2line_cache_entry
2747{
2748 Object* object;
2749 unsigned int shndx;
2750 Dwarf_line_info* dwarf_line_info;
2751 unsigned int generation_count;
2752 unsigned int access_count;
2753
2754 Addr2line_cache_entry(Object* o, unsigned int s, Dwarf_line_info* d)
2755 : object(o), shndx(s), dwarf_line_info(d),
2756 generation_count(next_generation_count), access_count(0)
2757 {
2758 if (next_generation_count < (1U << 31))
2759 ++next_generation_count;
2760 }
2761};
2762// We expect this cache to be small, so don't bother with a hashtable
2763// or priority queue or anything: just use a simple vector.
2764static std::vector<Addr2line_cache_entry> addr2line_cache;
2765
a55ce7fe
ILT
2766std::string
2767Dwarf_line_info::one_addr2line(Object* object,
e4e5049b 2768 unsigned int shndx, off_t offset,
71ff8986
ILT
2769 size_t cache_size,
2770 std::vector<std::string>* other_lines)
a55ce7fe 2771{
e4e5049b
CS
2772 Dwarf_line_info* lineinfo = NULL;
2773 std::vector<Addr2line_cache_entry>::iterator it;
2774
2775 // First, check the cache. If we hit, update the counts.
2776 for (it = addr2line_cache.begin(); it != addr2line_cache.end(); ++it)
8851ecca 2777 {
e4e5049b
CS
2778 if (it->object == object && it->shndx == shndx)
2779 {
2780 lineinfo = it->dwarf_line_info;
2781 it->generation_count = next_generation_count;
2782 // We cap generation_count at 2^31 -1 to avoid overflow.
2783 if (next_generation_count < (1U << 31))
2784 ++next_generation_count;
2785 // We cap access_count at 31 so 2^access_count doesn't overflow
2786 if (it->access_count < 31)
2787 ++it->access_count;
2788 break;
2789 }
2790 }
2791
2792 // If we don't hit the cache, create a new object and insert into the
2793 // cache.
2794 if (lineinfo == NULL)
2795 {
2796 switch (parameters->size_and_endianness())
2797 {
a55ce7fe 2798#ifdef HAVE_TARGET_32_LITTLE
e4e5049b
CS
2799 case Parameters::TARGET_32_LITTLE:
2800 lineinfo = new Sized_dwarf_line_info<32, false>(object, shndx); break;
a55ce7fe 2801#endif
a55ce7fe 2802#ifdef HAVE_TARGET_32_BIG
e4e5049b
CS
2803 case Parameters::TARGET_32_BIG:
2804 lineinfo = new Sized_dwarf_line_info<32, true>(object, shndx); break;
a55ce7fe 2805#endif
a55ce7fe 2806#ifdef HAVE_TARGET_64_LITTLE
e4e5049b
CS
2807 case Parameters::TARGET_64_LITTLE:
2808 lineinfo = new Sized_dwarf_line_info<64, false>(object, shndx); break;
a55ce7fe 2809#endif
8851ecca 2810#ifdef HAVE_TARGET_64_BIG
e4e5049b
CS
2811 case Parameters::TARGET_64_BIG:
2812 lineinfo = new Sized_dwarf_line_info<64, true>(object, shndx); break;
a55ce7fe 2813#endif
e4e5049b
CS
2814 default:
2815 gold_unreachable();
2816 }
2817 addr2line_cache.push_back(Addr2line_cache_entry(object, shndx, lineinfo));
2818 }
2819
2820 // Now that we have our object, figure out the answer
71ff8986 2821 std::string retval = lineinfo->addr2line(shndx, offset, other_lines);
e4e5049b
CS
2822
2823 // Finally, if our cache has grown too big, delete old objects. We
2824 // assume the common (probably only) case is deleting only one object.
2825 // We use a pretty simple scheme to evict: function of LRU and MFU.
2826 while (addr2line_cache.size() > cache_size)
2827 {
2828 unsigned int lowest_score = ~0U;
2829 std::vector<Addr2line_cache_entry>::iterator lowest
2830 = addr2line_cache.end();
2831 for (it = addr2line_cache.begin(); it != addr2line_cache.end(); ++it)
2832 {
2833 const unsigned int score = (it->generation_count
2834 + (1U << it->access_count));
2835 if (score < lowest_score)
2836 {
2837 lowest_score = score;
2838 lowest = it;
2839 }
2840 }
2841 if (lowest != addr2line_cache.end())
2842 {
2843 delete lowest->dwarf_line_info;
2844 addr2line_cache.erase(lowest);
2845 }
8851ecca 2846 }
e4e5049b
CS
2847
2848 return retval;
2849}
2850
2851void
2852Dwarf_line_info::clear_addr2line_cache()
2853{
2854 for (std::vector<Addr2line_cache_entry>::iterator it = addr2line_cache.begin();
2855 it != addr2line_cache.end();
2856 ++it)
2857 delete it->dwarf_line_info;
2858 addr2line_cache.clear();
a55ce7fe
ILT
2859}
2860
5c2c6c95
ILT
2861#ifdef HAVE_TARGET_32_LITTLE
2862template
a55ce7fe 2863class Sized_dwarf_line_info<32, false>;
5c2c6c95
ILT
2864#endif
2865
2866#ifdef HAVE_TARGET_32_BIG
2867template
a55ce7fe 2868class Sized_dwarf_line_info<32, true>;
5c2c6c95
ILT
2869#endif
2870
2871#ifdef HAVE_TARGET_64_LITTLE
2872template
a55ce7fe 2873class Sized_dwarf_line_info<64, false>;
5c2c6c95
ILT
2874#endif
2875
2876#ifdef HAVE_TARGET_64_BIG
2877template
a55ce7fe 2878class Sized_dwarf_line_info<64, true>;
5c2c6c95
ILT
2879#endif
2880
2881} // End namespace gold.
This page took 0.730599 seconds and 4 git commands to generate.