From b0193076dad64abdb42ed0057ad668eaf3c17c7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20=C3=81vila=20de=20Esp=C3=ADndola?= Date: Mon, 22 Mar 2010 14:18:24 +0000 Subject: 2010-03-22 Rafael Espindola * 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. --- gold/archive.h | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 121 insertions(+), 15 deletions(-) (limited to 'gold/archive.h') 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 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) -- cgit v1.1