[CLN-list] future GCC 4.3 and modules.h

Ralf Wildenhues Ralf.Wildenhues at gmx.de
Sun Dec 16 21:12:00 CET 2007


Hello Richard,

Apologies for the long delay, and thanks for the patience.

* Richard B. Kreckel wrote on Tue, Dec 04, 2007 at 04:53:37PM CET:
> On 2007-07-16, you wrote:
>> Consider this code snippet:
>>
>> extern "C" void func () {}
>> __asm__("\t.globl " "_GLOBAL__I_" "func");
>> static struct S {
>>   inline S () { }
>> } S;
>>
>> On x86_64, with `g++-4.2 -fPIC -c a.cc', this results in
>> | 0000000000000032 T _GLOBAL__I_func
>>
>> with mainline GCC (what will eventually be 4.3 or some other number), it
>> has
>> | 0000000000000032 t _GLOBAL__I_a.cc
>>
>> (and of course that will be `T' with the appropriate .globl directive).
>>
>> This affects .libs/cl_DF_globals.o and some of the other globals
>> objects, and causes a link failure of the examples due to the CL_REQUIRE
>> undefined references (global constructor keyed to ...).
>>
>> The hack below makes things work with mainline, but still needs to be
>> redone properly, with a configure-time check and so on to not regress
>> on g++ <= 4.2.  If you like I can take a stab at writing so; I assume
>> the test should make use of $lt_compiler_pic_CXX and the header file
>> provide different defines based on whether -DPIC was given?  (I'm not
>> all that experienced with this stuff, so pointers are greatly
>> appreciated.)
>
> Can you write such a patch? I'm a little confused how to do the switch 
> properly. Would it be bad to just combine #ifdef PIC and a test for 
> __GNUC__ and __GNUC_MINOR__ inside modules.h?

A feature-based test seems nicer to me.

> What is $lt_compiler_pic_CXX?  It doesn't seem to exist.

Oh sorry, that should've been lt_prog_compiler_pic_CXX, and is set by
AC_PROG_LIBTOOL.

Here's a proposed patch that seems to do the right thing for me, and
otherwise uses the same Autoconf macro style as the other code already
in c++-constructors.m4.  The macro as of now is fairly CLN-centric in
that it hard-codes "cl_module__" and "__firstglobalfun" into the cached
value.  I tried it with Autoconf 2.59 and HEAD.  I will try to build CLN
with this, with GCC 4.1.1 and svn HEAD on GNU/Linux x86, but results may
take up to a couple of days (so if you're in a hurry you may want to
test yourself).

Cheers,
Ralf

2007-12-16  Ralf Wildenhues  <Ralf.Wildenhues at gmx.de>

	Cater to the fact that g++ 4.3 will use a different naming for
	the global constructor suffix.
	* m4/c++-constructors.m4 (CL_GLOBAL_CONSTRUCTORS): Add test for
	the global constructor suffix, define CL_GLOBAL_CONSTRUCTOR_SUFFIX
	appropriately.
	* include/cln/config.h.in: Provide template to be filled in by
	configure.
	* include/cln/modules.h (CL_PROVIDE, CL_REQUIRE): Use
	CL_GLOBAL_CONSTRUCTOR_SUFFIX.

Index: include/cln/config.h.in
===================================================================
RCS file: /home/cvs/cln/include/cln/config.h.in,v
retrieving revision 1.10
diff -u -r1.10 config.h.in
--- include/cln/config.h.in	13 Jun 2006 18:31:18 -0000	1.10
+++ include/cln/config.h.in	16 Dec 2007 19:13:38 -0000
@@ -141,6 +141,10 @@
 /* Define if a module's global constructor function and global destructor
    function need to be exported in order to be accessible from other modules. */
 #undef CL_NEED_GLOBALIZE_CTORDTOR
+/* Define as the suffix of the name of a module's global constructor function */
+#ifndef CL_GLOBAL_CONSTRUCTOR_SUFFIX
+#undef CL_GLOBAL_CONSTRUCTOR_SUFFIX
+#endif
 
 /* CL_CHAR_UNSIGNED */
 #ifndef __CHAR_UNSIGNED__
Index: include/cln/modules.h
===================================================================
RCS file: /home/cvs/cln/include/cln/modules.h,v
retrieving revision 1.20
diff -u -r1.20 modules.h
--- include/cln/modules.h	18 Sep 2007 21:56:18 -0000	1.20
+++ include/cln/modules.h	16 Dec 2007 19:13:38 -0000
@@ -231,7 +231,7 @@
       CL_GLOBALIZE_JUMP_LABEL(cl_module__##module##__ctorend)		\
       CL_GLOBALIZE_CTORDTOR_LABEL(					\
                  ASM_UNDERSCORE_PREFIX CL_GLOBAL_CONSTRUCTOR_PREFIX	\
-                 "cl_module__" #module "__firstglobalfun")		\
+                 CL_GLOBAL_CONSTRUCTOR_SUFFIX(module))				\
       static int cl_module__##module##__counter;			\
       struct cl_module__##module##__controller {			\
         inline cl_module__##module##__controller ()			\
@@ -249,7 +249,7 @@
     #define CL_REQUIRE(module)  \
       extern "C" void cl_module__##module##__ctor (void)		\
         __asm__ (ASM_UNDERSCORE_PREFIX CL_GLOBAL_CONSTRUCTOR_PREFIX	\
-                 "cl_module__" #module "__firstglobalfun");		\
+                 CL_GLOBAL_CONSTRUCTOR_SUFFIX(module));				\
       struct _CL_REQUIRE_CLASSNAME(module,__LINE__) {			\
         inline _CL_REQUIRE_CLASSNAME(module,__LINE__) ()		\
           { cl_module__##module##__ctor (); }				\
Index: m4/c++-constructors.m4
===================================================================
RCS file: /home/cvs/cln/m4/c++-constructors.m4,v
retrieving revision 1.1
diff -u -r1.1 c++-constructors.m4
--- m4/c++-constructors.m4	29 Aug 2005 13:18:40 -0000	1.1
+++ m4/c++-constructors.m4	16 Dec 2007 19:13:38 -0000
@@ -95,6 +95,23 @@
 if test "$cl_cv_cplusplus_ctorexport" = yes; then
   AC_DEFINE(CL_NEED_GLOBALIZE_CTORDTOR)
 fi
+AC_CACHE_CHECK([for the global constructor function suffix],
+cl_cv_cplusplus_ctorsuffix, [
+cat > conftest.cc << EOF
+extern "C" void func () {}
+static struct S {
+  inline S () { }
+} S;
+EOF
+AC_TRY_COMMAND(${CXX-g++} $CXXFLAGS ${lt_prog_compiler_pic_CXX-"-fPIC"} -S conftest.cc) >/dev/null 2>&1
+if grep "${cl_cv_cplusplus_ctorprefix}conftest\.cc" conftest.s >/dev/null; then
+  cl_cv_cplusplus_ctorsuffix='#module ".cc"'
+else
+  cl_cv_cplusplus_ctorsuffix='"cl_module__" #module "__firstglobalfun"'
+fi
+rm -f conftest*
+])
+AC_DEFINE_UNQUOTED([CL_GLOBAL_CONSTRUCTOR_SUFFIX(module)], [$cl_cv_cplusplus_ctorsuffix])
 fi
 fi
 ])


More information about the CLN-list mailing list