--- gforth/engine/engine.c 2007/03/17 19:14:57 1.98 +++ gforth/engine/engine.c 2007/12/31 17:34:59 1.104 @@ -1,6 +1,6 @@ /* Gforth virtual machine (aka inner interpreter) - Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006 Free Software Foundation, Inc. + Copyright (C) 1995,1996,1997,1998,2000,2003,2004,2005,2006,2007 Free Software Foundation, Inc. This file is part of Gforth. @@ -24,7 +24,6 @@ #else #define USE_TOS #endif -#define USE_NO_FTOS #include "config.h" #include "forth.h" @@ -236,7 +235,7 @@ extern int gforth_memcmp(const char * s1 #ifdef GFORTH_DEBUGGING #if DEBUG -#define NAME(string) { saved_ip=ip; asmcomment(string); fprintf(stderr,"%08lx depth=%3ld: "string"\n",(Cell)ip,sp0+3-sp);} +#define NAME(string) { saved_ip=ip; asmcomment(string); fprintf(stderr,"%08lx depth=%3ld tos=%016lx: "string"\n",(Cell)ip,sp0+3-sp,sp[0]);} #else /* !DEBUG */ #define NAME(string) { saved_ip=ip; asm(""); } /* the asm here is to avoid reordering of following stuff above the @@ -265,6 +264,15 @@ extern int gforth_memcmp(const char * s1 } #endif +#ifdef STANDALONE +jmp_buf throw_jmp_buf; + +void throw(int code) +{ + longjmp(throw_jmp_buf,code); /* !! or use siglongjmp ? */ +} +#endif + #if defined(HAS_FFCALL) || defined(HAS_LIBFFI) #define SAVE_REGS IF_fpTOS(fp[0]=fpTOS); gforth_SP=sp; gforth_FP=fp; gforth_RP=rp; gforth_LP=lp; #define REST_REGS sp=gforth_SP; fp=gforth_FP; rp=gforth_RP; lp=gforth_LP; IF_fpTOS(fpTOS=fp[0]); @@ -275,6 +283,7 @@ extern int gforth_memcmp(const char * s1 #define VARIANT(v) (v) #define JUMP(target) goto I_noop #define LABEL(name) H_##name: asm(""); I_##name: +#define LABEL3(name) J_##name: asm(""); #elif ENGINE==2 /* variant with padding between VM instructions for finding out @@ -283,6 +292,11 @@ extern int gforth_memcmp(const char * s1 #define VARIANT(v) (v) #define JUMP(target) goto I_noop #define LABEL(name) H_##name: SKIP16; I_##name: +/* the SKIP16 after LABEL3 is there, because the ARM gcc may place + some constants after the final branch, and may refer to them from + the code before label3. Since we don't copy the constants, we have + to make sure that such code is recognized as non-relocatable. */ +#define LABEL3(name) J_##name: SKIP16; #elif ENGINE==3 /* variant with different immediate arguments for finding out @@ -291,13 +305,13 @@ extern int gforth_memcmp(const char * s1 #define VARIANT(v) ((v)^0xffffffff) #define JUMP(target) goto K_lit #define LABEL(name) H_##name: asm(""); I_##name: +#define LABEL3(name) J_##name: asm(""); #else #error illegal ENGINE value #endif /* ENGINE */ /* the asm(""); is there to get a stop compiled on Itanium */ #define LABEL2(name) K_##name: asm(""); -#define LABEL3(name) J_##name: asm(""); Label *gforth_engine(Xt *ip0, Cell *sp0, Cell *rp0, Float *fp0, Address lp0) /* executes code at ip, if ip!=NULL @@ -368,7 +382,7 @@ Label *gforth_engine(Xt *ip0, Cell *sp0, #include PRIM_LAB_I #undef INST_ADDR }; -#ifdef INCLUDE_IMAGE +#ifdef STANDALONE #define INST_ADDR(name) ((Label)&&I_##name) #include "image.i" #undef INST_ADDR @@ -404,7 +418,11 @@ Label *gforth_engine(Xt *ip0, Cell *sp0, xts[i] = symbols[i] = &routines[i]; } #endif /* defined(DOUBLY_INDIRECT) */ +#ifdef STANDALONE + return image; +#else return symbols; +#endif } #if !(defined(GFORTH_DEBUGGING) || defined(INDIRECT_THREADED) || defined(DOUBLY_INDIRECT) || defined(VM_PROFILING))