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 <[EMAIL PROTECTED]> * 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