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]

[gmane.comp.gdb.devel] FYI: micro-optimize producer checks


This one too.

--- Begin Message ---
I'm checking this in.

This is a second CU expansion performance micro-optimization.

As before, my test case was 'gdb -batch -readnow gdb'.

I neglected to mention in the earlier note that these tests and numbers
were done with a default ("-g -O2") build of gdb, using the Fedora 16
system gcc.

If you instead use '-g3', you will also see a big slowdown from a call
to complaint (!) in dwarf_decode_macro_bytes (it is actually dcgettext
which shows up in the profile).  This is related to a gcc bug (I
surmise, I didn't dig into it); but regardless, I think that this means
that the complaint system in gdb needs a fix.  I didn't do this today,
though.


Anyway.  I was surprised to find that gdb was spending a fair amount of
time in sscanf during CU expansion.  This was caused by repeated calls
to producer_is_gxx_lt_4_6.

The fix is to cache this information.  This is space-neutral but takes
us from 2:36 to 2:23 on the test case.  This is another 5% improvement.

Built and regtested on x86-64 Fedora 16.

Tom

2012-03-09  Tom Tromey  <tromey@redhat.com>

	* dwarf2read.c (struct dwarf2_cu) <checked_producer,
	producer_is_gxx_lt_4_6>: New fields.
	(producer_is_gxx_lt_4_6): Use and update producer cache fields.

Index: dwarf2read.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2read.c,v
retrieving revision 1.621
diff -u -r1.621 dwarf2read.c
--- dwarf2read.c	9 Mar 2012 20:06:18 -0000	1.621
+++ dwarf2read.c	9 Mar 2012 20:13:10 -0000
@@ -383,6 +383,13 @@
      any location list and still facing inlining issues if handled as
      unoptimized code.  For a future better test see GCC PR other/32998.  */
   unsigned int has_loclist : 1;
+
+  /* These cache the results of producer_is_gxx_lt_4_6.
+     CHECKED_PRODUCER is set if PRODUCER_IS_GXX_LT_4_6 is valid.  This
+     information is cached because profiling CU expansion showed
+     excessive time spent in producer_is_gxx_lt_4_6.  */
+  unsigned int checked_producer : 1;
+  unsigned int producer_is_gxx_lt_4_6 : 1;
 };
 
 /* Persistent data held for a compilation unit, even when not
@@ -6826,6 +6833,7 @@
 {
   const char *cs;
   int major, minor, release;
+  int result = 0;
 
   if (cu->producer == NULL)
     {
@@ -6841,26 +6849,33 @@
       return 0;
     }
 
+  if (cu->checked_producer)
+    return cu->producer_is_gxx_lt_4_6;
+
   /* Skip any identifier after "GNU " - such as "C++" or "Java".  */
 
   if (strncmp (cu->producer, "GNU ", strlen ("GNU ")) != 0)
     {
       /* For non-GCC compilers expect their behavior is DWARF version
 	 compliant.  */
-
-      return 0;
     }
-  cs = &cu->producer[strlen ("GNU ")];
-  while (*cs && !isdigit (*cs))
-    cs++;
-  if (sscanf (cs, "%d.%d.%d", &major, &minor, &release) != 3)
+  else
     {
-      /* Not recognized as GCC.  */
-
-      return 0;
+      cs = &cu->producer[strlen ("GNU ")];
+      while (*cs && !isdigit (*cs))
+	cs++;
+      if (sscanf (cs, "%d.%d.%d", &major, &minor, &release) != 3)
+	{
+	  /* Not recognized as GCC.  */
+	}
+      else
+	result = major < 4 || (major == 4 && minor < 6);
     }
 
-  return major < 4 || (major == 4 && minor < 6);
+  cu->checked_producer = 1;
+  cu->producer_is_gxx_lt_4_6 = result;
+
+  return result;
 }
 
 /* Return the default accessibility type if it is not overriden by


--- End Message ---

Tom

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