diff options
Diffstat (limited to 'binutils-2.25/gold/object.h')
-rw-r--r-- | binutils-2.25/gold/object.h | 118 |
1 files changed, 44 insertions, 74 deletions
diff --git a/binutils-2.25/gold/object.h b/binutils-2.25/gold/object.h index cce6c8c2..7fa2ad73 100644 --- a/binutils-2.25/gold/object.h +++ b/binutils-2.25/gold/object.h @@ -1,6 +1,6 @@ // object.h -- support for an object file for linking in gold -*- C++ -*- -// Copyright (C) 2006-2015 Free Software Foundation, Inc. +// Copyright (C) 2006-2014 Free Software Foundation, Inc. // Written by Ian Lance Taylor <iant@google.com>. // This file is part of gold. @@ -314,6 +314,21 @@ class Got_offset_list Got_offset_list* got_next_; }; +// Type for mapping section index to uncompressed size and contents. + +struct Compressed_section_info +{ + section_size_type size; + const unsigned char* contents; +}; +typedef std::map<unsigned int, Compressed_section_info> Compressed_section_map; + +template<int size, bool big_endian> +Compressed_section_map* +build_compressed_section_map(const unsigned char* pshdrs, unsigned int shnum, + const char* names, section_size_type names_size, + Object* obj, bool decompress_if_needed); + // Object is an abstract base class which represents either a 32-bit // or a 64-bit input object. This can be a regular object file // (ET_REL) or a shared object (ET_DYN). @@ -332,7 +347,8 @@ class Object : name_(name), input_file_(input_file), offset_(offset), shnum_(-1U), is_dynamic_(is_dynamic), is_needed_(false), uses_split_stack_(false), has_no_split_stack_(false), no_export_(false), - is_in_system_directory_(false), as_needed_(false), xindex_(NULL) + is_in_system_directory_(false), as_needed_(false), xindex_(NULL), + compressed_sections_(NULL) { if (input_file != NULL) { @@ -725,26 +741,34 @@ class Object set_no_export(bool value) { this->no_export_ = value; } - // Return TRUE if the section is a compressed debug section, and set - // *UNCOMPRESSED_SIZE to the size of the uncompressed data. bool section_is_compressed(unsigned int shndx, section_size_type* uncompressed_size) const - { return this->do_section_is_compressed(shndx, uncompressed_size); } + { + if (this->compressed_sections_ == NULL) + return false; + Compressed_section_map::const_iterator p = + this->compressed_sections_->find(shndx); + if (p != this->compressed_sections_->end()) + { + if (uncompressed_size != NULL) + *uncompressed_size = p->second.size; + return true; + } + return false; + } // Return a view of the decompressed 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); } + bool* 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(); } + discard_decompressed_sections(); // Return the index of the first incremental relocation for symbol SYMNDX. unsigned int @@ -923,27 +947,6 @@ class Object bool handle_split_stack_section(const char* name); - // Return TRUE if the section is a compressed debug section, and set - // *UNCOMPRESSED_SIZE to the size of the uncompressed data. - virtual bool - 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->do_section_contents(shndx, plen, false); - } - // Discard any buffers of decompressed sections. This is done // at the end of the Add_symbols task. virtual void @@ -962,6 +965,14 @@ class Object do_get_incremental_reloc_count(unsigned int) const { gold_unreachable(); } + void + set_compressed_sections(Compressed_section_map* compressed_sections) + { this->compressed_sections_ = compressed_sections; } + + Compressed_section_map* + compressed_sections() + { return this->compressed_sections_; } + private: // This class may not be copied. Object(const Object&); @@ -996,6 +1007,9 @@ class Object bool as_needed_ : 1; // Many sections for objects with more than SHN_LORESERVE sections. Xindex* xindex_; + // For compressed debug sections, map section index to uncompressed size + // and contents. + Compressed_section_map* compressed_sections_; }; // A regular object (ET_REL). This is an abstract base class itself. @@ -1862,15 +1876,6 @@ class Reloc_symbol_changes std::vector<Symbol*> vec_; }; -// Type for mapping section index to uncompressed size and contents. - -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. @@ -2453,38 +2458,6 @@ class Sized_relobj_file : public Sized_relobj<size, big_endian> set_output_local_symbol_count(unsigned int value) { this->output_local_symbol_count_ = value; } - // Return TRUE if the section is a compressed debug section, and set - // *UNCOMPRESSED_SIZE to the size of the uncompressed data. - bool - do_section_is_compressed(unsigned int shndx, - section_size_type* uncompressed_size) const - { - if (this->compressed_sections_ == NULL) - return false; - Compressed_section_map::const_iterator p = - this->compressed_sections_->find(shndx); - if (p != this->compressed_sections_->end()) - { - if (uncompressed_size != NULL) - *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 decompressed 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; @@ -2751,9 +2724,6 @@ 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 - // and contents. - Compressed_section_map* compressed_sections_; }; // A class to manage the list of all objects. |