X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gold%2Fdwarf_reader.h;h=3afc6e2409dff74a24f6af2e14cc5096f496fda1;hb=ec673e648cf7b2fa6a03342b0bca3ed3855f002f;hp=13d278a8e241015cfe3d3e5765ea125c26a47f09;hpb=d5834edbc87adeb263abe8e1df77e87f265b2e2c;p=external%2Fbinutils.git diff --git a/gold/dwarf_reader.h b/gold/dwarf_reader.h index 13d278a..3afc6e2 100644 --- a/gold/dwarf_reader.h +++ b/gold/dwarf_reader.h @@ -1,6 +1,7 @@ // dwarf_reader.h -- parse dwarf2/3 debug information for gold -*- C++ -*- -// Copyright 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +// Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2013 +// Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -338,7 +339,7 @@ class Dwarf_ranges_table Dwarf_ranges_table(Dwarf_info_reader* dwinfo) : dwinfo_(dwinfo), ranges_shndx_(0), ranges_buffer_(NULL), ranges_buffer_end_(NULL), owns_ranges_buffer_(false), - ranges_reloc_mapper_(NULL), output_section_offset_(0) + ranges_reloc_mapper_(NULL), reloc_type_(0), output_section_offset_(0) { } ~Dwarf_ranges_table() @@ -365,6 +366,11 @@ class Dwarf_ranges_table unsigned int ranges_shndx, off_t ranges_offset); + // Look for a relocation at offset OFF in the range table, + // and return the section index and offset of the target. + unsigned int + lookup_reloc(off_t off, off_t* target_off); + private: // The Dwarf_info_reader, for reading data. Dwarf_info_reader* dwinfo_; @@ -377,6 +383,8 @@ class Dwarf_ranges_table bool owns_ranges_buffer_; // Relocation mapper for the .debug_ranges section. Elf_reloc_mapper* ranges_reloc_mapper_; + // Type of the relocation section (SHT_REL or SHT_RELA). + unsigned int reloc_type_; // For incremental update links, this will hold the offset of the // input section within the output section. Offsets read from // relocated data will be relative to the output section, and need @@ -392,8 +400,9 @@ class Dwarf_pubnames_table public: Dwarf_pubnames_table(Dwarf_info_reader* dwinfo, bool is_pubtypes) : dwinfo_(dwinfo), buffer_(NULL), buffer_end_(NULL), owns_buffer_(false), - offset_size_(0), pinfo_(NULL), is_pubtypes_(is_pubtypes), - output_section_offset_(0) + offset_size_(0), pinfo_(NULL), end_of_table_(NULL), + is_pubtypes_(is_pubtypes), is_gnu_style_(false), + output_section_offset_(0), unit_length_(0), cu_offset_(0) { } ~Dwarf_pubnames_table() @@ -402,17 +411,31 @@ class Dwarf_pubnames_table delete[] this->buffer_; } - // Read the pubnames section SHNDX from the object file. + // Read the pubnames section from the object file, using the symbol + // table for relocating it. bool - read_section(Relobj* object, unsigned int shndx); + read_section(Relobj* object, const unsigned char* symbol_table, + off_t symtab_size); // Read the header for the set at OFFSET. bool read_header(off_t offset); - // Read the next name from the set. + // Return the offset to the cu within the info or types section. + off_t + cu_offset() + { return this->cu_offset_; } + + // Return the size of this subsection of the table. The unit length + // doesn't include the size of its own field. + off_t + subsection_size() + { return this->unit_length_; } + + // Read the next name from the set. If the pubname table is gnu-style, + // FLAG_BYTE is set to the high-byte of a gdb_index version 7 cu_index. const char* - next_name(); + next_name(uint8_t* flag_byte); private: // The Dwarf_info_reader, for reading data. @@ -426,13 +449,27 @@ class Dwarf_pubnames_table unsigned int offset_size_; // The current position within the buffer. const unsigned char* pinfo_; + // The end of the current pubnames table. + const unsigned char* end_of_table_; // TRUE if this is a .debug_pubtypes section. bool is_pubtypes_; + // Gnu-style pubnames table. This style has an extra flag byte between the + // offset and the name, and is used for generating version 7 of gdb-index. + bool is_gnu_style_; // For incremental update links, this will hold the offset of the // input section within the output section. Offsets read from // relocated data will be relative to the output section, and need // to be corrected before reading data from the input section. uint64_t output_section_offset_; + // Fields read from the header. + uint64_t unit_length_; + off_t cu_offset_; + + // Track relocations for this table so we can find the CUs that + // correspond to the subsections. + Elf_reloc_mapper* reloc_mapper_; + // Type of the relocation section (SHT_REL or SHT_RELA). + unsigned int reloc_type_; }; // This class represents a DWARF Debug Info Entry (DIE). @@ -668,8 +705,8 @@ class Dwarf_info_reader symtab_size_(symtab_size), shndx_(shndx), reloc_shndx_(reloc_shndx), reloc_type_(reloc_type), abbrev_shndx_(0), string_shndx_(0), buffer_(NULL), buffer_end_(NULL), cu_offset_(0), cu_length_(0), - offset_size_(0), address_size_(0), cu_version_(0), type_signature_(0), - type_offset_(0), abbrev_table_(), ranges_table_(this), + offset_size_(0), address_size_(0), cu_version_(0), + abbrev_table_(), ranges_table_(this), reloc_mapper_(NULL), string_buffer_(NULL), string_buffer_end_(NULL), owns_string_buffer_(false), string_output_section_offset_(0) { } @@ -740,6 +777,21 @@ class Dwarf_info_reader set_abbrev_shndx(unsigned int abbrev_shndx) { this->abbrev_shndx_ = abbrev_shndx; } + // Return a pointer to the object file's ELF symbol table. + const unsigned char* + symtab() const + { return this->symtab_; } + + // Return the size of the object file's ELF symbol table. + off_t + symtab_size() const + { return this->symtab_size_; } + + // Return the offset of the current compilation unit. + off_t + cu_offset() const + { return this->cu_offset_; } + protected: // Begin parsing the debug info. This calls visit_compilation_unit() // or visit_type_unit() for each compilation or type unit found in the @@ -778,16 +830,6 @@ class Dwarf_info_reader object() const { return this->object_; } - // Return a pointer to the object file's ELF symbol table. - const unsigned char* - symtab() const - { return this->symtab_; } - - // Return the size of the object file's ELF symbol table. - off_t - symtab_size() const - { return this->symtab_size_; } - // Checkpoint the relocation tracker. uint64_t get_reloc_checkpoint() const @@ -861,10 +903,6 @@ class Dwarf_info_reader unsigned int address_size_; // Compilation unit version number. unsigned int cu_version_; - // Type signature (for a type unit). - uint64_t type_signature_; - // Offset from the type unit header to the type DIE (for a type unit). - off_t type_offset_; // Abbreviations table for current compilation unit. Dwarf_abbrev_table abbrev_table_; // Ranges table for the current compilation unit.