diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-09-05 01:11:54 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 1998-09-05 01:11:54 +0000 |
commit | ffcbbbab99149ea7d8e800326458b70b54438076 (patch) | |
tree | e2a997b294961a00f5d259edefbef93b8501c089 /libchill/chillrt0.c | |
parent | ff8e09bdcb33f98c7094eec337fb5e93da360a0d (diff) | |
download | ppe42-gcc-ffcbbbab99149ea7d8e800326458b70b54438076.tar.gz ppe42-gcc-ffcbbbab99149ea7d8e800326458b70b54438076.zip |
* Chill runtime moved into toplevel libchill.
* Makefile.in Revamped due to move. Add multilib support.
* configure.in: Similarly. Use autoconf.
* powerset.h: Do not depend on BITS_PER_UNIT.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@22238 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libchill/chillrt0.c')
-rw-r--r-- | libchill/chillrt0.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/libchill/chillrt0.c b/libchill/chillrt0.c new file mode 100644 index 00000000000..b549602907a --- /dev/null +++ b/libchill/chillrt0.c @@ -0,0 +1,147 @@ +/* Implement runtime actions for CHILL. + Copyright (C) 1992,1993 Free Software Foundation, Inc. + Author: Wilfried Moser + +This file is part of GNU CC. + +GNU CC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU CC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU CC; see the file COPYING. If not, write to +the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> + +#include "rtltypes.h" +#include "iomodes.h" + +/* type definitions */ +typedef void (*init_ptr) (); +typedef void (*rts_init_ptr) (int *argc, char *argv []); + +typedef struct INIT_LIST +{ + init_ptr code; + struct INIT_LIST *forward; +} InitList; + +InitList *_ch_init_list = 0; + +/* force linker to get correct RTS functions */ +extern rts_init_ptr __RTS_INIT__; +extern init_ptr __RTS_MAIN_LOOP__; +extern init_ptr __RTS_FETCH_NUMBERS__; +extern init_ptr __RTS_FETCH_NAMES__; +static init_ptr *rts_dummies[4] = +{ + &__RTS_INIT__, + &__RTS_MAIN_LOOP__, + &__RTS_FETCH_NUMBERS__, + &__RTS_FETCH_NAMES__, +}; + +/* chill argc and argv */ +int chill_argc = 0; +TVaryingCharType **chill_argv = NULL; + +/* the program name for debugging purpose */ +char *progname = 0; + +extern void *__xmalloc_ (); + +/* + * function __xrealloc_ + * + * parameter: + * ptr pointer to reallocate + * size new number of bytes + * + * returns: + * void* + * + * abstract: + * This is the general reallocation routine for libchill + * + */ + +void * +__xrealloc_ (ptr, size) +void *ptr; +int size; +{ + void *tmp = realloc (ptr, size); + + if (!tmp) + { + fprintf (stderr, "ChillLib: Out of heap space.\n"); + fflush (stderr); + exit (ENOMEM); + } + return (tmp); +} /* __xrealloc_ */ + +static void +setup_argc_argv (argc, argv) +int argc; +char *argv[]; +{ + int i; + + chill_argv = __xmalloc_ ((argc + 1) * sizeof (TVaryingCharType *)); + for (i = 0; i < argc; i++) + { + chill_argv[i] = __xmalloc_ (sizeof (TVaryingCharType) + strlen (argv[i]) + 1); + chill_argv[i]->len = strlen (argv[i]); + strcpy (chill_argv[i]->body, argv[i]); + } + chill_argv[chill_argc = argc] = NULL; + + if ((progname = strrchr (argv[0], '/')) == 0) + progname = argv[0]; + else + progname++; + +} /* setup_argc_argv */ + +extern void __setexceptionStack (); + +/*--------- main entry for each CHILL - program ----------*/ +int +main (argc, argv) + int argc; + char *argv []; +{ + /* call look up for tasking */ + (*__RTS_INIT__) (&argc, argv); + + /* setup argc and argv */ + setup_argc_argv (argc, argv); + + /* clear exception stack */ + __setexceptionStack (0); + + /* now call code at module level */ + while (_ch_init_list) + { + if (_ch_init_list->code) + (*(_ch_init_list->code)) (); + _ch_init_list = _ch_init_list->forward; + } + + /* if we have rts linked, something will be done, else just return */ + (*__RTS_MAIN_LOOP__) (); + + return (0); + +} /* main */ |