Speed up objdump when displaying disassembly mixed with line number and source code...
authorNick Clifton <nickc@redhat.com>
Mon, 9 Jan 2017 16:49:48 +0000 (16:49 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 9 Jan 2017 16:49:48 +0000 (16:49 +0000)
bfd * dwarf2.c (lookup_address_in_function_table): Return early if
there are no functions in the given comp unit, or if the high
address of the last function in the comp unit is less than the
desired address.

binutils * objdump.c (display_file): Add new parameter 'last_file'.  If
last_file is true, do not call bfd_close at the end of the
function.
(main): Set the value of the last_file parameter when calling
display_file.

bfd/ChangeLog
bfd/dwarf2.c
binutils/ChangeLog
binutils/objdump.c

index 933feba0bd4fd18344f6c3b81e573d7f0b1d450d..83a71169d5ae110a4c6795381998b89c4be7d1af 100644 (file)
@@ -1,3 +1,10 @@
+2017-01-09  Nick Clifton  <nickc@redhat.com>
+
+       * dwarf2.c (lookup_address_in_function_table): Return early if
+       there are no functions in the given comp unit, or if the high
+       address of the last function in the comp unit is less than the
+       desired address.
+
 2017-01-09  Nick Clifton  <nickc@redhat.com>
 
        PR binutils/21013
index b477d27cfd50f9597f49191ae4a9845df5d319f2..40edd91aefac62fed89c53ea2b52f709bb7298d0 100644 (file)
@@ -2336,9 +2336,15 @@ lookup_address_in_function_table (struct comp_unit *unit,
   bfd_size_type low, high, mid, first;
   struct arange *arange;
 
+  if (number_of_functions == 0)
+    return FALSE;
+
   if (!build_lookup_funcinfo_table (unit))
     return FALSE;
 
+  if (unit->lookup_funcinfo_table[number_of_functions - 1].high_addr < addr)
+    return FALSE;
+  
   /* Find the first function in the lookup table which may contain the
      specified address.  */
   low = 0;
index b5e82fed645a837c9300512a3cf8590752bac613..a37f56cbce83b12a90e2b8c36f1686ec9d0edc39 100644 (file)
@@ -1,3 +1,11 @@
+2017-01-09  Nick Clifton  <nickc@redhat.com>
+
+       * objdump.c (display_file): Add new parameter 'last_file'.  If
+       last_file is true, do not call bfd_close at the end of the
+       function.
+       (main): Set the value of the last_file parameter when calling
+       display_file.
+
 2017-01-09  Alan Modra  <amodra@gmail.com>
 
        * readelf.c (process_section_headers): Correct .rel.dyn/.rela.dyn
index f61968b9d5c4c3f58cfdabb05fdf80d539b51012..c03dfc5f25e887b6fd9c4000dcf180473df07083 100644 (file)
@@ -3616,7 +3616,7 @@ display_any_bfd (bfd *file, int level)
 }
 
 static void
-display_file (char *filename, char *target)
+display_file (char *filename, char *target, bfd_boolean last_file)
 {
   bfd *file;
 
@@ -3635,7 +3635,18 @@ display_file (char *filename, char *target)
 
   display_any_bfd (file, 0);
 
-  bfd_close (file);
+  /* This is an optimization to improve the speed of objdump, especially when
+     dumping a file with lots of associated debug informatiom.  Calling
+     bfd_close on such a file can take a non-trivial amount of time as there
+     are lots of lists to walk and buffers to free.  This is only really
+     necessary however if we are about to load another file and we need the
+     memory back.  Otherwise, if we are about to exit, then we can save (a lot
+     of) time by only doing a quick close, and allowing the OS to reclaim the
+     memory for us.  */
+  if (! last_file)
+    bfd_close (file);
+  else
+    bfd_close_all_done (file);
 }
 \f
 int
@@ -3913,10 +3924,13 @@ main (int argc, char **argv)
   else
     {
       if (optind == argc)
-       display_file ("a.out", target);
+       display_file ("a.out", target, TRUE);
       else
        for (; optind < argc;)
-         display_file (argv[optind++], target);
+         {
+           display_file (argv[optind], target, optind == argc - 1);
+           optind++;
+         }
     }
 
   free_only_list ();