gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / target-select.cc
index b8a9f40d856a62a928b352864295d1ec85b4ac99..f47d79c6c19f4ac93c80efbbec3afac28f76891f 100644 (file)
@@ -1,6 +1,6 @@
 // target-select.cc -- select a target for an object file
 
-// Copyright 2006, 2007, 2008, 2009, 2010, 2011 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.
 
 #include "gold.h"
 
+#include <cstdio>
 #include <cstring>
 
 #include "elfcpp.h"
+#include "options.h"
+#include "parameters.h"
 #include "target-select.h"
 
 namespace
@@ -80,11 +83,24 @@ Target_selector::set_target()
   this->instantiated_target_ = this->do_instantiate_target();
 }
 
+// If we instantiated TARGET, return the corresponding BFD name.
+
+const char*
+Target_selector::do_target_bfd_name(const Target* target)
+{
+  if (!this->is_our_target(target))
+    return NULL;
+  const char* my_bfd_name = this->bfd_name();
+  gold_assert(my_bfd_name != NULL);
+  return my_bfd_name;
+}
+
 // Find the target for an ELF file.
 
 Target*
-select_target(int machine, int size, bool is_big_endian, int osabi,
-             int abiversion)
+select_target(Input_file* input_file, off_t offset,
+             int machine, int size, bool is_big_endian,
+             int osabi, int abiversion)
 {
   for (Target_selector* p = target_selectors; p != NULL; p = p->next())
     {
@@ -93,7 +109,8 @@ select_target(int machine, int size, bool is_big_endian, int osabi,
          && p->get_size() == size
          && (p->is_big_endian() ? is_big_endian : !is_big_endian))
        {
-         Target* ret = p->recognize(machine, osabi, abiversion);
+         Target* ret = p->recognize(input_file, offset,
+                                    machine, osabi, abiversion);
          if (ret != NULL)
            return ret;
        }
@@ -157,4 +174,46 @@ supported_emulation_names(std::vector<const char*>* names)
     p->supported_emulations(names);
 }
 
+// Implement the --print-output-format option.
+
+void
+print_output_format()
+{
+  if (!parameters->target_valid())
+    {
+      // This case arises when --print-output-format is used with no
+      // input files.  We need to come up with the right string to
+      // print based on the other options.  If the user specified the
+      // format using a --oformat option, use that.  That saves each
+      // target from having to remember the name that was used to
+      // select it.  In other cases, we will just have to ask the
+      // target.
+      if (parameters->options().user_set_oformat())
+       {
+         const char* bfd_name = parameters->options().oformat();
+         Target* target = select_target_by_bfd_name(bfd_name);
+         if (target != NULL)
+           printf("%s\n", bfd_name);
+         else
+           gold_error(_("unrecognized output format %s"), bfd_name);
+         return;
+       }
+
+      parameters_force_valid_target();
+    }
+
+  const Target* target = &parameters->target();
+  for (Target_selector* p = target_selectors; p != NULL; p = p->next())
+    {
+      const char* bfd_name = p->target_bfd_name(target);
+      if (bfd_name != NULL)
+       {
+         printf("%s\n", bfd_name);
+         return;
+       }
+    }
+
+  gold_unreachable();
+}
+
 } // End namespace gold.
This page took 0.025391 seconds and 4 git commands to generate.