aboutsummaryrefslogtreecommitdiff
path: root/gold/archive.h
diff options
context:
space:
mode:
Diffstat (limited to 'gold/archive.h')
-rw-r--r--gold/archive.h136
1 files changed, 121 insertions, 15 deletions
diff --git a/gold/archive.h b/gold/archive.h
index 7f567b7..a2d2af4 100644
--- a/gold/archive.h
+++ b/gold/archive.h
@@ -41,6 +41,22 @@ class Layout;
class Symbol_table;
class Object;
class Read_symbols_data;
+class Input_file_lib;
+
+// An entry in the archive map of offsets to members.
+struct Archive_member
+{
+ Archive_member()
+ : obj_(NULL), sd_(NULL)
+ { }
+ Archive_member(Object* obj, Read_symbols_data* sd)
+ : obj_(obj), sd_(sd)
+ { }
+ // The object file.
+ Object* obj_;
+ // The data to pass from read_symbols() to add_symbols().
+ Read_symbols_data* sd_;
+};
// This class represents an archive--generally a libNAME.a file.
// Archives have a symbol table and a list of objects.
@@ -148,6 +164,22 @@ class Archive
no_export()
{ return this->no_export_; }
+ // 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, const char* sym_name,
+ Symbol** symp, std::string* why, char** tmpbufp,
+ size_t* tmpbuflen);
+
private:
Archive(const Archive&);
Archive& operator=(const Archive&);
@@ -238,21 +270,6 @@ class Archive
off_t file_offset;
};
- // An entry in the archive map of offsets to members.
- struct Archive_member
- {
- Archive_member()
- : obj_(NULL), sd_(NULL)
- { }
- Archive_member(Object* obj, Read_symbols_data* sd)
- : obj_(obj), sd_(sd)
- { }
- // The object file.
- Object* obj_;
- // The data to pass from read_symbols() to add_symbols().
- Read_symbols_data* sd_;
- };
-
// A simple hash code for off_t values.
class Seen_hash
{
@@ -352,6 +369,95 @@ class Add_archive_symbols : public Task
Task_token* next_blocker_;
};
+// This class represents the files surrunded by a --start-lib ... --end-lib.
+
+class Lib_group
+{
+ public:
+ Lib_group(const Input_file_lib* lib, Task* task);
+
+ // Select members from the lib group as needed and add them to the link.
+ void
+ add_symbols(Symbol_table*, Layout*, Input_objects*);
+
+ // Include a member of the lib group in the link.
+ void
+ include_member(Symbol_table*, Layout*, Input_objects*, const Archive_member&);
+
+ Archive_member*
+ get_member(int i)
+ {
+ 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.
+ static unsigned int total_members;
+ // Number of archive members loaded.
+ static unsigned int total_members_loaded;
+
+ private:
+ // 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_;
+};
+
+// This class is used to pick out the desired elements and add them to the link.
+
+class Add_lib_group_symbols : public Task
+{
+ public:
+ Add_lib_group_symbols(Symbol_table* symtab, Layout* layout,
+ Input_objects* input_objects,
+ Lib_group* lib, Task_token* next_blocker)
+ : symtab_(symtab), layout_(layout), input_objects_(input_objects),
+ lib_(lib), this_blocker_(NULL), next_blocker_(next_blocker)
+ { }
+
+ ~Add_lib_group_symbols();
+
+ // The standard Task methods.
+
+ Task_token*
+ is_runnable();
+
+ void
+ locks(Task_locker*);
+
+ void
+ run(Workqueue*);
+
+ // Set the blocker to use for this task.
+ void
+ set_blocker(Task_token* this_blocker)
+ {
+ gold_assert(this->this_blocker_ == NULL);
+ this->this_blocker_ = this_blocker;
+ }
+
+ std::string
+ get_name() const
+ {
+ return "Add_lib_group_symbols";
+ }
+
+ private:
+ Symbol_table* symtab_;
+ Layout* layout_;
+ Input_objects* input_objects_;
+ Lib_group * lib_;
+ Task_token* this_blocker_;
+ Task_token* next_blocker_;
+};
+
} // End namespace gold.
#endif // !defined(GOLD_ARCHIVE_H)