Hi Pedro, > Currently, with C++ namespace support enabled, by defining > GNULIB_NAMESPACE, the replacement symbols put in the GNULIB_NAMESPACE > namespace are function pointers that point to the rpl_func functions. > This means that the linker must pull in the rpl_func functions, even > when "GNULIB_NAMESPACE::func(....)" is not called anywhere in the > program. > > Fix that by making the GNULIB_NAMESPACE::func symbols be C++ (empty) > objects with inline conversion operators instead of function pointers > that point to the replacement.
A really nice improvement. It works even with -O0. I added ChangeLog entries for your two patches from 2016-11-12 (that Paul committed). The member function 'rpl ()' is not used, other than in the 'operator type'. How about inlining and eliminating it? 2016-11-19 Bruno Haible <br...@clisp.org> snippet/c++defs: Simplify _GL_CXXALIAS_* macros. * build-aux/snippet/c++defs.h [__cplusplus && GNULIB_NAMESPACE] (_GL_CXXALIAS_RPL_1, _GL_CXXALIAS_RPL_CAST_1, _GL_CXXALIAS_SYS, _GL_CXXALIAS_SYS_CAST, _GL_CXXALIAS_SYS_CAST2): Inline and remove member function 'rpl ()' of the wrapper struct. diff --git a/build-aux/snippet/c++defs.h b/build-aux/snippet/c++defs.h index b19a0be..c71475d 100644 --- a/build-aux/snippet/c++defs.h +++ b/build-aux/snippet/c++defs.h @@ -133,8 +133,7 @@ static const struct _gl_ ## func ## _wrapper \ { \ typedef rettype (*type) parameters; \ - inline type rpl () const { return ::rpl_func; } \ - inline operator type () const { return rpl (); } \ + inline operator type () const { return ::rpl_func; } \ } func = {}; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy @@ -155,9 +154,7 @@ static const struct _gl_ ## func ## _wrapper \ { \ typedef rettype (*type) parameters; \ - inline type rpl () const \ - { return reinterpret_cast<type>(::rpl_func); } \ - inline operator type () const { return rpl (); } \ + inline operator type () const { return reinterpret_cast<type>(::rpl_func); } \ } func = {}; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy @@ -183,10 +180,9 @@ static const struct _gl_ ## func ## _wrapper \ { \ typedef rettype (*type) parameters; \ - inline type rpl () const { return ::func; } \ - inline operator type () const { return rpl (); } \ + inline operator type () const { return ::func; } \ } func = {}; \ - } \ + } \ _GL_EXTERN_C int _gl_cxxalias_dummy #else # define _GL_CXXALIAS_SYS(func,rettype,parameters) \ @@ -205,9 +201,7 @@ static const struct _gl_ ## func ## _wrapper \ { \ typedef rettype (*type) parameters; \ - inline type rpl () const \ - { return reinterpret_cast<type>(::func); } \ - inline operator type () const { return rpl (); }\ + inline operator type () const { return reinterpret_cast<type>(::func); } \ } func = {}; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy @@ -234,11 +228,7 @@ static const struct _gl_ ## func ## _wrapper \ { \ typedef rettype (*type) parameters; \ - \ - inline type rpl () const \ - { return reinterpret_cast<type>((rettype2 (*) parameters2)(::func)); }\ - \ - inline operator type () const { return rpl (); } \ + inline operator type () const { return reinterpret_cast<type>((rettype2 (*) parameters2)(::func)); } \ } func = {}; \ } \ _GL_EXTERN_C int _gl_cxxalias_dummy