gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / options.cc
index 73a3f67990c62154857cb6147d90cf8388c04002..94867b361a2479dc4bfd752f7e20d1d50dd041ec 100644 (file)
@@ -1,6 +1,6 @@
 // options.c -- handle command line options for gold
 
-// Copyright (C) 2006-2016 Free Software Foundation, Inc.
+// Copyright (C) 2006-2020 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -448,7 +448,6 @@ General_options::parse_library(const char*, const char* arg,
   cmdline->inputs().add_file(file);
 }
 
-#ifdef ENABLE_PLUGINS
 void
 General_options::parse_plugin(const char*, const char* arg,
                              Command_line*)
@@ -464,7 +463,6 @@ General_options::parse_plugin_opt(const char*, const char* arg,
 {
   this->add_plugin_option(arg);
 }
-#endif // ENABLE_PLUGINS
 
 void
 General_options::parse_R(const char* option, const char* arg,
@@ -689,6 +687,20 @@ General_options::string_to_object_format(const char* arg)
     }
 }
 
+const char*
+General_options::object_format_to_string(General_options::Object_format fmt)
+{
+  switch (fmt)
+    {
+    case General_options::OBJECT_FORMAT_ELF:
+      return "elf";
+    case General_options::OBJECT_FORMAT_BINARY:
+      return "binary";
+    default:
+      gold_unreachable();
+    }
+}
+
 void
 General_options::parse_fix_v4bx(const char*, const char*,
                                Command_line*)
@@ -715,6 +727,39 @@ General_options::parse_EL(const char*, const char*, Command_line*)
   this->endianness_ = ENDIANNESS_LITTLE;
 }
 
+void
+General_options::copy_from_posdep_options(
+    const Position_dependent_options& posdep)
+{
+  this->set_as_needed(posdep.as_needed());
+  this->set_Bdynamic(posdep.Bdynamic());
+  this->set_format(
+      General_options::object_format_to_string(posdep.format_enum()));
+  this->set_whole_archive(posdep.whole_archive());
+  this->set_incremental_disposition(posdep.incremental_disposition());
+}
+
+void
+General_options::parse_push_state(const char*, const char*, Command_line*)
+{
+  Position_dependent_options* posdep = new Position_dependent_options(*this);
+  this->options_stack_.push_back(posdep);
+}
+
+void
+General_options::parse_pop_state(const char*, const char*, Command_line*)
+{
+  if (this->options_stack_.empty())
+    {
+      gold::gold_error(_("unbalanced --push-state/--pop-state"));
+      return;
+    }
+  Position_dependent_options* posdep = this->options_stack_.back();
+  this->options_stack_.pop_back();
+  this->copy_from_posdep_options(*posdep);
+  delete posdep;
+}
+
 } // End namespace gold.
 
 namespace
@@ -951,7 +996,8 @@ General_options::General_options()
     section_starts_(),
     fix_v4bx_(FIX_V4BX_NONE),
     endianness_(ENDIANNESS_NOT_SET),
-    discard_locals_(DISCARD_SEC_MERGE)
+    discard_locals_(DISCARD_SEC_MERGE),
+    orphan_handling_enum_(ORPHAN_PLACE)
 {
   // Turn off option registration once construction is complete.
   gold::options::ready_to_register = false;
@@ -1110,6 +1156,19 @@ General_options::finalize()
       this->set_do_demangle(getenv("COLLECT_NO_DEMANGLE") == NULL);
     }
 
+  // Parse the --orphan-handling argument.
+  if (this->user_set_orphan_handling())
+    {
+      if (strcmp(this->orphan_handling(), "place") == 0)
+        this->set_orphan_handling_enum(ORPHAN_PLACE);
+      else if (strcmp(this->orphan_handling(), "discard") == 0)
+        this->set_orphan_handling_enum(ORPHAN_DISCARD);
+      else if (strcmp(this->orphan_handling(), "warn") == 0)
+        this->set_orphan_handling_enum(ORPHAN_WARN);
+      else if (strcmp(this->orphan_handling(), "error") == 0)
+        this->set_orphan_handling_enum(ORPHAN_ERROR);
+    }
+
   // -M is equivalent to "-Map -".
   if (this->print_map() && !this->user_set_Map())
     {
@@ -1147,6 +1206,13 @@ General_options::finalize()
                 program_name);
 #endif
 
+#ifndef ENABLE_PLUGINS
+  if (this->has_plugins())
+    gold_fatal(_("cannot use --plugin: "
+                "%s was compiled without plugin support"),
+              program_name);
+#endif
+
   std::string libpath;
   if (this->user_set_Y())
     {
@@ -1282,6 +1348,8 @@ General_options::finalize()
        gold_fatal(_("incremental linking is not compatible with --plugin"));
       if (this->relro())
        gold_fatal(_("incremental linking is not compatible with -z relro"));
+      if (this->pie())
+       gold_fatal(_("incremental linking is not compatible with -pie"));
       if (this->gc_sections())
        {
          gold_warning(_("ignoring --gc-sections for an incremental link"));
@@ -1508,6 +1576,12 @@ Command_line::process(int argc, const char** argv)
       usage();
     }
 
+  if (this->inputs_.in_lib())
+    {
+      fprintf(stderr, _("%s: missing lib end\n"), program_name);
+      usage();
+    }
+
   // Normalize the options and ensure they don't contradict each other.
   this->options_.finalize();
 }
This page took 0.025923 seconds and 4 git commands to generate.