summaryrefslogtreecommitdiff
path: root/gold/object.h
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2012-02-29 21:22:29 +0000
committerCary Coutant <ccoutant@google.com>2012-02-29 21:22:29 +0000
commit5dd8762ad1a47548394c76ead1b56fc5dab64628 (patch)
tree54eeb14cc262fb233284909e649157185c6a92d2 /gold/object.h
parent718cb7da5d4c438d89fc9aeac7f535d01d64af42 (diff)
downloadbinutils-gdb-5dd8762ad1a47548394c76ead1b56fc5dab64628.tar.gz
* 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.
Diffstat (limited to 'gold/object.h')
-rw-r--r--gold/object.h62
1 files changed, 58 insertions, 4 deletions
diff --git a/gold/object.h b/gold/object.h
index 48aff5a422a..9d3e1d736a9 100644
--- a/gold/object.h
+++ b/gold/object.h
@@ -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_;
};