[CLN-list] future GCC 4.3 and modules.h
Richard B. Kreckel
kreckel at ginac.de
Tue Dec 4 16:53:37 CET 2007
Hello Ralf,
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? What is
$lt_compiler_pic_CXX? It doesn't seem to exist.
> Index: include/cln/modules.h
> ===================================================================
> RCS file: /home/cvs/cln/include/cln/modules.h,v
> retrieving revision 1.19
> diff -u -r1.19 modules.h
> --- include/cln/modules.h 7 May 2006 21:05:24 -0000 1.19
> +++ include/cln/modules.h 26 May 2007 16:44:38 -0000
> @@ -219,7 +219,7 @@
> }; \
> static _CL_REQUIRE_CLASSNAME(module,__LINE__) \
> _CL_REQUIRE_CLASSNAME(module##_requirer,__LINE__);
> - #else
> + #elif 0
> // gcc-3.0 -fuse-cxa-atexit doesn't have a single per-module destructor
> // function anymore. Instead, for each object's static constructor it
> // executes, it pushes the corresponding object's destructor onto a list.
> @@ -255,9 +255,42 @@
> }; \
> static _CL_REQUIRE_CLASSNAME(module,__LINE__) \
> _CL_REQUIRE_CLASSNAME(module##_requirer,__LINE__);
> - #endif
> #define _CL_REQUIRE_CLASSNAME(module,line) __CL_REQUIRE_CLASSNAME(module,line)
> #define __CL_REQUIRE_CLASSNAME(module,line) cl_module__##module##__##line
> + #else
> + #define CL_PROVIDE(module) \
> + extern "C" void cl_module__##module##__ctorend (void); \
> + CL_GLOBALIZE_JUMP_LABEL(cl_module__##module##__ctorend) \
> + CL_GLOBALIZE_CTORDTOR_LABEL( \
> + ASM_UNDERSCORE_PREFIX CL_GLOBAL_CONSTRUCTOR_PREFIX \
> + #module ".cc") \
> + static int cl_module__##module##__counter; \
> + struct cl_module__##module##__controller { \
> + inline cl_module__##module##__controller () \
> + { if (cl_module__##module##__counter++) \
> + { CL_JUMP_TO(cl_module__##module##__ctorend); } \
> + } \
> + }; \
> + static cl_module__##module##__controller cl_module__##module##__ctordummy;
> + #define CL_PROVIDE_END(module) \
> + struct cl_module__##module##__destroyer { \
> + inline cl_module__##module##__destroyer () \
> + { CL_OUTPUT_LABEL (ASM_UNDERSCORE_PREFIX "cl_module__" #module "__ctorend"); } \
> + }; \
> + static cl_module__##module##__destroyer cl_module__##module##__dtordummy;
> + #define CL_REQUIRE(module) \
> + extern "C" void cl_module__##module##__ctor (void) \
> + __asm__ (ASM_UNDERSCORE_PREFIX CL_GLOBAL_CONSTRUCTOR_PREFIX \
> + #module ".cc"); \
> + struct _CL_REQUIRE_CLASSNAME(module,__LINE__) { \
> + inline _CL_REQUIRE_CLASSNAME(module,__LINE__) () \
> + { cl_module__##module##__ctor (); } \
> + }; \
> + static _CL_REQUIRE_CLASSNAME(module,__LINE__) \
> + _CL_REQUIRE_CLASSNAME(module##_requirer,__LINE__);
> + #define _CL_REQUIRE_CLASSNAME(module,line) __CL_REQUIRE_CLASSNAME(module,line)
> + #define __CL_REQUIRE_CLASSNAME(module,line) cl_module__##module##__##line
> +#endif
> #else
> #define CL_PROVIDE(module)
> #define CL_PROVIDE_END(module)
Cheers
-richy.
--
Richard B. Kreckel
<http://www.ginac.de/~kreckel/>
More information about the CLN-list
mailing list