forked from Imagelibrary/binutils-gdb
* dwarf_reader.cc (Sized_dwarf_line_info::Sized_dwarf_line_info):
Call Object::decompressed_section_contents. * dwarf_reader.h (Sized_dwarf_line_info::~Sized_dwarf_line_info): New dtor. (Sized_dwarf_line_info::buffer_start_): New data member. * merge.cc (Output_merge_data::do_add_input_section): Call Object::decompressed_section_contents. (Output_merge_string::do_add_input_section): Likewise. * object.cc (need_decompressed_section): New function. (build_compressed_section_map): Decompress sections needed later. (Sized_relobj_file::do_decompressed_section_contents): New function. (Sized_relobj_file::do_discard_decompressed_sections): New function. * object.h (Object::decompressed_section_contents): New function. (Object::discard_decompressed_sections): New function. (Object::do_decompressed_section_contents): New function. (Object::do_discard_decompressed_sections): New function. (Compressed_section_info): New type. (Compressed_section_map): Include decompressed section contents. (Sized_relobj_file::do_decompressed_section_contents): New function. (Sized_relobj_file::do_discard_decompressed_sections): New function.
This commit is contained in:
@@ -725,6 +725,20 @@ class Object
|
||||
section_size_type* uncompressed_size) const
|
||||
{ return this->do_section_is_compressed(shndx, uncompressed_size); }
|
||||
|
||||
// Return a view of the uncompressed contents of a section. Set *PLEN
|
||||
// to the size. Set *IS_NEW to true if the contents need to be freed
|
||||
// by the caller.
|
||||
const unsigned char*
|
||||
decompressed_section_contents(unsigned int shndx, section_size_type* plen,
|
||||
bool* is_cached)
|
||||
{ return this->do_decompressed_section_contents(shndx, plen, is_cached); }
|
||||
|
||||
// Discard any buffers of decompressed sections. This is done
|
||||
// at the end of the Add_symbols task.
|
||||
void
|
||||
discard_decompressed_sections()
|
||||
{ this->do_discard_decompressed_sections(); }
|
||||
|
||||
// Return the index of the first incremental relocation for symbol SYMNDX.
|
||||
unsigned int
|
||||
get_incremental_reloc_base(unsigned int symndx) const
|
||||
@@ -892,6 +906,27 @@ class Object
|
||||
do_section_is_compressed(unsigned int, section_size_type*) const
|
||||
{ return false; }
|
||||
|
||||
// Return a view of the decompressed contents of a section. Set *PLEN
|
||||
// to the size. This default implementation simply returns the
|
||||
// raw section contents and sets *IS_NEW to false to indicate
|
||||
// that the contents do not need to be freed by the caller.
|
||||
// This function must be overridden for any types of object files
|
||||
// that might contain compressed sections.
|
||||
virtual const unsigned char*
|
||||
do_decompressed_section_contents(unsigned int shndx,
|
||||
section_size_type* plen,
|
||||
bool* is_new)
|
||||
{
|
||||
*is_new = false;
|
||||
return this->section_contents(shndx, plen, false);
|
||||
}
|
||||
|
||||
// Discard any buffers of decompressed sections. This is done
|
||||
// at the end of the Add_symbols task.
|
||||
virtual void
|
||||
do_discard_decompressed_sections()
|
||||
{ }
|
||||
|
||||
// Return the index of the first incremental relocation for symbol SYMNDX--
|
||||
// implemented by child class.
|
||||
virtual unsigned int
|
||||
@@ -1775,9 +1810,14 @@ class Reloc_symbol_changes
|
||||
std::vector<Symbol*> vec_;
|
||||
};
|
||||
|
||||
// Type for mapping section index to uncompressed size.
|
||||
// Type for mapping section index to uncompressed size and contents.
|
||||
|
||||
typedef std::map<unsigned int, section_size_type> Compressed_section_map;
|
||||
struct Compressed_section_info
|
||||
{
|
||||
section_size_type size;
|
||||
const unsigned char* contents;
|
||||
};
|
||||
typedef std::map<unsigned int, Compressed_section_info> Compressed_section_map;
|
||||
|
||||
// Abstract base class for a regular object file, either a real object file
|
||||
// or an incremental (unchanged) object. This is size and endian specific.
|
||||
@@ -2319,12 +2359,25 @@ class Sized_relobj_file : public Sized_relobj<size, big_endian>
|
||||
if (p != this->compressed_sections_->end())
|
||||
{
|
||||
if (uncompressed_size != NULL)
|
||||
*uncompressed_size = p->second;
|
||||
*uncompressed_size = p->second.size;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Return a view of the uncompressed contents of a section. Set *PLEN
|
||||
// to the size. Set *IS_NEW to true if the contents need to be deleted
|
||||
// by the caller.
|
||||
const unsigned char*
|
||||
do_decompressed_section_contents(unsigned int shndx,
|
||||
section_size_type* plen,
|
||||
bool* is_new);
|
||||
|
||||
// Discard any buffers of uncompressed sections. This is done
|
||||
// at the end of the Add_symbols task.
|
||||
void
|
||||
do_discard_decompressed_sections();
|
||||
|
||||
private:
|
||||
// For convenience.
|
||||
typedef Sized_relobj_file<size, big_endian> This;
|
||||
@@ -2609,7 +2662,8 @@ class Sized_relobj_file : public Sized_relobj<size, big_endian>
|
||||
std::vector<Deferred_layout> deferred_layout_;
|
||||
// The list of relocation sections whose layout was deferred.
|
||||
std::vector<Deferred_layout> deferred_layout_relocs_;
|
||||
// For compressed debug sections, map section index to uncompressed size.
|
||||
// For compressed debug sections, map section index to uncompressed size
|
||||
// and contents.
|
||||
Compressed_section_map* compressed_sections_;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user