From b089e0d7f8cd477c679302f2254706eee487bada Mon Sep 17 00:00:00 2001 From: ceriel Date: Mon, 12 Nov 1990 13:46:31 +0000 Subject: [PATCH] many changes, delinted --- util/grind/Amakefile | 3 +- util/grind/avl.cc | 2 +- util/grind/c.c | 20 ++--- util/grind/commands.g | 46 ++++++----- util/grind/db_symtab.g | 8 +- util/grind/do_comm.c | 66 +++++---------- util/grind/expr.c | 184 ++++++++++++++++++++++++++++++++++++++++- util/grind/grind.1 | 36 ++++++-- util/grind/itemlist.cc | 64 +++++++++----- util/grind/langdep.cc | 4 +- util/grind/list.c | 2 +- util/grind/main.c | 7 +- util/grind/modula-2.c | 20 ++--- util/grind/position.c | 6 +- util/grind/print.c | 9 +- util/grind/run.c | 145 ++++++++++++++++---------------- util/grind/tree.c | 11 ++- util/grind/type.c | 3 +- 18 files changed, 426 insertions(+), 210 deletions(-) diff --git a/util/grind/Amakefile b/util/grind/Amakefile index aa11c2c04..97144e390 100644 --- a/util/grind/Amakefile +++ b/util/grind/Amakefile @@ -56,7 +56,6 @@ CSRC = { run.c, symbol.c, print.c, - value.c, type.c, rd.c, do_comm.c, @@ -133,7 +132,7 @@ LINTFLAGS = { %cluster { %targets lint.out[type = lint-output]; - %sources $CMD_LLSRC + $CSRC + $DBS_LLTARGETS + $HHSRC + char.ct + operators.ot ; + %sources $CSRC + $CMD_LLSRC + $DBS_LLTARGETS + $HHSRC + char.ct + operators.ot ; %use lint(realdest => lint.out) ; } ; diff --git a/util/grind/avl.cc b/util/grind/avl.cc index a97d5878e..da93bc4ac 100644 --- a/util/grind/avl.cc +++ b/util/grind/avl.cc @@ -170,7 +170,7 @@ add_to_avl_tree(tree, n) struct avl_tree *tree; /* tree to be added to */ char *n; /* information */ { - balance_add(&(tree->root), n, tree->cmp); + (void) balance_add(&(tree->root), n, tree->cmp); } /* extern char *find_ngt(struct avl_tree *tree, char *n); diff --git a/util/grind/c.c b/util/grind/c.c index bdbc570dd..c9c2d3647 100644 --- a/util/grind/c.c +++ b/util/grind/c.c @@ -27,7 +27,7 @@ static int print_string(), print_char(), get_number(), - get_string(), + getstring(), get_token(), print_op(), unop_prio(), @@ -37,7 +37,7 @@ static int static long array_elsize(); -static struct langdep c = { +static struct langdep c_lang = { 0, "%ld", @@ -59,7 +59,7 @@ static struct langdep c = { array_elsize, binop_prio, unop_prio, - get_string, + getstring, get_name, get_number, get_token, @@ -67,9 +67,9 @@ static struct langdep c = { fix_bin_to_pref }; -struct langdep *c_dep = &c; +struct langdep *c_dep = &c_lang; -static int +static void printchar(f, c, esc) FILE *f; int c; @@ -104,7 +104,7 @@ printchar(f, c, esc) } } -static int +static print_char(c) int c; { @@ -113,7 +113,7 @@ print_char(c) putc('\'', db_out); } -static int +static print_string(f, s, len) FILE *f; char *s; @@ -431,7 +431,7 @@ quoted(ch) } static int -get_string(c) +getstring(c) int c; { register int ch; @@ -464,7 +464,7 @@ get_string(c) return STRING; } -static int +static print_op(f, p) FILE *f; p_tree p; @@ -588,7 +588,7 @@ print_op(f, p) } } -static int +static fix_bin_to_pref(p) p_tree p; { diff --git a/util/grind/commands.g b/util/grind/commands.g index 72bac4a67..f3078b249 100644 --- a/util/grind/commands.g +++ b/util/grind/commands.g @@ -20,19 +20,22 @@ extern char *Salloc(); extern char *strindex(); extern char *strcpy(); +extern void signal_child(); extern FILE *db_in; extern int disable_intr; extern p_tree run_command, print_command; +struct token tok, aside; int errorgiven = 0; int child_interrupted = 0; int interrupted = 0; int eof_seen = 0; + +static int shellescape(); + static int extended_charset = 0; static int in_expression = 0; -struct token tok, aside; - #define binprio(op) ((*(currlang->binop_prio))(op)) #define unprio(op) ((*(currlang->unop_prio))(op)) } @@ -60,7 +63,7 @@ commands com = 0; } else { - log(com); + enterlog(com); eval(com); if (repeatable(com)) { lastcom = com; @@ -73,7 +76,7 @@ commands } } } else if (lastcom && ! errorgiven) { - log(lastcom); + enterlog(lastcom); eval(lastcom); } if (give_prompt) { @@ -101,7 +104,7 @@ command_line(p_tree *p;) | where_command(p) | STATUS { *p = mknode(OP_STATUS); } | DUMP { *p = mknode(OP_DUMP); } -| RESTORE count(p)? { *p = mknode(OP_RESTORE, *p); } +| RESTORE opt_num(p) { *p = mknode(OP_RESTORE, *p); } | delete_command(p) | print_command(p) | display_command(p) @@ -111,7 +114,7 @@ command_line(p_tree *p;) | FIND qualified_name(p){ *p = mknode(OP_FIND, *p); } | WHICH qualified_name(p){ *p = mknode(OP_WHICH, *p); } | able_command(p) -| '!' { shellescape(); +| '!' { (void) shellescape(); *p = mknode(OP_SHELL); } | source_command(p) @@ -227,7 +230,7 @@ trace_command(p_tree *p;) { p_tree whr = 0, cond = 0, exp = 0; } : TRACE - [ ON expression(&exp, 0) ]? + [ ON format_expression(&exp) ]? where(&whr)? condition(&cond)? { *p = mknode(OP_TRACE, whr, cond, exp); } ; @@ -290,7 +293,7 @@ regs_command(p_tree *p;) delete_command(p_tree *p;) : - DELETE count_list(p)? { *p = mknode(OP_DELETE, *p); } + DELETE num_list(p)? { *p = mknode(OP_DELETE, *p); } ; print_command(p_tree *p;) @@ -351,14 +354,14 @@ able_command(p_tree *p;) [ ENABLE { *p = mknode(OP_ENABLE, (p_tree) 0); } | DISABLE { *p = mknode(OP_DISABLE, (p_tree) 0); } ] - count_list(&(*p)->t_args[0])? + num_list(&(*p)->t_args[0])? ; -count_list(p_tree *p;) +num_list(p_tree *p;) : - count(p) + num(p) [ ',' { *p = mknode(OP_LINK, *p, (p_tree) 0); } - count(&(*p)->t_args[1]) + num(&(*p)->t_args[1]) ]* ; @@ -481,12 +484,17 @@ count(p_tree *p;) ; opt_num(p_tree *p;) +: + num(p) +| + { *p = 0; } +; + +num(p_tree *p;) : count(p) | '-' count(p) { (*p)->t_ival = - (*p)->t_ival; } -| - { *p = 0; } ; qualified_name(p_tree *p;) @@ -609,7 +617,7 @@ get_name(c) return id->id_reserved ? id->id_reserved : NAME; } -extern char * symbol2str(); +extern char *symbol2str(); LLmessage(t) { @@ -630,7 +638,7 @@ LLmessage(t) errorgiven = 1; } -static int +static void catch_del() { signal(SIGINT, catch_del); @@ -641,13 +649,13 @@ catch_del() interrupted = 1; } -int +void init_del() { signal(SIGINT, catch_del); } -static int +static void ctch() { /* Only for shell escapes ... */ @@ -656,7 +664,7 @@ ctch() #define SHBUFSIZ 512 -int +static int shellescape() { register char *p; /* walks through command */ diff --git a/util/grind/db_symtab.g b/util/grind/db_symtab.g index 0a856b04f..9eab3ecf1 100644 --- a/util/grind/db_symtab.g +++ b/util/grind/db_symtab.g @@ -21,9 +21,7 @@ extern char *strindex(); extern long str2long(); extern double atof(); -extern long pointer_size; - -static char *DbPtr; /* current pointer in DBX string */ +static char *DbPtr; /* current pointer in db string */ static int AllowName; /* set if NAME legal at this point */ static long ival; static double fval; @@ -718,7 +716,7 @@ static unsigned int NAckNames; /* Number of ACK symbol table entries */ static struct outname *EndAckNames; /* &AckNames[NAckNames] */ /* Read the symbol table from file 'f', which is supposed to be an - ACK a.out format file. Offer DBX strings to the DBX string parser. + ACK a.out format file. Offer db strings to the db string parser. */ int DbRead(f) @@ -760,7 +758,7 @@ DbRead(f) else n->on_mptr = 0; } - /* Offer strings to the DBX string parser if they contain a ':'. + /* Offer strings to the db string parser if they contain a ':'. Also offer filename-line number information to add_position_addr(). Here, the order may be important. */ diff --git a/util/grind/do_comm.c b/util/grind/do_comm.c index 41b394b75..5b8cb170b 100644 --- a/util/grind/do_comm.c +++ b/util/grind/do_comm.c @@ -16,15 +16,16 @@ #include "symbol.h" #include "scope.h" #include "file.h" -#include "message.h" extern FILE *db_out; extern t_lineno listline, currline; -extern int stop_reason; extern int interrupted; +extern int stack_offset; p_tree print_command; +extern void set_bytes(); + /*ARGSUSED*/ do_noop(p) p_tree p; @@ -230,7 +231,6 @@ extern t_addr get_dump(); struct dump { char *globals, *stack; - struct message_hdr mglobal, mstack; struct dump *next; }; @@ -245,7 +245,7 @@ do_dump(p) error("could not allocate enough memory"); return; } - p->t_address = get_dump(&d->mglobal, &d->globals, &d->mstack, &d->stack); + p->t_address = get_dump(&d->globals, &d->stack); if (! p->t_address) { free((char *) d); return; @@ -276,7 +276,8 @@ do_restore(p) return; } - if (! put_dump(&d->mglobal, d->globals, &d->mstack, d->stack)) { + if (! put_dump(d->globals, d->stack)) { + error("restoring failed"); } perform_items(); } @@ -468,7 +469,7 @@ setstop(p, kind) do_stop(p) p_tree p; { - if (! setstop(p, M_SETBP)) { + if (! setstop(p, 1)) { return; } add_to_item_list(p); @@ -504,7 +505,7 @@ do_trace(p) p_tree p; { p->t_address = NO_ADDR; - if (! settrace(p, M_SETTRACE)) { + if (! settrace(p, 1)) { return; } add_to_item_list(p); @@ -520,12 +521,7 @@ able(p, kind) int kind; { if (!p) { - if (stop_reason) { - able_item(stop_reason, kind); - } - else { - error("no current stopping point"); - } + able_item(0, kind); return; } switch(p->t_oper) { @@ -585,7 +581,7 @@ do_continue(p) } } if (count > 0) { - fprintf(db_out, "Only %d breakpoints skipped\n", + fprintf(db_out, "Only %ld breakpoints skipped\n", p->t_args[0]->t_ival - count); } } @@ -598,7 +594,7 @@ do_step(p) p_tree p; { p = p->t_args[0]; - if (! singlestep(M_SETSS, p ? p->t_ival : 1L)) { + if (! singlestep(0, p ? p->t_ival : 1L)) { } } @@ -610,7 +606,7 @@ do_next(p) p_tree p; { p = p->t_args[0]; - if (! singlestep(M_SETSSF, p? p->t_ival : 1L)) { + if (! singlestep(1, p? p->t_ival : 1L)) { } } @@ -663,7 +659,7 @@ where_entry(num) fprintf(db_out, "%s(", sc->sc_definedby->sy_idf->id_text); print_params(sc->sc_definedby->sy_type, AB, has_static_link(sc)); fputs(") ", db_out); - print_position(where_PC, 0); + (void) print_position(where_PC, 0); fputs("\n", db_out); return 1; } @@ -705,21 +701,13 @@ do_where(p) /* implementation of the delete command */ -extern p_tree remove_from_item_list(); - do_delete(p) p_tree p; { switch(p->t_oper) { case OP_DELETE: if (! p->t_args[0]) { - if (stop_reason) { - remove_from_item_list(stop_reason); - stop_reason = 0; - } - else { - error("no current stopping point"); - } + remove_from_item_list(0); } else do_delete(p->t_args[0]); break; @@ -728,20 +716,7 @@ do_delete(p) do_delete(p->t_args[1]); break; case OP_INTEGER: - p = remove_from_item_list((int) p->t_ival); - - if (p) switch(p->t_oper) { - case OP_WHEN: - case OP_STOP: - setstop(p, M_CLRBP); - break; - case OP_TRACE: - settrace(p, M_CLRTRACE); - break; - case OP_DUMP: - free_dump(p); - } - freenode(p); + remove_from_item_list((int) p->t_ival); break; default: assert(0); @@ -939,7 +914,7 @@ do_log(p) extern int item_count; extern int in_wheninvoked; -log(p) +enterlog(p) p_tree p; { register p_tree p1; @@ -952,19 +927,20 @@ log(p) case OP_DELETE: case OP_ENABLE: case OP_DISABLE: + case OP_RESTORE: /* Change absolute item numbers into relative ones for safer replay */ p1 = p->t_args[0]; while (p1 && p1->t_oper == OP_LINK) { register p_tree p2 = p1->t_args[0]; - if (p2->t_ival > 0) { - p2->t_ival = item_count - p2->t_ival; + if (p2->t_ival > 0 && p2->t_ival <= item_count) { + p2->t_ival = p2->t_ival - item_count - 1; } p1 = p1->t_args[1]; } - if (p1 && p1->t_ival > 0) { - p1->t_ival = item_count - p1->t_ival; + if (p1 && p1->t_ival > 0 && p1->t_ival <= item_count) { + p1->t_ival = p1->t_ival - item_count - 1; } /* Fall through */ default: diff --git a/util/grind/expr.c b/util/grind/expr.c index 92ae22e59..2bf0a7e5d 100644 --- a/util/grind/expr.c +++ b/util/grind/expr.c @@ -7,10 +7,10 @@ and returns 1 if it evaluates to TRUE, or 0 if it could not be evaluated for some reason or if it evalutes to FALSE. If the expression cannot be evaluated, an error message is given. - - int eval_desig(p_tree p, t_addr *pbuf, long **psize, p_type *ptp) + - int eval_desig(p_tree p, t_addr *paddr, long **psize, p_type *ptp) This routine evaluates the expression indicated by p, which should result in a designator. The result of the expression is an address - which is to be found in *pbuf. *psize will contain the size of the + which is to be found in *paddr. *psize will contain the size of the designated object, and *ptp its type. If the expression cannot be evaluated or does not result in a designator, 0 is returned and an error message is given. @@ -50,15 +50,185 @@ #include "symbol.h" #include "type.h" #include "langdep.h" +#include "scope.h" +#include "idf.h" extern FILE *db_out; +extern int stack_offset; extern char *strcpy(); +extern t_addr *get_EM_regs(); +extern char *memcpy(); #define malloc_succeeded(p) if (! (p)) {\ error("could not allocate enough memory");\ return 0;\ } +/* static t_addr get_addr(p_symbol sym; long *psize); + Get the address of the object indicated by sym. Returns 0 on failure, + address on success. *psize will contain size of object. + For local variables or parameters, the 'stack_offset' variable is + used to determine from which stack frame the search must start. +*/ +static t_addr +get_addr(sym, psize) + register p_symbol sym; + long *psize; +{ + p_type tp = sym->sy_type; + long size = tp->ty_size; + t_addr *EM_regs; + int i; + p_scope sc, symsc; + + *psize = size; + switch(sym->sy_class) { + case VAR: + /* exists if child exists; nm_value contains addres */ + return (t_addr) sym->sy_name.nm_value; + case VARPAR: + case LOCVAR: + /* first find the stack frame in which it resides */ + symsc = base_scope(sym->sy_scope); + + /* now symsc contains the scope where the storage for sym is + allocated. Now find it on the stack of child. + */ + i = stack_offset; + for (;;) { + sc = 0; + if (! (EM_regs = get_EM_regs(i++))) { + return 0; + } + if (! EM_regs[1]) { + error("%s not available", sym->sy_idf->id_text); + return 0; + } + sc = base_scope(get_scope_from_addr(EM_regs[2])); + if (! sc || sc->sc_start > EM_regs[2]) { + error("%s not available", sym->sy_idf->id_text); + sc = 0; + return 0; + } + if (sc == symsc) break; /* found it */ + } + + if (sym->sy_class == LOCVAR) { + /* Either local variable or value parameter */ + return EM_regs[sym->sy_name.nm_value < 0 ? 0 : 1] + + (t_addr) sym->sy_name.nm_value; + } + + /* If we get here, we have a var parameter. Get the parameters + of the current procedure invocation. + */ + { + p_type proctype = sc->sc_definedby->sy_type; + t_addr a; + char *AB; + + size = proctype->ty_nbparams; + if (has_static_link(sc)) size += pointer_size; + AB = malloc((unsigned) size); + if (! AB) { + error("could not allocate enough memory"); + break; + } + if (! get_bytes(size, EM_regs[1], AB)) { + break; + } + if ((size = tp->ty_size) == 0) { + size = compute_size(tp, AB); + *psize = size; + } + a = (t_addr) get_int(AB+sym->sy_name.nm_value, pointer_size, T_UNSIGNED); + free(AB); + return a; + } + default: + error("%s is not a variable", sym->sy_idf->id_text); + break; + } + return 0; +} + +/* static int get_value(p_symbol sym; char **pbuf; long *psize); + Get the value of the symbol indicated by sym. Return 0 on failure, + 1 on success. On success, 'pbuf' contains the value, and 'psize' contains + the size. For 'pbuf', storage is allocated by malloc; this storage must + be freed by caller (I don't like this any more than you do, but caller + does not know sizes). + For local variables or parameters, the 'stack_offset' variable is + used to determine from which stack frame the search must start. +*/ +static int +get_value(sym, pbuf, psize) + register p_symbol sym; + char **pbuf; + long *psize; +{ + p_type tp = sym->sy_type; + int retval = 0; + t_addr a; + long size = tp->ty_size; + + *pbuf = 0; + switch(sym->sy_class) { + case CONST: + *pbuf = malloc((unsigned) size); + if (! *pbuf) { + error("could not allocate enough memory"); + break; + } + switch(tp->ty_class) { + case T_REAL: + put_real(*pbuf, size, sym->sy_const.co_rval); + break; + case T_INTEGER: + case T_SUBRANGE: + case T_UNSIGNED: + case T_ENUM: + put_int(*pbuf, size, sym->sy_const.co_ival); + break; + case T_SET: + memcpy(*pbuf, sym->sy_const.co_setval, (int) size); + break; + case T_STRING: + memcpy(*pbuf, sym->sy_const.co_sval, (int) size); + break; + default: + fatal("strange constant"); + } + retval = 1; + break; + case VAR: + case VARPAR: + case LOCVAR: + a = get_addr(sym, psize); + if (a) { + size = *psize; + *pbuf = malloc((unsigned) size); + if (! *pbuf) { + error("could not allocate enough memory"); + break; + } + if (get_bytes(size, a, *pbuf)) { + retval = 1; + } + } + break; + } + + if (retval == 0) { + if (*pbuf) free(*pbuf); + *pbuf = 0; + *psize = 0; + } + else *psize = size; + + return retval; +} + /* buffer to integer and vice versa routines */ long @@ -808,6 +978,10 @@ cmp_op(p, pbuf, psize, ptp) else l1 = (unsigned long) l1 > (unsigned long) l2; break; + default: + l1 = 0; + assert(0); + break; } break; case T_REAL: @@ -834,6 +1008,10 @@ cmp_op(p, pbuf, psize, ptp) case E_GT: l1 = d1 > d2; break; + default: + l1 = 0; + assert(0); + break; } break; default: @@ -1163,8 +1341,6 @@ eval_expr(p, pbuf, psize, ptp) return retval; } -extern t_addr get_addr(); - int eval_desig(p, paddr, psize, ptp) p_tree p; diff --git a/util/grind/grind.1 b/util/grind/grind.1 index df2853dc0..9940f07e8 100644 --- a/util/grind/grind.1 +++ b/util/grind/grind.1 @@ -57,6 +57,21 @@ values of type INTEGER with values of type REAL in an expression without using conversion routines. In .BR grind , the conversions needed are performed automatically. +.LP +Expressions whose value is to be printed can be given a "format" by appending +a `\e', followed by a format. A format consists of a string of letters. +The following letters are available: +.LP +.nf +c print all integer values as a char +d print all integer values in signed decimal format +o print all integer values in octal format +x print all integer values in hexadecimal format +h print all integer values in hexadecimal format +u print all integer values in unsigned decimal format +s for "pointer to char" types, make an attempt to print + the indicated string +.fi .SS Operators .LP .B Grind @@ -64,7 +79,7 @@ supports operators for addition, subtraction, multiplication, division, remainder, bitwise or, bitwise xor, bitwise and, boolean or, boolean and, left-shift, right-shift, address-of, dereference, less than, less than or equal, equal, not equal, greater than, greater than or equal, -selection. +selection, array subscripting. .LP The syntax and priority of these operators depends on the source language. Parentheses can be used for grouping. @@ -97,10 +112,20 @@ This indicates the first statement within the named function (except for the trace command discussed later). The following way is also accepted: .RS -\fBat\fP [ "\fIfilename\fP": ] \fIlinenumber\fP \fBin \fIfunction\fP +\fBin\fP \fIfunction\fP \fBat\fP [ "\fIfilename\fP": ] \fIlinenumber\fP .RE In this case, consistency of the information given is checked. This last form is useful for "stuffing" output from the status command described later. +.SS "Command numbers" +.LP +Some command numbers have a command number associated with them. Other commands +refer to these command numbers. These command numbers can either be given as +an absolute number, or as a negative number. In the last case, the number +is interpreted relative to the last number assigned. This feature is normally +only used for commands that are put in a log file, so that "sourceing" these +log files is safer (see also the description of the \fBsource\fP and \fBlog\fP +commands). + .SS "Commands" .TP .B ^C @@ -130,7 +155,7 @@ command. .br Continue execution from where it stopped, or, if \fIsourceline\fP is given, at that source line. If \fIcount\fP is given, pass \fIcount\fP-1 -breakpoints. +breakpoints. \fIsourceline\fP must be in the same function. .TP \fBtrace\fP [ \fBon\fP \fIexpression\fP ] [ \fIposition\fP ] [ \fBif\fP \fIcondition\fP ] .ti -0.5i @@ -169,7 +194,7 @@ If no condition is given, stop when is reached. Either a position or a condition (or both) must be given. .TP -\fBwhen\fP [ \fIposition\fP ] [ \fBif\fP \fIcondition\fP ] { \fIcommand\fP [ ; \fIcommand ] ... } +\fBwhen\fP [ \fIposition\fP ] [ \fBif\fP \fIcondition\fP ] { \fIcommand\fP [ ; \fIcommand\fP ] ... } Execute the .B grind .IR command (s) @@ -340,6 +365,7 @@ executing \fBgrind\fP log files created with the \fBlog\fP command. .br Start logging the \fBgrind\fP commands given on file \fIfilename\fP, or stop logging. If no argument is given, the current log file is printed. +In logged commands, an absolute command number is replaced by a relative one. .TP \fBdisable\fP [ \fIcommandnumber\fP [ , \fIcommandnumber\fP ... ] ] .br @@ -364,7 +390,7 @@ breakpoint. Invoke the shell with \fIshellcommand\fP. \fIshellcommand\fP extends to the end of the line. In the command, the characters `%' and `!' are replaced with the current file name and the previous shell command respectively. -The sequences `\%' and `\!' are replaced by `%' and `!' respectively. +The sequences `\e%' and `\e!' are replaced by `%' and `!' respectively. .TP \fBframe\fP [ \fIcount\fP | + \fIcount\fP | - \fIcount\fP ] .br diff --git a/util/grind/itemlist.cc b/util/grind/itemlist.cc index dd1959fee..5d6674121 100644 --- a/util/grind/itemlist.cc +++ b/util/grind/itemlist.cc @@ -7,11 +7,9 @@ #include "position.h" #include "tree.h" #include "operator.h" -#include "message.h" extern FILE *db_out; extern int db_ss; -int stop_reason; typedef struct item { struct item *i_next; @@ -27,6 +25,7 @@ struct itemlist { }; static struct itemlist item_list; +static int stop_reason; int item_count; static int @@ -57,11 +56,10 @@ item_addr_actions(a, mess_type, may_stop) int mess_type; int may_stop; { - /* Perform actions associated with position 'a', and return 1 if we must stop - there, and 0 if not. + /* Perform actions associated with position 'a', and return stop_reason + if we must stop there, and 0 if not. */ register p_item i = item_list.il_first; - int stopping = 0; stop_reason = 0; for (i = item_list.il_first; i != 0; i = i->i_next) { @@ -71,10 +69,9 @@ item_addr_actions(a, mess_type, may_stop) && (p->t_address == a || p->t_address == NO_ADDR)) { switch(p->t_oper) { case OP_STOP: - if (mess_type != M_DB_SS && mess_type != M_OK) break; + if (mess_type != 1) break; if (! p->t_args[1] || eval_cond(p->t_args[1])) { if (! stop_reason) stop_reason = i->i_itemno; - stopping = 1; } break; case OP_TRACE: @@ -94,7 +91,7 @@ item_addr_actions(a, mess_type, may_stop) && (p->t_address == a || p->t_address == NO_ADDR)) { switch(p->t_oper) { case OP_TRACE: - if ((! stopping && mess_type != M_END_SS) + if ((! stop_reason && mess_type != 0) || p->t_args[2] || ! may_stop) { perform(p, a); } @@ -111,7 +108,7 @@ item_addr_actions(a, mess_type, may_stop) } } } - return stopping; + return stop_reason; } handle_displays() @@ -131,7 +128,7 @@ add_to_item_list(p) { p_item i; - if (in_item_list(p)) return 1; + if (in_item_list(p)) return; i = new_item(); i->i_node = p; @@ -146,17 +143,23 @@ add_to_item_list(p) i->i_itemno = ++item_count; item_list.il_last = i; pr_item(i); - return 1; } -p_tree remove_from_item_list(n) int n; { register p_item i = item_list.il_first, prev = 0; p_tree p; - if (n <= 0) n = item_count - n; + if (n == 0) { + n = stop_reason; + if (n == 0) { + error("no current stopping point"); + return; + } + stop_reason = 0; + } + if (n < 0) n = item_count + n + 1; while (i) { if (i->i_itemno == n) break; prev = i; @@ -164,7 +167,7 @@ remove_from_item_list(n) } if (! i) { error("no item %d in current status", n); - return 0; + return; } if (i->i_itemno == stop_reason) stop_reason = 0; if (prev) { @@ -176,7 +179,19 @@ remove_from_item_list(n) if (p->t_address == NO_ADDR && (p->t_oper != OP_TRACE || ! p->t_args[0])) db_ss--; free_item(i); - return p; + switch(p->t_oper) { + case OP_STOP: + case OP_WHEN: + (void) setstop(p, 0); + break; + case OP_TRACE: + (void) settrace(p, 0); + break; + case OP_DUMP: + free_dump(p); + break; + } + freenode(p); } p_tree @@ -185,7 +200,11 @@ get_from_item_list(n) { register p_item i = item_list.il_first; - if (n <= 0) n = item_count - n; + if (n == 0) { + n = stop_reason; + if (n == 0) return 0; + } + if (n < 0) n = item_count + n + 1; while (i) { if (i->i_itemno == n) return i->i_node; i = i->i_next; @@ -199,7 +218,14 @@ able_item(n, kind) register p_item i = item_list.il_first; register p_tree p; - if (n <= 0) n = item_count - n; + if (n == 0) { + n = stop_reason; + if (n == 0) { + error("no current stopping point"); + return; + } + } + if (n < 0) n = item_count + n + 1; while (i) { if (i->i_itemno == n) break; i = i->i_next; @@ -221,10 +247,10 @@ able_item(n, kind) switch(p->t_oper) { case OP_STOP: case OP_WHEN: - setstop(p, kind ? M_CLRBP : M_SETBP); + (void) setstop(p, ! kind); break; case OP_TRACE: - settrace(p, kind ? M_CLRTRACE : M_SETTRACE); + (void) settrace(p, ! kind); break; } } diff --git a/util/grind/langdep.cc b/util/grind/langdep.cc index c663f90ea..0759b12d3 100644 --- a/util/grind/langdep.cc +++ b/util/grind/langdep.cc @@ -14,7 +14,7 @@ static struct langlist *list; struct langdep *currlang; -static int +static void add_language(suff, lang) char *suff; struct langdep *lang; @@ -27,14 +27,12 @@ add_language(suff, lang) list = p; } -int init_languages() { add_language(".mod", m2_dep); add_language(".c", c_dep); } -int find_language(suff) char *suff; { diff --git a/util/grind/list.c b/util/grind/list.c index 4406b0f9c..995edcbc1 100644 --- a/util/grind/list.c +++ b/util/grind/list.c @@ -15,7 +15,7 @@ extern FILE *db_out; extern t_lineno currline; extern int interrupted; -static int +static void mk_filnm(dir, file, newname) char *dir; char *file; diff --git a/util/grind/main.c b/util/grind/main.c index 4d097b73e..2bf826634 100644 --- a/util/grind/main.c +++ b/util/grind/main.c @@ -21,6 +21,9 @@ FILE *db_in; int debug; extern struct tokenname tkidf[]; extern char *strindex(); +extern void signal_child(); +extern void init_del(); +extern void init_run(); extern int eof_seen; extern int interrupted; @@ -73,9 +76,7 @@ main(argc, argv) else if (AObj == 0) AObj = "a.out"; reserve(tkidf); reserve(shorts); - if (! init_run()) { - fatal("something wrong with file descriptors"); - } + init_run(); prompt(); Commands(); signal_child(SIGKILL); diff --git a/util/grind/modula-2.c b/util/grind/modula-2.c index 293aae4dd..0a3d2670b 100644 --- a/util/grind/modula-2.c +++ b/util/grind/modula-2.c @@ -25,9 +25,9 @@ static int print_string(), print_char(), get_number(), - get_name(), + getname(), get_token(), - get_string(), + getstring(), print_op(), binop_prio(), unop_prio(), @@ -58,8 +58,8 @@ static struct langdep m2 = { array_elsize, binop_prio, unop_prio, - get_string, - get_name, + getstring, + getname, get_number, get_token, print_op, @@ -68,7 +68,7 @@ static struct langdep m2 = { struct langdep *m2_dep = &m2; -static int +static print_char(c) int c; { @@ -76,7 +76,7 @@ print_char(c) fprintf(db_out, (c >= 040 && c < 0177) ? "'%c'" : "%oC", c); } -static int +static print_string(f, s, len) FILE *f; char *s; @@ -298,7 +298,7 @@ get_number(ch) } static int -get_name(c) +getname(c) register int c; { char buf[512+1]; @@ -437,7 +437,7 @@ get_token(c) } static int -get_string(c) +getstring(c) int c; { register int ch; @@ -457,7 +457,7 @@ get_string(c) return STRING; } -static int +static print_op(f, p) FILE *f; p_tree p; @@ -549,7 +549,7 @@ print_op(f, p) } } -static int +static fix_bin_to_pref() { /* No problems of this kind in Modula-2 */ diff --git a/util/grind/position.c b/util/grind/position.c index a8882bbdc..5549adb04 100644 --- a/util/grind/position.c +++ b/util/grind/position.c @@ -143,11 +143,11 @@ print_position(a, print_function) t_addr a; int print_function; { - register p_scope sc = base_scope(get_scope_from_addr(a)); register p_position pos = get_position_from_addr(a); - if (sc && print_function) { - fprintf(db_out, "in %s ", sc->sc_definedby->sy_idf->id_text); + if (print_function) { + register p_scope sc = base_scope(get_scope_from_addr(a)); + if (sc) fprintf(db_out, "in %s ", sc->sc_definedby->sy_idf->id_text); } if (pos) fprintf(db_out, "at \"%s\":%u", pos->filename, pos->lineno); return pos; diff --git a/util/grind/print.c b/util/grind/print.c index 6e0e345cb..a551b0803 100644 --- a/util/grind/print.c +++ b/util/grind/print.c @@ -5,7 +5,6 @@ #include #include "type.h" -#include "message.h" #include "langdep.h" #include "scope.h" #include "symbol.h" @@ -28,6 +27,9 @@ print_unsigned(tp, v, format) format++; } switch(format == 0 ? 0 : *format) { + case 'u': + fprintf(db_out, currlang->uns_fmt, v); + break; default: if (tp != uchar_type) { fprintf(db_out, currlang->uns_fmt, v); @@ -107,6 +109,9 @@ print_integer(tp, v, format) case 'h': fprintf(db_out, currlang->hexint_fmt, v); break; + case 'u': + fprintf(db_out, currlang->uns_fmt, v); + break; } } @@ -251,7 +256,7 @@ print_val(tp, tp_sz, addr, compressed, indent, format) if (fld->fld_bitsize < (sz << 3)) { /* apparently a bit field */ /* ??? */ - fprintf(db_out, "", fld->fld_bitsize, sz); + fprintf(db_out, "", fld->fld_bitsize, sz); } else print_val(fld->fld_type, sz, addr+(fld->fld_pos>>3), compressed, indent, format); if (compressed && i > 1) { diff --git a/util/grind/run.c b/util/grind/run.c index 937aa6ff4..3e631200f 100644 --- a/util/grind/run.c +++ b/util/grind/run.c @@ -26,12 +26,9 @@ extern struct idf *str2idf(); extern char *AObj; extern FILE *db_out; extern int debug; -extern long pointer_size; extern char *progname; extern int child_interrupted; extern int interrupted; -extern int stop_reason; -extern int stack_offset; extern t_lineno currline; static int child_pid; /* process id of child */ @@ -39,17 +36,20 @@ static int to_child, from_child; /* file descriptors for communication */ static int child_status; static int restoring; static int fild1[2], fild2[2]; /* pipe file descriptors */ + int disable_intr = 1; - int db_ss; +int stack_offset; -static int catch_sigpipe(); +void signal_child(); + +static void catch_sigpipe(); static int stopped(); static int uputm(), ugetm(); static t_addr curr_stop; p_tree run_command; -static +static void ITOBUF(p, l, sz) register char *p; long l; @@ -78,7 +78,7 @@ BUFTOI(p, sz) return l; } -int +void init_run() { /* take file descriptors so that listing cannot take them */ @@ -89,26 +89,24 @@ init_run() pipe(fild2) < 0 || fild1[0] != 3 || fild2[1] != 6) { - return 0; + fatal("something wrong with file descriptors"); } to_child = fild1[1]; from_child = fild2[0]; child_pid = 0; if (currfile) CurrentScope = currfile->sy_file->f_scope; currline = 0; - return 1; } extern int errno; -int start_child(p) p_tree p; { /* start up the process to be debugged and set up communication */ char *argp[MAXARG]; /* argument list */ - register p_tree pt = p->t_args[0], pt1; + register p_tree pt = p->t_args[0], pt1 = 0; unsigned int nargs = 1; /* #args */ char *in_redirect = 0; /* standard input redirected */ char *out_redirect = 0; /* standard output redirected */ @@ -134,20 +132,20 @@ start_child(p) } else { error("too many arguments"); - return 0; + return; } break; case OP_INPUT: if (in_redirect) { error("input redirected twice?"); - return 0; + return; } in_redirect = pt->t_str; break; case OP_OUTPUT: if (out_redirect) { error("output redirected twice?"); - return 0; + return; } out_redirect = pt->t_str; break; @@ -162,7 +160,7 @@ start_child(p) child_pid = fork(); if (child_pid < 0) { error("could not create child"); - return 0; + return; } if (child_pid == 0) { /* this is the child process */ @@ -205,11 +203,10 @@ start_child(p) exit(1); } - /* debugger */ - close(fild1[0]); - close(fild2[1]); + /* debugger; don't close fild1[0] and fild2[1]; we want those file + descriptors occupied! + */ - pipe(fild1); /* to occupy file descriptors */ signal(SIGPIPE, catch_sigpipe); { struct message_hdr m; @@ -217,21 +214,20 @@ start_child(p) if (! ugetm(&m)) { error("child not responding"); init_run(); - return 0; + return; } curr_stop = BUFTOI(m.m_buf+1, (int) PS); CurrentScope = get_scope_from_addr(curr_stop); } perform_items(); - if (! restoring && ! item_addr_actions(curr_stop, M_OK, 1)) { - send_cont(1); + if (! restoring) { + int stop_reason = item_addr_actions(curr_stop, 1, 1); + if (! stop_reason) (void) send_cont(1); + else (void) stopped("stopped", curr_stop, stop_reason); } - else if (! restoring) { - stopped("stopped", curr_stop); - } - return 1; } +void signal_child(sig) { if (child_pid) { @@ -243,7 +239,7 @@ signal_child(sig) } } -static int +static void catch_sigpipe() { child_pid = 0; @@ -348,9 +344,10 @@ static struct message_hdr answer; static int single_stepping; static int -stopped(s, a) - char *s; /* stop message */ - t_addr a; /* address where stopped */ +stopped(s, a, stop_reason) + char *s; /* stop message */ + t_addr a; /* address where stopped */ + int stop_reason; /* status entry causing the stop */ { p_position pos; @@ -377,16 +374,17 @@ could_send(m, stop_message) t_addr a; static int level = 0; int child_dead = 0; + int stop_reason; level++; for (;;) { + stop_reason = 0; if (! child_pid) { error("no process"); return 0; } if (m->m_type & M_DB_RUN) { disable_intr = 0; - stop_reason = 0; stack_offset = 0; } if (!child_interrupted && (! uputm(m) || ! ugetm(&answer))) { @@ -405,7 +403,7 @@ could_send(m, stop_message) if (! level) { child_interrupted = 0; interrupted = 0; - stopped("interrupted", (t_addr) BUFTOI(answer.m_buf+1, (int)PS)); + return stopped("interrupted", (t_addr) BUFTOI(answer.m_buf+1, (int)PS), 0); } return 1; } @@ -428,11 +426,14 @@ could_send(m, stop_message) } a = BUFTOI(answer.m_buf+1, (int)PS); type = answer.m_type & 0377; + if (type == M_END_SS) type = 0; + else if (type == M_OK || type == M_DB_SS) type = 1; + else type = 2; if (m->m_type & M_DB_RUN) { /* run command */ CurrentScope = get_scope_from_addr((t_addr) a); - if (! item_addr_actions(a, type, stop_message) && - ( type == M_DB_SS || type == M_OK)) { + if (!(stop_reason = item_addr_actions(a, type, stop_message)) + && (type == 1)) { /* no explicit breakpoints at this position. Also, child did not stop because of SETSS or SETSSF, otherwise we would @@ -444,16 +445,16 @@ could_send(m, stop_message) } continue; } - if (type != M_END_SS && single_stepping) { + if (type != 0 && single_stepping) { m->m_type = M_CLRSS; if (! uputm(m) || ! ugetm(&answer)) return 0; } single_stepping = 0; } - if (stop_message) { - stopped("stopped", a); - } level--; + if (stop_message) { + return stopped("stopped", a, stop_reason); + } return 1; } /*NOTREACHED*/ @@ -513,6 +514,7 @@ get_string(size, from, to) return retval; } +void set_bytes(size, from, to) long size; char *from; @@ -542,11 +544,11 @@ set_bytes(size, from, to) } t_addr -get_dump(globmessage, globbuf, stackmessage, stackbuf) - struct message_hdr *globmessage, *stackmessage; +get_dump(globbuf, stackbuf) char **globbuf, **stackbuf; { struct message_hdr m; + struct message_hdr *globm, *stackm; long sz; m.m_type = M_DUMP; @@ -566,51 +568,54 @@ get_dump(globmessage, globbuf, stackmessage, stackbuf) assert(0); } - *globmessage = answer; sz = BUFTOI(answer.m_buf+1, (int)LS); - *globbuf = malloc((unsigned) sz); - if (! ureceive(*globbuf, sz) || ! ugetm(stackmessage)) { + *globbuf = malloc((unsigned) (sz+sizeof(struct message_hdr))); + if (! *globbuf + || ! ureceive(*globbuf+sizeof(struct message_hdr), sz) + || ! ugetm(&m)) { if (*globbuf) free(*globbuf); + else error("could not allocate enougn memory"); return 0; } - assert(stackmessage->m_type == M_DSTACK); - sz = BUFTOI(stackmessage->m_buf+1, (int)LS); - *stackbuf = malloc((unsigned) sz); - if (! ureceive(*stackbuf, sz)) { - if (*globbuf) free(*globbuf); + globm = (struct message_hdr *) *globbuf; + *globm = answer; + + assert(m.m_type == M_DSTACK); + sz = BUFTOI(m.m_buf+1, (int)LS); + *stackbuf = malloc((unsigned) sz+sizeof(struct message_hdr)); + if (! *stackbuf || ! ureceive(*stackbuf+sizeof(struct message_hdr), sz)) { + free(*globbuf); if (*stackbuf) free(*stackbuf); + else error("could not allocate enougn memory"); return 0; } - ITOBUF(globmessage->m_buf+SP_OFF, BUFTOI(stackmessage->m_buf+SP_OFF, (int)PS), (int) PS); - if (! *globbuf || ! *stackbuf) { - error("could not allocate enough memory"); - if (*globbuf) free(*globbuf); - if (*stackbuf) free(*stackbuf); - return 0; - } - return BUFTOI(globmessage->m_buf+PC_OFF, (int)PS); + stackm = (struct message_hdr *) *stackbuf; + *stackm = m; + ITOBUF(globm->m_buf+SP_OFF, BUFTOI(stackm->m_buf+SP_OFF, (int)PS), (int) PS); + return BUFTOI(globm->m_buf+PC_OFF, (int)PS); } int -put_dump(globmessage, globbuf, stackmessage, stackbuf) - struct message_hdr *globmessage, *stackmessage; +put_dump(globbuf, stackbuf) char *globbuf, *stackbuf; { struct message_hdr m; - int retval; + struct message_hdr *globm = (struct message_hdr *) globbuf, + *stackm = (struct message_hdr *) stackbuf; + stackbuf += sizeof(struct message_hdr); + globbuf += sizeof(struct message_hdr); if (! child_pid) { restoring = 1; start_child(run_command); restoring = 0; } - retval = uputm(globmessage) - && usend(globbuf, BUFTOI(globmessage->m_buf+1, (int) LS)) - && uputm(stackmessage) - && usend(stackbuf, BUFTOI(stackmessage->m_buf+1, (int) LS)) + return uputm(globm) + && usend(globbuf, BUFTOI(globm->m_buf+1, (int) LS)) + && uputm(stackm) + && usend(stackbuf, BUFTOI(stackm->m_buf+1, (int) LS)) && ugetm(&m) - && stopped("restored", BUFTOI(m.m_buf+1, (int) PS)); - return retval; + && stopped("restored", BUFTOI(m.m_buf+1, (int) PS), 0); } t_addr * @@ -688,7 +693,7 @@ singlestep(type, count) { struct message_hdr m; - m.m_type = type | (db_ss ? M_DB_SS : 0); + m.m_type = (type ? M_SETSSF : M_SETSS) | (db_ss ? M_DB_SS : 0); ITOBUF(m.m_buf+1, count, (int) LS); single_stepping = 1; if (could_send(&m, 1) && child_pid) return 1; @@ -703,9 +708,9 @@ set_or_clear_breakpoint(a, type) { struct message_hdr m; - m.m_type = type; + m.m_type = type ? M_SETBP : M_CLRBP; ITOBUF(m.m_buf+1, (long) a, (int) PS); - if (debug) printf("%s breakpoint at 0x%lx\n", type == M_SETBP ? "setting" : "clearing", (long) a); + if (debug) printf("%s breakpoint at 0x%lx\n", type ? "setting" : "clearing", (long) a); if (child_pid && ! could_send(&m, 0)) { } @@ -719,10 +724,10 @@ set_or_clear_trace(start, end, type) { struct message_hdr m; - m.m_type = type; + m.m_type = type ? M_SETTRACE : M_CLRTRACE; ITOBUF(m.m_buf+1, (long)start, (int) PS); ITOBUF(m.m_buf+PS+1, (long)end, (int) PS); - if (debug) printf("%s trace at [0x%lx,0x%lx]\n", type == M_SETTRACE ? "setting" : "clearing", (long) start, (long) end); + if (debug) printf("%s trace at [0x%lx,0x%lx]\n", type ? "setting" : "clearing", (long) start, (long) end); if (child_pid && ! could_send(&m, 0)) { return 0; } diff --git a/util/grind/tree.c b/util/grind/tree.c index fb5e1077e..2e9f0e1ca 100644 --- a/util/grind/tree.c +++ b/util/grind/tree.c @@ -11,7 +11,6 @@ #include "file.h" #include "idf.h" #include "tree.h" -#include "message.h" #include "scope.h" #include "symbol.h" #include "langdep.h" @@ -267,7 +266,7 @@ print_node(f, p, top_level) break; case OP_DUMP: fputs("dump ", f); - print_position(p->t_address, 1); + (void) print_position(p->t_address, 1); break; case OP_RESTORE: fputs("restore ", f); @@ -295,7 +294,7 @@ print_node(f, p, top_level) case OP_WHEN: fputs("when ", f); if (p->t_address != NO_ADDR) { - print_position(p->t_address, 1); + (void) print_position(p->t_address, 1); } else print_node(f, p->t_args[0], 0); if (p->t_args[1]) { @@ -315,7 +314,7 @@ print_node(f, p, top_level) case OP_STOP: fputs("stop ", f); if (p->t_address != NO_ADDR) { - print_position(p->t_address, 1); + (void) print_position(p->t_address, 1); } else print_node(f, p->t_args[0], 0); if (p->t_args[1]) { @@ -331,7 +330,7 @@ print_node(f, p, top_level) fputs(" ", f); } if (p->t_address != NO_ADDR) { - print_position(p->t_address, 1); + (void) print_position(p->t_address, 1); } else print_node(f, p->t_args[0], 0); if (p->t_args[1]) { @@ -340,7 +339,7 @@ print_node(f, p, top_level) } break; case OP_AT: - fprintf(f, "at \"%s\":%ld", p->t_filename, p->t_lino); + fprintf(f, "at \"%s\":%d", p->t_filename, (int) p->t_lino); break; case OP_IN: fputs("in ", f); diff --git a/util/grind/type.c b/util/grind/type.c index c4d5de695..6469ab800 100644 --- a/util/grind/type.c +++ b/util/grind/type.c @@ -10,7 +10,6 @@ #include "sizes.h" #include "symbol.h" #include "scope.h" -#include "message.h" #include "langdep.h" #include "expr.h" @@ -303,12 +302,12 @@ tp_lookup(type_index) p = &list_row[type_index[0]]; while (type_index[1] >= p->len) { int indx = p->len/NINCR; - p->len += NINCR; if (p->len) { p->row = (p_type **) Realloc((char *) p->row, (unsigned) (indx + 1) * sizeof(p_type *)); } else p->row = (p_type **) Malloc(sizeof(p_type *)); + p->len += NINCR; p->row[indx] = (p_type *) Malloc(NINCR * sizeof(p_type)); for (i = NINCR-1; i >= 0; i--) { p->row[indx][i] = 0;