PR ld/10515
[binutils-gdb.git] / gold / dwarf_reader.h
index 48ded84965e2f293ee63b1674a23e9d08dd6341f..c9d760ce53ff04c74917ef1aee868aa663e9022b 100644 (file)
@@ -1,6 +1,6 @@
 // dwarf_reader.h -- parse dwarf2/3 debug information for gold  -*- C++ -*-
 
-// Copyright 2007 Free Software Foundation, Inc.
+// Copyright 2007, 2008 Free Software Foundation, Inc.
 // Written by Ian Lance Taylor <iant@google.com>.
 
 // This file is part of gold.
@@ -38,6 +38,12 @@ template<int size, bool big_endian>
 class Track_relocs;
 struct LineStateMachine;
 
+uint64_t
+read_unsigned_LEB_128(const unsigned char* buffer, size_t* len);
+
+int64_t
+read_signed_LEB_128(const unsigned char* buffer, size_t* len);
+
 // We can't do better than to keep the offsets in a sorted vector.
 // Here, offset is the key, and file_num/line_num is the value.
 struct Offset_to_lineno_entry
@@ -72,12 +78,20 @@ class Dwarf_line_info
   addr2line(unsigned int shndx, off_t offset)
   { return do_addr2line(shndx, offset); }
 
-  // A helper function for a single addr2line lookup.  It uses
-  // parameters() to figure out the size and endianness.  This is less
-  // efficient than using the templatized size and endianness, so only
-  // call this from an un-templatized context.
+  // A helper function for a single addr2line lookup.  It also keeps a
+  // cache of the last CACHE_SIZE Dwarf_line_info objects it created;
+  // set to 0 not to cache at all.  The larger CACHE_SIZE is, the more
+  // chance this routine won't have to re-create a Dwarf_line_info
+  // object for its addr2line computation; such creations are slow.
+  // NOTE: Not thread-safe, so only call from one thread at a time.
   static std::string
-  one_addr2line(Object* object, unsigned int shndx, off_t offset);
+  one_addr2line(Object* object, unsigned int shndx, off_t offset,
+                size_t cache_size);
+
+  // This reclaims all the memory that one_addr2line may have cached.
+  // Use this when you know you will not be calling one_addr2line again.
+  static void
+  clear_addr2line_cache();
 
  private:
   virtual std::string
@@ -89,25 +103,30 @@ class Sized_dwarf_line_info : public Dwarf_line_info
 {
  public:
   // Initializes a .debug_line reader for a given object file.
-  Sized_dwarf_line_info(Object* object);
+  // If SHNDX is specified and non-negative, only read the debug
+  // information that pertains to the specified section.
+  Sized_dwarf_line_info(Object* object, off_t read_shndx = -1U);
 
  private:
   std::string
   do_addr2line(unsigned int shndx, off_t offset);
 
   // Start processing line info, and populates the offset_map_.
+  // If SHNDX is non-negative, only store debug information that
+  // pertains to the specified section.
   void
-  read_line_mappings();
+  read_line_mappings(Object*, off_t shndx);
 
   // Reads the relocation section associated with .debug_line and
   // stores relocation information in reloc_map_.
   void
-  read_relocs();
+  read_relocs(Object*);
 
   // Looks in the symtab to see what section a symbol is in.
   unsigned int
-  symbol_section(unsigned int sym,
-                 typename elfcpp::Elf_types<size>::Elf_Addr* value);
+  symbol_section(Object*, unsigned int sym,
+                 typename elfcpp::Elf_types<size>::Elf_Addr* value,
+                bool* is_ordinary);
 
   // Reads the DWARF2/3 header for this line info.  Each takes as input
   // a starting buffer position, and returns the ending position.
@@ -117,9 +136,11 @@ class Sized_dwarf_line_info : public Dwarf_line_info
   const unsigned char*
   read_header_tables(const unsigned char* lineptr);
 
-  // Reads the DWARF2/3 line information.
+  // Reads the DWARF2/3 line information.  If shndx is non-negative,
+  // discard all line information that doesn't pertain to the given
+  // section.
   const unsigned char*
-  read_lines(const unsigned char* lineptr);
+  read_lines(const unsigned char* lineptr, off_t shndx);
 
   // Process a single line info opcode at START using the state
   // machine at LSM.  Return true if we should define a line using the
@@ -166,7 +187,7 @@ class Sized_dwarf_line_info : public Dwarf_line_info
 
   // This is used to figure out what section to apply a relocation to.
   const unsigned char* symtab_buffer_;
-  off_t symtab_buffer_size_;
+  section_size_type symtab_buffer_size_;
 
   // Holds the directories and files as we see them.  We have an array
   // of directory-lists, one for each .o file we're reading (usually