changes for C++ constructors on psim

Ralf Corsepius ralf_corsepius at rtems.org
Thu May 6 04:23:16 UTC 2004


Comments interspersed ...

On Thu, 2004-05-06 at 00:08, JP Bonn wrote:
> This is against the 4.6.1 release.  I plan on making a formal patch but
> it'll be a little bit.  These changes make the cdtest program, including
> iostreams, work on psim. There are also changes to cdtest that are
> independent of the psim changes that allow it to compile if iostreams
> are used.
> 
> I wanted someone who understand RTEMS to check that I was setting flags
> in the proper files. The linker script changes are the same as some of
> the other bsps.
> 
> =======================================================================
> 
> diff -N -P -r -c rtems-4.6.1/c/src/lib/libbsp/powerpc/psim/bsp_specs
> rtems-4.6.1.mod/c/src/lib/libbsp/powerpc/psim/bsp_specs
> *** rtems-4.6.1/c/src/lib/libbsp/powerpc/psim/bsp_specs	Fri Aug 22
> 11:50:48 2003
> --- rtems-4.6.1.mod/c/src/lib/libbsp/powerpc/psim/bsp_specs	Tue May  4
> 14:14:06 2004
> ***************
> *** 10,21 ****
>   %{!qnolinkcmds: -T linkcmds%s}}}
>   
>   *startfile:
> ! %{!qrtems: %(old_startfile)} %{!nostdlib: %{qrtems:  ecrti%O%s \
>   %{!qrtems_debug: start.o%s} \
>   %{qrtems_debug: start_g.o%s}}}
>   
>   *endfile:
> ! %{!qrtems: %(old_endfile)} %{qrtems: ecrtn%O%s}
>   
>   *link:
>   %{!qrtems: %(old_link)} %{qrtems: -Qy -dp -Bstatic -e _start -u __vectors}
> --- 10,21 ----
>   %{!qnolinkcmds: -T linkcmds%s}}}
>   
>   *startfile:
> ! %{!qrtems: %(old_startfile)} %{!nostdlib: %{qrtems:  ecrti%O%s
> crtbegin%O%s \
>   %{!qrtems_debug: start.o%s} \
>   %{qrtems_debug: start_g.o%s}}}
>   
>   *endfile:
> ! %{!qrtems: %(old_endfile)} %{qrtems: crtend%O%s ecrtn%O%s}
>   
>   *link:
>   %{!qrtems: %(old_link)} %{qrtems: -Qy -dp -Bstatic -e _start -u __vectors}
Well, there had been similar proposals to other BSPs, before ... and ...
they are causing me some headaches.

IMO, such crt* handling should be added to gcc (i.e. to specs) instead
of bsp_specs, because gcc's crt*-stuff is shared for all BSPs.
Instead of adding crt*-stuff to BSPs' *startfile, *endfile, I'd prefer
to see the BSP's *startfile, *endfile etc. use the original
%(startfile), %(endfile), etc.

Unfortunately, I haven't found enough time to try implementing,
therefore don't really know if it is possible,  and of cause don't have
a patch proposal at hand.


