diff options
author | Rafael Ávila de Espíndola <respindola@mozilla.com> | 2010-03-22 14:18:24 +0000 |
---|---|---|
committer | Rafael Ávila de Espíndola <respindola@mozilla.com> | 2010-03-22 14:18:24 +0000 |
commit | b0193076dad64abdb42ed0057ad668eaf3c17c7a (patch) | |
tree | 52ff18d9073b353700e411c07b9cf8ad4f7c50f5 /gold/archive.h | |
parent | cff8d58ab4a99c8fdcc1572227f9957064b1aaa0 (diff) | |
download | fsf-binutils-gdb-b0193076dad64abdb42ed0057ad668eaf3c17c7a.zip fsf-binutils-gdb-b0193076dad64abdb42ed0057ad668eaf3c17c7a.tar.gz fsf-binutils-gdb-b0193076dad64abdb42ed0057ad668eaf3c17c7a.tar.bz2 |
2010-03-22 Rafael Espindola <espindola@google.com>
* archive.cc (Should_include): Move to archive.h.
(should_include_member): Make it a member of Archive.
(Lib_group): New.
(Add_lib_group_symbols): New.
* archive.h: Include options.h.
(Archive_member): Moved from Archive.
(Should_include): Moved from archive.cc.
(Lib_group): New.
(Add_lib_group_symbols): New.
* dynobj.cc (do_should_include_member): New.
* dynobj.h (do_should_include_member): New.
* gold.cc (queue_initial_tasks): Update call to queue.
* main.cc (main): Print lib group stats.
* object.cc (do_should_include_member): New.
* object.h: Include archive.h.
(Object::should_include_member): New.
(Object::do_should_include_member): New.
(Sized_relobj::do_should_include_member): New.
* options.cc (General_options::parse_start_lib): New.
(General_options::parse_end_lib): New.
(Input_arguments::add_file): Handle lib groups.
(Input_arguments::start_group): Check we are not in a lib.
(Input_arguments::start_lib): New.
(Input_arguments::end_lib): New.
* options.h (General_options): Add start_lib and end_lib.
(Input_argument::lib_): New.
(Input_argument::lib): New.
(Input_argument::is_lib): New.
(Input_file_lib): New.
(Input_arguments::in_lib_): New.
(Input_arguments::in_lib): New.
(Input_arguments::start_lib): New.
(Input_arguments::end_lib_): New.
* plugin.cc (Pluginobj::get_symbol_resolution_info): Mark symbols
in unused members as preempted.
(Sized_pluginobj::do_should_include_member): New.
* plugin.h (Sized_pluginobj::do_should_include_member): New.
* readsyms.cc (Read_symbols::locks): If we are just reading a member,
return the blocker.
(Read_symbols::do_whole_lib_group): New.
(Read_symbols::do_lib_group): New.
(Read_symbols::do_read_symbols): Handle lib groups.
(Read_symbols::get_name): Handle lib groups.
* readsyms.h (Read_symbols): Add an archive member pointer.
(Read_symbols::do_whole_lib_group): New.
(Read_symbols::do_lib_group): New.
(Read_symbols::member_): New.
* script.cc (read_input_script): Update call to queue_soon.
Diffstat (limited to 'gold/archive.h')
-rw-r--r-- | gold/archive.h | 136 |
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) |