daily update
[deliverable/binutils-gdb.git] / gold / dwarf_reader.cc
index 1190066fac5ab8fbba388d3518b82470dc1dfde1..e345ff8eccf8b90ca93053375458f4f9d2a8aa60 100644 (file)
@@ -1,6 +1,6 @@
 // dwarf_reader.cc -- parse dwarf2/3 debug information
 
-// 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.
@@ -22,6 +22,8 @@
 
 #include "gold.h"
 
+#include <algorithm>
+
 #include "elfcpp_swap.h"
 #include "dwarf.h"
 #include "object.h"
@@ -125,11 +127,12 @@ Sized_dwarf_line_info<size, big_endian>::Sized_dwarf_line_info(Object* object,
 {
   unsigned int debug_shndx;
   for (debug_shndx = 0; debug_shndx < object->shnum(); ++debug_shndx)
+    // FIXME: do this more efficiently: section_name() isn't super-fast
     if (object->section_name(debug_shndx) == ".debug_line")
       {
-        off_t buffer_size;
-        this->buffer_ = object->section_contents(
-            debug_shndx, &buffer_size, false);
+        section_size_type buffer_size;
+        this->buffer_ = object->section_contents(debug_shndx, &buffer_size,
+                                                false);
         this->buffer_end_ = this->buffer_ + buffer_size;
         break;
       }
@@ -182,7 +185,7 @@ const unsigned char*
 Sized_dwarf_line_info<size, big_endian>::read_header_prolog(
     const unsigned char* lineptr)
 {
-  uint32_t initial_length = elfcpp::Swap<32, big_endian>::readval(lineptr);
+  uint32_t initial_length = elfcpp::Swap_unaligned<32, big_endian>::readval(lineptr);
   lineptr += 4;
 
   // In DWARF2/3, if the initial length is all 1 bits, then the offset
@@ -190,7 +193,7 @@ Sized_dwarf_line_info<size, big_endian>::read_header_prolog(
   if (initial_length == 0xffffffff)
     {
       header_.offset_size = 8;
-      initial_length = elfcpp::Swap<64, big_endian>::readval(lineptr);
+      initial_length = elfcpp::Swap_unaligned<64, big_endian>::readval(lineptr);
       lineptr += 8;
     }
   else
@@ -200,13 +203,13 @@ Sized_dwarf_line_info<size, big_endian>::read_header_prolog(
 
   gold_assert(lineptr + header_.total_length <= buffer_end_);
 
-  header_.version = elfcpp::Swap<16, big_endian>::readval(lineptr);
+  header_.version = elfcpp::Swap_unaligned<16, big_endian>::readval(lineptr);
   lineptr += 2;
 
   if (header_.offset_size == 4)
-    header_.prologue_length = elfcpp::Swap<32, big_endian>::readval(lineptr);
+    header_.prologue_length = elfcpp::Swap_unaligned<32, big_endian>::readval(lineptr);
   else
-    header_.prologue_length = elfcpp::Swap<64, big_endian>::readval(lineptr);
+    header_.prologue_length = elfcpp::Swap_unaligned<64, big_endian>::readval(lineptr);
   lineptr += header_.offset_size;
 
   header_.min_insn_length = *lineptr;
@@ -391,7 +394,7 @@ Sized_dwarf_line_info<size, big_endian>::process_one_opcode(
     case elfcpp::DW_LNS_fixed_advance_pc:
       {
         int advance_address;
-        advance_address = elfcpp::Swap<16, big_endian>::readval(start);
+        advance_address = elfcpp::Swap_unaligned<16, big_endian>::readval(start);
         oplen += 2;
         lsm->address += advance_address;
       }
@@ -429,7 +432,7 @@ Sized_dwarf_line_info<size, big_endian>::process_one_opcode(
 
           case elfcpp::DW_LNE_set_address:
             {
-              lsm->address = elfcpp::Swap<size, big_endian>::readval(start);
+              lsm->address = elfcpp::Swap_unaligned<size, big_endian>::readval(start);
               typename Reloc_map::const_iterator it
                   = reloc_map_.find(start - this->buffer_);
               if (it != reloc_map_.end())
@@ -789,36 +792,31 @@ std::string
 Dwarf_line_info::one_addr2line(Object* object,
                                unsigned int shndx, off_t offset)
 {
-  if (parameters->get_size() == 32 && !parameters->is_big_endian())
+  switch (parameters->size_and_endianness())
+    {
 #ifdef HAVE_TARGET_32_LITTLE
-    return Sized_dwarf_line_info<32, false>(object, shndx).addr2line(shndx,
-                                                                     offset);
-#else
-    gold_unreachable();
+    case Parameters::TARGET_32_LITTLE:
+      return Sized_dwarf_line_info<32, false>(object, shndx).addr2line(shndx,
+                                                                       offset);
 #endif
-  else if (parameters->get_size() == 32 && parameters->is_big_endian())
 #ifdef HAVE_TARGET_32_BIG
-    return Sized_dwarf_line_info<32, true>(object, shndx).addr2line(shndx,
-                                                                    offset);
-#else
-    gold_unreachable();
+    case Parameters::TARGET_32_BIG:
+      return Sized_dwarf_line_info<32, true>(object, shndx).addr2line(shndx,
+                                                                      offset);
 #endif
-  else if (parameters->get_size() == 64 && !parameters->is_big_endian())
 #ifdef HAVE_TARGET_64_LITTLE
-    return Sized_dwarf_line_info<64, false>(object, shndx).addr2line(shndx,
-                                                                     offset);
-#else
-    gold_unreachable();
+    case Parameters::TARGET_64_LITTLE:
+      return Sized_dwarf_line_info<64, false>(object, shndx).addr2line(shndx,
+                                                                       offset);
 #endif
-  else if (parameters->get_size() == 64 && parameters->is_big_endian())
-#ifdef HAVE_TARGET_64_BIT
-    return Sized_dwarf_line_info<64, true>(object, shndx).addr2line(shndx,
-                                                                    offset);
-#else
-    gold_unreachable();
+#ifdef HAVE_TARGET_64_BIG
+    case Parameters::TARGET_64_BIG:
+      return Sized_dwarf_line_info<64, true>(object, shndx).addr2line(shndx,
+                                                                      offset);
 #endif
-  else
-    gold_unreachable();
+    default:
+      gold_unreachable();
+    }
 }
 
 #ifdef HAVE_TARGET_32_LITTLE
This page took 0.026076 seconds and 4 git commands to generate.