Add icf_virtual_function_folding_test to check_PROGRAMS.
[binutils-gdb.git] / gold / layout.h
index 79785bfd02bca534f62753c1d045f1c4df088097..912be31e15490d604c343b232d8678ce42241ecf 100644 (file)
@@ -51,6 +51,7 @@ class Output_segment_headers;
 class Output_file_header;
 class Output_segment;
 class Output_data;
+class Output_data_reloc_generic;
 class Output_data_dynamic;
 class Output_symtab_xindex;
 class Output_reduced_debug_abbrev_section;
@@ -151,10 +152,10 @@ class Kept_section
 
   // Set the object.
   void
-  set_object(Relobj* obj)
+  set_object(Relobj* object)
   {
     gold_assert(this->object_ == NULL);
-    this->object_ = obj;
+    this->object_ = object;
   }
 
   // The section index.
@@ -164,10 +165,10 @@ class Kept_section
 
   // Set the section index.
   void
-  set_shndx(unsigned int sec_shndx)
+  set_shndx(unsigned int shndx)
   {
     gold_assert(this->shndx_ == 0);
-    this->shndx_ = sec_shndx;
+    this->shndx_ = shndx;
   }
 
   // Whether this is a comdat group.
@@ -198,11 +199,11 @@ class Kept_section
 
   // Add a section to the group list.
   void
-  add_comdat_section(const std::string& name, unsigned int sec_shndx,
+  add_comdat_section(const std::string& name, unsigned int shndx,
                     uint64_t size)
   {
     gold_assert(this->is_comdat_);
-    Comdat_section_info sinfo(sec_shndx, size);
+    Comdat_section_info sinfo(shndx, size);
     this->u_.group_sections->insert(std::make_pair(name, sinfo));
   }
 
@@ -362,11 +363,21 @@ class Layout
   // Add an Output_section_data to the layout.  This is used for
   // special sections like the GOT section.  IS_DYNAMIC_LINKER_SECTION
   // is true for sections which are used by the dynamic linker, such
-  // as dynamic reloc sections.
+  // as dynamic reloc sections.  IS_RELRO is true for relro sections.
+  // IS_LAST_RELRO is true for the last relro section.
+  // IS_FIRST_NON_RELRO is true for the first section after the relro
+  // sections.
   Output_section*
   add_output_section_data(const char* name, elfcpp::Elf_Word type,
                          elfcpp::Elf_Xword flags,
-                         Output_section_data*, bool is_dynamic_linker_section);
+                         Output_section_data*, bool is_dynamic_linker_section,
+                         bool is_relro, bool is_last_relro,
+                         bool is_first_non_relro);
+
+  // Increase the size of the relro segment by this much.
+  void
+  increase_relro(unsigned int s)
+  { this->increase_relro_ += s; }
 
   // Create dynamic sections if necessary.
   void
@@ -423,6 +434,11 @@ class Layout
   is_linkonce(const char* name)
   { return strncmp(name, ".gnu.linkonce", sizeof(".gnu.linkonce") - 1) == 0; }
 
+  // Whether we have added an input section.
+  bool
+  have_added_input_section() const
+  { return this->have_added_input_section_; }
+
   // Return true if a section is a debugging section.
   static inline bool
   is_debug_info_section(const char* name)
@@ -541,6 +557,14 @@ class Layout
   incremental_inputs()
   { return this->incremental_inputs_; }
 
+  // For the target-specific code to add dynamic tags which are common
+  // to most targets.
+  void
+  add_target_dynamic_tags(bool use_rel, const Output_data* plt_got,
+                         const Output_data* plt_rel,
+                         const Output_data_reloc_generic* dyn_rel,
+                         bool add_debug, bool dynrel_includes_plt);
+
   // Compute and write out the build ID if needed.
   void
   write_build_id(Output_file*) const;
@@ -576,7 +600,8 @@ class Layout
 
   // Make a section for a linker script to hold data.
   Output_section*
-  make_output_section_for_script(const char* name);
+  make_output_section_for_script(const char* name,
+                                Script_sections::Section_type section_type);
 
   // Make a segment.  This is used by the linker script code.
   Output_segment*
@@ -708,6 +733,10 @@ class Layout
   void
   finish_dynamic_section(const Input_objects*, const Symbol_table*);
 
+  // Set the size of the _DYNAMIC symbol.
+  void
+  set_dynamic_symbol_size(const Symbol_table*);
+
   // Create the .interp section and PT_INTERP segment.
   void
   create_interp(const Target* target);
@@ -748,20 +777,24 @@ class Layout
   Output_section*
   get_output_section(const char* name, Stringpool::Key name_key,
                     elfcpp::Elf_Word type, elfcpp::Elf_Xword flags,
-                    bool is_interp, bool is_dynamic_linker_section);
+                    bool is_interp, bool is_dynamic_linker_section,
+                    bool is_relro, bool is_last_relro,
+                    bool is_first_non_relro);
 
   // Choose the output section for NAME in RELOBJ.
   Output_section*
   choose_output_section(const Relobj* relobj, const char* name,
                        elfcpp::Elf_Word type, elfcpp::Elf_Xword flags,
                        bool is_input_section, bool is_interp,
-                       bool is_dynamic_linker_section);
+                       bool is_dynamic_linker_section, bool is_relro,
+                       bool is_last_relro, bool is_first_non_relro);
 
   // Create a new Output_section.
   Output_section*
   make_output_section(const char* name, elfcpp::Elf_Word type,
                      elfcpp::Elf_Xword flags, bool is_interp,
-                     bool is_dynamic_linker_section);
+                     bool is_dynamic_linker_section, bool is_relro,
+                     bool is_last_relro, bool is_first_non_relro);
 
   // Attach a section to a segment.
   void
@@ -937,6 +970,9 @@ class Layout
   Output_segment* tls_segment_;
   // A pointer to the PT_GNU_RELRO segment if there is one.
   Output_segment* relro_segment_;
+  // A backend may increase the size of the PT_GNU_RELRO segment if
+  // there is one.  This is the amount to increase it by.
+  unsigned int increase_relro_;
   // The SHT_SYMTAB output section.
   Output_section* symtab_section_;
   // The SHT_SYMTAB_SHNDX for the regular symbol table if there is one.
@@ -947,6 +983,8 @@ class Layout
   Output_symtab_xindex* dynsym_xindex_;
   // The SHT_DYNAMIC output section if there is one.
   Output_section* dynamic_section_;
+  // The _DYNAMIC symbol if there is one.
+  Symbol* dynamic_symbol_;
   // The dynamic data which goes into dynamic_section_.
   Output_data_dynamic* dynamic_data_;
   // The exception frame output section if there is one.
@@ -967,6 +1005,8 @@ class Layout
   Group_signatures group_signatures_;
   // The size of the output file.
   off_t output_file_size_;
+  // Whether we have added an input section to an output section.
+  bool have_added_input_section_;
   // Whether we have attached the sections to the segments.
   bool sections_are_attached_;
   // Whether we have seen an object file marked to require an