gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / dynobj.h
index f6c6538ad123a8a043c5ef1deb8817d22eb55036..c1674a1f089da94c612336fd67d6dc0ef12ff1a6 100644 (file)
@@ -1,6 +1,6 @@
 // dynobj.h -- dynamic object support for gold   -*- C++ -*-
 
-// Copyright 2006, 2007, 2008 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.
@@ -72,6 +72,16 @@ class Dynobj : public Object
     this->unknown_needed_ = set ? UNKNOWN_NEEDED_TRUE : UNKNOWN_NEEDED_FALSE;
   }
 
+  // Return the word size of the object file.
+  int
+  elfsize() const
+  { gold_unreachable(); }
+
+  // Return TRUE if this is a big-endian object file.
+  bool
+  is_big_endian() const
+  { gold_unreachable(); }
+
   // Compute the ELF hash code for a string.
   static uint32_t
   elf_hash(const char*);
@@ -96,6 +106,11 @@ class Dynobj : public Object
                        unsigned char** pphash, unsigned int* phashlen);
 
  protected:
+  // Return a pointer to this object.
+  virtual Dynobj*
+  do_dynobj()
+  { return this; }
+
   // Set the DT_SONAME string.
   void
   set_soname_string(const char* s)
@@ -117,7 +132,7 @@ class Dynobj : public Object
                       bool for_gnu_hash_table);
 
   // Sized version of create_elf_hash_table.
-  template<bool big_endian>
+  template<int size, bool big_endian>
   static void
   sized_create_elf_hash_table(const std::vector<uint32_t>& bucket,
                              const std::vector<uint32_t>& chain,
@@ -156,14 +171,14 @@ template<int size, bool big_endian>
 class Sized_dynobj : public Dynobj
 {
  public:
-  typedef typename Sized_relobj<size, big_endian>::Symbols Symbols;
+  typedef typename Sized_relobj_file<size, big_endian>::Symbols Symbols;
 
   Sized_dynobj(const std::string& name, Input_file* input_file, off_t offset,
               const typename elfcpp::Ehdr<size, big_endian>&);
 
   // Set up the object file based on TARGET.
   void
-  setup(Target *target);
+  setup();
 
   // Read the symbols.
   void
@@ -177,6 +192,20 @@ class Sized_dynobj : public Dynobj
   void
   do_add_symbols(Symbol_table*, Read_symbols_data*, Layout*);
 
+  Archive::Should_include
+  do_should_include_member(Symbol_table* symtab, Layout*, Read_symbols_data*,
+                           std::string* why);
+
+  // Iterate over global symbols, calling a visitor class V for each.
+  void
+  do_for_all_global_symbols(Read_symbols_data* sd,
+                           Library_base::Symbol_visitor_base* v);
+
+  // Iterate over local symbols, calling a visitor class V for each GOT offset
+  // associated with a local symbol.
+  void
+  do_for_all_local_got_entries(Got_offset_list::Visitor* v) const;
+
   // Get the size of a section.
   uint64_t
   do_section_size(unsigned int shndx)
@@ -184,14 +213,24 @@ class Sized_dynobj : public Dynobj
 
   // Get the name of a section.
   std::string
-  do_section_name(unsigned int shndx)
+  do_section_name(unsigned int shndx) const
   { return this->elf_file_.section_name(shndx); }
 
   // Return a view of the contents of a section.  Set *PLEN to the
   // size.
-  Object::Location
-  do_section_contents(unsigned int shndx)
-  { return this->elf_file_.section_contents(shndx); }
+  const unsigned char*
+  do_section_contents(unsigned int shndx, section_size_type* plen,
+                     bool cache)
+  {
+    Location loc(this->elf_file_.section_contents(shndx));
+    *plen = convert_to_section_size_type(loc.data_size);
+    if (*plen == 0)
+      {
+       static const unsigned char empty[1] = { '\0' };
+       return empty;
+      }
+    return this->get_view(loc.file_offset, *plen, true, cache);
+  }
 
   // Return section flags.
   uint64_t
@@ -236,6 +275,17 @@ class Sized_dynobj : public Dynobj
   void
   do_get_global_symbol_counts(const Symbol_table*, size_t*, size_t*) const;
 
+  // Get the global symbols.
+  const Symbols*
+  do_get_global_symbols() const
+  { return this->symbols_; }
+
+ protected:
+  // Read the symbols.  This is common code for all target-specific
+  // overrides of do_read_symbols().
+  void
+  base_read_symbols(Read_symbols_data*);
+
  private:
   // For convenience.
   typedef Sized_dynobj<size, big_endian> This;
@@ -355,9 +405,9 @@ class Verdef : public Version_base
 {
  public:
   Verdef(const char* name, const std::vector<std::string>& deps,
-         bool is_base, bool is_weak, bool is_symbol_created)
+         bool is_base, bool is_weak, bool is_info, bool is_symbol_created)
     : name_(name), deps_(deps), is_base_(is_base), is_weak_(is_weak),
-      is_symbol_created_(is_symbol_created)
+      is_info_(is_info), is_symbol_created_(is_symbol_created)
   { }
 
   // Return the version name.
@@ -386,6 +436,11 @@ class Verdef : public Version_base
   clear_weak()
   { this->is_weak_ = false; }
 
+  // Return whether this definition is informational.
+  bool
+  is_info() const
+  { return this->is_info_; }
+
   // Return whether a version symbol has been created for this
   // definition.
   bool
@@ -414,6 +469,8 @@ class Verdef : public Version_base
   bool is_base_;
   // Whether this version is weak.
   bool is_weak_;
+  // Whether this version is informational.
+  bool is_info_;
   // Whether a version symbol has been created.
   bool is_symbol_created_;
 };
@@ -568,7 +625,8 @@ class Versions
 
   // Handle a symbol SYM defined with version VERSION.
   void
-  add_def(const Symbol* sym, const char* version, Stringpool::Key);
+  add_def(Stringpool*, const Symbol* sym, const char* version,
+         Stringpool::Key);
 
   // Add a reference to version NAME in file FILENAME.
   void
@@ -584,6 +642,10 @@ class Versions
   version_index(const Symbol_table*, const Stringpool*,
                const Symbol* sym) const;
 
+  // Define the base version of a shared library.
+  void
+  define_base_version(Stringpool* dynpool);
+
   // We keep a hash table mapping canonicalized name/version pairs to
   // a version base.
   typedef std::pair<Stringpool::Key, Stringpool::Key> Key;
@@ -616,6 +678,9 @@ class Versions
   bool is_finalized_;
   // Contents of --version-script, if passed, or NULL.
   const Version_script_info& version_script_;
+  // Whether we need to insert a base version.  This is only used for
+  // shared libraries and is cleared when the base version is defined.
+  bool needs_base_version_;
 };
 
 } // End namespace gold.
This page took 0.027117 seconds and 4 git commands to generate.