2010-03-22 Rafael Espindola <espindola@google.com>
[deliverable/binutils-gdb.git] / gold / options.cc
index c6c8073683aa4be9c202f5b04f759904e5b49592..0eb38ada837b0ac22d3de1be5740b6efb0cf1a10 100644 (file)
@@ -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()
This page took 0.025982 seconds and 4 git commands to generate.