version 1.1, 2001/04/29 11:28:24
|
version 1.7, 2007/12/31 18:40:26
|
Line 1
|
Line 1
|
/* support functions and main() for vmgen example |
/* support functions and main() for vmgen example |
|
|
Copyright (C) 2001 Free Software Foundation, Inc. |
Copyright (C) 2001,2003 Free Software Foundation, Inc. |
|
|
This file is part of Gforth. |
This file is part of Gforth. |
|
|
Gforth is free software; you can redistribute it and/or |
Gforth is free software; you can redistribute it and/or |
modify it under the terms of the GNU General Public License |
modify it under the terms of the GNU General Public License |
as published by the Free Software Foundation; either version 2 |
as published by the Free Software Foundation, either version 3 |
of the License, or (at your option) any later version. |
of the License, or (at your option) any later version. |
|
|
This program is distributed in the hope that it will be useful, |
This program is distributed in the hope that it will be useful, |
Line 15
|
Line 15
|
GNU General Public License for more details. |
GNU General Public License for more details. |
|
|
You should have received a copy of the GNU General Public License |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
along with this program; if not, see http://www.gnu.org/licenses/. |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
*/ |
*/ |
|
|
#include <stdlib.h> |
#include <stdlib.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <unistd.h> |
#include <unistd.h> |
|
extern int optind; |
|
|
#include <assert.h> |
#include <assert.h> |
#include "mini.h" |
#include "mini.h" |
|
|
Line 52 void printarg_a(char *a)
|
Line 53 void printarg_a(char *a)
|
fprintf(vm_out, "%p ", a); |
fprintf(vm_out, "%p ", a); |
} |
} |
|
|
|
void printarg_Cell(Cell i) |
|
{ |
|
fprintf(vm_out, "0x%lx ", i); |
|
} |
|
|
/* This language has separate name spaces for functions and variables; |
/* This language has separate name spaces for functions and variables; |
this works because there are no function variables, and the syntax |
this works because there are no function variables, and the syntax |
makes it possible to differentiate between function and variable |
makes it possible to differentiate between function and variable |
Line 149 int main(int argc, char **argv)
|
Line 155 int main(int argc, char **argv)
|
int disassembling = 0; |
int disassembling = 0; |
int profiling = 0; |
int profiling = 0; |
int c; |
int c; |
Inst vm_code[CODE_SIZE]; |
Inst *vm_code=(Inst *)calloc(CODE_SIZE,sizeof(Inst)); |
Inst *start; |
Inst *start; |
Cell stack[STACK_SIZE]; |
Cell *stack=(Cell *)calloc(STACK_SIZE,sizeof(Cell)); |
engine_t runvm=engine; |
engine_t runvm=engine; |
|
|
while ((c = getopt(argc, argv, "hdpt")) != -1) { |
while ((c = getopt(argc, argv, "hdpt")) != -1) { |
Line 159 int main(int argc, char **argv)
|
Line 165 int main(int argc, char **argv)
|
default: |
default: |
case 'h': |
case 'h': |
help: |
help: |
fprintf(stderr, "\ |
fprintf(stderr, "Usage: %s [options] file\nOptions:\n-h Print this message and exit\n-d disassemble VM program before execution\n-p profile VM code sequences (output on stderr)\n-t trace VM code execution (output on stderr)\n", |
Usage: %s [options] file\n |
|
Options:\n |
|
-h Print this message and exit\n\ |
|
-d disassemble VM program before execution\n\ |
|
-p profile VM code sequences (output on stderr)\n\ |
|
-t trace VM code execution (output on stderr)\n\ |
|
", |
|
argv[0]); |
argv[0]); |
exit(1); |
exit(1); |
case 'd': |
case 'd': |
Line 174 Options:\n
|
Line 173 Options:\n
|
break; |
break; |
case 'p': |
case 'p': |
profiling=1; |
profiling=1; |
|
use_super=0; /* we don't want superinstructions in the profile */ |
runvm = engine_debug; |
runvm = engine_debug; |
break; |
break; |
case 't': |
case 't': |
Line 200 Options:\n
|
Line 200 Options:\n
|
exit(1); |
exit(1); |
|
|
start=vmcodep; |
start=vmcodep; |
gen_main_end(); |
gen_main_end(); |
|
vmcode_end=vmcodep; |
|
|
if (disassembling) |
if (disassembling) |
vm_disassemble(vm_code, vmcodep, vm_prim); |
vm_disassemble(vm_code, vmcodep, vm_prim); |
|
|
printf("result = %ld\n",runvm(start, stack+STACK_SIZE-1, NULL)); |
printf("result = %ld\n",runvm(start, stack+STACK_SIZE-1, NULL)); |
|
|
|
if (profiling) |
|
vm_print_profile(vm_out); |
|
|
return 0; |
return 0; |
} |
} |