gdb/testsuite/
[deliverable/binutils-gdb.git] / binutils / objdump.c
index b05c384717abae5fd7173d8040ccfae6e64fd9e5..b346aa7a52a40a818d716415a50d31c9a98356f4 100644 (file)
@@ -1525,7 +1525,9 @@ disassemble_bytes (struct disassemble_info * info,
              info->stream = &sfile;
              info->bytes_per_line = 0;
              info->bytes_per_chunk = 0;
-             info->flags = 0;
+             info->flags = disassemble_all ? DISASSEMBLE_DATA : 0;
+             if (machine)
+               info->flags |= USER_SPECIFIED_MACHINE_TYPE;
 
              if (info->disassembler_needs_relocs
                  && (bfd_get_file_flags (aux->abfd) & EXEC_P) == 0
@@ -1554,7 +1556,7 @@ disassemble_bytes (struct disassemble_info * info,
                      || (distance_to_rel > 0
                          && distance_to_rel < (bfd_signed_vma) (previous_octets/ opb)))
                    {
-                     info->flags = INSN_HAS_RELOC;
+                     info->flags |= INSN_HAS_RELOC;
                      aux->reloc = **relppp;
                    }
                  else
@@ -1898,7 +1900,7 @@ disassemble_section (bfd *abfd, asection *section, void *info)
       bfd_boolean insns;
 
       addr = section->vma + addr_offset;
-      addr = (addr ^ sign_adjust) - sign_adjust;
+      addr = ((addr & ((sign_adjust << 1) - 1)) ^ sign_adjust) - sign_adjust;
 
       if (sym != NULL && bfd_asymbol_value (sym) <= addr)
        {
@@ -1961,7 +1963,8 @@ disassemble_section (bfd *abfd, asection *section, void *info)
       else
        nextstop_offset = bfd_asymbol_value (nextsym) - section->vma;
 
-      if (nextstop_offset > stop_offset)
+      if (nextstop_offset > stop_offset
+         || nextstop_offset <= addr_offset)
        nextstop_offset = stop_offset;
 
       /* If a symbol is explicitly marked as being an object
@@ -1984,7 +1987,7 @@ disassemble_section (bfd *abfd, asection *section, void *info)
       disassemble_bytes (pinfo, paux->disassemble_fn, insns, data,
                         addr_offset, nextstop_offset,
                         rel_offset, &rel_pp, rel_ppend);
-
+      
       addr_offset = nextstop_offset;
       sym = nextsym;
     }
@@ -2122,12 +2125,12 @@ disassemble_data (bfd *abfd)
   free (sorted_syms);
 }
 \f
-int
-load_debug_section (enum dwarf_section_display_enum debug, void *file)
+static int
+load_specific_debug_section (enum dwarf_section_display_enum debug,
+                            asection *sec, void *file)
 {
   struct dwarf_section *section = &debug_displays [debug].section;
   bfd *abfd = file;
-  asection *sec;
   bfd_boolean ret;
   int section_is_compressed;
 
@@ -2135,18 +2138,6 @@ load_debug_section (enum dwarf_section_display_enum debug, void *file)
   if (section->start != NULL)
     return 1;
 
-  /* Locate the debug section.  */
-  sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
-  if (sec != NULL)
-    section->name = section->uncompressed_name;
-  else
-    {
-      sec = bfd_get_section_by_name (abfd, section->compressed_name);
-      if (sec != NULL)
-       section->name = section->compressed_name;
-    }
-  if (sec == NULL)
-    return 0;
   section_is_compressed = section->name == section->compressed_name;
 
   section->address = 0;
@@ -2182,7 +2173,34 @@ load_debug_section (enum dwarf_section_display_enum debug, void *file)
       section->size = size;
     }
 
-  return ret;
+  return 1;
+}
+
+int
+load_debug_section (enum dwarf_section_display_enum debug, void *file)
+{
+  struct dwarf_section *section = &debug_displays [debug].section;
+  bfd *abfd = file;
+  asection *sec;
+
+  /* If it is already loaded, do nothing.  */
+  if (section->start != NULL)
+    return 1;
+
+  /* Locate the debug section.  */
+  sec = bfd_get_section_by_name (abfd, section->uncompressed_name);
+  if (sec != NULL)
+    section->name = section->uncompressed_name;
+  else
+    {
+      sec = bfd_get_section_by_name (abfd, section->compressed_name);
+      if (sec != NULL)
+        section->name = section->compressed_name;
+    }
+  if (sec == NULL)
+    return 0;
+
+  return load_specific_debug_section (debug, sec, file);
 }
 
 void
@@ -2218,17 +2236,18 @@ dump_dwarf_section (bfd *abfd, asection *section,
        && debug_displays [i].enabled != NULL
        && *debug_displays [i].enabled)
       {
-       if (!debug_displays [i].eh_frame)
-         {
-           struct dwarf_section *sec = &debug_displays [i].section;
-
-           if (load_debug_section (i, abfd))
-             {
-               debug_displays [i].display (sec, abfd);
+       struct dwarf_section *sec = &debug_displays [i].section;
 
-               if (i != info && i != abbrev)
-                 free_debug_section (i);
-             }
+       if (strcmp (sec->uncompressed_name, match) == 0)
+         sec->name = sec->uncompressed_name;
+       else
+         sec->name = sec->compressed_name;
+       if (load_specific_debug_section (i, section, abfd))
+         {
+           debug_displays [i].display (sec, abfd);
+           
+           if (i != info && i != abbrev)
+             free_debug_section (i);
          }
        break;
       }
This page took 0.024306 seconds and 4 git commands to generate.