gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / target-select.h
index 4e2ea92268434fef69d65ac760258540cae1639d..51e39a6f10be5749b00426c906f940bc166fc7e9 100644 (file)
@@ -1,6 +1,6 @@
 // target-select.h -- select a target for an object file  -*- C++ -*-
 
-// 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.
@@ -30,6 +30,7 @@
 namespace gold
 {
 
+class Input_file;
 class Target;
 class Target_selector;
 
@@ -65,9 +66,10 @@ class Target_selector
   // or 64), and endianness.  The machine number can be EM_NONE to
   // test for any machine number.  BFD_NAME is the name of the target
   // used by the GNU linker, for backward compatibility; it may be
-  // NULL.
+  // NULL.  EMULATION is the name of the emulation used by the GNU
+  // linker; it is similar to BFD_NAME.
   Target_selector(int machine, int size, bool is_big_endian,
-                 const char* bfd_name);
+                 const char* bfd_name, const char* emulation);
 
   virtual ~Target_selector()
   { }
@@ -75,20 +77,33 @@ class Target_selector
   // If we can handle this target, return a pointer to a target
   // structure.  The size and endianness are known.
   Target*
-  recognize(int machine, int osabi, int abiversion)
-  { return this->do_recognize(machine, osabi, abiversion); }
+  recognize(Input_file* input_file, off_t offset,
+           int machine, int osabi, int abiversion)
+  { return this->do_recognize(input_file, offset, machine, osabi, abiversion); }
 
   // If NAME matches the target, return a pointer to a target
   // structure.
   Target*
-  recognize_by_name(const char* name)
-  { return this->do_recognize_by_name(name); }
+  recognize_by_bfd_name(const char* name)
+  { return this->do_recognize_by_bfd_name(name); }
 
-  // Push all supported names onto the vector.  This is only used for
-  // help output.
+  // Push all supported BFD names onto the vector.  This is only used
+  // for help output.
   void
-  supported_names(std::vector<const char*>* names)
-  { this->do_supported_names(names); }
+  supported_bfd_names(std::vector<const char*>* names)
+  { this->do_supported_bfd_names(names); }
+
+  // If NAME matches the target emulation, return a pointer to a
+  // target structure.
+  Target*
+  recognize_by_emulation(const char* name)
+  { return this->do_recognize_by_emulation(name); }
+
+  // Push all supported emulations onto the vector.  This is only used
+  // for help output.
+  void
+  supported_emulations(std::vector<const char*>* names)
+  { this->do_supported_emulations(names); }
 
   // Return the next Target_selector in the linked list.
   Target_selector*
@@ -114,12 +129,26 @@ class Target_selector
   { return this->is_big_endian_; }
 
   // Return the BFD name.  This may return NULL, in which case the
-  // do_recognize_by_name hook will be responsible for matching the
-  // BFD name.
+  // do_recognize_by_bfd_name hook will be responsible for matching
+  // the BFD name.
   const char*
   bfd_name() const
   { return this->bfd_name_; }
 
+  // Return the emulation.  This may return NULL, in which case the
+  // do_recognize_by_emulation hook will be responsible for matching
+  // the emulation.
+  const char*
+  emulation() const
+  { return this->emulation_; }
+
+  // The reverse mapping, for --print-output-format: if we
+  // instantiated TARGET, return our BFD_NAME.  If we did not
+  // instantiate it, return NULL.
+  const char*
+  target_bfd_name(const Target* target)
+  { return this->do_target_bfd_name(target); }
+
  protected:
   // Return an instance of the real target.  This must be implemented
   // by the child class.
@@ -133,7 +162,7 @@ class Target_selector
   // checks, or to check for multiple machine codes if the machine_
   // field is EM_NONE.
   virtual Target*
-  do_recognize(int, int, int)
+  do_recognize(Input_file*, off_t, int, int, int)
   { return this->instantiate_target(); }
 
   // Recognize a target by name.  When this is called we already know
@@ -141,23 +170,50 @@ class Target_selector
   // child class may implement a different version of this to
   // recognize more than one name.
   virtual Target*
-  do_recognize_by_name(const char*)
+  do_recognize_by_bfd_name(const char*)
   { return this->instantiate_target(); }
 
   // Return a list of supported BFD names.  The child class may
   // implement a different version of this to handle more than one
   // name.
   virtual void
-  do_supported_names(std::vector<const char*>* names)
+  do_supported_bfd_names(std::vector<const char*>* names)
   {
     gold_assert(this->bfd_name_ != NULL);
     names->push_back(this->bfd_name_);
   }
 
+  // Recognize a target by emulation.  When this is called we already
+  // know that the name matches (or that the emulation_ field is
+  // NULL).  The child class may implement a different version of this
+  // to recognize more than one emulation.
+  virtual Target*
+  do_recognize_by_emulation(const char*)
+  { return this->instantiate_target(); }
+
+  // Return a list of supported emulations.  The child class may
+  // implement a different version of this to handle more than one
+  // emulation.
+  virtual void
+  do_supported_emulations(std::vector<const char*>* emulations)
+  {
+    gold_assert(this->emulation_ != NULL);
+    emulations->push_back(this->emulation_);
+  }
+
+  // Map from target to BFD name.
+  virtual const char*
+  do_target_bfd_name(const Target*);
+
   // Instantiate the target and return it.
   Target*
   instantiate_target();
 
+  // Return whether TARGET is the target we instantiated.
+  bool
+  is_our_target(const Target* target)
+  { return target == this->instantiated_target_; }
+
  private:
   // Set the target.
   void
@@ -173,6 +229,8 @@ class Target_selector
   const bool is_big_endian_;
   // BFD name of target, for compatibility.
   const char* const bfd_name_;
+  // GNU linker emulation for this target, for compatibility.
+  const char* const emulation_;
   // Next entry in list built at global constructor time.
   Target_selector* next_;
   // The singleton Target structure--this points to an instance of the
@@ -185,13 +243,19 @@ class Target_selector
 // Select the target for an ELF file.
 
 extern Target*
-select_target(int machine, int size, bool big_endian, int osabi,
+select_target(Input_file*, off_t,
+             int machine, int size, bool big_endian, int osabi,
              int abiversion);
 
 // Select a target using a BFD name.
 
 extern Target*
-select_target_by_name(const char* name);
+select_target_by_bfd_name(const char* name);
+
+// Select a target using a GNU linker emulation.
+
+extern Target*
+select_target_by_emulation(const char* name);
 
 // Fill in a vector with the list of supported targets.  This returns
 // a list of BFD names.
@@ -199,6 +263,16 @@ select_target_by_name(const char* name);
 extern void
 supported_target_names(std::vector<const char*>*);
 
+// Fill in a vector with the list of supported emulations.
+
+extern void
+supported_emulation_names(std::vector<const char*>*);
+
+// Print the output format, for the --print-output-format option.
+
+extern void
+print_output_format();
+
 } // End namespace gold.
 
 #endif // !defined(GOLD_TARGET_SELECT_H)
This page took 0.024893 seconds and 4 git commands to generate.