Some new commands and improvements
This commit is contained in:
parent
e3a247ad23
commit
fbcee49b7e
|
@ -31,7 +31,8 @@ static int
|
||||||
get_token(),
|
get_token(),
|
||||||
print_op(),
|
print_op(),
|
||||||
unop_prio(),
|
unop_prio(),
|
||||||
binop_prio();
|
binop_prio(),
|
||||||
|
fix_bin_to_pref();
|
||||||
|
|
||||||
static long
|
static long
|
||||||
array_elsize();
|
array_elsize();
|
||||||
|
@ -62,7 +63,8 @@ static struct langdep c = {
|
||||||
get_name,
|
get_name,
|
||||||
get_number,
|
get_number,
|
||||||
get_token,
|
get_token,
|
||||||
print_op
|
print_op,
|
||||||
|
fix_bin_to_pref
|
||||||
};
|
};
|
||||||
|
|
||||||
struct langdep *c_dep = &c;
|
struct langdep *c_dep = &c;
|
||||||
|
@ -270,12 +272,11 @@ get_token(c)
|
||||||
c = getc(db_in);
|
c = getc(db_in);
|
||||||
if (c == '&') {
|
if (c == '&') {
|
||||||
tok.ival = E_AND;
|
tok.ival = E_AND;
|
||||||
|
return BIN_OP;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
ungetc(c, db_in);
|
ungetc(c, db_in);
|
||||||
tok.ival = E_BAND;
|
tok.ival = E_BAND;
|
||||||
}
|
return PREF_OR_BIN_OP;
|
||||||
return BIN_OP;
|
|
||||||
case '^':
|
case '^':
|
||||||
tok.ival = E_BXOR;
|
tok.ival = E_BXOR;
|
||||||
return BIN_OP;
|
return BIN_OP;
|
||||||
|
@ -428,7 +429,6 @@ print_op(p)
|
||||||
print_node(p->t_args[0], 0);
|
print_node(p->t_args[0], 0);
|
||||||
break;
|
break;
|
||||||
case E_DEREF:
|
case E_DEREF:
|
||||||
case E_MUL:
|
|
||||||
fputs("*", db_out);
|
fputs("*", db_out);
|
||||||
print_node(p->t_args[0], 0);
|
print_node(p->t_args[0], 0);
|
||||||
break;
|
break;
|
||||||
|
@ -436,6 +436,10 @@ print_op(p)
|
||||||
fputs("~", db_out);
|
fputs("~", db_out);
|
||||||
print_node(p->t_args[0], 0);
|
print_node(p->t_args[0], 0);
|
||||||
break;
|
break;
|
||||||
|
case E_ADDR:
|
||||||
|
fputs("&", db_out);
|
||||||
|
print_node(p->t_args[0], 0);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OP_BINOP:
|
case OP_BINOP:
|
||||||
|
@ -521,3 +525,17 @@ print_op(p)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
fix_bin_to_pref(p)
|
||||||
|
p_tree p;
|
||||||
|
{
|
||||||
|
switch(p->t_whichoper) {
|
||||||
|
case E_MUL:
|
||||||
|
p->t_whichoper = E_DEREF;
|
||||||
|
break;
|
||||||
|
case E_BAND:
|
||||||
|
p->t_whichoper = E_ADDR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -94,17 +94,29 @@ command_line(p_tree *p;)
|
||||||
| step_command(p)
|
| step_command(p)
|
||||||
| next_command(p)
|
| next_command(p)
|
||||||
| regs_command(p)
|
| regs_command(p)
|
||||||
| WHERE { *p = mknode(OP_WHERE); }
|
| where_command(p)
|
||||||
| STATUS { *p = mknode(OP_STATUS); }
|
| STATUS { *p = mknode(OP_STATUS); }
|
||||||
| DUMP { *p = mknode(OP_DUMP); }
|
| DUMP { *p = mknode(OP_DUMP); }
|
||||||
| RESTORE INTEGER { *p = mknode(OP_RESTORE, tok.ival); }
|
| RESTORE INTEGER { *p = mknode(OP_RESTORE, tok.ival); }
|
||||||
| delete_command(p)
|
| delete_command(p)
|
||||||
| print_command(p)
|
| print_command(p)
|
||||||
|
| display_command(p)
|
||||||
| trace_command(p)
|
| trace_command(p)
|
||||||
| set_command(p)
|
| set_command(p)
|
||||||
|
| FIND qualified_name(p){ *p = mknode(OP_FIND, *p); }
|
||||||
|
| WHICH qualified_name(p){ *p = mknode(OP_WHICH, *p); }
|
||||||
| { *p = 0; }
|
| { *p = 0; }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
where_command(p_tree *p;)
|
||||||
|
{ long l; }
|
||||||
|
:
|
||||||
|
WHERE
|
||||||
|
[ INTEGER { l = tok.ival; }
|
||||||
|
| { l = 0x7fffffff; }
|
||||||
|
] { *p = mknode(OP_WHERE, l); }
|
||||||
|
;
|
||||||
|
|
||||||
list_command(p_tree *p;)
|
list_command(p_tree *p;)
|
||||||
{ p_tree t1 = 0, t2 = 0; }
|
{ p_tree t1 = 0, t2 = 0; }
|
||||||
:
|
:
|
||||||
|
@ -233,9 +245,19 @@ delete_command(p_tree *p;)
|
||||||
|
|
||||||
print_command(p_tree *p;)
|
print_command(p_tree *p;)
|
||||||
:
|
:
|
||||||
PRINT expression(p, 1){ *p = mknode(OP_PRINT, *p);
|
PRINT expression_list(p)
|
||||||
p = &((*p)->t_args[0]);
|
{ *p = mknode(OP_PRINT, *p); }
|
||||||
}
|
;
|
||||||
|
|
||||||
|
display_command(p_tree *p;)
|
||||||
|
:
|
||||||
|
DISPLAY expression_list(p)
|
||||||
|
{ *p = mknode(OP_DISPLAY, *p); }
|
||||||
|
;
|
||||||
|
|
||||||
|
expression_list(p_tree *p;)
|
||||||
|
:
|
||||||
|
expression(p, 1)
|
||||||
[ ',' { *p = mknode(OP_LINK, *p, (p_tree) 0);
|
[ ',' { *p = mknode(OP_LINK, *p, (p_tree) 0);
|
||||||
p = &((*p)->t_args[1]);
|
p = &((*p)->t_args[1]);
|
||||||
}
|
}
|
||||||
|
@ -291,7 +313,9 @@ factor(p_tree *p;)
|
||||||
{ *p = mknode(OP_UNOP, (p_tree) 0);
|
{ *p = mknode(OP_UNOP, (p_tree) 0);
|
||||||
(*p)->t_whichoper = (int) tok.ival;
|
(*p)->t_whichoper = (int) tok.ival;
|
||||||
}
|
}
|
||||||
[ PREF_OP | PREF_OR_BIN_OP ]
|
[ PREF_OP
|
||||||
|
| PREF_OR_BIN_OP { (*currlang->fix_bin_to_pref)(*p); }
|
||||||
|
]
|
||||||
expression(&(*p)->t_args[0], unprio((*p)->t_whichoper))
|
expression(&(*p)->t_args[0], unprio((*p)->t_whichoper))
|
||||||
;
|
;
|
||||||
|
|
||||||
|
@ -394,6 +418,9 @@ name(p_tree *p;)
|
||||||
| ON
|
| ON
|
||||||
| SET
|
| SET
|
||||||
| TO
|
| TO
|
||||||
|
| FIND
|
||||||
|
| DISPLAY
|
||||||
|
| WHICH
|
||||||
] { *p = mknode(OP_NAME, tok.idf, tok.str); }
|
] { *p = mknode(OP_NAME, tok.idf, tok.str); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,7 @@ debugger_string
|
||||||
| /* type name */
|
| /* type name */
|
||||||
{ s = NewSymbol(str, CurrentScope, TYPE, currnam); }
|
{ s = NewSymbol(str, CurrentScope, TYPE, currnam); }
|
||||||
't' type_name(&(s->sy_type))
|
't' type_name(&(s->sy_type))
|
||||||
|
{ if (! s->sy_type->ty_sym) s->sy_type->ty_sym = s; }
|
||||||
|
|
||||||
| /* tag name (only C?) */
|
| /* tag name (only C?) */
|
||||||
{ s = NewSymbol(str, CurrentScope, TAG, currnam); }
|
{ s = NewSymbol(str, CurrentScope, TAG, currnam); }
|
||||||
|
@ -76,7 +77,7 @@ debugger_string
|
||||||
}
|
}
|
||||||
|
|
||||||
| /* external procedure */
|
| /* external procedure */
|
||||||
{ s = NewSymbol(str, PervasiveScope, PROC, currnam); }
|
{ s = NewSymbol(str, FileScope, PROC, currnam); }
|
||||||
'P' routine(s)
|
'P' routine(s)
|
||||||
|
|
||||||
| /* private procedure */
|
| /* private procedure */
|
||||||
|
@ -84,7 +85,7 @@ debugger_string
|
||||||
'Q' routine(s)
|
'Q' routine(s)
|
||||||
|
|
||||||
| /* external function */
|
| /* external function */
|
||||||
{ s = NewSymbol(str, PervasiveScope, FUNCTION, currnam); }
|
{ s = NewSymbol(str, FileScope, FUNCTION, currnam); }
|
||||||
'F' function(s)
|
'F' function(s)
|
||||||
|
|
||||||
| /* private function */
|
| /* private function */
|
||||||
|
@ -96,10 +97,10 @@ debugger_string
|
||||||
the type information anyway for other
|
the type information anyway for other
|
||||||
types.
|
types.
|
||||||
*/
|
*/
|
||||||
{ s = Lookup(findidf(str), PervasiveScope, VAR);
|
{ s = Lookup(findidf(str), FileScope, VAR);
|
||||||
if (s) {
|
if (s) {
|
||||||
tmp = s->sy_type;
|
tmp = s->sy_type;
|
||||||
} else s = NewSymbol(str, PervasiveScope, VAR, currnam);
|
} else s = NewSymbol(str, FileScope, VAR, currnam);
|
||||||
}
|
}
|
||||||
'G' type(&(s->sy_type), (int *) 0)
|
'G' type(&(s->sy_type), (int *) 0)
|
||||||
{ if (tmp) s->sy_type = tmp; }
|
{ if (tmp) s->sy_type = tmp; }
|
||||||
|
|
|
@ -307,6 +307,23 @@ do_deref(p, pbuf, psize, ptp)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
do_addr(p, pbuf, psize, ptp)
|
||||||
|
p_tree p;
|
||||||
|
char **pbuf;
|
||||||
|
long *psize;
|
||||||
|
p_type *ptp;
|
||||||
|
{
|
||||||
|
t_addr addr;
|
||||||
|
|
||||||
|
if (eval_desig(p->t_args[0], &addr, psize, ptp)) {
|
||||||
|
*pbuf = Malloc((unsigned) pointer_size);
|
||||||
|
put_int(*pbuf, pointer_size, (long) addr);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
do_unmin(p, pbuf, psize, ptp)
|
do_unmin(p, pbuf, psize, ptp)
|
||||||
p_tree p;
|
p_tree p;
|
||||||
|
@ -370,7 +387,7 @@ static int (*un_op[])() = {
|
||||||
0,
|
0,
|
||||||
do_unplus,
|
do_unplus,
|
||||||
do_unmin,
|
do_unmin,
|
||||||
do_deref,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
|
@ -383,7 +400,9 @@ static int (*un_op[])() = {
|
||||||
0,
|
0,
|
||||||
do_bnot,
|
do_bnot,
|
||||||
0,
|
0,
|
||||||
0
|
0,
|
||||||
|
0,
|
||||||
|
do_addr
|
||||||
};
|
};
|
||||||
|
|
||||||
static p_type
|
static p_type
|
||||||
|
@ -961,8 +980,10 @@ static int (*bin_op[])() = {
|
||||||
do_arith,
|
do_arith,
|
||||||
do_arith,
|
do_arith,
|
||||||
0,
|
0,
|
||||||
|
0,
|
||||||
do_sft,
|
do_sft,
|
||||||
do_sft
|
do_sft,
|
||||||
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -33,3 +33,4 @@
|
||||||
#define E_DERSELECT 25 /* -> in C */
|
#define E_DERSELECT 25 /* -> in C */
|
||||||
#define E_LSFT 26
|
#define E_LSFT 26
|
||||||
#define E_RSFT 27
|
#define E_RSFT 27
|
||||||
|
#define E_ADDR 28
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
typedef struct file {
|
typedef struct file {
|
||||||
struct symbol *f_sym;
|
struct symbol *f_sym;
|
||||||
|
struct symbol *f_base;
|
||||||
char *f_fullname; /* name including directory */
|
char *f_fullname; /* name including directory */
|
||||||
struct scope *f_scope; /* reference to scope of this file */
|
struct scope *f_scope; /* reference to scope of this file */
|
||||||
t_lineno f_nlines; /* number of lines in file */
|
t_lineno f_nlines; /* number of lines in file */
|
||||||
|
|
|
@ -65,6 +65,7 @@ item_addr_actions(a)
|
||||||
eval_cond(p->t_args[1])) stopping = 1;
|
eval_cond(p->t_args[1])) stopping = 1;
|
||||||
break;
|
break;
|
||||||
case OP_DUMP:
|
case OP_DUMP:
|
||||||
|
case OP_DISPLAY:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
|
@ -75,6 +76,18 @@ item_addr_actions(a)
|
||||||
return stopping;
|
return stopping;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handle_displays()
|
||||||
|
{
|
||||||
|
register p_item i = item_list.il_first;
|
||||||
|
|
||||||
|
while (i) {
|
||||||
|
register p_tree p = i->i_node;
|
||||||
|
|
||||||
|
if (p->t_oper == OP_DISPLAY) do_print(p);
|
||||||
|
i = i->i_next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
add_to_item_list(p)
|
add_to_item_list(p)
|
||||||
p_tree p;
|
p_tree p;
|
||||||
{
|
{
|
||||||
|
|
|
@ -40,6 +40,10 @@ find_language(suff)
|
||||||
{
|
{
|
||||||
register struct langlist *p = list;
|
register struct langlist *p = list;
|
||||||
|
|
||||||
|
if (! suff) {
|
||||||
|
currlang = c_dep;
|
||||||
|
return;
|
||||||
|
}
|
||||||
while (p) {
|
while (p) {
|
||||||
currlang = p->l_lang;
|
currlang = p->l_lang;
|
||||||
if (! strcmp(p->l_suff, suff)) break;
|
if (! strcmp(p->l_suff, suff)) break;
|
||||||
|
|
|
@ -33,6 +33,7 @@ struct langdep {
|
||||||
int (*get_number)();
|
int (*get_number)();
|
||||||
int (*get_token)();
|
int (*get_token)();
|
||||||
int (*printop)();
|
int (*printop)();
|
||||||
|
int (*fix_bin_to_pref)();
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct langdep *m2_dep, *c_dep, *currlang;
|
extern struct langdep *m2_dep, *c_dep, *currlang;
|
||||||
|
|
|
@ -30,7 +30,8 @@ static int
|
||||||
get_string(),
|
get_string(),
|
||||||
print_op(),
|
print_op(),
|
||||||
binop_prio(),
|
binop_prio(),
|
||||||
unop_prio();
|
unop_prio(),
|
||||||
|
fix_bin_to_pref();
|
||||||
|
|
||||||
static long
|
static long
|
||||||
array_elsize();
|
array_elsize();
|
||||||
|
@ -61,7 +62,8 @@ static struct langdep m2 = {
|
||||||
get_name,
|
get_name,
|
||||||
get_number,
|
get_number,
|
||||||
get_token,
|
get_token,
|
||||||
print_op
|
print_op,
|
||||||
|
fix_bin_to_pref
|
||||||
};
|
};
|
||||||
|
|
||||||
struct langdep *m2_dep = &m2;
|
struct langdep *m2_dep = &m2;
|
||||||
|
@ -537,3 +539,9 @@ print_op(p)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
fix_bin_to_pref()
|
||||||
|
{
|
||||||
|
/* No problems of this kind in Modula-2 */
|
||||||
|
}
|
||||||
|
|
|
@ -25,5 +25,8 @@ OP_PRINT 1 do_print
|
||||||
OP_DUMP 0 do_dump
|
OP_DUMP 0 do_dump
|
||||||
OP_RESTORE 0 do_restore
|
OP_RESTORE 0 do_restore
|
||||||
OP_TRACE 3 do_trace
|
OP_TRACE 3 do_trace
|
||||||
|
OP_FIND 1 do_find
|
||||||
|
OP_DISPLAY 1 add_to_item_list
|
||||||
|
OP_WHICH 1 do_which
|
||||||
OP_UNOP 1 0
|
OP_UNOP 1 0
|
||||||
OP_BINOP 2 0
|
OP_BINOP 2 0
|
||||||
|
|
|
@ -124,7 +124,7 @@ print_val(tp, tp_sz, addr, compressed, indent)
|
||||||
if (indent == 0) indent = 4;
|
if (indent == 0) indent = 4;
|
||||||
switch(tp->ty_class) {
|
switch(tp->ty_class) {
|
||||||
case T_SUBRANGE:
|
case T_SUBRANGE:
|
||||||
print_val(tp->ty_base, tp->ty_size, addr, compressed, indent);
|
print_val(tp->ty_base, tp_sz, addr, compressed, indent);
|
||||||
break;
|
break;
|
||||||
case T_ARRAY:
|
case T_ARRAY:
|
||||||
if (tp->ty_elements == char_type ||
|
if (tp->ty_elements == char_type ||
|
||||||
|
|
|
@ -349,7 +349,10 @@ could_send(m, stop_message)
|
||||||
}
|
}
|
||||||
single_stepping = 0;
|
single_stepping = 0;
|
||||||
}
|
}
|
||||||
if (stop_message) stopped("stopped", a);
|
if (stop_message) {
|
||||||
|
stopped("stopped", a);
|
||||||
|
handle_displays();
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
/* Symbol handling */
|
/* Symbol handling */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
#include <out.h>
|
#include <out.h>
|
||||||
#include <stb.h>
|
#include <stb.h>
|
||||||
|
@ -18,6 +19,8 @@
|
||||||
|
|
||||||
p_symbol currfile;
|
p_symbol currfile;
|
||||||
|
|
||||||
|
extern FILE *db_out;
|
||||||
|
|
||||||
p_symbol
|
p_symbol
|
||||||
NewSymbol(s, scope, class, nam)
|
NewSymbol(s, scope, class, nam)
|
||||||
char *s;
|
char *s;
|
||||||
|
@ -120,10 +123,29 @@ add_file(s)
|
||||||
(struct outname *) 0);
|
(struct outname *) 0);
|
||||||
*p = c;
|
*p = c;
|
||||||
sym1->sy_filelink = sym;
|
sym1->sy_filelink = sym;
|
||||||
|
sym->sy_file->f_base = sym1;
|
||||||
}
|
}
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p_scope
|
||||||
|
def_scope(s)
|
||||||
|
p_symbol s;
|
||||||
|
{
|
||||||
|
switch(s->sy_class) {
|
||||||
|
case FILELINK:
|
||||||
|
s = s->sy_filelink;
|
||||||
|
/* fall through */
|
||||||
|
case FILESYM:
|
||||||
|
return s->sy_file->f_scope;
|
||||||
|
case PROC:
|
||||||
|
case FUNCTION:
|
||||||
|
case MODULE:
|
||||||
|
return s->sy_name.nm_scope;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Determine if the OP_SELECT tree indicated by 'p' could lead to scope 'sc'.
|
/* Determine if the OP_SELECT tree indicated by 'p' could lead to scope 'sc'.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
|
@ -133,23 +155,35 @@ consistent(p, sc)
|
||||||
{
|
{
|
||||||
p_tree arg;
|
p_tree arg;
|
||||||
p_symbol sym;
|
p_symbol sym;
|
||||||
|
p_scope target_sc;
|
||||||
|
|
||||||
assert(p->t_oper == OP_SELECT);
|
assert(p->t_oper == OP_SELECT);
|
||||||
sc = sc->sc_static_encl;
|
|
||||||
if (!sc) return 0;
|
|
||||||
|
|
||||||
p = p->t_args[0];
|
p = p->t_args[0];
|
||||||
|
|
||||||
switch(p->t_oper) {
|
switch(p->t_oper) {
|
||||||
case OP_NAME:
|
case OP_NAME:
|
||||||
sym = Lookfromscope(p->t_idf, FILELINK|FILESYM|PROC|FUNCTION|MODULE, sc);
|
sym = Lookfromscope(p->t_idf, FILELINK|FILESYM|PROC|FUNCTION|MODULE, sc->sc_static_encl);
|
||||||
return sym != 0;
|
if (sym) {
|
||||||
|
target_sc = def_scope(sym);
|
||||||
|
while (sc && sc != target_sc) {
|
||||||
|
sc = sc->sc_static_encl;
|
||||||
|
}
|
||||||
|
return sc != 0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
case OP_SELECT:
|
case OP_SELECT:
|
||||||
arg = p->t_args[1];
|
arg = p->t_args[1];
|
||||||
sym = Lookfromscope(arg->t_idf, FILELINK|FILESYM|PROC|FUNCTION|MODULE, sc);
|
sym = Lookfromscope(arg->t_idf, FILELINK|FILESYM|PROC|FUNCTION|MODULE, sc->sc_static_encl);
|
||||||
if (sym == 0) return 0;
|
if (sym) {
|
||||||
return consistent(p, sym->sy_scope);
|
target_sc = def_scope(sym);
|
||||||
|
while (sc && sc != target_sc) {
|
||||||
|
sc = sc->sc_static_encl;
|
||||||
|
}
|
||||||
|
return sc != 0 && consistent(p, sym->sy_scope);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
|
@ -224,3 +258,106 @@ identify(p, class_set)
|
||||||
}
|
}
|
||||||
return sym;
|
return sym;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
pr_scopes(sc)
|
||||||
|
p_scope sc;
|
||||||
|
{
|
||||||
|
while (sc && ! sc->sc_definedby) {
|
||||||
|
sc = sc->sc_static_encl;
|
||||||
|
}
|
||||||
|
if (sc) {
|
||||||
|
pr_scopes(sc->sc_static_encl);
|
||||||
|
if (sc->sc_definedby->sy_class == FILESYM &&
|
||||||
|
sc->sc_definedby->sy_file->f_base) {
|
||||||
|
fprintf(db_out, "%s`", sc->sc_definedby->sy_file->f_base->sy_idf->id_text);
|
||||||
|
}
|
||||||
|
else fprintf(db_out, "%s`", sc->sc_definedby->sy_idf->id_text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
pr_sym(s)
|
||||||
|
p_symbol s;
|
||||||
|
{
|
||||||
|
switch(s->sy_class) {
|
||||||
|
case CONST:
|
||||||
|
fprintf(db_out, "Constant:\t");
|
||||||
|
break;
|
||||||
|
case TYPE:
|
||||||
|
fprintf(db_out, "Type:\t\t");
|
||||||
|
break;
|
||||||
|
case TAG:
|
||||||
|
fprintf(db_out, "Tag:\t\t");
|
||||||
|
break;
|
||||||
|
case MODULE:
|
||||||
|
fprintf(db_out, "Module:\t\t");
|
||||||
|
break;
|
||||||
|
case PROC:
|
||||||
|
case FUNCTION:
|
||||||
|
fprintf(db_out, "Routine:\t");
|
||||||
|
break;
|
||||||
|
case VAR:
|
||||||
|
case REGVAR:
|
||||||
|
case LOCVAR:
|
||||||
|
case VARPAR:
|
||||||
|
fprintf(db_out, "Variable:\t");
|
||||||
|
break;
|
||||||
|
case FIELD:
|
||||||
|
fprintf(db_out, "Field:\t\t");
|
||||||
|
break;
|
||||||
|
case FILESYM:
|
||||||
|
case FILELINK:
|
||||||
|
fprintf(db_out, "File:\t\t");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
pr_scopes(s->sy_scope);
|
||||||
|
fprintf(db_out, "%s\n", s->sy_idf->id_text);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print all identifications of p->t_args[0].
|
||||||
|
*/
|
||||||
|
do_find(p)
|
||||||
|
p_tree p;
|
||||||
|
{
|
||||||
|
p_symbol sym = 0;
|
||||||
|
register p_symbol s;
|
||||||
|
p_tree arg;
|
||||||
|
|
||||||
|
p = p->t_args[0];
|
||||||
|
switch(p->t_oper) {
|
||||||
|
case OP_NAME:
|
||||||
|
s = p->t_idf->id_def;
|
||||||
|
while (s) {
|
||||||
|
pr_sym(s);
|
||||||
|
s = s->sy_next;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OP_SELECT:
|
||||||
|
arg = p->t_args[1];
|
||||||
|
assert(arg->t_oper == OP_NAME);
|
||||||
|
s = arg->t_idf->id_def;
|
||||||
|
sym = 0;
|
||||||
|
while (s) {
|
||||||
|
if (consistent(p, s->sy_scope)) {
|
||||||
|
pr_sym(s);
|
||||||
|
}
|
||||||
|
s = s->sy_next;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_which(p)
|
||||||
|
p_tree p;
|
||||||
|
{
|
||||||
|
p_symbol sym = identify(p->t_args[0], 0xffff);
|
||||||
|
|
||||||
|
if ( sym) pr_sym(sym);
|
||||||
|
}
|
||||||
|
|
|
@ -62,6 +62,9 @@ struct tokenname tkidf[] = { /* names of the identifier tokens */
|
||||||
{TRACE, "trace"},
|
{TRACE, "trace"},
|
||||||
{SET, "set"},
|
{SET, "set"},
|
||||||
{TO, "to"},
|
{TO, "to"},
|
||||||
|
{FIND, "find"},
|
||||||
|
{DISPLAY, "display"},
|
||||||
|
{WHICH, "which"},
|
||||||
{-1, "quit"},
|
{-1, "quit"},
|
||||||
{0, ""}
|
{0, ""}
|
||||||
};
|
};
|
||||||
|
|
|
@ -43,9 +43,6 @@ mknode(va_alist)
|
||||||
p->t_idf = va_arg(ap, struct idf *);
|
p->t_idf = va_arg(ap, struct idf *);
|
||||||
p->t_str = va_arg(ap, char *);
|
p->t_str = va_arg(ap, char *);
|
||||||
break;
|
break;
|
||||||
case OP_INTEGER:
|
|
||||||
p->t_ival = va_arg(ap, long);
|
|
||||||
break;
|
|
||||||
case OP_STRING:
|
case OP_STRING:
|
||||||
p->t_sval = va_arg(ap, char *);
|
p->t_sval = va_arg(ap, char *);
|
||||||
break;
|
break;
|
||||||
|
@ -56,11 +53,13 @@ mknode(va_alist)
|
||||||
p->t_lino = va_arg(ap, long);
|
p->t_lino = va_arg(ap, long);
|
||||||
p->t_filename = va_arg(ap, char *);
|
p->t_filename = va_arg(ap, char *);
|
||||||
break;
|
break;
|
||||||
|
case OP_INTEGER:
|
||||||
case OP_NEXT:
|
case OP_NEXT:
|
||||||
case OP_STEP:
|
case OP_STEP:
|
||||||
case OP_REGS:
|
case OP_REGS:
|
||||||
case OP_DELETE:
|
case OP_DELETE:
|
||||||
case OP_RESTORE:
|
case OP_RESTORE:
|
||||||
|
case OP_WHERE:
|
||||||
p->t_ival = va_arg(ap, long);
|
p->t_ival = va_arg(ap, long);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -124,6 +123,10 @@ print_node(p, top_level)
|
||||||
fputs("print ", db_out);
|
fputs("print ", db_out);
|
||||||
print_node(p->t_args[0], 0);
|
print_node(p->t_args[0], 0);
|
||||||
break;
|
break;
|
||||||
|
case OP_DISPLAY:
|
||||||
|
fputs("display ", db_out);
|
||||||
|
print_node(p->t_args[0], 0);
|
||||||
|
break;
|
||||||
case OP_FILE:
|
case OP_FILE:
|
||||||
fputs("file ", db_out);
|
fputs("file ", db_out);
|
||||||
print_node(p->t_args[0], 0);
|
print_node(p->t_args[0], 0);
|
||||||
|
@ -134,17 +137,25 @@ print_node(p, top_level)
|
||||||
fputs(" to ", db_out);
|
fputs(" to ", db_out);
|
||||||
print_node(p->t_args[1], 0);
|
print_node(p->t_args[1], 0);
|
||||||
break;
|
break;
|
||||||
|
case OP_FIND:
|
||||||
|
fputs("find ", db_out);
|
||||||
|
print_node(p->t_args[0], 0);
|
||||||
|
break;
|
||||||
|
case OP_WHICH:
|
||||||
|
fputs("which ", db_out);
|
||||||
|
print_node(p->t_args[0], 0);
|
||||||
|
break;
|
||||||
case OP_DELETE:
|
case OP_DELETE:
|
||||||
fprintf(db_out, "delete %d", p->t_ival);
|
fprintf(db_out, "delete %ld", p->t_ival);
|
||||||
break;
|
break;
|
||||||
case OP_REGS:
|
case OP_REGS:
|
||||||
fprintf(db_out, "regs %d", p->t_ival);
|
fprintf(db_out, "regs %ld", p->t_ival);
|
||||||
break;
|
break;
|
||||||
case OP_NEXT:
|
case OP_NEXT:
|
||||||
fprintf(db_out, "next %d", p->t_ival);
|
fprintf(db_out, "next %ld", p->t_ival);
|
||||||
break;
|
break;
|
||||||
case OP_STEP:
|
case OP_STEP:
|
||||||
fprintf(db_out, "step %d", p->t_ival);
|
fprintf(db_out, "step %ld", p->t_ival);
|
||||||
break;
|
break;
|
||||||
case OP_STATUS:
|
case OP_STATUS:
|
||||||
fputs("status", db_out);
|
fputs("status", db_out);
|
||||||
|
@ -154,15 +165,16 @@ print_node(p, top_level)
|
||||||
print_position(p->t_address, 1);
|
print_position(p->t_address, 1);
|
||||||
break;
|
break;
|
||||||
case OP_RESTORE:
|
case OP_RESTORE:
|
||||||
fprintf(db_out, "restore %d", p->t_ival);
|
fprintf(db_out, "restore %ld", p->t_ival);
|
||||||
break;
|
break;
|
||||||
case OP_WHERE:
|
case OP_WHERE:
|
||||||
fputs("where", db_out);
|
fputs("where", db_out);
|
||||||
|
if (p->t_ival != 0x7fffffff) fprintf(" %ld", p->t_ival);
|
||||||
break;
|
break;
|
||||||
case OP_CONT:
|
case OP_CONT:
|
||||||
fputs("cont", db_out);
|
fputs("cont", db_out);
|
||||||
if (p->t_args[0]) {
|
if (p->t_args[0]) {
|
||||||
fprintf(db_out, " %d", p->t_args[0]->t_ival);
|
fprintf(db_out, " %ld", p->t_args[0]->t_ival);
|
||||||
}
|
}
|
||||||
if (p->t_args[1]) {
|
if (p->t_args[1]) {
|
||||||
fputs(" ", db_out);
|
fputs(" ", db_out);
|
||||||
|
@ -274,6 +286,7 @@ in_status(com)
|
||||||
case OP_WHEN:
|
case OP_WHEN:
|
||||||
case OP_TRACE:
|
case OP_TRACE:
|
||||||
case OP_DUMP:
|
case OP_DUMP:
|
||||||
|
case OP_DISPLAY:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -487,8 +500,9 @@ do_where(p)
|
||||||
p_tree p;
|
p_tree p;
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
unsigned int cnt;
|
||||||
|
|
||||||
for (;;) {
|
for (cnt = p->t_ival; cnt != 0; cnt--) {
|
||||||
t_addr AB;
|
t_addr AB;
|
||||||
t_addr PC;
|
t_addr PC;
|
||||||
p_scope sc;
|
p_scope sc;
|
||||||
|
@ -568,6 +582,7 @@ do_print(p)
|
||||||
|
|
||||||
switch(p->t_oper) {
|
switch(p->t_oper) {
|
||||||
case OP_PRINT:
|
case OP_PRINT:
|
||||||
|
case OP_DISPLAY:
|
||||||
do_print(p->t_args[0]);
|
do_print(p->t_args[0]);
|
||||||
break;
|
break;
|
||||||
case OP_LINK:
|
case OP_LINK:
|
||||||
|
|
|
@ -42,6 +42,7 @@ typedef struct type {
|
||||||
short ty_flags;
|
short ty_flags;
|
||||||
#define T_CROSS 0x0001
|
#define T_CROSS 0x0001
|
||||||
long ty_size;
|
long ty_size;
|
||||||
|
struct symbol *ty_sym;
|
||||||
union {
|
union {
|
||||||
/* cross references */
|
/* cross references */
|
||||||
char *typ_tag;
|
char *typ_tag;
|
||||||
|
|
Loading…
Reference in a new issue