RFC: Speeding up libstdc++.so with --dynamic-list-data

H. J. Lu hjl@lucon.org
Tue Jan 9 14:50:00 GMT 2007


On Mon, Jan 08, 2007 at 08:23:39PM -0800, H. J. Lu wrote:
> On Mon, Jan 08, 2007 at 08:09:59PM -0800, Andrew Pinski wrote:
> > On Mon, 2007-01-08 at 18:25 -0800, H. J. Lu wrote:
> > > I am enclosing a patch to implement a new linker swicth,
> > > --dynamic-list-data. It is -Bsymbolic for function symbols only.
> > > I tried it with C, C++, Java and Fortran on Linux/ia32, Linux/x86-64
> > > and Linux/ia64. There are only a few regressions. The function calls
> > > within the new resulting DSOs will bind locally. It speeds up
> > > the enclosed C++ testcase by
> > > 
> > > 1. 23% on ia64.
> > > 2. 6% on ia32.
> > > 3. 3% on x86-64.
> > > 
> > > Should we consider such optimization?
> > 
> > The real question is, does this work with operator new?
> > 
> > In that if I a C++ developer provides a seperate operator new (and
> > delete), does libstdc++ use that one as required by the C++ standard?
> 
> These are the regressions I was talking about. I can support them with
> a new linker switch. So far, we have
> 
>   --dynamic-list-cpp-typeinfo Use C++ typeinfo dynamic list
>   --dynamic-list FILE         Read dynamic list
> 
> My current proposal adds
> 
>   --dynamic-list-data         Add data symbols to dynamic list
> 
> I can add a new one
> 
>   --dynamic-list-cpp-new     Add C++ new/delete to dynamic list
> 
> Then we can build libstdc++ with
> 
> --dynamic-list-data --dynamic-list-cpp-new
> 

I am testing this patch now. It should fix the regresions when
libstdc++ is built with

-Bsymbolic-functions --dynamic-list-cpp-new


H.J.
----
2007-01-09  H.J. Lu  <hongjiu.lu@intel.com>

	* ldlang.c (lang_append_dynamic_list_cpp_new): New.
	* ldlang.h (lang_append_dynamic_list_cpp_new): Likewise.

	* lexsup.c (option_values): Add OPTION_DYNAMIC_LIST_CPP_NEW.
	(ld_options): Add entries for OPTION_DYNAMIC_LIST_CPP_NEW.
	(parse_args): Handle OPTION_DYNAMIC_LIST_CPP_NEW.

--- ld/ldlang.c.new	2007-01-09 06:15:11.000000000 -0800
+++ ld/ldlang.c	2007-01-09 06:20:41.000000000 -0800
@@ -7086,3 +7086,24 @@ lang_append_dynamic_list_cpp_typeinfo (v
 
   lang_append_dynamic_list (dynamic);
 }
+
+/* Append the list of C++ operator new and delete dynamic symbols to the
+   existing one.  */
+
+void
+lang_append_dynamic_list_cpp_new (void)
+{
+  const char * symbols [] =
+    {
+      "operator new*",
+      "operator delete*"
+    };
+  struct bfd_elf_version_expr *dynamic = NULL;
+  unsigned int i;
+
+  for (i = 0; i < ARRAY_SIZE (symbols); i++)
+    dynamic = lang_new_vers_pattern (dynamic, symbols [i], "C++",
+				     FALSE);
+
+  lang_append_dynamic_list (dynamic);
+}
--- ld/ldlang.h.new	2006-10-25 07:31:37.000000000 -0700
+++ ld/ldlang.h	2007-01-09 06:21:08.000000000 -0800
@@ -607,6 +607,7 @@ extern void lang_register_vers_node
   (const char *, struct bfd_elf_version_tree *, struct bfd_elf_version_deps *);
 extern void lang_append_dynamic_list (struct bfd_elf_version_expr *);
 extern void lang_append_dynamic_list_cpp_typeinfo (void);
+extern void lang_append_dynamic_list_cpp_new (void);
 bfd_boolean unique_section_p
   (const asection *);
 extern void lang_add_unique
--- ld/lexsup.c.new	2007-01-09 06:15:11.000000000 -0800
+++ ld/lexsup.c	2007-01-09 06:22:30.000000000 -0800
@@ -109,6 +109,7 @@ enum option_values
   OPTION_VERSION_SCRIPT,
   OPTION_VERSION_EXPORTS_SECTION,
   OPTION_DYNAMIC_LIST,
+  OPTION_DYNAMIC_LIST_CPP_NEW,
   OPTION_DYNAMIC_LIST_CPP_TYPEINFO,
   OPTION_WARN_COMMON,
   OPTION_WARN_CONSTRUCTORS,
@@ -506,6 +507,8 @@ static const struct ld_option ld_options
      OPTION_VERSION_EXPORTS_SECTION },
     '\0', N_("SYMBOL"), N_("Take export symbols list from .exports, using\n"
 			   "\t\t\t\tSYMBOL as the version."), TWO_DASHES },
+  { {"dynamic-list-cpp-new", no_argument, NULL, OPTION_DYNAMIC_LIST_CPP_NEW},
+    '\0', NULL, N_("Use C++ operator new/delete dynamic list"), TWO_DASHES },
   { {"dynamic-list-cpp-typeinfo", no_argument, NULL, OPTION_DYNAMIC_LIST_CPP_TYPEINFO},
     '\0', NULL, N_("Use C++ typeinfo dynamic list"), TWO_DASHES },
   { {"dynamic-list", required_argument, NULL, OPTION_DYNAMIC_LIST},
@@ -1255,6 +1258,10 @@ parse_args (unsigned argc, char **argv)
 	  lang_append_dynamic_list_cpp_typeinfo ();
 	  link_info.dynamic = TRUE;
 	  break;
+	case OPTION_DYNAMIC_LIST_CPP_NEW:
+	  lang_append_dynamic_list_cpp_new ();
+	  link_info.dynamic = TRUE;
+	  break;
 	case OPTION_DYNAMIC_LIST:
 	  /* This option indicates a small script that only specifies
 	     a dynamic list.  Read it, but don't assume that we've



More information about the Binutils mailing list