jjc@relay.eu.net (James Clark) (11/27/89)
It occurred to me that if gnulib3.c were written in C++ rather than C,
then the xyzzy stuff that's currently in builtin.cc could be put in
gnulib3.cc. This means that those who don't want to install all of
libg++ can use a minimal libg++.a which just contains gnulib3.o. It
also allows __main to be a little prettier.
Here's some diffs to the Makefile:
*** Makefile.dist Mon Nov 27 12:40:46 1989
--- Makefile Mon Nov 27 13:20:36 1989
***************
*** 204,212 ****
# gnulib is not a target because a proper installation of GNU CC
# will place it where g++ can find it. Same with cpp
! all: crt1+.o g++ cc1plus ld++ g++filt # collect crt0+.o
# On COFF systems, use the target below.
! # all: g++ cc1plus collect # crt0+.o crt1+.o
doc: $(srcdir)/cpp.info $(srcdir)/g++.info
--- 204,212 ----
# gnulib is not a target because a proper installation of GNU CC
# will place it where g++ can find it. Same with cpp
! all: crt1+.o g++ cc1plus ld++ g++filt gnulib3.o # collect crt0+.o
# On COFF systems, use the target below.
! # all: g++ cc1plus collect gnulib3.o # crt0+.o crt1+.o
doc: $(srcdir)/cpp.info $(srcdir)/g++.info
***************
*** 322,327 ****
--- 322,330 ----
crt1+.o: crt1.c config.h
$(CRT1_COMMAND)
mv crt1.o crt1+.o
+
+ gnulib3.o: gnulib3.cc g++ cc1plus
+ ./g++ -B./ -O -c $(COFFLAGS) $<
cc1plus: $(CPLUS_OBJS) $(OBJS) $(LIBDEPS) lastfile.o
$(CC) $(CFLAGS) $(LDFLAGS) -o cc1plus lastfile.o $(CPLUS_OBJS) $(OBJS) $(LIBS)
Here's gnulib3.cc:
#if defined(sun)
#define ON_EXIT on_exit
#endif
#ifndef USE_COLLECT
struct __xyzzy__
{
__xyzzy__ () {}
~__xyzzy__ () {}
};
static __xyzzy__ __1xyzzy__;
#endif
struct set_vector
{
int length;
int vector[1];
};
extern set_vector __CTOR_LIST__;
extern set_vector __DTOR_LIST__;
static set_vector *__dlp;
static int __dli;
static void
__do_global_init ()
{
typedef void (*ctor_t)();
register ctor_t *ppf = (ctor_t *)__CTOR_LIST__.vector;
int len = __CTOR_LIST__.length;
for (int i = 0; i < len; i++)
(*ppf[i])();
}
static void
__do_global_cleanup ()
{
typedef void (*dtor_t)();
while (__dlp)
{
while (--__dli >= 0)
{
dtor_t pf = dtor_t(__dlp->vector[__dli]);
(*pf)();
}
__dlp = (struct set_vector *)__dlp->vector[__dlp->length];
if (__dlp) __dli = __dlp->length;
}
}
extern "C" {
int
__main ()
{
#ifdef ON_EXIT
extern void ON_EXIT(void*, void*);
ON_EXIT (__do_global_cleanup, 0);
#endif
__dli = __DTOR_LIST__.length;
__dlp = &__DTOR_LIST__;
__do_global_init ();
}
#ifndef ON_EXIT
void
exit (int status)
{
extern void _cleanup ();
extern void _exit (int);
__do_global_cleanup ();
_cleanup ();
_exit (status);
}
#endif
}
James Clark
jjc@jclark.uucp