aboutsummaryrefslogtreecommitdiff
path: root/gold/options.h
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2010-03-22 14:18:24 +0000
committerRafael Ávila de Espíndola <respindola@mozilla.com>2010-03-22 14:18:24 +0000
commitb0193076dad64abdb42ed0057ad668eaf3c17c7a (patch)
tree52ff18d9073b353700e411c07b9cf8ad4f7c50f5 /gold/options.h
parentcff8d58ab4a99c8fdcc1572227f9957064b1aaa0 (diff)
downloadbinutils-b0193076dad64abdb42ed0057ad668eaf3c17c7a.zip
binutils-b0193076dad64abdb42ed0057ad668eaf3c17c7a.tar.gz
binutils-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/options.h')
-rw-r--r--gold/options.h97
1 files changed, 93 insertions, 4 deletions
diff --git a/gold/options.h b/gold/options.h
index b725b04..3a234d0 100644
--- a/gold/options.h
+++ b/gold/options.h
@@ -53,6 +53,7 @@ class Command_line;
class General_options;
class Search_directory;
class Input_file_group;
+class Input_file_lib;
class Position_dependent_options;
class Target;
class Plugin_manager;
@@ -1033,6 +1034,12 @@ class General_options
DEFINE_special(end_group, options::TWO_DASHES, ')',
N_("End a library search group"), NULL);
+
+ DEFINE_special(start_lib, options::TWO_DASHES, '\0',
+ N_("Start a library"), NULL);
+ DEFINE_special(end_lib, options::TWO_DASHES, '\0',
+ N_("End a library "), NULL);
+
// The -z options.
DEFINE_bool(combreloc, options::DASH_Z, '\0', true,
@@ -1500,12 +1507,17 @@ class Input_argument
public:
// Create a file or library argument.
explicit Input_argument(Input_file_argument file)
- : is_file_(true), file_(file), group_(NULL)
+ : is_file_(true), file_(file), group_(NULL), lib_(NULL)
{ }
// Create a group argument.
explicit Input_argument(Input_file_group* group)
- : is_file_(false), group_(group)
+ : is_file_(false), group_(group), lib_(NULL)
+ { }
+
+ // Create a lib argument.
+ explicit Input_argument(Input_file_lib* lib)
+ : is_file_(false), group_(NULL), lib_(lib)
{ }
// Return whether this is a file.
@@ -1516,7 +1528,12 @@ class Input_argument
// Return whether this is a group.
bool
is_group() const
- { return !this->is_file_; }
+ { return !this->is_file_ && this->lib_ == NULL; }
+
+ // Return whether this is a lib.
+ bool
+ is_lib() const
+ { return this->lib_ != NULL; }
// Return the information about the file.
const Input_file_argument&
@@ -1541,10 +1558,28 @@ class Input_argument
return this->group_;
}
+ // Return the information about the lib.
+ const Input_file_lib*
+ lib() const
+ {
+ gold_assert(!this->is_file_);
+ gold_assert(this->lib_);
+ return this->lib_;
+ }
+
+ Input_file_lib*
+ lib()
+ {
+ gold_assert(!this->is_file_);
+ gold_assert(this->lib_);
+ return this->lib_;
+ }
+
private:
bool is_file_;
Input_file_argument file_;
Input_file_group* group_;
+ Input_file_lib* lib_;
};
typedef std::vector<Input_argument> Input_argument_list;
@@ -1580,6 +1615,46 @@ class Input_file_group
Input_argument_list files_;
};
+// A lib from the command line. This is a set of arguments within
+// --start-lib ... --end-lib.
+
+class Input_file_lib
+{
+ public:
+ typedef Input_argument_list::const_iterator const_iterator;
+
+ Input_file_lib(const Position_dependent_options& options)
+ : files_(), options_(options)
+ { }
+
+ // Add a file to the end of the lib.
+ void
+ add_file(const Input_file_argument& arg)
+ { this->files_.push_back(Input_argument(arg)); }
+
+ const Position_dependent_options&
+ options() const
+ { return this->options_; }
+
+ // Iterators to iterate over the lib contents.
+
+ const_iterator
+ begin() const
+ { return this->files_.begin(); }
+
+ const_iterator
+ end() const
+ { return this->files_.end(); }
+
+ size_t
+ size() const
+ { return this->files_.size(); }
+
+ private:
+ Input_argument_list files_;
+ Position_dependent_options options_;
+};
+
// A list of files from the command line or a script.
class Input_arguments
@@ -1588,7 +1663,7 @@ class Input_arguments
typedef Input_argument_list::const_iterator const_iterator;
Input_arguments()
- : input_argument_list_(), in_group_(false)
+ : input_argument_list_(), in_group_(false), in_lib_(false)
{ }
// Add a file.
@@ -1603,11 +1678,24 @@ class Input_arguments
void
end_group();
+ // Start a lib (the --start-lib option).
+ void
+ start_lib(const Position_dependent_options&);
+
+ // End a lib (the --end-lib option).
+ void
+ end_lib();
+
// Return whether we are currently in a group.
bool
in_group() const
{ return this->in_group_; }
+ // Return whether we are currently in a lib.
+ bool
+ in_lib() const
+ { return this->in_lib_; }
+
// The number of entries in the list.
int
size() const
@@ -1631,6 +1719,7 @@ class Input_arguments
private:
Input_argument_list input_argument_list_;
bool in_group_;
+ bool in_lib_;
};