* 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:
Cary Coutant
2012-02-29 21:22:29 +00:00
parent 718cb7da5d
commit 5dd8762ad1
7 changed files with 246 additions and 66 deletions

View File

@@ -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_;
};