This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch 1/2] Speed up JIT support


Greetings,

In earlier thread: http://sourceware.org/ml/gdb/2011-01/msg00009.html, Pedro
suggested that we should eliminate repeated symbol lookups by stashing
relevant info in per-objfile data.

This series of patches implements the idea.

The first patch merely reshuffles the code around to make it more convenient
to cache the results. The second patch is the "meat" of the change.

Timing results using:

  /usr/bin/time ./gdb -nx -q -ex 'run' -ex quit --args \
    testsuite/gdb.base/jit-main testsuite/gdb.base/jit-solib.so N

### before ###
   N   time
 300   1.04user 0.19system 0:01.24elapsed 99%CPU
 400   2.75user 0.16system 0:02.94elapsed 98%CPU
 500   5.70user 0.30system 0:06.04elapsed 99%CPU
 600  10.98user 0.28system 0:11.31elapsed 99%CPU
 700  18.56user 0.30system 0:18.96elapsed 99%CPU
 800  28.57user 0.46system 0:29.16elapsed 99%CPU

### after ###
   N   time
 600   0.48user 0.25system 0:00.75elapsed 96%CPU
1000   1.04user 0.40system 0:01.44elapsed 99%CPU
2000   3.17user 0.95system 0:04.23elapsed 97%CPU
3000   7.20user 1.44system 0:08.89elapsed 97%CPU
4000  13.67user 1.93system 0:15.97elapsed 97%CPU
5000  23.41user 2.46system 0:26.41elapsed 97%CPU

This is still showing non-linear growth, but the factors are much nicer ;-)

Next up: move jit_breakpoint_re_set into breakpoint.c and make it use
the same mechanism (lookup_minimal_symbol{,_text} are still major CPU
consumers, though find_pc_section moves to the top spot).

Thanks,
--
Paul Pluzhnikov


2010-02-03  Paul Pluzhnikov  <ppluzhnikov@google.com>

	* breakpoint.c (create_overlay_event_breakpoint): Adjust.
	(create_longjmp_master_breakpoint): Adjust.
	(create_std_terminate_master_breakpoint): Adjust.
	(update_breakpoints_after_exec): Adjust.
	(breakpoint_re_set): Adjust.


Index: breakpoint.c
===================================================================
RCS file: /cvs/src/src/gdb/breakpoint.c,v
retrieving revision 1.532
diff -u -p -r1.532 breakpoint.c
--- breakpoint.c	31 Jan 2011 21:37:01 -0000	1.532
+++ breakpoint.c	3 Feb 2011 21:37:16 -0000
@@ -2218,9 +2218,10 @@ create_internal_breakpoint (struct gdbar
 }
 
 static void
-create_overlay_event_breakpoint (char *func_name)
+create_overlay_event_breakpoint (void)
 {
   struct objfile *objfile;
+  const char *const func_name = "_ovly_debug_event";
 
   ALL_OBJFILES (objfile)
     {
@@ -2251,48 +2252,64 @@ create_overlay_event_breakpoint (char *f
 }
 
 static void
-create_longjmp_master_breakpoint (char *func_name)
+create_longjmp_master_breakpoint (void)
 {
   struct program_space *pspace;
-  struct objfile *objfile;
   struct cleanup *old_chain;
 
   old_chain = save_current_program_space ();
 
   ALL_PSPACES (pspace)
-  ALL_OBJFILES (objfile)
+  {
+    struct objfile *objfile;
+
+    set_current_program_space (pspace);
+
+    ALL_OBJFILES (objfile)
     {
-      struct breakpoint *b;
-      struct minimal_symbol *m;
+      const char *const longjmp_names[]
+	= { "longjmp", "_longjmp", "siglongjmp", "_siglongjmp" };
+      const int num_longjmp_names
+	= sizeof (longjmp_names) / sizeof (longjmp_names[0]);
+      int i;
+      struct gdbarch *gdbarch;
 
-      if (!gdbarch_get_longjmp_target_p (get_objfile_arch (objfile)))
+      gdbarch = get_objfile_arch (objfile);
+      if (!gdbarch_get_longjmp_target_p (gdbarch))
 	continue;
 
-      set_current_program_space (pspace);
+      for (i = 0; i < num_longjmp_names; i++)
+	{
+	  struct breakpoint *b;
+	  struct minimal_symbol *m;
+	  const char *func_name;
 
-      m = lookup_minimal_symbol_text (func_name, objfile);
-      if (m == NULL)
-        continue;
+	  func_name = longjmp_names[i];
+	  m = lookup_minimal_symbol_text (func_name, objfile);
+	  if (m == NULL)
+	    continue;
 
-      b = create_internal_breakpoint (get_objfile_arch (objfile),
-				      SYMBOL_VALUE_ADDRESS (m),
-                                      bp_longjmp_master);
-      b->addr_string = xstrdup (func_name);
-      b->enable_state = bp_disabled;
+	  b = create_internal_breakpoint (gdbarch,
+					  SYMBOL_VALUE_ADDRESS (m),
+					  bp_longjmp_master);
+	  b->addr_string = xstrdup (func_name);
+	  b->enable_state = bp_disabled;
+	}
     }
+  }
   update_global_location_list (1);
 
   do_cleanups (old_chain);
 }
 
-/* Create a master std::terminate breakpoint.  The actual function
-   looked for is named FUNC_NAME.  */
+/* Create a master std::terminate breakpoint.  */
 static void
-create_std_terminate_master_breakpoint (const char *func_name)
+create_std_terminate_master_breakpoint (void)
 {
   struct program_space *pspace;
   struct objfile *objfile;
   struct cleanup *old_chain;
+  const char *const func_name = "std::terminate()";
 
   old_chain = save_current_program_space ();
 
@@ -2462,12 +2479,9 @@ update_breakpoints_after_exec (void)
       }
   }
   /* FIXME what about longjmp breakpoints?  Re-create them here?  */
-  create_overlay_event_breakpoint ("_ovly_debug_event");
-  create_longjmp_master_breakpoint ("longjmp");
-  create_longjmp_master_breakpoint ("_longjmp");
-  create_longjmp_master_breakpoint ("siglongjmp");
-  create_longjmp_master_breakpoint ("_siglongjmp");
-  create_std_terminate_master_breakpoint ("std::terminate()");
+  create_overlay_event_breakpoint ();
+  create_longjmp_master_breakpoint ();
+  create_std_terminate_master_breakpoint ();
   create_exception_master_breakpoint ();
 }
 
@@ -10716,12 +10730,9 @@ breakpoint_re_set (void)
 
   do_cleanups (old_chain);
 
-  create_overlay_event_breakpoint ("_ovly_debug_event");
-  create_longjmp_master_breakpoint ("longjmp");
-  create_longjmp_master_breakpoint ("_longjmp");
-  create_longjmp_master_breakpoint ("siglongjmp");
-  create_longjmp_master_breakpoint ("_siglongjmp");
-  create_std_terminate_master_breakpoint ("std::terminate()");
+  create_overlay_event_breakpoint ();
+  create_longjmp_master_breakpoint ();
+  create_std_terminate_master_breakpoint ();
   create_exception_master_breakpoint ();
 }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]