aboutsummaryrefslogtreecommitdiff
path: root/gold/archive.h
diff options
context:
space:
mode:
Diffstat (limited to 'gold/archive.h')
-rw-r--r--gold/archive.h235
1 files changed, 129 insertions, 106 deletions
diff --git a/gold/archive.h b/gold/archive.h
index c5ba114..e428315 100644
--- a/gold/archive.h
+++ b/gold/archive.h
@@ -59,10 +59,105 @@ struct Archive_member
Read_symbols_data* sd_;
};
+// This class serves as a base class for Archive and Lib_group objects.
+
+class Library_base
+{
+ public:
+ Library_base(Task* task)
+ : task_(task), incremental_info_(NULL)
+ { }
+
+ virtual
+ ~Library_base()
+ { }
+
+ // The file name.
+ const std::string&
+ filename() const
+ { return this->do_filename(); }
+
+ // The modification time of the archive file.
+ Timespec
+ get_mtime()
+ { return this->do_get_mtime(); }
+
+ // 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.
+
+ enum Should_include
+ {
+ SHOULD_INCLUDE_NO,
+ SHOULD_INCLUDE_YES,
+ SHOULD_INCLUDE_UNKNOWN
+ };
+
+ static Should_include
+ should_include_member(Symbol_table* symtab, Layout*, const char* sym_name,
+ Symbol** symp, std::string* why, char** tmpbufp,
+ size_t* tmpbuflen);
+
+ // Store a pointer to the incremental link info for the library.
+ void
+ set_incremental_info(Incremental_archive_entry* info)
+ { this->incremental_info_ = info; }
+
+ // Return the pointer to the incremental link info for the library.
+ Incremental_archive_entry*
+ incremental_info() const
+ { return this->incremental_info_; }
+
+ // Abstract base class for processing unused symbols.
+ class Symbol_visitor_base
+ {
+ public:
+ Symbol_visitor_base()
+ { }
+
+ virtual
+ ~Symbol_visitor_base()
+ { }
+
+ // This function will be called for each unused global
+ // symbol in a library, with a pointer to the symbol name.
+ virtual void
+ visit(const char* /* name */) = 0;
+ };
+
+ // Iterator for unused global symbols in the library.
+ // Calls v->visit() for each global symbol defined
+ // in each unused library member, passing a pointer to
+ // the symbol name.
+ void
+ for_all_unused_symbols(Symbol_visitor_base* v) const
+ { this->do_for_all_unused_symbols(v); }
+
+ protected:
+ // The task reading this archive.
+ Task *task_;
+
+ private:
+ // The file name.
+ virtual const std::string&
+ do_filename() const = 0;
+
+ // Return the modification time of the archive file.
+ virtual Timespec
+ do_get_mtime() = 0;
+
+ // Iterator for unused global symbols in the library.
+ virtual void
+ do_for_all_unused_symbols(Symbol_visitor_base* v) const = 0;
+
+ // The incremental link information for this archive.
+ Incremental_archive_entry* incremental_info_;
+};
+
// This class represents an archive--generally a libNAME.a file.
// Archives have a symbol table and a list of objects.
-class Archive
+class Archive : public Library_base
{
public:
Archive(const std::string& name, Input_file* input_file,
@@ -90,11 +185,6 @@ class Archive
input_file() const
{ return this->input_file_; }
- // The file name.
- const std::string&
- filename() const
- { return this->input_file_->filename(); }
-
// Set up the archive: read the symbol map.
void
setup();
@@ -169,99 +259,20 @@ 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.
-
- enum Should_include
- {
- SHOULD_INCLUDE_NO,
- SHOULD_INCLUDE_YES,
- SHOULD_INCLUDE_UNKNOWN
- };
-
- static Should_include
- should_include_member(Symbol_table* symtab, Layout*, const char* sym_name,
- Symbol** symp, std::string* why, char** tmpbufp,
- 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&);
+ // The file name.
+ const std::string&
+ do_filename() const
+ { return this->input_file_->filename(); }
+
+ // The modification time of the archive file.
+ Timespec
+ do_get_mtime()
+ { return this->file().get_mtime(); }
+
struct Archive_header;
// Total number of archives seen.
@@ -339,6 +350,10 @@ class Archive
friend class const_iterator;
+ // Iterator for unused global symbols in the library.
+ void
+ do_for_all_unused_symbols(Symbol_visitor_base* v) const;
+
// An entry in the archive map of symbols to object files.
struct Armap_entry
{
@@ -384,14 +399,10 @@ class Archive
Nested_archive_table nested_archives_;
// The directory search path.
Dirsearch* dirpath_;
- // The task reading this archive.
- Task* task_;
// Number of members in this 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
@@ -451,7 +462,7 @@ class Add_archive_symbols : public Task
// This class represents the files surrounded by a --start-lib ... --end-lib.
-class Lib_group
+class Lib_group : public Library_base
{
public:
Lib_group(const Input_file_lib* lib, Task* task);
@@ -470,10 +481,6 @@ class Lib_group
return &this->members_[i];
}
- // Dump statistical information to stderr.
- static void
- print_stats();
-
// Total number of archives seen.
static unsigned int total_lib_groups;
// Total number of archive members seen.
@@ -481,11 +488,27 @@ class Lib_group
// Number of archive members loaded.
static unsigned int total_members_loaded;
+ // Dump statistical information to stderr.
+ static void
+ print_stats();
+
private:
+ // The file name.
+ const std::string&
+ do_filename() const;
+
+ // A Lib_group does not have a modification time, since there is no
+ // real library file.
+ Timespec
+ do_get_mtime()
+ { return Timespec(0, 0); }
+
+ // Iterator for unused global symbols in the library.
+ void
+ do_for_all_unused_symbols(Symbol_visitor_base*) const;
+
// For reading the files.
const Input_file_lib* lib_;
- // The task reading this lib group.
- Task* task_;
// Table of the objects in the group.
std::vector<Archive_member> members_;
};