--- gforth/engine/forth.h 2012/03/13 22:56:39 1.119 +++ gforth/engine/forth.h 2012/12/31 15:25:19 1.133 @@ -1,6 +1,6 @@ /* common header file - Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009,2010,2011 Free Software Foundation, Inc. + Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012 Free Software Foundation, Inc. This file is part of Gforth. @@ -303,6 +303,17 @@ typedef Label *Xt; #define rpTOS (rp[0]) typedef struct { + Cell next_task; + Cell prev_task; + Cell save_task; + Cell* sp0; + Cell* rp0; + Float* fp0; + Address lp0; + Xt *throw_entry; +} user_area; + +typedef struct { Address base; /* base address of image (0 if relocatable) */ UCell checksum; /* checksum of ca's to protect against some incompatible binary/executable combinations @@ -315,12 +326,10 @@ typedef struct { UCell locals_stack_size; Xt *boot_entry; /* initial ip for booting (in BOOT) */ Xt *throw_entry; /* ip after signal (in THROW) */ - Cell unused1; /* possibly tib stack size */ + Xt *quit_entry; + Xt *execute_entry; + Xt *find_entry; Label *xt_base; /* base of DOUBLE_INDIRECT xts[], for comp-i.fs */ - Address data_stack_base; /* this and the following fields are initialized by the loader */ - Address fp_stack_base; - Address return_stack_base; - Address locals_stack_base; } ImageHeader; /* the image-header is created in main.fs */ @@ -363,30 +372,47 @@ typedef struct saved_regs { Xt *sr_saved_ip; Cell *sr_rp; } saved_regs; -extern saved_regs saved_regs_v, *saved_regs_p; +extern saved_regs saved_regs_v; +extern PER_THREAD saved_regs *saved_regs_p; #define saved_ip (saved_regs_p->sr_saved_ip) #define rp (saved_regs_p->sr_rp) /* for use in gforth_engine header */ #error sr_proto not passed in fflib.fs callbacks (solution: disable GLOBALS_NONRELOC) #define sr_proto , struct saved_regs *saved_regs_p0 #define sr_call , saved_regs_p -#define sr_arg , arg[5] #else /* !defined(GLOBALS_NONRELOC) */ -extern Xt *saved_ip; -extern Cell *rp; +extern PER_THREAD Xt *saved_ip; +extern PER_THREAD Cell *rp; #define sr_proto #define sr_call -#define sr_arg #endif /* !defined(GLOBALS_NONRELOC) */ #else /* !defined(GFORTH_DEBUGGING) */ #define sr_proto #define sr_call -#define sr_arg #endif /* !defined(GFORTH_DEBUGGING) */ -Label *gforth_engine(Xt *ip, Cell *sp, Cell *rp0, Float *fp, Address lp sr_proto); -Label *gforth_engine2(Xt *ip, Cell *sp, Cell *rp0, Float *fp, Address lp sr_proto); -Label *gforth_engine3(Xt *ip, Cell *sp, Cell *rp0, Float *fp, Address lp sr_proto); +Label *gforth_engine(Xt *ip sr_proto); +Label *gforth_engine2(Xt *ip sr_proto); +Label *gforth_engine3(Xt *ip sr_proto); + + +int gforth_main(int argc, char **argv, char **env); +void gforth_args(int argc, char ** argv, char ** path, char ** imagename); +Address gforth_loader(char* imagename, char* path); +user_area* gforth_stacks(Cell dsize, Cell rsize, Cell fsize, Cell lsize); +void gforth_free_stacks(user_area* t); +void gforth_free(); +Cell gforth_go(Xt* ip0); +int gforth_boot(int argc, char** argv, char* path); +int gforth_start(int argc, char ** argv); +int gforth_quit(); +Xt gforth_find(Char * name); +int gforth_execute(Xt xt); +void gforth_cleanup(); +void gforth_printmetrics(); +#if defined(DOUBLY_INDIRECT) +int gforth_make_image(int debugflag); +#endif /* for ABI-CODE and ;ABI-CODE */ typedef Cell *abifunc(Cell *sp, Float **fpp); @@ -410,7 +436,7 @@ struct Cellpair parse_white(Char *c_addr Cell rename_file(Char *c_addr1, UCell u1, Char *c_addr2, UCell u2); struct Cellquad read_line(Char *c_addr, UCell u1, FILE *wfileid); struct Cellpair file_status(Char *c_addr, UCell u); -Cell to_float(Char *c_addr, UCell u, Float *r_p); +Cell to_float(Char *c_addr, UCell u, Float *r_p, Char dot); Float v_star(Float *f_addr1, Cell nstride1, Float *f_addr2, Cell nstride2, UCell ucount); void faxpy(Float ra, Float *f_x, Cell nstridex, Float *f_y, Cell nstridey, UCell ucount); UCell lshift(UCell u1, UCell n); @@ -467,16 +493,13 @@ extern int debug; # define debug 0 #endif -extern __thread Cell *gforth_SP; -extern __thread Cell *gforth_RP; -extern __thread Address gforth_LP; -extern __thread Float *gforth_FP; -extern __thread Address gforth_UP; -#ifndef HAS_LINKBACK -extern __thread void * gforth_pointers[]; -#endif +extern PER_THREAD Cell *gforth_SP; +extern PER_THREAD Cell *gforth_RP; +extern PER_THREAD Address gforth_LP; +extern PER_THREAD Float *gforth_FP; +extern PER_THREAD user_area* gforth_UP; -extern void gforth_backlink(); +extern void * gforth_pointers(Cell n); #ifdef HAS_FFCALL extern void gforth_callback(Xt* fcall, void * alist);