Add -Wshadow to the gcc command line options used when compiling the binutils.
[platform/upstream/binutils.git] / gold / dynobj.h
index b55ae35..be0d975 100644 (file)
@@ -1,6 +1,6 @@
 // dynobj.h -- dynamic object 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.
@@ -156,12 +156,14 @@ template<int size, bool big_endian>
 class Sized_dynobj : public Dynobj
 {
  public:
+  typedef typename Sized_relobj<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 the ELF header.
+  // Set up the object file based on TARGET.
   void
-  setup(const typename elfcpp::Ehdr<size, big_endian>&);
+  setup();
 
   // Read the symbols.
   void
@@ -173,7 +175,7 @@ class Sized_dynobj : public Dynobj
 
   // Add the symbols to the symbol table.
   void
-  do_add_symbols(Symbol_table*, Read_symbols_data*);
+  do_add_symbols(Symbol_table*, Read_symbols_data*, Layout*);
 
   // Get the size of a section.
   uint64_t
@@ -196,6 +198,11 @@ class Sized_dynobj : public Dynobj
   do_section_flags(unsigned int shndx)
   { return this->elf_file_.section_flags(shndx); }
 
+  // Not used for dynobj.
+  uint64_t
+  do_section_entsize(unsigned int )
+  { gold_unreachable(); }
+
   // Return section address.
   uint64_t
   do_section_address(unsigned int shndx)
@@ -221,6 +228,14 @@ class Sized_dynobj : public Dynobj
   do_section_addralign(unsigned int shndx)
   { return this->elf_file_.section_addralign(shndx); }
 
+  // Return the Xindex structure to use.
+  Xindex*
+  do_initialize_xindex();
+
+  // Get symbol counts.
+  void
+  do_get_global_symbol_counts(const Symbol_table*, size_t*, size_t*) const;
+
  private:
   // For convenience.
   typedef Sized_dynobj<size, big_endian> This;
@@ -230,11 +245,19 @@ class Sized_dynobj : public Dynobj
   typedef elfcpp::Shdr<size, big_endian> Shdr;
   typedef elfcpp::Dyn<size, big_endian> Dyn;
 
+  // Adjust a section index if necessary.
+  unsigned int
+  adjust_shndx(unsigned int shndx)
+  {
+    if (shndx >= elfcpp::SHN_LORESERVE)
+      shndx += this->elf_file_.large_shndx_offset();
+    return shndx;
+  }
+
   // Find the dynamic symbol table and the version sections, given the
   // section headers.
   void
   find_dynsym_sections(const unsigned char* pshdrs,
-                      unsigned int* pdynshm_shndx,
                       unsigned int* pversym_shndx,
                       unsigned int* pverdef_shndx,
                       unsigned int* pverneed_shndx,
@@ -274,6 +297,13 @@ class Sized_dynobj : public Dynobj
 
   // General access to the ELF file.
   elfcpp::Elf_file<size, big_endian, Object> elf_file_;
+  // The section index of the dynamic symbol table.
+  unsigned int dynsym_shndx_;
+  // The entries in the symbol table for the symbols.  We only keep
+  // this if we need it to print symbol information.
+  Symbols* symbols_;
+  // Number of defined symbols.
+  size_t defined_count_;
 };
 
 // A base class for Verdef and Verneed_version which just handles the
@@ -300,10 +330,10 @@ class Version_base
 
   // Set the version index.
   void
-  set_index(unsigned int index)
+  set_index(unsigned int vindex)
   {
     gold_assert(this->index_ == -1U);
-    this->index_ = index;
+    this->index_ = vindex;
   }
 
   // Clear the weak flag in a version definition.
@@ -324,10 +354,10 @@ class Version_base
 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)
-    : name_(name), deps_(deps), is_base_(is_base), is_weak_(is_weak),
-      is_symbol_created_(is_symbol_created)
+  Verdef(const char* vname, const std::vector<std::string>& deps,
+         bool is_base, bool vis_weak, bool vis_symbol_created)
+    : name_(vname), deps_(deps), is_base_(is_base), is_weak_(vis_weak),
+      is_symbol_created_(vis_symbol_created)
   { }
 
   // Return the version name.
@@ -343,8 +373,8 @@ class Verdef : public Version_base
   // Add a dependency to this version.  The NAME should be
   // canonicalized in the dynamic Stringpool.
   void
-  add_dependency(const char* name)
-  { this->deps_.push_back(name); }
+  add_dependency(const char* dname)
+  { this->deps_.push_back(dname); }
 
   // Return whether this definition is weak.
   bool
@@ -394,8 +424,8 @@ class Verdef : public Version_base
 class Verneed_version : public Version_base
 {
  public:
-  Verneed_version(const char* version)
-    : version_(version)
+  Verneed_version(const char* ver)
+    : version_(ver)
   { }
 
   // Return the version name.
@@ -420,8 +450,8 @@ class Verneed_version : public Version_base
 class Verneed
 {
  public:
-  Verneed(const char* filename)
-    : filename_(filename), need_versions_()
+  Verneed(const char* fname)
+    : filename_(fname), need_versions_()
   { }
 
   ~Verneed();
@@ -554,6 +584,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;
@@ -586,6 +620,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 libaries and is cleared when the base version is defined.
+  bool needs_base_version_;
 };
 
 } // End namespace gold.