gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / parameters.cc
index 194c81bd389ceb8ad81cbac70240c82ba39facdd..d677044a079dbbde43a9dd90ad52d5557a6ff5e0 100644 (file)
@@ -1,6 +1,6 @@
 // parameters.cc -- general parameters for a link using gold
 
-// Copyright 2006, 2007, 2008, 2009, 2010 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.
@@ -64,7 +64,7 @@ Set_parameters_target_once set_parameters_target_once(&static_parameters);
 // Class Parameters.
 
 Parameters::Parameters()
-   : errors_(NULL), options_(NULL), target_(NULL),
+   : errors_(NULL), timer_(NULL), options_(NULL), target_(NULL),
      doing_static_link_valid_(false), doing_static_link_(false),
      debug_(0), incremental_mode_(General_options::INCREMENTAL_OFF),
      set_parameters_target_once_(&set_parameters_target_once)
@@ -78,6 +78,13 @@ Parameters::set_errors(Errors* errors)
   this->errors_ = errors;
 }
 
+void
+Parameters::set_timer(Timer* timer)
+{
+  gold_assert(this->timer_ == NULL);
+  this->timer_ = timer;
+}
+
 void
 Parameters::set_options(const General_options* options)
 {
@@ -118,8 +125,12 @@ Parameters::set_target_once(Target* target)
 {
   gold_assert(this->target_ == NULL);
   this->target_ = target;
+  target->select_as_default_target();
   if (this->options_valid())
-    this->check_target_endianness();
+    {
+      this->check_target_endianness();
+      this->check_rodata_segment();
+    }
 }
 
 // Clear the target, for testing.
@@ -205,23 +216,29 @@ Parameters::check_target_endianness()
          gold_assert(endianness == General_options::ENDIANNESS_LITTLE);
          big_endian = false;;
        }
-      
+
       if (this->target().is_big_endian() != big_endian)
        gold_error(_("input file does not match -EB/EL option"));
     }
 }
 
+void
+Parameters::check_rodata_segment()
+{
+  if (this->options().user_set_Trodata_segment()
+      && !this->options().rosegment()
+      && !this->target().isolate_execinstr())
+    gold_error(_("-Trodata-segment is meaningless without --rosegment"));
+}
+
 // Return the name of the entry symbol.
 
 const char*
 Parameters::entry() const
 {
   const char* ret = this->options().entry();
-  if (ret == NULL)
-    {
-      // FIXME: Need to support target specific entry symbol.
-      ret = "_start";
-    }
+  if (ret == NULL && parameters->target_valid())
+    ret = parameters->target().entry_symbol_name();
   return ret;
 }
 
@@ -248,6 +265,14 @@ Parameters::incremental() const
   return this->incremental_mode_ != General_options::INCREMENTAL_OFF;
 }
 
+// Return true if we are doing a full incremental link.
+
+bool
+Parameters::incremental_full() const
+{
+  return this->incremental_mode_ == General_options::INCREMENTAL_FULL;
+}
+
 // Return true if we are doing an incremental update.
 
 bool
@@ -261,6 +286,10 @@ void
 set_parameters_errors(Errors* errors)
 { static_parameters.set_errors(errors); }
 
+void
+set_parameters_timer(Timer* timer)
+{ static_parameters.set_timer(timer); }
+
 void
 set_parameters_options(const General_options* options)
 { static_parameters.set_options(options); }
@@ -269,7 +298,6 @@ void
 set_parameters_target(Target* target)
 {
   static_parameters.set_target(target);
-  target->select_as_default_target();
 }
 
 void
@@ -299,15 +327,28 @@ parameters_force_valid_target()
   gold_assert(parameters->options_valid());
   if (parameters->options().user_set_oformat())
     {
-      Target* target = select_target_by_name(parameters->options().oformat());
+      const char* bfd_name = parameters->options().oformat();
+      Target* target = select_target_by_bfd_name(bfd_name);
+      if (target != NULL)
+       {
+         set_parameters_target(target);
+         return;
+       }
+
+      gold_error(_("unrecognized output format %s"), bfd_name);
+    }
+
+  if (parameters->options().user_set_m())
+    {
+      const char* emulation = parameters->options().m();
+      Target* target = select_target_by_emulation(emulation);
       if (target != NULL)
        {
          set_parameters_target(target);
          return;
        }
 
-      gold_error(_("unrecognized output format %s"),
-                 parameters->options().oformat());
+      gold_error(_("unrecognized emulation %s"), emulation);
     }
 
   // The GOLD_DEFAULT_xx macros are defined by the configure script.
@@ -320,12 +361,19 @@ parameters_force_valid_target()
   else
     is_big_endian = GOLD_DEFAULT_BIG_ENDIAN;
 
-  Target* target = select_target(elfcpp::GOLD_DEFAULT_MACHINE,
+  Target* target = select_target(NULL, 0,
+                                elfcpp::GOLD_DEFAULT_MACHINE,
                                 GOLD_DEFAULT_SIZE,
                                 is_big_endian,
                                 elfcpp::GOLD_DEFAULT_OSABI,
                                 0);
-  gold_assert(target != NULL);
+
+  if (target == NULL)
+    {
+      gold_assert(is_big_endian != GOLD_DEFAULT_BIG_ENDIAN);
+      gold_fatal(_("no supported target for -EB/-EL option"));
+    }
+
   set_parameters_target(target);
 }
 
This page took 0.034494 seconds and 4 git commands to generate.