From fa46de1021113a5532e8fa35d9d677d6f50fd614 Mon Sep 17 00:00:00 2001 From: steve Date: Thu, 22 Mar 2001 05:28:41 +0000 Subject: [PATCH] Add code label forward references. --- vvp/codes.cc | 8 +++++++- vvp/compile.cc | 50 ++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/vvp/codes.cc b/vvp/codes.cc index 5411d359c..0a26528a0 100644 --- a/vvp/codes.cc +++ b/vvp/codes.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: codes.cc,v 1.4 2001/03/22 05:08:00 steve Exp $" +#ident "$Id: codes.cc,v 1.5 2001/03/22 05:28:41 steve Exp $" #endif # include "codes.h" @@ -106,6 +106,9 @@ void codespace_dump(FILE*fd) } else if (cop->opcode == &of_JMP) { fprintf(fd, "%%jmp 0x%u\n", cop->cptr); + } else if (cop->opcode == &of_JMP0) { + fprintf(fd, "%%jmp/0 0x%u\n", cop->cptr); + } else if (cop->opcode == &of_SET) { fprintf(fd, "%%set 0x%u, %u\n", cop->iptr, cop->bit_idx1); @@ -118,6 +121,9 @@ void codespace_dump(FILE*fd) /* * $Log: codes.cc,v $ + * Revision 1.5 2001/03/22 05:28:41 steve + * Add code label forward references. + * * Revision 1.4 2001/03/22 05:08:00 steve * implement %load, %inv, %jum/0 and %cmp/u * diff --git a/vvp/compile.cc b/vvp/compile.cc index 6a0b9fa64..7e3a8a441 100644 --- a/vvp/compile.cc +++ b/vvp/compile.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: compile.cc,v 1.9 2001/03/22 05:08:00 steve Exp $" +#ident "$Id: compile.cc,v 1.10 2001/03/22 05:28:41 steve Exp $" #endif # include "compile.h" @@ -121,6 +121,18 @@ struct resolv_list_s { static struct resolv_list_s*resolv_list = 0; +/* + * Instructions may make forward references to labels. In this case, + * the compile makes one of these to remember to retry the + * resolution. + */ +struct cresolv_list_s { + struct cresolv_list_s*next; + struct vvp_code_s*cp; + char*lab; +}; + +static struct cresolv_list_s*cresolv_list = 0; /* * Initialize the compiler by allocation empty symbol tables and @@ -287,11 +299,18 @@ void compile_code(char*label, char*mnem, comp_operands_t opa) tmp = sym_get_value(sym_codespace, opa->argv[idx].symb.text); code->cptr = tmp.num; if (code->cptr == 0) { - yyerror("functor undefined"); - break; + struct cresolv_list_s*res = (struct cresolv_list_s*) + calloc(1, sizeof(struct cresolv_list_s)); + res->cp = code; + res->lab = opa->argv[idx].symb.text; + res->next = cresolv_list; + cresolv_list = res; + + } else { + + free(opa->argv[idx].symb.text); } - free(opa->argv[idx].symb.text); break; case OA_FUNC_PTR: @@ -455,6 +474,26 @@ void compile_cleanup(void) } } + struct cresolv_list_s*tmp_clist = cresolv_list; + cresolv_list = 0; + + while (tmp_clist) { + struct cresolv_list_s*res = tmp_clist; + tmp_clist = res->next; + + symbol_value_t val = sym_get_value(sym_codespace, res->lab); + vvp_cpoint_t tmp = val.num; + + if (tmp != 0) { + res->cp->cptr = tmp; + free(res->lab); + + } else { + fprintf(stderr, "unresolved code label: %s\n", res->lab); + res->next = cresolv_list; + cresolv_list = res; + } + } } void compile_dump(FILE*fd) @@ -476,6 +515,9 @@ void compile_dump(FILE*fd) /* * $Log: compile.cc,v $ + * Revision 1.10 2001/03/22 05:28:41 steve + * Add code label forward references. + * * Revision 1.9 2001/03/22 05:08:00 steve * implement %load, %inv, %jum/0 and %cmp/u *