xref: /netbsd-src/external/gpl3/binutils.old/dist/gold/dwarf_reader.cc (revision e992f068c547fd6e84b3f104dc2340adcc955732)
1 // dwarf_reader.cc -- parse dwarf2/3 debug information
2 
3 // Copyright (C) 2007-2022 Free Software Foundation, Inc.
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 
25 #include <algorithm>
26 #include <utility>
27 #include <vector>
28 
29 #include "debug.h"
30 #include "elfcpp_swap.h"
31 #include "dwarf.h"
32 #include "object.h"
33 #include "reloc.h"
34 #include "dwarf_reader.h"
35 #include "int_encoding.h"
36 #include "compressed_output.h"
37 
38 namespace gold {
39 
40 // Class Sized_elf_reloc_mapper
41 
42 // Initialize the relocation tracker for section RELOC_SHNDX.
43 
44 template<int size, bool big_endian>
45 bool
do_initialize(unsigned int reloc_shndx,unsigned int reloc_type)46 Sized_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 
56 template<int size, bool big_endian>
57 unsigned int
symbol_section(unsigned int symndx,Address * value,bool * is_ordinary)58 Sized_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;
62   gold_assert(static_cast<off_t>((symndx + 1) * symsize) <= this->symtab_size_);
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 
72 template<int size, bool big_endian>
73 unsigned int
do_get_reloc_target(off_t reloc_offset,off_t * target_offset)74 Sized_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 
93 static inline Elf_reloc_mapper*
make_elf_reloc_mapper(Relobj * object,const unsigned char * symtab,off_t symtab_size)94 make_elf_reloc_mapper(Relobj* object, const unsigned char* symtab,
95 		      off_t symtab_size)
96 {
97   if (object->elfsize() == 32)
98     {
99       if (object->is_big_endian())
100         {
101 #ifdef HAVE_TARGET_32_BIG
102 	  return new Sized_elf_reloc_mapper<32, true>(object, symtab,
103 						      symtab_size);
104 #else
105 	  gold_unreachable();
106 #endif
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();
115 #endif
116         }
117     }
118   else if (object->elfsize() == 64)
119     {
120       if (object->is_big_endian())
121         {
122 #ifdef HAVE_TARGET_64_BIG
123 	  return new Sized_elf_reloc_mapper<64, true>(object, symtab,
124 						      symtab_size);
125 #else
126 	  gold_unreachable();
127 #endif
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         }
138     }
139   else
140     gold_unreachable();
141 }
142 
143 // class Dwarf_abbrev_table
144 
145 void
clear_abbrev_codes()146 Dwarf_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 
168 bool
do_read_abbrevs(Relobj * object,unsigned int abbrev_shndx,off_t abbrev_offset)169 Dwarf_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);
185 	  if (name == ".debug_abbrev" || name == ".zdebug_abbrev")
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 
226 const Dwarf_abbrev_table::Abbrev_code*
do_get_abbrev(unsigned int code)227 Dwarf_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 
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 
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 
294 	  entry->add_attribute(attr, form, implicit_const);
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 
309 bool
read_ranges_table(Relobj * object,const unsigned char * symtab,off_t symtab_size,unsigned int ranges_shndx,unsigned int version)310 Dwarf_ranges_table::read_ranges_table(
311     Relobj* object,
312     const unsigned char* symtab,
313     off_t symtab_size,
314     unsigned int ranges_shndx,
315     unsigned int version)
316 {
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 
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);
338 	  if (name == section_name || name == compressed_section_name)
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);
395   this->reloc_type_ = reloc_type;
396 
397   return true;
398 }
399 
400 // Read a range list from section RANGES_SHNDX at offset RANGES_OFFSET.
401 
402 Dwarf_range_list*
read_range_list(Relobj * object,const unsigned char * symtab,off_t symtab_size,unsigned int addr_size,unsigned int ranges_shndx,off_t offset)403 Dwarf_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 
413   if (!this->read_ranges_table(object, symtab, symtab_size, ranges_shndx, 4))
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 	{
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);
438 	}
439       else
440 	{
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);
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         {
452 	  shndx1 = this->lookup_reloc(offset, &start);
453 	  shndx2 = this->lookup_reloc(offset + addr_size, &end);
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 
479 // Read a DWARF 5 range list from section RANGES_SHNDX at offset RANGES_OFFSET.
480 
481 Dwarf_range_list*
read_range_list_v5(Relobj * object,const unsigned char * symtab,off_t symtab_size,unsigned int addr_size,unsigned int ranges_shndx,off_t offset)482 Dwarf_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 
598 // Look for a relocation at offset OFF in the range table,
599 // and return the section index and offset of the target.
600 
601 unsigned int
lookup_reloc(off_t off,off_t * target_off)602 Dwarf_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 
616 // class Dwarf_pubnames_table
617 
618 // Read the pubnames section from the object file.
619 
620 bool
read_section(Relobj * object,const unsigned char * symtab,off_t symtab_size)621 Dwarf_pubnames_table::read_section(Relobj* object, const unsigned char* symtab,
622                                    off_t symtab_size)
623 {
624   section_size_type buffer_size;
625   unsigned int shndx = 0;
626   const char* name = this->is_pubtypes_ ? "pubtypes" : "pubnames";
627   const char* gnu_name = (this->is_pubtypes_
628 			  ? "gnu_pubtypes"
629 			  : "gnu_pubnames");
630 
631   for (unsigned int i = 1; i < object->shnum(); ++i)
632     {
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;
644           break;
645         }
646       else if (strcmp(section_name_suffix, gnu_name) == 0)
647         {
648           shndx = i;
649           this->is_gnu_style_ = true;
650           break;
651         }
652     }
653   if (shndx == 0)
654     return false;
655 
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;
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 
686   return true;
687 }
688 
689 // Read the header for the set at OFFSET.
690 
691 bool
read_header(off_t offset)692 Dwarf_pubnames_table::read_header(off_t offset)
693 {
694   // Make sure we have actually read the section.
695   gold_assert(this->buffer_ != NULL);
696 
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.
703   uint64_t unit_length = this->dwinfo_->read_from_pointer<32>(pinfo);
704   pinfo += 4;
705   if (unit_length == 0xffffffff)
706     {
707       unit_length = this->dwinfo_->read_from_pointer<64>(pinfo);
708       this->unit_length_ = unit_length + 12;
709       pinfo += 8;
710       this->offset_size_ = 8;
711     }
712   else
713     {
714       this->unit_length_ = unit_length + 4;
715       this->offset_size_ = 4;
716     }
717   this->end_of_table_ = pinfo + unit_length;
718 
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 
725   // Check the version.
726   unsigned int version = this->dwinfo_->read_from_pointer<16>(pinfo);
727   pinfo += 2;
728   if (version != 2)
729     return false;
730 
731   this->reloc_mapper_->get_reloc_target(pinfo - this->buffer_,
732                                         &this->cu_offset_);
733 
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 
746 const char*
next_name(uint8_t * flag_byte)747 Dwarf_pubnames_table::next_name(uint8_t* flag_byte)
748 {
749   const unsigned char* pinfo = this->pinfo_;
750 
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_)
754     return NULL;
755 
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 
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 
Dwarf_die(Dwarf_info_reader * dwinfo,off_t die_offset,Dwarf_die * parent)782 Dwarf_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 
811 bool
read_attributes()812 Dwarf_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 	{
845 	  case elfcpp::DW_FORM_flag_present:
846 	    attr_value.val.intval = 1;
847 	    break;
848 	  case elfcpp::DW_FORM_implicit_const:
849 	    attr_value.val.intval =
850 		this->abbrev_code_->attributes[i].implicit_const;
851 	    break;
852 	  case elfcpp::DW_FORM_strp:
853 	  case elfcpp::DW_FORM_strp_sup:
854 	  case elfcpp::DW_FORM_line_strp:
855 	    {
856 	      off_t str_off;
857 	      if (this->dwinfo_->offset_size() == 4)
858 		str_off = this->dwinfo_->read_from_pointer<32>(&pattr);
859 	      else
860 		str_off = this->dwinfo_->read_from_pointer<64>(&pattr);
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 	    }
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;
887 	  case elfcpp::DW_FORM_sec_offset:
888 	    {
889 	      off_t sec_off;
890 	      if (this->dwinfo_->offset_size() == 4)
891 		sec_off = this->dwinfo_->read_from_pointer<32>(&pattr);
892 	      else
893 		sec_off = this->dwinfo_->read_from_pointer<64>(&pattr);
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:
902 	    {
903 	      off_t sec_off;
904 	      if (this->dwinfo_->address_size() == 4)
905 		sec_off = this->dwinfo_->read_from_pointer<32>(&pattr);
906 	      else
907 		sec_off = this->dwinfo_->read_from_pointer<64>(&pattr);
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;
912 	      break;
913 	    }
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 	    }
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:
934 	    attr_value.aux.blocklen =
935 		this->dwinfo_->read_from_pointer<16>(&pattr);
936 	    attr_value.val.blockval = pattr;
937 	    pattr += attr_value.aux.blocklen;
938 	    break;
939 	  case elfcpp::DW_FORM_block4:
940 	    attr_value.aux.blocklen =
941 		this->dwinfo_->read_from_pointer<32>(&pattr);
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:
960 	    attr_value.val.intval =
961 		this->dwinfo_->read_from_pointer<16>(&pattr);
962 	    break;
963 	  case elfcpp::DW_FORM_ref2:
964 	    attr_value.val.refval =
965 		this->dwinfo_->read_from_pointer<16>(&pattr);
966 	    ref_form = true;
967 	    break;
968 	  case elfcpp::DW_FORM_data4:
969 	    {
970 	      off_t sec_off;
971 	      sec_off = this->dwinfo_->read_from_pointer<32>(&pattr);
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:
979 	  case elfcpp::DW_FORM_ref_sup4:
980 	    {
981 	      off_t sec_off;
982 	      sec_off = this->dwinfo_->read_from_pointer<32>(&pattr);
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;
993 	      sec_off = this->dwinfo_->read_from_pointer<64>(&pattr);
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 	    }
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 	    }
1008 	  case elfcpp::DW_FORM_ref_sig8:
1009 	    attr_value.val.uintval =
1010 		this->dwinfo_->read_from_pointer<64>(&pattr);
1011 	    break;
1012 	  case elfcpp::DW_FORM_ref8:
1013 	  case elfcpp::DW_FORM_ref_sup8:
1014 	    {
1015 	      off_t sec_off;
1016 	      sec_off = this->dwinfo_->read_from_pointer<64>(&pattr);
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:
1030 	    attr_value.val.uintval = read_unsigned_LEB_128(pattr, &len);
1031 	    pattr += len;
1032 	    break;
1033 	  case elfcpp::DW_FORM_addrx:
1034 	  case elfcpp::DW_FORM_GNU_addr_index:
1035 	    attr_value.val.uintval = read_unsigned_LEB_128(pattr, &len);
1036 	    pattr += len;
1037 	    break;
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;
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;
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;
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 
1128 off_t
skip_attributes()1129 Dwarf_die::skip_attributes()
1130 {
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 	{
1150 	  case elfcpp::DW_FORM_flag_present:
1151 	  case elfcpp::DW_FORM_implicit_const:
1152 	    break;
1153 	  case elfcpp::DW_FORM_strp:
1154 	  case elfcpp::DW_FORM_sec_offset:
1155 	  case elfcpp::DW_FORM_strp_sup:
1156 	  case elfcpp::DW_FORM_line_strp:
1157 	    pattr += this->dwinfo_->offset_size();
1158 	    break;
1159 	  case elfcpp::DW_FORM_addr:
1160 	    pattr += this->dwinfo_->address_size();
1161 	    break;
1162 	  case elfcpp::DW_FORM_ref_addr:
1163 	    pattr += this->dwinfo_->ref_addr_size();
1164 	    break;
1165 	  case elfcpp::DW_FORM_block1:
1166 	    pattr += 1 + *pattr;
1167 	    break;
1168 	  case elfcpp::DW_FORM_block2:
1169 	    {
1170 	      uint16_t block_size;
1171 	      block_size = this->dwinfo_->read_from_pointer<16>(&pattr);
1172 	      pattr += block_size;
1173 	      break;
1174 	    }
1175 	  case elfcpp::DW_FORM_block4:
1176 	    {
1177 	      uint32_t block_size;
1178 	      block_size = this->dwinfo_->read_from_pointer<32>(&pattr);
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:
1193 	  case elfcpp::DW_FORM_strx1:
1194 	  case elfcpp::DW_FORM_addrx1:
1195 	    pattr += 1;
1196 	    break;
1197 	  case elfcpp::DW_FORM_data2:
1198 	  case elfcpp::DW_FORM_ref2:
1199 	  case elfcpp::DW_FORM_strx2:
1200 	  case elfcpp::DW_FORM_addrx2:
1201 	    pattr += 2;
1202 	    break;
1203 	  case elfcpp::DW_FORM_strx3:
1204 	  case elfcpp::DW_FORM_addrx3:
1205 	    pattr += 3;
1206 	    break;
1207 	  case elfcpp::DW_FORM_data4:
1208 	  case elfcpp::DW_FORM_ref4:
1209 	  case elfcpp::DW_FORM_ref_sup4:
1210 	  case elfcpp::DW_FORM_strx4:
1211 	  case elfcpp::DW_FORM_addrx4:
1212 	    pattr += 4;
1213 	    break;
1214 	  case elfcpp::DW_FORM_data8:
1215 	  case elfcpp::DW_FORM_ref8:
1216 	  case elfcpp::DW_FORM_ref_sig8:
1217 	  case elfcpp::DW_FORM_ref_sup8:
1218 	    pattr += 8;
1219 	    break;
1220 	  case elfcpp::DW_FORM_data16:
1221 	    pattr += 16;
1222 	    break;
1223 	  case elfcpp::DW_FORM_ref_udata:
1224 	  case elfcpp::DW_FORM_udata:
1225 	  case elfcpp::DW_FORM_addrx:
1226 	  case elfcpp::DW_FORM_strx:
1227 	  case elfcpp::DW_FORM_loclistx:
1228 	  case elfcpp::DW_FORM_rnglistx:
1229 	  case elfcpp::DW_FORM_GNU_addr_index:
1230 	  case elfcpp::DW_FORM_GNU_str_index:
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 
1252 void
set_name()1253 Dwarf_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 
1264 void
set_linkage_name()1265 Dwarf_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 
1276 const Dwarf_die::Attribute_value*
attribute(unsigned int attr)1277 Dwarf_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 
1289 const char*
string_attribute(unsigned int attr)1290 Dwarf_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 
1307 int64_t
int_attribute(unsigned int attr)1308 Dwarf_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     {
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 
1328 uint64_t
uint_attribute(unsigned int attr)1329 Dwarf_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     {
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 
1349 off_t
ref_attribute(unsigned int attr,unsigned int * shndx)1350 Dwarf_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 
1379 off_t
address_attribute(unsigned int attr,unsigned int * shndx)1380 Dwarf_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 
1390 // Return the offset of this DIE's first child.
1391 
1392 off_t
child_offset()1393 Dwarf_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 
1405 off_t
sibling_offset()1406 Dwarf_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 
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 
1450 void
parse()1451 Dwarf_info_reader::parse()
1452 {
1453   if (this->object_->is_big_endian())
1454     {
1455 #if defined(HAVE_TARGET_32_BIG) || defined(HAVE_TARGET_64_BIG)
1456       this->do_parse<true>();
1457 #else
1458       gold_unreachable();
1459 #endif
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();
1467 #endif
1468     }
1469 }
1470 
1471 template<bool big_endian>
1472 void
do_parse()1473 Dwarf_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).
1494   unsigned int abbrev_shndx = this->abbrev_shndx_;
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 
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 
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 
1559       // DWARF 2-4: Read address_size (1 byte).
1560       if (this->cu_version_ < 5)
1561 	this->address_size_ = *pinfo++;
1562 
1563       // For type units, read the two extra fields.
1564       uint64_t signature = 0;
1565       off_t type_offset = 0;
1566       if (this->is_type_unit())
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.
1596 	  if (this->is_type_unit())
1597 	    this->visit_type_unit(section_offset + this->cu_offset_,
1598 				  cu_end - cu_start, type_offset, signature,
1599 				  &root_die);
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 
1618 bool
do_read_string_table(unsigned int string_shndx)1619 Dwarf_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);
1630 	  if (name == ".debug_str" || name == ".zdebug_str")
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 
1660 // Read a possibly unaligned integer of SIZE.
1661 template <int valsize>
1662 inline typename elfcpp::Valtype_base<valsize>::Valtype
read_from_pointer(const unsigned char * source)1663 Dwarf_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.
1674 template <int valsize>
1675 inline typename elfcpp::Valtype_base<valsize>::Valtype
read_from_pointer(const unsigned char ** source)1676 Dwarf_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 
1687 // Read a 3-byte integer.  Update SOURCE after read.
1688 inline typename elfcpp::Valtype_base<32>::Valtype
read_3bytes_from_pointer(const unsigned char ** source)1689 Dwarf_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 
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 
1703 unsigned int
lookup_reloc(off_t attr_off,off_t * target_off)1704 Dwarf_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 
1720 const char*
get_string(off_t str_off,unsigned int string_shndx)1721 Dwarf_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 
1747 void
visit_compilation_unit(off_t,off_t,Dwarf_die *)1748 Dwarf_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 
1754 void
visit_type_unit(off_t,off_t,off_t,uint64_t,Dwarf_die *)1755 Dwarf_info_reader::visit_type_unit(off_t, off_t, off_t, uint64_t, Dwarf_die*)
1756 {
1757 }
1758 
1759 // Print a warning about a corrupt debug section.
1760 
1761 void
warn_corrupt_debug_section() const1762 Dwarf_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 
1769 // class Sized_dwarf_line_info
1770 
1771 struct 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 
1783 static void
ResetLineStateMachine(struct LineStateMachine * lsm,bool default_is_stmt)1784 ResetLineStateMachine(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;
1790   lsm->shndx = -1U;
1791   lsm->is_stmt = default_is_stmt;
1792   lsm->basic_block = false;
1793   lsm->end_sequence = false;
1794 }
1795 
1796 template<int size, bool big_endian>
Sized_dwarf_line_info(Object * object,unsigned int read_shndx)1797 Sized_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),
1801     str_buffer_(NULL), str_buffer_start_(NULL),
1802     reloc_mapper_(NULL), symtab_buffer_(NULL), directories_(), files_(),
1803     current_header_index_(-1), reloc_map_(), line_number_map_()
1804 {
1805   unsigned int debug_line_shndx = 0;
1806   unsigned int debug_line_str_shndx = 0;
1807 
1808   for (unsigned int i = 1; i < object->shnum(); ++i)
1809     {
1810       section_size_type buffer_size;
1811       bool is_new = false;
1812 
1813       // FIXME: do this more efficiently: section_name() isn't super-fast
1814       std::string name = object->section_name(i);
1815       if (name == ".debug_line" || name == ".zdebug_line")
1816 	{
1817 	  this->buffer_ =
1818 	      object->decompressed_section_contents(i, &buffer_size, &is_new);
1819 	  if (is_new)
1820 	    this->buffer_start_ = this->buffer_;
1821 	  this->buffer_end_ = this->buffer_ + buffer_size;
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;
1832 	}
1833       if (debug_line_shndx > 0 && debug_line_str_shndx > 0)
1834         break;
1835     }
1836   if (this->buffer_ == NULL)
1837     return;
1838 
1839   // Find the relocation section for ".debug_line".
1840   // We expect these for relobjs (.o's) but not dynobjs (.so's).
1841   unsigned int reloc_shndx = 0;
1842   for (unsigned int i = 0; i < object->shnum(); ++i)
1843     {
1844       unsigned int reloc_sh_type = object->section_type(i);
1845       if ((reloc_sh_type == elfcpp::SHT_REL
1846 	   || reloc_sh_type == elfcpp::SHT_RELA)
1847 	  && object->section_info(i) == debug_line_shndx)
1848 	{
1849 	  reloc_shndx = i;
1850 	  this->track_relocs_type_ = reloc_sh_type;
1851 	  break;
1852 	}
1853     }
1854 
1855   // Finally, we need the symtab section to interpret the relocs.
1856   if (reloc_shndx != 0)
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           {
1862 	    this->symtab_buffer_ = object->section_contents(
1863 		symtab_shndx, &this->symtab_buffer_size_, false);
1864             break;
1865           }
1866       if (this->symtab_buffer_ == NULL)
1867         return;
1868     }
1869 
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 
1877   // Now that we have successfully read all the data, parse the debug
1878   // info.
1879   this->data_valid_ = true;
1880   this->read_line_mappings(read_shndx);
1881 }
1882 
1883 // Read the DWARF header.
1884 
1885 template<int size, bool big_endian>
1886 const unsigned char*
read_header_prolog(const unsigned char * lineptr)1887 Sized_dwarf_line_info<size, big_endian>::read_header_prolog(
1888     const unsigned char* lineptr)
1889 {
1890   uint32_t initial_length = elfcpp::Swap_unaligned<32, big_endian>::readval(lineptr);
1891   lineptr += 4;
1892 
1893   // In DWARF, if the initial length is all 1 bits, then the offset
1894   // size is 8 and we need to read the next 8 bytes for the real length.
1895   if (initial_length == 0xffffffff)
1896     {
1897       this->header_.offset_size = 8;
1898       initial_length = elfcpp::Swap_unaligned<64, big_endian>::readval(lineptr);
1899       lineptr += 8;
1900     }
1901   else
1902     this->header_.offset_size = 4;
1903 
1904   this->header_.total_length = initial_length;
1905 
1906   this->end_of_unit_ = lineptr + initial_length;
1907   gold_assert(this->end_of_unit_ <= buffer_end_);
1908 
1909   this->header_.version =
1910       elfcpp::Swap_unaligned<16, big_endian>::readval(lineptr);
1911   lineptr += 2;
1912 
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_;
1917 
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);
1929   else
1930     this->header_.prologue_length =
1931 	elfcpp::Swap_unaligned<64, big_endian>::readval(lineptr);
1932   lineptr += this->header_.offset_size;
1933 
1934   this->end_of_header_length_ = lineptr;
1935 
1936   this->header_.min_insn_length = *lineptr;
1937   lineptr += 1;
1938 
1939   if (this->header_.version < 4)
1940     this->header_.max_ops_per_insn = 1;
1941   else
1942     {
1943       // DWARF 4 added the maximum_operations_per_instruction field.
1944       this->header_.max_ops_per_insn = *lineptr;
1945       lineptr += 1;
1946       // TODO: Add support for values other than 1.
1947       gold_assert(this->header_.max_ops_per_insn == 1);
1948     }
1949 
1950   this->header_.default_is_stmt = *lineptr;
1951   lineptr += 1;
1952 
1953   this->header_.line_base = *reinterpret_cast<const signed char*>(lineptr);
1954   lineptr += 1;
1955 
1956   this->header_.line_range = *lineptr;
1957   lineptr += 1;
1958 
1959   this->header_.opcode_base = *lineptr;
1960   lineptr += 1;
1961 
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++)
1965     {
1966       this->header_.std_opcode_lengths[i] = *lineptr;
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.
1975 // This routine is for DWARF versions 2, 3, and 4.
1976 
1977 template<int size, bool big_endian>
1978 const unsigned char*
read_header_tables_v2(const unsigned char * lineptr)1979 Sized_dwarf_line_info<size, big_endian>::read_header_tables_v2(
1980     const unsigned char* lineptr)
1981 {
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 
1994   // It is legal for the directory entry table to be empty.
1995   if (*lineptr)
1996     {
1997       int dirindex = 1;
1998       while (*lineptr)
1999         {
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;
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);
2021           lineptr += len;
2022 
2023           if (dirindex >= this->directories_.back().size())
2024             dirindex = 0;
2025 	  int dirindexi = static_cast<int>(dirindex);
2026 
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 
2033           gold_assert(fileindex
2034 		      == static_cast<int>(this->files_.back().size()));
2035           this->files_.back().push_back(std::make_pair(dirindexi, filename));
2036           fileindex++;
2037         }
2038     }
2039   lineptr++;
2040 
2041   return lineptr;
2042 }
2043 
2044 // This routine is for DWARF version 5.
2045 
2046 template<int size, bool big_endian>
2047 const unsigned char*
read_header_tables_v5(const unsigned char * lineptr)2048 Sized_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 
2207 // Process a single opcode in the .debug.line structure.
2208 
2209 template<int size, bool big_endian>
2210 bool
process_one_opcode(const unsigned char * start,struct LineStateMachine * lsm,size_t * len)2211 Sized_dwarf_line_info<size, big_endian>::process_one_opcode(
2212     const unsigned char* start, struct LineStateMachine* lsm, size_t* len)
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.
2222   if (opcode >= this->header_.opcode_base)
2223     {
2224       opcode -= this->header_.opcode_base;
2225       const int advance_address = ((opcode / this->header_.line_range)
2226                                    * this->header_.min_insn_length);
2227       lsm->address += advance_address;
2228 
2229       const int advance_line = ((opcode % this->header_.line_range)
2230                                 + this->header_.line_base);
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
2248             = read_unsigned_LEB_128(start, &templen);
2249         oplen += templen;
2250         lsm->address += this->header_.min_insn_length * advance_address;
2251       }
2252       break;
2253 
2254     case elfcpp::DW_LNS_advance_line:
2255       {
2256         const int64_t advance_line = read_signed_LEB_128(start, &templen);
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;
2289         advance_address = elfcpp::Swap_unaligned<16, big_endian>::readval(start);
2290         oplen += 2;
2291         lsm->address += advance_address;
2292       }
2293       break;
2294 
2295     case elfcpp::DW_LNS_const_add_pc:
2296       {
2297         const int advance_address = (this->header_.min_insn_length
2298                                      * ((255 - this->header_.opcode_base)
2299                                         / this->header_.line_range));
2300         lsm->address += advance_address;
2301       }
2302       break;
2303 
2304     case elfcpp::DW_LNS_extended_op:
2305       {
2306         const uint64_t extended_op_len
2307             = read_unsigned_LEB_128(start, &templen);
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:
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.
2320             lsm->line_num = -1;
2321             lsm->end_sequence = true;
2322             *len = oplen;
2323             return true;
2324 
2325           case elfcpp::DW_LNE_set_address:
2326             {
2327               lsm->address =
2328 		elfcpp::Swap_unaligned<size, big_endian>::readval(start);
2329               typename Reloc_map::const_iterator it
2330                   = this->reloc_map_.find(start - this->buffer_);
2331               if (it != reloc_map_.end())
2332                 {
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;
2342                   lsm->shndx = it->second.first;
2343                 }
2344               else
2345                 {
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;
2350                 }
2351               break;
2352             }
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);
2360 
2361               if (dirindex >= this->directories_.back().size())
2362                 dirindex = 0;
2363 	      int dirindexi = static_cast<int>(dirindex);
2364 
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.
2370 
2371               this->files_.back().push_back(std::make_pair(dirindexi,
2372 							   filename));
2373             }
2374             break;
2375           }
2376       }
2377       break;
2378 
2379     default:
2380       {
2381         // Ignore unknown opcode  silently
2382         for (int i = 0; i < this->header_.std_opcode_lengths[opcode]; i++)
2383           {
2384             size_t templen;
2385             read_unsigned_LEB_128(start, &templen);
2386             start += templen;
2387             oplen += templen;
2388           }
2389       }
2390       break;
2391   }
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 
2399 template<int size, bool big_endian>
2400 unsigned const char*
read_lines(unsigned const char * lineptr,unsigned const char * endptr,unsigned int shndx)2401 Sized_dwarf_line_info<size, big_endian>::read_lines(unsigned const char* lineptr,
2402                                                     unsigned const char* endptr,
2403                                                     unsigned int shndx)
2404 {
2405   struct LineStateMachine lsm;
2406 
2407   while (lineptr < endptr)
2408     {
2409       ResetLineStateMachine(&lsm, this->header_.default_is_stmt);
2410       while (!lsm.end_sequence)
2411         {
2412           size_t oplength;
2413 
2414 	  if (lineptr >= endptr)
2415 	    break;
2416 
2417           bool add_line = this->process_one_opcode(lineptr, &lsm, &oplength);
2418           lineptr += oplength;
2419 
2420           if (add_line
2421               && (shndx == -1U || lsm.shndx == -1U || shndx == lsm.shndx))
2422             {
2423               Offset_to_lineno_entry entry
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 };
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
2431 	      // offset and a real line number, then mark the first
2432 	      // one as non-canonical.
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)
2437 		map.back().last_line_for_offset = false;
2438 	      map.push_back(entry);
2439             }
2440         }
2441     }
2442 
2443   return endptr;
2444 }
2445 
2446 // Read the relocations into a Reloc_map.
2447 
2448 template<int size, bool big_endian>
2449 void
read_relocs()2450 Sized_dwarf_line_info<size, big_endian>::read_relocs()
2451 {
2452   if (this->symtab_buffer_ == NULL)
2453     return;
2454 
2455   off_t value;
2456   off_t reloc_offset;
2457   while ((reloc_offset = this->reloc_mapper_->next_offset()) != -1)
2458     {
2459       const unsigned int shndx =
2460           this->reloc_mapper_->get_reloc_target(reloc_offset, &value);
2461 
2462       // There is no reason to record non-ordinary section indexes, or
2463       // SHN_UNDEF, because they will never match the real section.
2464       if (shndx != 0)
2465 	this->reloc_map_[reloc_offset] = std::make_pair(shndx, value);
2466 
2467       this->reloc_mapper_->advance(reloc_offset + 1);
2468     }
2469 }
2470 
2471 // Read the line number info.
2472 
2473 template<int size, bool big_endian>
2474 void
read_line_mappings(unsigned int shndx)2475 Sized_dwarf_line_info<size, big_endian>::read_line_mappings(unsigned int shndx)
2476 {
2477   gold_assert(this->data_valid_ == true);
2478 
2479   this->read_relocs();
2480   while (this->buffer_ < this->buffer_end_)
2481     {
2482       const unsigned char* lineptr = this->buffer_;
2483       lineptr = this->read_header_prolog(lineptr);
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_;
2495     }
2496 
2497   // Sort the lines numbers, so addr2line can use binary search.
2498   for (typename Lineno_map::iterator it = line_number_map_.begin();
2499        it != line_number_map_.end();
2500        ++it)
2501     // Each vector needs to be sorted by offset.
2502     std::sort(it->second.begin(), it->second.end());
2503 }
2504 
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 
2511 template<int size, bool big_endian>
2512 bool
input_is_relobj()2513 Sized_dwarf_line_info<size, big_endian>::input_is_relobj()
2514 {
2515   // Only .o files have relocs and the symtab buffer that goes with them.
2516   return this->symtab_buffer_ != NULL;
2517 }
2518 
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 
2525 static std::vector<Offset_to_lineno_entry>::const_iterator
offset_to_iterator(const std::vector<Offset_to_lineno_entry> * offsets,off_t offset)2526 offset_to_iterator(const std::vector<Offset_to_lineno_entry>* offsets,
2527                    off_t offset)
2528 {
2529   const Offset_to_lineno_entry lookup_key = { offset, 0, 0, true, 0 };
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:
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
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
2564   // (as is true for some others, most obviously from 3236->5764).
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
2568   //         at the beginning of offsets, we return end() (invalid).
2569   // Case 2: lookup_key has offset 10000.  lower_bound returns
2570   //         offset[21] (end()).  We return end() (invalid).
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
2587   //         functions, so we return end() (not a valid offset).
2588   // Case 7: lookup_key has offset == 5794.  lower_bound returns
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.)
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
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.
2633   for (; it != range_end; ++it)
2634     if (it->line_num != -1)
2635       return it;
2636   return offsets->end();
2637 }
2638 
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.
2642 
2643 template<int size, bool big_endian>
2644 std::string
do_addr2line(unsigned int shndx,off_t offset,std::vector<std::string> * other_lines)2645 Sized_dwarf_line_info<size, big_endian>::do_addr2line(
2646     unsigned int shndx,
2647     off_t offset,
2648     std::vector<std::string>* other_lines)
2649 {
2650   gold_debug(DEBUG_LOCATION, "do_addr2line: shndx %u offset %08x",
2651 	     shndx, static_cast<int>(offset));
2652 
2653   if (this->data_valid_ == false)
2654     return "";
2655 
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())
2665     return "";
2666 
2667   typename std::vector<Offset_to_lineno_entry>::const_iterator it
2668       = offset_to_iterator(offsets, offset);
2669   if (it == offsets->end())
2670     return "";
2671 
2672   std::string result = this->format_file_lineno(*it);
2673   gold_debug(DEBUG_LOCATION, "do_addr2line: canonical result: %s",
2674 	     result.c_str());
2675   if (other_lines != NULL)
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 
2700   return result;
2701 }
2702 
2703 // Convert the file_num + line_num into a string.
2704 
2705 template<int size, bool big_endian>
2706 std::string
format_file_lineno(const Offset_to_lineno_entry & loc) const2707 Sized_dwarf_line_info<size, big_endian>::format_file_lineno(
2708     const Offset_to_lineno_entry& loc) const
2709 {
2710   std::string ret;
2711 
2712   gold_assert(loc.header_num < static_cast<int>(this->files_.size()));
2713   gold_assert(loc.file_num
2714 	      < static_cast<unsigned int>(this->files_[loc.header_num].size()));
2715   const std::pair<int, std::string>& filename_pair
2716       = this->files_[loc.header_num][loc.file_num];
2717   const std::string& filename = filename_pair.second;
2718 
2719   gold_assert(loc.header_num < static_cast<int>(this->directories_.size()));
2720   gold_assert(filename_pair.first
2721               < static_cast<int>(this->directories_[loc.header_num].size()));
2722   const std::string& dirname
2723       = this->directories_[loc.header_num][filename_pair.first];
2724 
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
2735   snprintf(buffer, sizeof(buffer), "%d", loc.line_num);
2736   ret += ":";
2737   ret += buffer;
2738 
2739   return ret;
2740 }
2741 
2742 // Dwarf_line_info routines.
2743 
2744 static unsigned int next_generation_count = 0;
2745 
2746 struct 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 
Addr2line_cache_entrygold::Addr2line_cache_entry2754   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.
2764 static std::vector<Addr2line_cache_entry> addr2line_cache;
2765 
2766 std::string
one_addr2line(Object * object,unsigned int shndx,off_t offset,size_t cache_size,std::vector<std::string> * other_lines)2767 Dwarf_line_info::one_addr2line(Object* object,
2768                                unsigned int shndx, off_t offset,
2769                                size_t cache_size,
2770                                std::vector<std::string>* other_lines)
2771 {
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)
2777     {
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       {
2798 #ifdef HAVE_TARGET_32_LITTLE
2799         case Parameters::TARGET_32_LITTLE:
2800           lineinfo = new Sized_dwarf_line_info<32, false>(object, shndx); break;
2801 #endif
2802 #ifdef HAVE_TARGET_32_BIG
2803         case Parameters::TARGET_32_BIG:
2804           lineinfo = new Sized_dwarf_line_info<32, true>(object, shndx); break;
2805 #endif
2806 #ifdef HAVE_TARGET_64_LITTLE
2807         case Parameters::TARGET_64_LITTLE:
2808           lineinfo = new Sized_dwarf_line_info<64, false>(object, shndx); break;
2809 #endif
2810 #ifdef HAVE_TARGET_64_BIG
2811         case Parameters::TARGET_64_BIG:
2812           lineinfo = new Sized_dwarf_line_info<64, true>(object, shndx); break;
2813 #endif
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
2821   std::string retval = lineinfo->addr2line(shndx, offset, other_lines);
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         }
2846     }
2847 
2848   return retval;
2849 }
2850 
2851 void
clear_addr2line_cache()2852 Dwarf_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();
2859 }
2860 
2861 #ifdef HAVE_TARGET_32_LITTLE
2862 template
2863 class Sized_dwarf_line_info<32, false>;
2864 #endif
2865 
2866 #ifdef HAVE_TARGET_32_BIG
2867 template
2868 class Sized_dwarf_line_info<32, true>;
2869 #endif
2870 
2871 #ifdef HAVE_TARGET_64_LITTLE
2872 template
2873 class Sized_dwarf_line_info<64, false>;
2874 #endif
2875 
2876 #ifdef HAVE_TARGET_64_BIG
2877 template
2878 class Sized_dwarf_line_info<64, true>;
2879 #endif
2880 
2881 } // End namespace gold.
2882