Add code label forward references.
This commit is contained in:
parent
aa31884d3b
commit
fa46de1021
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#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
|
#endif
|
||||||
|
|
||||||
# include "codes.h"
|
# include "codes.h"
|
||||||
|
|
@ -106,6 +106,9 @@ void codespace_dump(FILE*fd)
|
||||||
} else if (cop->opcode == &of_JMP) {
|
} else if (cop->opcode == &of_JMP) {
|
||||||
fprintf(fd, "%%jmp 0x%u\n", cop->cptr);
|
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) {
|
} else if (cop->opcode == &of_SET) {
|
||||||
fprintf(fd, "%%set 0x%u, %u\n", cop->iptr, cop->bit_idx1);
|
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 $
|
* $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
|
* Revision 1.4 2001/03/22 05:08:00 steve
|
||||||
* implement %load, %inv, %jum/0 and %cmp/u
|
* implement %load, %inv, %jum/0 and %cmp/u
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||||
*/
|
*/
|
||||||
#if !defined(WINNT)
|
#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
|
#endif
|
||||||
|
|
||||||
# include "compile.h"
|
# include "compile.h"
|
||||||
|
|
@ -121,6 +121,18 @@ struct resolv_list_s {
|
||||||
|
|
||||||
static struct resolv_list_s*resolv_list = 0;
|
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
|
* 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);
|
tmp = sym_get_value(sym_codespace, opa->argv[idx].symb.text);
|
||||||
code->cptr = tmp.num;
|
code->cptr = tmp.num;
|
||||||
if (code->cptr == 0) {
|
if (code->cptr == 0) {
|
||||||
yyerror("functor undefined");
|
struct cresolv_list_s*res = (struct cresolv_list_s*)
|
||||||
break;
|
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;
|
break;
|
||||||
|
|
||||||
case OA_FUNC_PTR:
|
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)
|
void compile_dump(FILE*fd)
|
||||||
|
|
@ -476,6 +515,9 @@ void compile_dump(FILE*fd)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* $Log: compile.cc,v $
|
* $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
|
* Revision 1.9 2001/03/22 05:08:00 steve
|
||||||
* implement %load, %inv, %jum/0 and %cmp/u
|
* implement %load, %inv, %jum/0 and %cmp/u
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue