gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gold / copy-relocs.h
index b7d0f5fb4f0be3a892f005ea28a1d8f167540290..885d685c777ab9c365fe627994ee2eccf66475eb 100644 (file)
@@ -1,6 +1,6 @@
 // copy-relocs.h -- handle COPY relocations 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.
@@ -54,7 +54,8 @@ class Copy_relocs
 
  public:
   Copy_relocs(unsigned int copy_reloc_type)
-    : copy_reloc_type_(copy_reloc_type), dynbss_(NULL), entries_()
+    : entries_(), copy_reloc_type_(copy_reloc_type), dynbss_(NULL),
+      dynrelro_(NULL)
   { }
 
   // This is called while scanning relocs if we see a relocation
@@ -65,9 +66,15 @@ class Copy_relocs
   // will wind up.  REL is the reloc itself.  The Output_data_reloc
   // section is where the dynamic relocs are put.
   void
-  copy_reloc(Symbol_table*, Layout*, Sized_symbol<size>* sym, Relobj* object,
-            unsigned int shndx, Output_section* output_section,
-            const Reloc& rel,
+  copy_reloc(Symbol_table*,
+            Layout*,
+            Sized_symbol<size>* sym,
+             Sized_relobj_file<size, big_endian>* object,
+            unsigned int shndx,
+            Output_section* output_section,
+            unsigned int r_type,
+            typename elfcpp::Elf_types<size>::Elf_Addr r_offset,
+            typename elfcpp::Elf_types<size>::Elf_Swxword r_addend,
             Output_data_reloc<sh_type, true, size, big_endian>*);
 
   // Return whether there are any saved relocations.
@@ -80,18 +87,24 @@ class Copy_relocs
   void
   emit(Output_data_reloc<sh_type, true, size, big_endian>*);
 
- private:
+  // Emit a COPY reloc.
+  void
+  emit_copy_reloc(Symbol_table*, Sized_symbol<size>*,
+                 Output_data*, off_t,
+                 Output_data_reloc<sh_type, true, size, big_endian>*);
+
+ protected:
   typedef typename elfcpp::Elf_types<size>::Elf_Addr Address;
   typedef typename elfcpp::Elf_types<size>::Elf_Addr Addend;
 
   // This POD class holds the relocations we are saving.  We will emit
   // these relocations if it turns out that the symbol does not
   // require a COPY relocation.
-  class Copy_reloc_entry
+  struct Copy_reloc_entry
   {
-   public:
     Copy_reloc_entry(Symbol* sym, unsigned int reloc_type,
-                    Relobj* relobj, unsigned int shndx,
+                    Sized_relobj_file<size, big_endian>* relobj,
+                     unsigned int shndx,
                     Output_section* output_section,
                     Address address, Addend addend)
       : sym_(sym), reloc_type_(reloc_type), relobj_(relobj),
@@ -99,52 +112,53 @@ class Copy_relocs
        address_(address), addend_(addend)
     { }
 
-    // Emit this reloc if appropriate.  This is called after we have
-    // scanned all the relocations, so we know whether we emitted a
-    // COPY relocation for SYM_.
-    void
-    emit(Output_data_reloc<sh_type, true, size, big_endian>*);
-
-   private:
     Symbol* sym_;
     unsigned int reloc_type_;
-    Relobj* relobj_;
+    Sized_relobj_file<size, big_endian>* relobj_;
     unsigned int shndx_;
     Output_section* output_section_;
     Address address_;
     Addend addend_;
   };
 
+  // Make a new COPY reloc and emit it.
+  void
+  make_copy_reloc(Symbol_table*, Layout*, Sized_symbol<size>*,
+                 Sized_relobj_file<size, big_endian>* object,
+                 Output_data_reloc<sh_type, true, size, big_endian>*);
+
   // A list of relocs to be saved.
   typedef std::vector<Copy_reloc_entry> Copy_reloc_entries;
 
+  // The list of relocs we are saving.
+  Copy_reloc_entries entries_;
+
+ private:
   // Return whether we need a COPY reloc.
   bool
-  need_copy_reloc(Sized_symbol<size>* gsym, Relobj* object,
+  need_copy_reloc(Sized_symbol<size>* gsym,
+                  Sized_relobj_file<size, big_endian>* object,
                  unsigned int shndx) const;
 
-  // Emit a COPY reloc.
-  void
-  emit_copy_reloc(Symbol_table*, Layout*, Sized_symbol<size>*,
-                 Output_data_reloc<sh_type, true, size, big_endian>*);
-
-  // Add a COPY reloc to the dynamic reloc section.
-  void
-  add_copy_reloc(Symbol*, section_size_type,
-                Output_data_reloc<sh_type, true, size, big_endian>*);
-
   // Save a reloc against SYM for possible emission later.
   void
-  save(Symbol*, Relobj*, unsigned int shndx, Output_section*,
-       const Reloc& rel);
+  save(Symbol*,
+       Sized_relobj_file<size, big_endian>*,
+       unsigned int shndx,
+       Output_section*,
+       unsigned int r_type,
+       typename elfcpp::Elf_types<size>::Elf_Addr r_offset,
+       typename elfcpp::Elf_types<size>::Elf_Swxword r_addend);
 
   // The target specific relocation type of the COPY relocation.
   const unsigned int copy_reloc_type_;
   // The dynamic BSS data which goes into the .bss section.  This is
-  // where variables which require COPY relocations are placed.
+  // where writable variables which require COPY relocations are placed.
   Output_data_space* dynbss_;
-  // The list of relocs we are saving.
-  Copy_reloc_entries entries_;
+  // The dynamic read-only data, which goes into the .data.rel.ro section.
+  // This is where read-only variables which require COPY relocations are
+  // placed.
+  Output_data_space* dynrelro_;
 };
 
 } // End namespace gold.
This page took 0.028966 seconds and 4 git commands to generate.