diff options
Diffstat (limited to 'gold/options.cc')
-rw-r--r-- | gold/options.cc | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/gold/options.cc b/gold/options.cc index c6c8073683a..0eb38ada837 100644 --- a/gold/options.cc +++ b/gold/options.cc @@ -499,6 +499,20 @@ General_options::parse_end_group(const char*, const char*, cmdline->inputs().end_group(); } +void +General_options::parse_start_lib(const char*, const char*, + Command_line* cmdline) +{ + cmdline->inputs().start_lib(cmdline->position_dependent_options()); +} + +void +General_options::parse_end_lib(const char*, const char*, + Command_line* cmdline) +{ + cmdline->inputs().end_lib(); +} + // The function add_excluded_libs() in ld/ldlang.c of GNU ld breaks up a list // of names seperated by commas or colons and puts them in a linked list. // We implement the same parsing of names here but store names in an unordered @@ -1161,14 +1175,20 @@ Search_directory::add_sysroot(const char* sysroot, void Input_arguments::add_file(const Input_file_argument& file) { - if (!this->in_group_) - this->input_argument_list_.push_back(Input_argument(file)); - else + if (this->in_group_) { gold_assert(!this->input_argument_list_.empty()); gold_assert(this->input_argument_list_.back().is_group()); this->input_argument_list_.back().group()->add_file(file); } + else if (this->in_lib_) + { + gold_assert(!this->input_argument_list_.empty()); + gold_assert(this->input_argument_list_.back().is_lib()); + this->input_argument_list_.back().lib()->add_file(file); + } + else + this->input_argument_list_.push_back(Input_argument(file)); } // Start a group. @@ -1178,6 +1198,8 @@ Input_arguments::start_group() { if (this->in_group_) gold_fatal(_("May not nest groups")); + if (this->in_lib_) + gold_fatal(_("may not nest groups in libraries")); Input_file_group* group = new Input_file_group(); this->input_argument_list_.push_back(Input_argument(group)); this->in_group_ = true; @@ -1193,6 +1215,30 @@ Input_arguments::end_group() this->in_group_ = false; } +// Start a lib. + +void +Input_arguments::start_lib(const Position_dependent_options& options) +{ + if (this->in_lib_) + gold_fatal(_("may not nest libraries")); + if (this->in_group_) + gold_fatal(_("may not nest libraries in groups")); + Input_file_lib* lib = new Input_file_lib(options); + this->input_argument_list_.push_back(Input_argument(lib)); + this->in_lib_ = true; +} + +// End a lib. + +void +Input_arguments::end_lib() +{ + if (!this->in_lib_) + gold_fatal(_("lib end without lib start")); + this->in_lib_ = false; +} + // Command_line options. Command_line::Command_line() |