gas/testsuite/
[deliverable/binutils-gdb.git] / gold / target.h
index 8ecc078330d76efeace35f8dfd10e1bd57459586..30fa0086ca638eca16a2684f35af2deab81692c1 100644 (file)
@@ -1,6 +1,6 @@
 // target.h -- target support for gold   -*- C++ -*-
 
-// Copyright 2006, 2007 Free Software Foundation, Inc.
+// Copyright 2006, 2007, 2008 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -34,6 +34,8 @@
 #define GOLD_TARGET_H
 
 #include "elfcpp.h"
+#include "options.h"
+#include "parameters.h"
 
 namespace gold
 {
@@ -42,6 +44,7 @@ class General_options;
 class Object;
 template<int size, bool big_endian>
 class Sized_relobj;
+class Relocatable_relocs;
 template<int size, bool big_endian>
 class Relocate_info;
 class Symbol;
@@ -102,12 +105,24 @@ class Target
   // Return the ABI specified page size.
   uint64_t
   abi_pagesize() const
-  { return this->pti_->abi_pagesize; }
+  {
+    if (parameters->options().max_page_size() > 0)
+      return parameters->options().max_page_size();
+    else
+      return this->pti_->abi_pagesize;
+  }
 
   // Return the common page size used on actual systems.
   uint64_t
   common_pagesize() const
-  { return this->pti_->common_pagesize; }
+  {
+    if (parameters->options().common_page_size() > 0)
+      return std::min(parameters->options().common_page_size(),
+                     this->abi_pagesize());
+    else
+      return std::min(this->pti_->common_pagesize,
+                     this->abi_pagesize());
+  }
 
   // If we see some object files with .note.GNU-stack sections, and
   // some objects files without them, this returns whether we should
@@ -117,6 +132,15 @@ class Target
   is_default_stack_executable() const
   { return this->pti_->is_default_stack_executable; }
 
+  // Return a character which may appear as a prefix for a wrap
+  // symbol.  If this character appears, we strip it when checking for
+  // wrapping and add it back when forming the final symbol name.
+  // This should be '\0' if not special prefix is required, which is
+  // the normal case.
+  char
+  wrap_char() const
+  { return this->pti_->wrap_char; }
+
   // This is called to tell the target to complete any sections it is
   // handling.  After this all sections must have their final size.
   void
@@ -134,9 +158,15 @@ class Target
   // basically one or more NOPS which must fill out the specified
   // length in bytes.
   std::string
-  code_fill(off_t length)
+  code_fill(section_size_type length) const
   { return this->do_code_fill(length); }
 
+  // Return whether SYM is known to be defined by the ABI.  This is
+  // used to avoid inappropriate warnings about undefined symbols.
+  bool
+  is_defined_by_abi(Symbol* sym) const
+  { return this->do_is_defined_by_abi(sym); }
+
  protected:
   // This struct holds the constant information for a child class.  We
   // use a struct to avoid the overhead of virtual function calls for
@@ -158,6 +188,8 @@ class Target
     // Whether an object file with no .note.GNU-stack sections implies
     // that the stack should be executable.
     bool is_default_stack_executable;
+    // Prefix character to strip when checking for wrapping.
+    char wrap_char;
     // The default dynamic linker name.
     const char* dynamic_linker;
     // The default text segment address.
@@ -185,9 +217,14 @@ class Target
   // Virtual function which must be implemented by the child class if
   // needed.
   virtual std::string
-  do_code_fill(off_t)
+  do_code_fill(section_size_type) const
   { gold_unreachable(); }
 
+  // Virtual function which may be implemented by the child class.
+  virtual bool
+  do_is_defined_by_abi(Symbol*) const
+  { return false; }
+
  private:
   Target(const Target&);
   Target& operator=(const Target&);
@@ -268,7 +305,43 @@ class Sized_target : public Target
                   bool needs_special_offset_handling,
                   unsigned char* view,
                   typename elfcpp::Elf_types<size>::Elf_Addr view_address,
-                  off_t view_size) = 0;
+                  section_size_type view_size) = 0;
+
+  // Scan the relocs during a relocatable link.  The parameters are
+  // like scan_relocs, with an additional Relocatable_relocs
+  // parameter, used to record the disposition of the relocs.
+  virtual void
+  scan_relocatable_relocs(const General_options& options,
+                         Symbol_table* symtab,
+                         Layout* layout,
+                         Sized_relobj<size, big_endian>* object,
+                         unsigned int data_shndx,
+                         unsigned int sh_type,
+                         const unsigned char* prelocs,
+                         size_t reloc_count,
+                         Output_section* output_section,
+                         bool needs_special_offset_handling,
+                         size_t local_symbol_count,
+                         const unsigned char* plocal_symbols,
+                         Relocatable_relocs*) = 0;
+
+  // Relocate a section during a relocatable link.  The parameters are
+  // like relocate_section, with additional parameters for the view of
+  // the output reloc section.
+  virtual void
+  relocate_for_relocatable(const Relocate_info<size, big_endian>*,
+                          unsigned int sh_type,
+                          const unsigned char* prelocs,
+                          size_t reloc_count,
+                          Output_section* output_section,
+                          off_t offset_in_output_section,
+                          const Relocatable_relocs*,
+                          unsigned char* view,
+                          typename elfcpp::Elf_types<size>::Elf_Addr
+                            view_address,
+                          section_size_type view_size,
+                          unsigned char* reloc_view,
+                          section_size_type reloc_view_size) = 0;
 
  protected:
   Sized_target(const Target::Target_info* pti)
This page took 0.026657 seconds and 4 git commands to generate.