diff options
Diffstat (limited to 'gold/archive.h')
-rw-r--r-- | gold/archive.h | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/gold/archive.h b/gold/archive.h index bff3457..9107d1e 100644 --- a/gold/archive.h +++ b/gold/archive.h @@ -1,6 +1,6 @@ // archive.h -- archive support for gold -*- C++ -*- -// Copyright 2006, 2007, 2008 Free Software Foundation, Inc. +// Copyright 2006, 2007, 2008, 2010 Free Software Foundation, Inc. // Written by Ian Lance Taylor <iant@google.com>. // This file is part of gold. @@ -42,6 +42,7 @@ class Symbol_table; class Object; class Read_symbols_data; class Input_file_lib; +class Incremental_archive_entry; // An entry in the archive map of offsets to members. struct Archive_member @@ -164,6 +165,16 @@ class Archive no_export() { return this->no_export_; } + // Store a pointer to the incremental link info for the archive. + void + set_incremental_info(Incremental_archive_entry* info) + { this->incremental_info_ = info; } + + // Return the pointer to the incremental link info for the archive. + Incremental_archive_entry* + incremental_info() const + { return this->incremental_info_; } + // When we see a symbol in an archive we might decide to include the member, // not include the member or be undecided. This enum represents these // possibilities. @@ -181,6 +192,69 @@ class Archive size_t* tmpbuflen); private: + struct Armap_entry; + + public: + // Iterator class for unused global symbols. This iterator is used + // for incremental links. + + class Unused_symbol_iterator + { + public: + Unused_symbol_iterator(Archive* arch, + std::vector<Armap_entry>::const_iterator it) + : arch_(arch), it_(it) + { this->skip_used_symbols(); } + + const char* + operator*() const + { return this->arch_->armap_names_.data() + this->it_->name_offset; } + + Unused_symbol_iterator& + operator++() + { + ++this->it_; + this->skip_used_symbols(); + return *this; + } + + bool + operator==(const Unused_symbol_iterator p) const + { return this->it_ == p.it_; } + + bool + operator!=(const Unused_symbol_iterator p) const + { return this->it_ != p.it_; } + + private: + // Skip over symbols defined by members that have been included. + void + skip_used_symbols() + { + while (this->it_ != this->arch_->armap_.end() + && (this->arch_->seen_offsets_.find(this->it_->file_offset) + != this->arch_->seen_offsets_.end())) + ++it_; + } + + // The underlying archive. + Archive* arch_; + + // The underlying iterator over all entries in the archive map. + std::vector<Armap_entry>::const_iterator it_; + }; + + // Return an iterator referring to the first unused symbol. + Unused_symbol_iterator + unused_symbols_begin() + { return Unused_symbol_iterator(this, this->armap_.begin()); } + + // Return an iterator referring to the end of the unused symbols. + Unused_symbol_iterator + unused_symbols_end() + { return Unused_symbol_iterator(this, this->armap_.end()); } + + private: Archive(const Archive&); Archive& operator=(const Archive&); @@ -312,6 +386,8 @@ class Archive unsigned int num_members_; // True if we exclude this library archive from automatic export. bool no_export_; + // The incremental link information for this archive. + Incremental_archive_entry* incremental_info_; }; // This class is used to read an archive and pick out the desired |