> diff -N -P -r -c rtems-4.6.1/c/src/tests/samples/cdtest/main.cc
> rtems-4.6.1.mod/c/src/tests/samples/cdtest/main.cc
> *** rtems-4.6.1/c/src/tests/samples/cdtest/main.cc	Thu Sep  4 11:46:30 2003
> --- rtems-4.6.1.mod/c/src/tests/samples/cdtest/main.cc	Tue May  4
> 14:14:06 2004
> ***************
> *** 29,37 ****
>   #include <stdio.h>
>   #include <stdlib.h>
>   #ifdef RTEMS_TEST_IO_STREAM
> ! #include <iostream.h>
>   #endif
>   
>   extern "C" 
>   {
>   #include <tmacros.h>
> --- 29,47 ----
>   #include <stdio.h>
>   #include <stdlib.h>
>   #ifdef RTEMS_TEST_IO_STREAM
> ! #include <iostream>
>   #endif
>   
> + 
> + void my_ctor (void) __attribute__ ((constructor));
> + void
> + my_ctor (void)
> + {
> + 	                printf ("hello before main()\n");
> + }

As Chris already mentioned, C constructors are a GCC extension.
Therefore this function should be guarded by __GNUC__ #defines.

Also, you are adding "my_ctor" to a C++ file, i.e. you actually are
attributing a C++ function as constructor. If you want to test C
constructors, this function should be put into a separate *.c file, or
be marked 'extern "C"'.

Another issue is the '__attribute__(..)'.
This is a GCC internal define. If you want the code to be portable you
have to define it for non-GCC compilers.

> + 
> + 
>   extern "C" 
>   {
>   #include <tmacros.h>
> ***************
> *** 134,141 ****
>   
>   
>   
> ! AClass foo( "GLOBAL" );
> ! BClass foobar( "GLOBAL" );
>   
>   void
>   cdtest(void)
> --- 144,151 ----
>   
>   
>   
> ! AClass fooAClass( "GLOBAL fooAClass" );
> ! BClass fooBClass( "GLOBAL fooBClass" );
>   
>   void
>   cdtest(void)
> ***************
> *** 144,150 ****
>       BClass bleak;
>   
>   #ifdef RTEMS_TEST_IO_STREAM
> !     cout << "Testing a C++ I/O stream" << endl;
>   #else
>       printf("IO Stream not tested\n");
>   #endif
> --- 154,160 ----
>       BClass bleak;
>   
>   #ifdef RTEMS_TEST_IO_STREAM
> !     std::cout << "Testing a C++ I/O stream" << std::endl;
>   #else
>       printf("IO Stream not tested\n");
>   #endif
> diff -N -P -r -c rtems-4.6.1/make/custom/psim.cfg
> rtems-4.6.1.mod/make/custom/psim.cfg
> *** rtems-4.6.1/make/custom/psim.cfg	Tue May 14 08:51:29 2002
> --- rtems-4.6.1.mod/make/custom/psim.cfg	Tue May  4 14:25:24 2004
> ***************
> *** 15,27 ****
>   #  This contains the compiler options necessary to select the CPU model
>   #  and (hopefully) optimize for it. 
>   #
> ! CPU_CFLAGS = -mcpu=603e -D_OLD_EXCEPTIONS -Dppc603e
>   #-ffunction-sections
>   
>   # optimize flag: typically -0, could use -O4 or -fast
>   # -O4 is ok for RTEMS
>   # NOTE: some level of -O may be actually required by inline assembler
>   CFLAGS_OPTIMIZE_V=-O4 -fno-keep-inline-functions
>   
>   define make-exe
>   	$(LINK.c) $(AM_CFLAGS) $(AM_LDFLAGS) -o $(basename $@).exe \
> --- 15,35 ----
>   #  This contains the compiler options necessary to select the CPU model
>   #  and (hopefully) optimize for it. 
>   #
> ! CPU_CFLAGS = -mcpu=603e -D_OLD_EXCEPTIONS -Dppc603e -D__USE_INIT_FINI__
__USE_INIT_FINI__ is a gcc-internal define and is supposed to be
implicitly supplied by the compiler and should not be used on the
command-line.

If your compiler doesn't implicitly specify it, this would indicate a
bug in the compiler.

>   #-ffunction-sections
>   
>   # optimize flag: typically -0, could use -O4 or -fast
>   # -O4 is ok for RTEMS
>   # NOTE: some level of -O may be actually required by inline assembler
>   CFLAGS_OPTIMIZE_V=-O4 -fno-keep-inline-functions
> + 
> + define make-exe
> + 	$(LINK.c) $(AM_CFLAGS) $(AM_LDFLAGS) -o $(basename $@).exe \
> + 	    $(LINK_OBJS) $(LINK_LIBS)
> + 	$(NM) -g -n $@ > $(basename $@).num
> + 	$(SIZE) $@
> + endef
> + 
>
>  define make-exe
>   	$(LINK.c) $(AM_CFLAGS) $(AM_LDFLAGS) -o $(basename $@).exe \
Here, you are adding a second "define make-exe". There may only be one.

Ralf





More information about the users mailing list