]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gold/target-select.cc
* options.h (class General_options): Add --print-output-format.
[thirdparty/binutils-gdb.git] / gold / target-select.cc
index b8a9f40d856a62a928b352864295d1ec85b4ac99..9370a8714ab6a027160d343de24aecef8598cd82 100644 (file)
 
 #include "gold.h"
 
+#include <cstdio>
 #include <cstring>
 
 #include "elfcpp.h"
+#include "options.h"
+#include "parameters.h"
 #include "target-select.h"
 
 namespace
@@ -80,6 +83,18 @@ 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*
@@ -157,4 +172,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.