summaryrefslogtreecommitdiff
path: root/gold/archive.h
diff options
context:
space:
mode:
Diffstat (limited to 'gold/archive.h')
-rw-r--r--gold/archive.h78
1 files changed, 77 insertions, 1 deletions
diff --git a/gold/archive.h b/gold/archive.h
index bff34576ec..9107d1e612 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