From dfe684fab1478340f6616bc800cc160899773230 Mon Sep 17 00:00:00 2001 From: borutr Date: Tue, 5 Sep 2006 20:16:41 +0000 Subject: [PATCH] * configure.in, configure: support for winsock2 * debugger/mcs51/break.h, debugger/mcs51/cmd.c, debugger/mcs51/cmd.h, debugger/mcs51/sdcdb.c, debugger/mcs51/sdcdb.h, debugger/mcs51/simi.c, debugger/mcs51/simi.h, debugger/mcs51/symtab.c, debugger/mcs51/symtab.h: sdcdb WIN32 native port git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4363 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 9 + configure | 158 ++++++- configure.in | 14 +- debugger/mcs51/break.h | 28 +- debugger/mcs51/cmd.c | 975 ++++++++++++++++++++-------------------- debugger/mcs51/cmd.h | 10 +- debugger/mcs51/sdcdb.c | 25 +- debugger/mcs51/sdcdb.h | 42 +- debugger/mcs51/simi.c | 346 +++++++++++--- debugger/mcs51/simi.h | 25 +- debugger/mcs51/symtab.c | 4 +- debugger/mcs51/symtab.h | 52 +-- 12 files changed, 1040 insertions(+), 648 deletions(-) diff --git a/ChangeLog b/ChangeLog index 685c708b..3f7175c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2006-09-05 Borut Razem + + * configure.in, configure: support for winsock2 + * debugger/mcs51/break.h, debugger/mcs51/cmd.c, + debugger/mcs51/cmd.h, debugger/mcs51/sdcdb.c, + debugger/mcs51/sdcdb.h, debugger/mcs51/simi.c, + debugger/mcs51/simi.h, debugger/mcs51/symtab.c, + debugger/mcs51/symtab.h: sdcdb WIN32 native port + 2006-09-05 Maarten Brock * src/SDCCopt.c (cnvToFcall): fixed bug 1551947 by updating OP_USES diff --git a/configure b/configure index 08cbd251..c0224a65 100755 --- a/configure +++ b/configure @@ -3638,6 +3638,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu # Checking for header files. # =========================================================================== +socket_type=unknown echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 @@ -4037,15 +4038,170 @@ if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF + socket_type=sys_socket_h +fi + +done + +if test $socket_type = unknown; then + +for ac_header in winsock2.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## ------------------------------------------ ## +## Report this to the AC_PACKAGE_NAME lists. ## +## ------------------------------------------ ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + socket_type=winsock2_h fi done +fi # Checking for functions/libs # =========================================================================== +if test $socket_type = winsock2_h; then + LIBS="-lws2_32 $LIBS" +else echo "$as_me:$LINENO: checking for socket in -lsocket" >&5 echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6 @@ -4194,6 +4350,7 @@ _ACEOF fi +fi # Checking for functions @@ -6343,7 +6500,6 @@ _ACEOF fi -ac_cv_c_char_unsigned=yes type_name() { diff --git a/configure.in b/configure.in index c3ecc6b6..65596ecf 100755 --- a/configure.in +++ b/configure.in @@ -63,13 +63,21 @@ AC_LANG([C]) # Checking for header files. # =========================================================================== -AC_CHECK_HEADERS(sys/socket.h) +socket_type=unknown +AC_CHECK_HEADERS(sys/socket.h, socket_type=sys_socket_h) +if test $socket_type = unknown; then + AC_CHECK_HEADERS(winsock2.h, socket_type=winsock2_h) +fi # Checking for functions/libs # =========================================================================== -AC_CHECK_LIB(socket,socket) -AC_CHECK_LIB(nsl,xdr_short) +if test $socket_type = winsock2_h; then + LIBS="-lws2_32 $LIBS" +else + AC_CHECK_LIB(socket,socket) + AC_CHECK_LIB(nsl,xdr_short) +fi # Checking for functions diff --git a/debugger/mcs51/break.h b/debugger/mcs51/break.h index 727fd14e..c0b2e16b 100644 --- a/debugger/mcs51/break.h +++ b/debugger/mcs51/break.h @@ -1,24 +1,24 @@ /*------------------------------------------------------------------------- break.h - Header file for break point management - Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve - what you give them. Help stamp out software-hoarding! + what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ #ifndef SDCDB_BREAK_H @@ -36,14 +36,14 @@ enum { NEXT , FENTRY , FEXIT, - TMPUSER }; + TMPUSER }; typedef struct breakp { unsigned addr; /* address of break point */ int bpnum ; /* break point number */ - char addrType; /* data or code */ - char bpType ; /* bp type USER/ LOGICAL */ + char addrType; /* data or code */ + char bpType ; /* bp type USER/ LOGICAL */ char *filename; /* file name */ int lineno ; /* lineno */ int (*callBack) @@ -58,20 +58,20 @@ typedef struct breakp #define BP_CALLBACK(func) \ int func (unsigned addr, \ - breakp *bp, \ - context *ctxt) + breakp *bp, \ + context *ctxt) #define EXTERN_BP_CALLBACK(func) \ extern int func (unsigned addr, \ - breakp *bp, \ - context *ctxt) + breakp *bp, \ + context *ctxt) extern char userBpPresent; extern char doingSteps; -int setBreakPoint (unsigned , char , char, - int (*callBack)(unsigned,breakp *bp,context *),char *, int); +int setBreakPoint (unsigned , char , char, + int (*callBack)(unsigned,breakp *bp,context *),char *, int); long getLastBreakptNumber(void); void resetHitCount(void); diff --git a/debugger/mcs51/cmd.c b/debugger/mcs51/cmd.c index fef7d6dc..0865e0b2 100644 --- a/debugger/mcs51/cmd.c +++ b/debugger/mcs51/cmd.c @@ -1,7 +1,6 @@ /*------------------------------------------------------------------------- cmd.c - source file for debugger command execution - - Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -347,11 +346,11 @@ DEFSETFUNC(funcWithName) V_ARG(function **,funcp); if (*funcp) - return 0; + return 0; if (strcmp(func->sym->name,name) == 0) { - *funcp = func; - return 1; + *funcp = func; + return 1; } return 0; @@ -407,27 +406,27 @@ static void setBPatModLine (module *mod, int line, char bpType ) next_line = line; for ( ; next_line < (srcMode == SRC_CMODE ? mod->ncLines : mod->nasmLines ) ; - next_line++ ) { - if (srcMode == SRC_CMODE) { - if (mod->cLines[next_line]->addr != INT_MAX) { - setBreakPoint (mod->cLines[next_line]->addr, CODE, bpType, - userBpCB, mod->c_name, next_line); - return; -// break; - } - } - else { - if (mod->asmLines[next_line]->addr != INT_MAX) { - setBreakPoint (mod->asmLines[next_line]->addr, CODE, bpType, - userBpCB, mod->asm_name, next_line); - return; -// break; - } - } - } - - fprintf(stderr,"No line %d or after in file \"%s\"..\n", - line,mod->c_name); + next_line++ ) { + if (srcMode == SRC_CMODE) { + if (mod->cLines[next_line]->addr != INT_MAX) { + setBreakPoint (mod->cLines[next_line]->addr, CODE, bpType, + userBpCB, mod->c_name, next_line); + return; +// break; + } + } + else { + if (mod->asmLines[next_line]->addr != INT_MAX) { + setBreakPoint (mod->asmLines[next_line]->addr, CODE, bpType, + userBpCB, mod->asm_name, next_line); + return; +// break; + } + } + } + + fprintf(stderr,"No line %d or after in file \"%s\"..\n", + line,mod->c_name); return; } @@ -440,29 +439,29 @@ static void clearBPatModLine (module *mod, int line) /* look for the first executable line after the line specified & get the break point there */ if (srcMode == SRC_CMODE && line > mod->ncLines) { - fprintf(stderr,"No line %d in file \"%s\".\n", - line,mod->c_name); - return ; + fprintf(stderr,"No line %d in file \"%s\".\n", + line,mod->c_name); + return ; } if (srcMode == SRC_AMODE && line > mod->ncLines) { - fprintf(stderr,"No line %d in file \"%s\".\n", - line,mod->c_name); - return ; + fprintf(stderr,"No line %d in file \"%s\".\n", + line,mod->c_name); + return ; } for ( ; line < (srcMode == SRC_CMODE ? mod->ncLines : mod->nasmLines ) ; - line++ ) { - if (srcMode == SRC_CMODE) - if (mod->cLines[line]->addr) { - clearUSERbp (mod->cLines[line]->addr); - break; - } - else - if (mod->asmLines[line]->addr) { - clearUSERbp (mod->asmLines[line]->addr); - break; - } + line++ ) { + if (srcMode == SRC_CMODE) + if (mod->cLines[line]->addr) { + clearUSERbp (mod->cLines[line]->addr); + break; + } + else + if (mod->asmLines[line]->addr) { + clearUSERbp (mod->asmLines[line]->addr); + break; + } } return; @@ -519,9 +518,9 @@ DEFSETFUNC(funcWithNameModule) return 0; if (strcmp(func->sym->name,fname) == 0 && - strcmp(func->mod->c_name,mname) == 0) { - *funcp = func; - return 1; + strcmp(func->mod->c_name,mname) == 0) { + *funcp = func; + return 1; } return 0; @@ -537,14 +536,14 @@ DEFSETFUNC(funcInAddr) V_ARG(function **,funcp); if (*funcp) - return 0; + return 0; /* in the address range */ if (func->sym->addr <= addr && - func->sym->eaddr >= addr) { + func->sym->eaddr >= addr) { - *funcp = func; - return 1; + *funcp = func; + return 1; } return 0; @@ -559,11 +558,11 @@ DEFSETFUNC(setStepBp) if (func->sym && func->sym->addr ) { - /* set the entry break point */ - setBreakPoint (func->sym->addr , CODE , STEP , - stepBpCB ,func->mod->c_name , func->entryline); + /* set the entry break point */ + setBreakPoint (func->sym->addr , CODE , STEP , + stepBpCB ,func->mod->c_name , func->entryline); - return 1; + return 1; } return 0; @@ -579,7 +578,7 @@ DEFSETFUNC(setStepEPBp) V_ARG(char *,mname); setBreakPoint (ep->addr, CODE, bptype, - stepBpCB, mname, ep->line); + stepBpCB, mname, ep->line); return 1; } @@ -593,7 +592,7 @@ DEFSETFUNC(setNextEPBp) V_ARG(char *,mname); setBreakPoint (ep->addr, CODE, bptype, - nextBpCB, mname, ep->line); + nextBpCB, mname, ep->line); return 1; } @@ -610,12 +609,12 @@ DEFSETFUNC(lineAtAddr) /* address must be an exact match */ if (ep->addr == addr) { - *line = ep->line; - if (block) - *block = ep->block ; - if (level) - *level = ep->level ; - return 1; + *line = ep->line; + if (block) + *block = ep->block ; + if (level) + *level = ep->level ; + return 1; } return 0; @@ -635,12 +634,12 @@ DEFSETFUNC(lineNearAddr) /* the line in which the address is */ if (ep->addr <= addr) { - *line = ep->line; - if (block) - *block = ep->block ; - if (level) - *level = ep->level ; - return 1; + *line = ep->line; + if (block) + *block = ep->block ; + if (level) + *level = ep->level ; + return 1; } return 0; @@ -687,7 +686,7 @@ context *discoverContext (unsigned addr, function *func) /* find the asm line number */ line = 0; if (applyToSet(func->afpoints,lineAtAddr,addr, - &line,NULL,NULL)) + &line,NULL,NULL)) currCtxt->asmline = line; else currCtxt->asmline = -1; @@ -734,9 +733,9 @@ void simGo (unsigned int gaddr) of the program */ if (!rv) { - if ( gaddr == 0 ) + if ( gaddr == 0 ) gaddr = -1; - if ( gaddr == -1 || doingSteps == 1 ) + if ( gaddr == -1 || doingSteps == 1 ) goto top ; } @@ -978,8 +977,8 @@ static int commonSetUserBp(char *s, context *cctxt, char bpType) */ if (!cctxt) { - fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n"); - return 0; + fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n"); + return 0; } /* white space skip */ while (*s && isspace(*s)) s++; @@ -994,22 +993,22 @@ static int commonSetUserBp(char *s, context *cctxt, char bpType) the current execution location from the currentContext */ if (! *s ) { - /* if current context is known */ - if (cctxt->func) { + /* if current context is known */ + if (cctxt->func) { Dprintf(D_break, ("commonSetUserBp: a) cctxtaddr:%x \n",cctxt->addr)); - if (srcMode == SRC_CMODE) - /* set the break point */ - setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB , - cctxt->func->mod->c_name, cctxt->cline); - else - setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB , - cctxt->func->mod->asm_name, cctxt->asmline); + if (srcMode == SRC_CMODE) + /* set the break point */ + setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB , + cctxt->func->mod->c_name, cctxt->cline); + else + setBreakPoint ( cctxt->addr , CODE , bpType , userBpCB , + cctxt->func->mod->asm_name, cctxt->asmline); - } - else - fprintf(stderr,"No default breakpoint address now.\n"); + } + else + fprintf(stderr,"No default breakpoint address now.\n"); - goto ret ; + goto ret ; } /* case g) *addr */ if ( *s == '*' && isdigit(*(s+1))) @@ -1031,7 +1030,7 @@ static int commonSetUserBp(char *s, context *cctxt, char bpType) } goto ret ; } - else + else { int line = func->exitline; if ( !applyToSet(func->cfpoints,lineAtAddr,braddr, @@ -1040,89 +1039,89 @@ static int commonSetUserBp(char *s, context *cctxt, char bpType) setBreakPoint ( braddr , CODE , bpType , userBpCB , func->mod->c_name,line); } - goto ret ; + goto ret ; } /* case b) lineno */ /* check if line number */ if ( !strchr(s,':') && isdigit(*s)) { - /* get the lineno */ - int line = atoi(s) -1; + /* get the lineno */ + int line = atoi(s) -1; Dprintf(D_break, ("commonSetUserBp: b) line:%d \n",line)); if ( line < 0 ) { - fprintf(stdout,"linenumber <= 0\n"); + fprintf(stdout,"linenumber <= 0\n"); goto ret; } - /* if current context not present then we must get the module - which has main & set the break point @ line number provided - of that module : if current context known then set the bp - at the line number given for the current module - */ - if (cctxt->func) { - if (!cctxt->func->mod) { - if (!applyToSet(functions,funcWithName,"main")) - fprintf(stderr,"Function \"main\" not defined.\n"); - else - setBPatModLine(func->mod,line, bpType); - } else - setBPatModLine(cctxt->func->mod,line, bpType); - } else { - if (list_mod) { - setBPatModLine(list_mod,line, bpType); - } else { - fprintf(stdout,"Sdcdb fails to have module symbol context at %d\n", __LINE__); - } - } - - goto ret; + /* if current context not present then we must get the module + which has main & set the break point @ line number provided + of that module : if current context known then set the bp + at the line number given for the current module + */ + if (cctxt->func) { + if (!cctxt->func->mod) { + if (!applyToSet(functions,funcWithName,"main")) + fprintf(stderr,"Function \"main\" not defined.\n"); + else + setBPatModLine(func->mod,line, bpType); + } else + setBPatModLine(cctxt->func->mod,line, bpType); + } else { + if (list_mod) { + setBPatModLine(list_mod,line, bpType); + } else { + fprintf(stdout,"Sdcdb fails to have module symbol context at %d\n", __LINE__); + } + } + + goto ret; } if ((bp = strchr(s,':'))) { - module *mod = NULL; - *bp = '\0'; - - if (srcMode == SRC_CMODE) { - if (!applyToSet(modules,moduleWithCName,s,&mod)) { - fprintf (stderr,"No source file named %s.\n",s); - goto ret; - } - } else { - if (!applyToSet(modules,moduleWithAsmName,s,&mod)) { - fprintf (stderr,"No source file named %s.\n",s); - goto ret; - } - } - - /* case c) filename:lineno */ - if (isdigit(*(bp +1))) { + module *mod = NULL; + *bp = '\0'; + + if (srcMode == SRC_CMODE) { + if (!applyToSet(modules,moduleWithCName,s,&mod)) { + fprintf (stderr,"No source file named %s.\n",s); + goto ret; + } + } else { + if (!applyToSet(modules,moduleWithAsmName,s,&mod)) { + fprintf (stderr,"No source file named %s.\n",s); + goto ret; + } + } + + /* case c) filename:lineno */ + if (isdigit(*(bp +1))) { Dprintf(D_break, ("commonSetUserBp: c) line:%d \n",atoi(bp+1))); - setBPatModLine (mod,atoi(bp+1)-1,bpType); - goto ret; - - } - /* case d) filename:function */ - if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func)) - fprintf(stderr,"Function \"%s\" not defined.\n",bp+1); - else + setBPatModLine (mod,atoi(bp+1)-1,bpType); + goto ret; + + } + /* case d) filename:function */ + if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func)) + fprintf(stderr,"Function \"%s\" not defined.\n",bp+1); + else Dprintf(D_break, ("commonSetUserBp: d) \n")); - setBPatModLine (mod, - (srcMode == SRC_CMODE ? - func->entryline : - func->aentryline),bpType); + setBPatModLine (mod, + (srcMode == SRC_CMODE ? + func->entryline : + func->aentryline),bpType); - goto ret; + goto ret; } /* case e) function */ Dprintf(D_break, ("commonSetUserBp: e) \n")); if (!applyToSet(functions,funcWithName,s,&func)) - fprintf(stderr,"Function \"%s\" not defined.\n",s); + fprintf(stderr,"Function \"%s\" not defined.\n",s); else - setBPatModLine(func->mod, - (srcMode == SRC_CMODE ? - func->entryline : - func->aentryline),bpType); + setBPatModLine(func->mod, + (srcMode == SRC_CMODE ? + func->entryline : + func->aentryline),bpType); ret: return 0; @@ -1189,7 +1188,7 @@ int cmdJump (char *s, context *cctxt) int line = atoi(s) -1; if (!cctxt || !cctxt->func || !cctxt->func->mod) { - fprintf(stderr,"Function not defined.\n"); + fprintf(stderr,"Function not defined.\n"); return 0; } if (line >= cctxt->func->entryline && @@ -1200,7 +1199,7 @@ int cmdJump (char *s, context *cctxt) } if (line >= cctxt->func->mod->ncLines ) { - fprintf(stderr,"line not in module.\n"); + fprintf(stderr,"line not in module.\n"); return 0; } fprintf(stdout,"Warning line %d outside actual function.\n",line+1); @@ -1225,7 +1224,7 @@ int cmdJump (char *s, context *cctxt) line = atoi(bp) -1; if (line >= mod->ncLines ) { - fprintf(stderr,"line not in module.\n"); + fprintf(stderr,"line not in module.\n"); return 0; } if ( mod != cctxt->func->mod || @@ -1265,13 +1264,13 @@ int cmdSetOption (char *s, context *cctxt) { while (*s && isspace(*s)) s++; if (strncmp(s,"srcmode",7) == 0 ) { - if (srcMode == SRC_CMODE) - srcMode = SRC_AMODE; - else - srcMode = SRC_CMODE; - fprintf(stderr,"source mode set to '%s'\n", - (srcMode == SRC_CMODE ? "C" : "asm")); - return 0; + if (srcMode == SRC_CMODE) + srcMode = SRC_AMODE; + else + srcMode = SRC_CMODE; + fprintf(stderr,"source mode set to '%s'\n", + (srcMode == SRC_CMODE ? "C" : "asm")); + return 0; } if (strncmp(s,"listsize ",9) == 0) @@ -1322,8 +1321,8 @@ int cmdSetOption (char *s, context *cctxt) int cmdContinue (char *s, context *cctxt) { if (STACK_EMPTY(callStack)) { - fprintf(stdout,"The program is not being run.\n"); - return 0; + fprintf(stdout,"The program is not being run.\n"); + return 0; } fprintf(stdout,"Continuing.\n"); @@ -1421,20 +1420,20 @@ int cmdDelUserBp (char *s, context *cctxt) while (isspace(*s)) s++; if (!*s ) { - if (userBpPresent) { - char buffer[10]; - fprintf (stdout,"Delete all breakpoints? (y or n) "); - fflush(stdout); - fgets(buffer,sizeof(buffer),stdin); - if (toupper(buffer[0]) == 'Y') - deleteUSERbp(-1); - } - return 0; + if (userBpPresent) { + char buffer[10]; + fprintf (stdout,"Delete all breakpoints? (y or n) "); + fflush(stdout); + fgets(buffer,sizeof(buffer),stdin); + if (toupper(buffer[0]) == 'Y') + deleteUSERbp(-1); + } + return 0; } /* determine the break point number */ if (sscanf(s,"%d",&bpnum) == 1) - deleteUSERbp(bpnum); + deleteUSERbp(bpnum); return 0; } @@ -1450,7 +1449,7 @@ int cmdStepi (char *s, context *cctxt) else { doingSteps = 2; - simGo(2); + simGo(2); doingSteps = 0; showfull = 1; } @@ -1550,7 +1549,7 @@ int cmdNexti (char *s, context *cctxt) else { doingSteps = 2; - simGo(1); + simGo(1); doingSteps = 0; showfull = 1; } @@ -1637,27 +1636,27 @@ int cmdRun (char *s, context *cctxt) { char buff[10]; if (STACK_EMPTY(callStack)) { - fprintf(stdout,"Starting program\n"); + fprintf(stdout,"Starting program\n"); if ( ! simactive ) { fprintf(stdout,"No executable file specified.\nUse the \"file\" command.\n"); return 0; } resetHitCount(); - simGo(0); + simGo(0); } else { - fprintf(stdout, - "The program being debugged has been started already.\n"); - fprintf(stdout,"Start it from the beginning? (y or n) "); - fflush(stdout); + fprintf(stdout, + "The program being debugged has been started already.\n"); + fprintf(stdout,"Start it from the beginning? (y or n) "); + fflush(stdout); - fgets(buff,sizeof(buff),stdin); - if (toupper(buff[0]) == 'Y') { - simReset(); + fgets(buff,sizeof(buff),stdin); + if (toupper(buff[0]) == 'Y') { + simReset(); resetHitCount(); - simGo(0); - } + simGo(0); + } } showfull = 1; return 0; @@ -2002,9 +2001,9 @@ static void infoStack(context *ctxt) while ((func = STACK_WALK(callStack))) { Dprintf(D_break, ("break: infoStack: %s %p (%p)\n",func->sym->name, w_callStack,p_callStack)); - fprintf(stdout,"#%d 0x%08x in %s () at %s:%d\n",i++, - func->laddr,func->sym->name, - func->mod->c_name,func->lline+1); + fprintf(stdout,"#%d 0x%08x in %s () at %s:%d\n",i++, + func->laddr,func->sym->name, + func->mod->c_name,func->lline+1); } if ( !i ) fprintf(stdout,"no stack.\n"); @@ -2015,8 +2014,8 @@ static void infoStack(context *ctxt) /*-----------------------------------------------------------------*/ int cmdWhere(char *s, context *cctxt) { - infoStack(cctxt); - return 0; + infoStack(cctxt); + return 0; } @@ -2030,20 +2029,20 @@ int cmdInfo (char *s, context *cctxt) /* list all break points */ if (strncmp(s,"break",5) == 0) { - listUSERbp(); - return 0; + listUSERbp(); + return 0; } /* info frame same as frame */ if (strcmp(s,"frame") == 0) { - cmdFrame (s,cctxt); - return 0; + cmdFrame (s,cctxt); + return 0; } if (strncmp(s,"line",4) == 0) { infomode=1; - cmdListSrc (s+4,cctxt); - return 0; + cmdListSrc (s+4,cctxt); + return 0; } if (strncmp(s,"source",6) == 0) { @@ -2092,15 +2091,15 @@ int cmdInfo (char *s, context *cctxt) } /* info stack display call stack */ if (strcmp(s,"stack") == 0) { - infoStack(cctxt); + infoStack(cctxt); showfull = 1; - return 0; + return 0; } /* info stack display call stack */ if (strcmp(s,"registers") == 0) { infoRegisters(0,cctxt); - return 0; + return 0; } /* info stack display call stack */ @@ -2136,7 +2135,7 @@ int cmdInfo (char *s, context *cctxt) int cmdQuit (char *s, context *cctxt) { if (simactive) - closeSimulator(); + closeSimulator(); return 1; } @@ -2163,16 +2162,16 @@ int cmdListSrc (char *s, context *cctxt) FILE:FUNCTION - function in file */ if (*s) { - /* case a) LINE */ - if (isdigit(*s)) { - if (!cctxt || !cctxt->func || !cctxt->func->mod) { - if (!list_mod) { - fprintf(stdout,"Sdcdb fails to have a proper context at %d.\n", __LINE__); - return 0; - } - } - else - list_mod = cctxt->func->mod; + /* case a) LINE */ + if (isdigit(*s)) { + if (!cctxt || !cctxt->func || !cctxt->func->mod) { + if (!list_mod) { + fprintf(stdout,"Sdcdb fails to have a proper context at %d.\n", __LINE__); + return 0; + } + } + else + list_mod = cctxt->func->mod; pline = strtol(s,&s,10) - 1; if (s && (s = strchr(s,','))) { @@ -2183,29 +2182,29 @@ int cmdListSrc (char *s, context *cctxt) else llines = listlines; } - } - else { - char *bp; - - /* if ':' present then FILE:LINE || FILE:FUNCTION */ - if ((bp = strchr(s,':'))) { - *bp = '\0'; - bp ++; - if (isdigit(*bp)) { - /* FILE:LINE */ - list_mod=NULL; /* bug fix 2-09-02, moduleWithCName expects mod to be null */ - if (srcMode == SRC_CMODE) { - if (!applyToSet(modules,moduleWithCName,s,&list_mod)) { - fprintf (stderr,"No c source file named %s.\n",s); - return 0; - } - } else { - if (!applyToSet(modules,moduleWithAsmName,s,&list_mod)) { - fprintf (stderr,"No source file named %s.\n",s); - return 0; - } - } - pline = strtol(bp,&bp,10) - 1; + } + else { + char *bp; + + /* if ':' present then FILE:LINE || FILE:FUNCTION */ + if ((bp = strchr(s,':'))) { + *bp = '\0'; + bp ++; + if (isdigit(*bp)) { + /* FILE:LINE */ + list_mod=NULL; /* bug fix 2-09-02, moduleWithCName expects mod to be null */ + if (srcMode == SRC_CMODE) { + if (!applyToSet(modules,moduleWithCName,s,&list_mod)) { + fprintf (stderr,"No c source file named %s.\n",s); + return 0; + } + } else { + if (!applyToSet(modules,moduleWithAsmName,s,&list_mod)) { + fprintf (stderr,"No source file named %s.\n",s); + return 0; + } + } + pline = strtol(bp,&bp,10) - 1; if (bp && (bp = strchr(bp,','))) { /* FILE:LINE,LASTLINE */ @@ -2215,24 +2214,24 @@ int cmdListSrc (char *s, context *cctxt) else llines = listlines; } - } else { - /* FILE:FUCTION */ - if (!applyToSet(functions,funcWithNameModule,bp,s,&func)) { - fprintf(stdout,"Function \"%s\" not defined.\n",bp); - return 0; - } - list_mod = func->mod; - if (srcMode == SRC_CMODE) { - pline = func->entryline; - llines = func->exitline - func->entryline + 1; - } else { - pline = func->aentryline; - llines = func->aexitline - func->aentryline + 1; - } - } - } - else { - /* FUNCTION */ + } else { + /* FILE:FUCTION */ + if (!applyToSet(functions,funcWithNameModule,bp,s,&func)) { + fprintf(stdout,"Function \"%s\" not defined.\n",bp); + return 0; + } + list_mod = func->mod; + if (srcMode == SRC_CMODE) { + pline = func->entryline; + llines = func->exitline - func->entryline + 1; + } else { + pline = func->aentryline; + llines = func->aexitline - func->aentryline + 1; + } + } + } + else { + /* FUNCTION */ if (*s == '\'') { /* 'FUNCTION' */ @@ -2243,38 +2242,38 @@ int cmdListSrc (char *s, context *cctxt) } } - if (!applyToSet(functions,funcWithName,s,&func)) { - fprintf(stderr,"Function \"%s\" not defined.\n",s); - return 0; - } - else { - list_mod = func->mod; - if (srcMode == SRC_CMODE) { - pline = func->entryline; - llines = func->exitline - func->entryline + 1; - } else { - pline = func->aentryline; - llines = func->aexitline - func->aentryline + 1; - } - } - } - } + if (!applyToSet(functions,funcWithName,s,&func)) { + fprintf(stderr,"Function \"%s\" not defined.\n",s); + return 0; + } + else { + list_mod = func->mod; + if (srcMode == SRC_CMODE) { + pline = func->entryline; + llines = func->exitline - func->entryline + 1; + } else { + pline = func->aentryline; + llines = func->aexitline - func->aentryline + 1; + } + } + } + } } else { - /* if no line specified & we had listed - before then continue from that listing */ - if (currline) - pline = currline ; - else { - if (!cctxt || !cctxt->func || !cctxt->func->mod) { - fprintf(stdout,"Missing context at %d. Try list filename:lineno\n", __LINE__); - return 0; - } - list_mod = cctxt->func->mod; - if (srcMode == SRC_CMODE) - pline = cctxt->cline; - else - pline = cctxt->asmline; - } + /* if no line specified & we had listed + before then continue from that listing */ + if (currline) + pline = currline ; + else { + if (!cctxt || !cctxt->func || !cctxt->func->mod) { + fprintf(stdout,"Missing context at %d. Try list filename:lineno\n", __LINE__); + return 0; + } + list_mod = cctxt->func->mod; + if (srcMode == SRC_CMODE) + pline = cctxt->cline; + else + pline = cctxt->asmline; + } } if (!list_mod) { @@ -2287,12 +2286,12 @@ int cmdListSrc (char *s, context *cctxt) if ( infomode ) { unsigned firstaddr , lastaddr ; - if ( pline >= list_mod->ncLines ) + if ( pline >= list_mod->ncLines ) pline = cctxt->cline; firstaddr = lastaddr = list_mod->cLines[pline]->addr; if (!func && cctxt && cctxt->func ) func = cctxt->func; - fprintf(stdout,"Line %d of \"%s\" starts at address 0x%08x <%s+%d>", + fprintf(stdout,"Line %d of \"%s\" starts at address 0x%08x <%s+%d>", pline+1, list_mod->c_name, lastaddr, func ? func->sym->name : "?", @@ -2320,17 +2319,17 @@ int cmdListSrc (char *s, context *cctxt) return 0; } for ( i = 0 ; i < llines ; i++ ) { - if (srcMode == SRC_CMODE) { - if ( (pline + i) >= list_mod->ncLines ) - break; - fprintf(stdout,"%d\t%s",pline + i, - list_mod->cLines[pline +i]->src); - } else { - if ( (pline + i) >= list_mod->nasmLines ) - break; - fprintf(stdout,"%d\t%s",pline + i, - list_mod->asmLines[pline +i]->src); - } + if (srcMode == SRC_CMODE) { + if ( (pline + i) >= list_mod->ncLines ) + break; + fprintf(stdout,"%d\t%s",pline + i, + list_mod->cLines[pline +i]->src); + } else { + if ( (pline + i) >= list_mod->nasmLines ) + break; + fprintf(stdout,"%d\t%s",pline + i, + list_mod->asmLines[pline +i]->src); + } } currline = pline + i ; return 0; @@ -2354,11 +2353,11 @@ static unsigned long getValBasic(symbol *sym, link *type, char *val) if (IS_FLOAT(type)) v.f = strtod(val,NULL); else - if (IS_PTR(type)) - v.val = strtol(val,NULL,0); - else + if (IS_PTR(type)) + v.val = strtol(val,NULL,0); + else { - if (IS_INTEGRAL(type)) + if (IS_INTEGRAL(type)) { link *etype; if ( type->next ) @@ -2387,7 +2386,7 @@ static unsigned long getValBasic(symbol *sym, link *type, char *val) v.i.lo = strtol(val,NULL,0); else v.val = strtol(val,NULL,0); - } + } else v.val = strtol(val,NULL,0); } @@ -2408,9 +2407,9 @@ static void printFmtInteger(char *deffmt,int fmt, long val, }; static int radixOfFormat[] = { 0 , 2, 8 ,10, 16 }; static int olenOfSize[] = { 0 , 3, 6 , 8, 11 }; - char buf[40]; - char negative = 0; - int charPos = 38; + char buf[40]; + char negative = 0; + int charPos = 38; int radix; if ( fmt == FMT_NON || fmt == FMT_DEZ ) @@ -2425,16 +2424,16 @@ static void printFmtInteger(char *deffmt,int fmt, long val, negative = 1; */ - if (!negative) - val = -val; + if (!negative) + val = -val; - buf[39] = '\0'; + buf[39] = '\0'; while (val <= -radix) { - buf[charPos--] = digits[-(val % radix)]; - val = val / radix; - } - buf[charPos] = digits[-val]; + buf[charPos--] = digits[-(val % radix)]; + val = val / radix; + } + buf[charPos] = digits[-val]; switch ( fmt ) { @@ -2464,9 +2463,9 @@ static void printFmtInteger(char *deffmt,int fmt, long val, buf[--charPos] = '0'; break; } - if (negative) { - buf[--charPos] = '-'; - } + if (negative) { + buf[--charPos] = '-'; + } fputs(&buf[charPos],stdout); } @@ -2490,11 +2489,11 @@ static void printValBasic(symbol *sym, link *type, v.val = simGetValue(addr,mem,size); /* if this a floating point number then */ if (IS_FLOAT(type)) - fprintf(stdout,"%f",v.f); + fprintf(stdout,"%f",v.f); else - if (IS_PTR(type)) - fprintf(stdout,"0x%*x",size<<1,v.val); - else + if (IS_PTR(type)) + fprintf(stdout,"0x%*x",size<<1,v.val); + else if (IS_INTEGRAL(type)) { link *etype; @@ -2532,7 +2531,7 @@ static void printValBasic(symbol *sym, link *type, fprintf(stdout,"0x%0*x",size<<1,v.val); } } - } else + } else fprintf(stdout,"0x%0*x",size<<1,v.val); } @@ -2550,22 +2549,22 @@ static void printValFunc (symbol *sym, int fmt) static void printArrayValue (symbol *sym, link *type, char space, unsigned int addr, int fmt) { - link *elem_type = type->next; - int i; + link *elem_type = type->next; + int i; - fprintf(stdout,"{"); - for (i = 0 ; i < DCL_ELEM(type) ; i++) { - if (IS_AGGREGATE(elem_type)) { - printValAggregates(sym,elem_type,space,addr,fmt); - } else { - printValBasic(sym,elem_type,space,addr,getSize(elem_type),fmt); - } - addr += getSize(elem_type); - if (i != DCL_ELEM(type) -1) - fprintf(stdout,","); - } + fprintf(stdout,"{"); + for (i = 0 ; i < DCL_ELEM(type) ; i++) { + if (IS_AGGREGATE(elem_type)) { + printValAggregates(sym,elem_type,space,addr,fmt); + } else { + printValBasic(sym,elem_type,space,addr,getSize(elem_type),fmt); + } + addr += getSize(elem_type); + if (i != DCL_ELEM(type) -1) + fprintf(stdout,","); + } - fprintf(stdout,"}"); + fprintf(stdout,"}"); } /*-----------------------------------------------------------------*/ @@ -2574,21 +2573,21 @@ static void printArrayValue (symbol *sym, link *type, static void printStructValue (symbol *sym, link *type, char space, unsigned int addr, int fmt) { - symbol *fields = SPEC_STRUCT(type)->fields; + symbol *fields = SPEC_STRUCT(type)->fields; int first = 1; - fprintf(stdout," { "); - while (fields) { - fprintf(stdout,"%s%s = ",(first ? "": ", "),fields->name); - first = 0; + fprintf(stdout," { "); + while (fields) { + fprintf(stdout,"%s%s = ",(first ? "": ", "),fields->name); + first = 0; if (IS_AGGREGATE(fields->type)) { - printValAggregates(fields,fields->type,space, addr, fmt); - } else { - printValBasic(fields,fields->type,space,addr,getSize(fields->type), fmt); - } - addr += getSize(fields->type); - fields = fields->next; - } - fprintf(stdout,"}"); + printValAggregates(fields,fields->type,space, addr, fmt); + } else { + printValBasic(fields,fields->type,space,addr,getSize(fields->type), fmt); + } + addr += getSize(fields->type); + fields = fields->next; + } + fprintf(stdout,"}"); } /*-----------------------------------------------------------------*/ @@ -2598,15 +2597,15 @@ static void printValAggregates (symbol *sym, link *type, char space,unsigned int addr, int fmt) { - if (IS_ARRAY(type)) { - printArrayValue(sym, type, space, addr, fmt); - return ; - } + if (IS_ARRAY(type)) { + printArrayValue(sym, type, space, addr, fmt); + return ; + } - if (IS_STRUCT(type)) { - printStructValue(sym, type, space, addr, fmt); - return; - } + if (IS_STRUCT(type)) { + printStructValue(sym, type, space, addr, fmt); + return; + } } /*-----------------------------------------------------------------*/ @@ -2618,7 +2617,7 @@ static int printOrSetSymValue (symbol *sym, context *cctxt, { static char fmtChar[] = " todx "; static int stack = 1; - symbol *fields; + symbol *fields; link *type; unsigned int addr; int size, n; @@ -2735,7 +2734,7 @@ static int printOrSetSymValue (symbol *sym, context *cctxt, /* arrays & structures first */ if (IS_AGGREGATE(type)) { - if ( val ) + if ( val ) { fprintf(stdout,"Cannot set/compare aggregate variable\n"); return 1; @@ -2744,17 +2743,17 @@ static int printOrSetSymValue (symbol *sym, context *cctxt, printValAggregates(sym,type,sym->addrspace,addr,fmt); } else - /* functions */ - if (IS_FUNC(type)) + /* functions */ + if (IS_FUNC(type)) { - if ( !val ) + if ( !val ) printValFunc(sym,fmt); else return 1; } - else + else { - if ( val ) + if ( val ) { unsigned long newval; newval = getValBasic(sym,type,val); @@ -2790,7 +2789,7 @@ static int printOrSetSymValue (symbol *sym, context *cctxt, printValBasic(sym,type,sym->addrspace,addr,size,fmt); } if ( flg > 0 ) fprintf(stdout,"\n"); - return 0; + return 0; } /*-----------------------------------------------------------------*/ @@ -2802,16 +2801,16 @@ static void printStructInfo (structdef *sdef) int i = 0 ; while (field) { - i += field->offset; - field = field->next; + i += field->offset; + field = field->next; } fprintf(stdout,"%s %s {\n",(i ? "struct" : "union" ), sdef->tag); field = sdef->fields; while (field) { - printTypeInfo (field->type); - fprintf(stdout," %s ;\n",field->name); - field = field->next ; + printTypeInfo (field->type); + fprintf(stdout," %s ;\n",field->name); + field = field->next ; } fprintf(stdout,"}\n"); @@ -2824,72 +2823,72 @@ static void printStructInfo (structdef *sdef) static void printTypeInfo(link *p) { if (!p) - return ; + return ; if (IS_DECL(p)) { - switch (DCL_TYPE(p)) { - case FUNCTION: - printTypeInfo (p->next); - fprintf(stdout,"()"); - break; - case ARRAY: - printTypeInfo (p->next); - fprintf(stdout,"[%d]",DCL_ELEM(p)); - break; - - case IPOINTER: - case PPOINTER: - case POINTER: - printTypeInfo (p->next); - fprintf(stdout,"(_near *)"); - break; - - case FPOINTER: - printTypeInfo (p->next); - fprintf(stdout,"(_xdata *)"); - break; - - case CPOINTER: - printTypeInfo( p->next); - fprintf(stdout,"(_code *)"); - break; - - case GPOINTER: - printTypeInfo( p->next); - fprintf(stdout,"(_generic *)"); - break; - } + switch (DCL_TYPE(p)) { + case FUNCTION: + printTypeInfo (p->next); + fprintf(stdout,"()"); + break; + case ARRAY: + printTypeInfo (p->next); + fprintf(stdout,"[%d]",DCL_ELEM(p)); + break; + + case IPOINTER: + case PPOINTER: + case POINTER: + printTypeInfo (p->next); + fprintf(stdout,"(_near *)"); + break; + + case FPOINTER: + printTypeInfo (p->next); + fprintf(stdout,"(_xdata *)"); + break; + + case CPOINTER: + printTypeInfo( p->next); + fprintf(stdout,"(_code *)"); + break; + + case GPOINTER: + printTypeInfo( p->next); + fprintf(stdout,"(_generic *)"); + break; + } } else { - switch (SPEC_NOUN(p)) { /* depending on the specifier type */ - case V_INT: - (IS_LONG(p) ? fputs("long ",stdout) : - ( IS_SHORT(p) ? fputs("short ",stdout) : - fputs("int ",stdout))) ; - break; - case V_FLOAT: - fputs("float ",stdout); - break; + switch (SPEC_NOUN(p)) { /* depending on the specifier type */ + case V_INT: + (IS_LONG(p) ? fputs("long ",stdout) : + ( IS_SHORT(p) ? fputs("short ",stdout) : + fputs("int ",stdout))) ; + break; + case V_FLOAT: + fputs("float ",stdout); + break; - case V_CHAR: - fputs ("char ",stdout); - break; + case V_CHAR: + fputs ("char ",stdout); + break; - case V_VOID: - fputs("void ",stdout); - break; + case V_VOID: + fputs("void ",stdout); + break; - case V_STRUCT: - printStructInfo (SPEC_STRUCT(p)); - break; + case V_STRUCT: + printStructInfo (SPEC_STRUCT(p)); + break; - case V_SBIT: - fputs("sbit ",stdout); - break; + case V_SBIT: + fputs("sbit ",stdout); + break; - case V_BIT: - fprintf(stdout,": %d" ,SPEC_BLEN(p)); - break; - } + case V_BIT: + fprintf(stdout,": %d" ,SPEC_BLEN(p)); + break; + } } } @@ -3080,12 +3079,12 @@ int cmdPrintType (char *s, context *cctxt) *bp = '\0'; if ((sym = symLookup(s,cctxt))) { - printTypeInfo(sym->type); - fprintf(stdout,"\n"); + printTypeInfo(sym->type); + fprintf(stdout,"\n"); } else { - fprintf(stdout, - "No symbol \"%s\" in current context.\n", - s); + fprintf(stdout, + "No symbol \"%s\" in current context.\n", + s); } return 0; } @@ -3108,8 +3107,8 @@ int cmdClrUserBp (char *s, context *cctxt) */ if (!cctxt) { - fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n"); - return 0; + fprintf(stdout,"No symbol table is loaded. Use the \"file\" command.\n"); + return 0; } /* white space skip */ @@ -3125,71 +3124,71 @@ int cmdClrUserBp (char *s, context *cctxt) the current execution location from the currentContext */ if (! *s ) { - /* if current context is known */ - if (cctxt->func) - /* clear the break point @ current location */ - clearUSERbp (cctxt->addr); - else - fprintf(stderr,"No default breakpoint address now.\n"); + /* if current context is known */ + if (cctxt->func) + /* clear the break point @ current location */ + clearUSERbp (cctxt->addr); + else + fprintf(stderr,"No default breakpoint address now.\n"); - goto ret ; + goto ret ; } /* case b) lineno */ /* check if line number */ if (isdigit(*s)) { - /* get the lineno */ - int line = atoi(s); - - /* if current context not present then we must get the module - which has main & set the break point @ line number provided - of that module : if current context known then set the bp - at the line number given for the current module - */ - if (cctxt->func) { - if (!cctxt->func->mod) { - if (!applyToSet(functions,funcWithName,"main")) - fprintf(stderr,"Function \"main\" not defined.\n"); - else - clearBPatModLine(func->mod,line); - } else - clearBPatModLine(cctxt->func->mod,line); - } - - goto ret; + /* get the lineno */ + int line = atoi(s); + + /* if current context not present then we must get the module + which has main & set the break point @ line number provided + of that module : if current context known then set the bp + at the line number given for the current module + */ + if (cctxt->func) { + if (!cctxt->func->mod) { + if (!applyToSet(functions,funcWithName,"main")) + fprintf(stderr,"Function \"main\" not defined.\n"); + else + clearBPatModLine(func->mod,line); + } else + clearBPatModLine(cctxt->func->mod,line); + } + + goto ret; } if ((bp = strchr(s,':'))) { - module *mod = NULL; - *bp = '\0'; + module *mod = NULL; + *bp = '\0'; - if (!applyToSet(modules,moduleWithCName,s,&mod)) { - fprintf (stderr,"No source file named %s.\n",s); - goto ret; - } + if (!applyToSet(modules,moduleWithCName,s,&mod)) { + fprintf (stderr,"No source file named %s.\n",s); + goto ret; + } - /* case c) filename:lineno */ - if (isdigit(*(bp +1))) { + /* case c) filename:lineno */ + if (isdigit(*(bp +1))) { - clearBPatModLine (mod,atoi(bp+1)); - goto ret; + clearBPatModLine (mod,atoi(bp+1)); + goto ret; - } - /* case d) filename:function */ - if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func)) - fprintf(stderr,"Function \"%s\" not defined.\n",bp+1); - else - clearBPatModLine (mod,func->entryline); + } + /* case d) filename:function */ + if (!applyToSet(functions,funcWithNameModule,bp+1,s,&func)) + fprintf(stderr,"Function \"%s\" not defined.\n",bp+1); + else + clearBPatModLine (mod,func->entryline); - goto ret; + goto ret; } /* case e) function */ if (!applyToSet(functions,funcWithName,s,&func)) - fprintf(stderr,"Function \"%s\" not defined.\n",s); + fprintf(stderr,"Function \"%s\" not defined.\n",s); else - clearBPatModLine(func->mod,func->entryline); + clearBPatModLine(func->mod,func->entryline); ret: return 0; @@ -3282,7 +3281,7 @@ int cmdUp(char *s, context *cctxt) currentFrame++ ; printFrame(); - return 0; + return 0; } /*-----------------------------------------------------------------*/ @@ -3297,7 +3296,7 @@ int cmdDown(char *s, context *cctxt) currentFrame-- ; printFrame(); - return 0; + return 0; } /*-----------------------------------------------------------------*/ /* cmdFrame - Frame command */ @@ -3320,18 +3319,18 @@ int cmdFrame (char *s, context *cctxt) int cmdFinish (char *s, context *ctxt) { if (STACK_EMPTY(callStack)) { - fprintf(stdout,"The program is not running.\n"); - return 0; + fprintf(stdout,"The program is not running.\n"); + return 0; } if (srcMode == SRC_CMODE) { - setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP, - stepBpCB, ctxt->func->mod->c_name, - ctxt->func->exitline); + setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP, + stepBpCB, ctxt->func->mod->c_name, + ctxt->func->exitline); } else { - setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP, - stepBpCB, ctxt->func->mod->asm_name, - ctxt->func->aexitline); + setBreakPoint (ctxt->func->sym->eaddr, CODE, STEP, + stepBpCB, ctxt->func->mod->asm_name, + ctxt->func->aexitline); } simGo(-1); @@ -3350,13 +3349,13 @@ int cmdShow (char *s, context *cctxt) while (*s && isspace(*s)) s++ ; if (strcmp(s,"copying") == 0) { - fputs(copying,stdout); - return 0; + fputs(copying,stdout); + return 0; } if (strcmp(s,"warranty") == 0) { - fputs(warranty,stdout); - return 0; + fputs(warranty,stdout); + return 0; } return 0; diff --git a/debugger/mcs51/cmd.h b/debugger/mcs51/cmd.h index 5829dc56..41a46eb9 100644 --- a/debugger/mcs51/cmd.h +++ b/debugger/mcs51/cmd.h @@ -1,24 +1,24 @@ /*------------------------------------------------------------------------- cmd.h - header file for debugger command execution - Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve - what you give them. Help stamp out software-hoarding! + what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ #ifndef SDCDB_CMD_H diff --git a/debugger/mcs51/sdcdb.c b/debugger/mcs51/sdcdb.c index 66c0d468..6c1d610c 100644 --- a/debugger/mcs51/sdcdb.c +++ b/debugger/mcs51/sdcdb.c @@ -569,7 +569,7 @@ static void functionPoints () ep = setNextItem(mod->cfpoints)) { if (ep->addr >= sym->addr && - ep->addr <= sym->eaddr ) + ep->addr <= sym->eaddr ) { addSet(&func->cfpoints,ep); } @@ -750,7 +750,7 @@ int cmdHelp (char *s, context *cctxt) } else if (*s) { - for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++) + for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++) { if ((cmdTab[i].htxt) && !strcmp(cmdTab[i].cmd,s)) { @@ -769,7 +769,7 @@ int cmdHelp (char *s, context *cctxt) for (i = 0 ; i < (sizeof(cmdTab)/sizeof(struct cmdtab)) ; i++) { /* command string matches */ - + if ((cmdTab[i].htxt) && (i >= startline)) fprintf(stdout,"%s",cmdTab[i].htxt); if (i == endline) @@ -904,14 +904,14 @@ static void commandLoop(FILE *cmdfile) { char *line, save_ch, *s; actualcmdfile = cmdfile; - while (1) + while (1) { if ( cmdfile == stdin ) { if (sim_cmd_mode) printf("(sim) "); else - fprintf(stdout,"(sdcdb) "); + fprintf(stdout,"(sdcdb) "); fflush(stdout); } @@ -1125,6 +1125,7 @@ sigintr(int sig) sendSim("stop\n"); } +#ifndef _WIN32 /* the only child can be the simulator */ static void sigchld(int sig) { @@ -1134,23 +1135,27 @@ static void sigchld(int sig) /* if ( retpid == simPid ) */ simactive = 0; } +#endif static void setsignals() { - signal(SIGHUP , SIG_IGN); - signal(SIGCONT, SIG_IGN); - signal(SIGINT , sigintr ); - signal(SIGTERM, bad_signal); + signal(SIGINT , sigintr ); + signal(SIGABRT, bad_signal); + signal(SIGTERM, bad_signal); + +#ifndef _WIN32 + signal(SIGHUP , SIG_IGN); + signal(SIGCONT, SIG_IGN); signal(SIGCHLD, sigchld ); - signal(SIGABRT, bad_signal); signal(SIGALRM, bad_signal); //signal(SIGFPE, bad_signal); //signal(SIGILL, bad_signal); signal(SIGPIPE, bad_signal); signal(SIGQUIT, bad_signal); //signal(SIGSEGV, bad_signal); +#endif } /*-----------------------------------------------------------------*/ diff --git a/debugger/mcs51/sdcdb.h b/debugger/mcs51/sdcdb.h index 9e1268e2..8328e178 100644 --- a/debugger/mcs51/sdcdb.h +++ b/debugger/mcs51/sdcdb.h @@ -1,24 +1,24 @@ /*------------------------------------------------------------------------- sdcdb.h - Header file used by ALL source files for the debugger - Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve - what you give them. Help stamp out software-hoarding! + what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ #ifndef SDCDB_H @@ -62,18 +62,18 @@ typedef short bool; #define min(a,b) (a < b ? a : b) #endif -/* +/* * #ifndef ALLOC - * #define ALLOC(x,sz) if (!(x = calloc(1, sz))) \ + * #define ALLOC(x,sz) if (!(x = calloc(1, sz))) \ * { \ - * fprintf(stderr,"sdcdb: out of memory\n"); \ + * fprintf(stderr,"sdcdb: out of memory\n"); \ * exit (1); \ * } * #endif * #ifndef ALLOC_ATOMIC * #define ALLOC_ATOMIC(x,sz) if (!(x = calloc(1, sz))) \ * { \ - * fprintf(stderr,"sdcdb: out of memory\n"); \ + * fprintf(stderr,"sdcdb: out of memory\n"); \ * exit (1); \ * } * #endif @@ -95,7 +95,7 @@ typedef short bool; #define STACK_FULL(stack) ((p_##stack) <= stack ) #define STACK_EMPTY(stack) ((p_##stack) >= (stack + \ - sizeof(stack)/sizeof(*stack)) ) + sizeof(stack)/sizeof(*stack)) ) #define STACK_PUSH_(stack,x) (*--p_##stack = (x)) #define STACK_POP_(stack) (*p_##stack++) @@ -124,7 +124,7 @@ typedef short bool; #define STACK_STARTWALK(stack) (w_##stack = p_##stack) #define STACK_WALK(stack) (w_##stack >= (stack + sizeof(stack)/sizeof(*stack)) \ - ? NULL : *w_##stack++ ) + ? NULL : *w_##stack++ ) #include "src/SDCCbitv.h" @@ -156,14 +156,14 @@ typedef struct srcLine char *src ; } srcLine ; - + /*-----------------------------------------------------------------*/ /* structure for cdb record */ /*-----------------------------------------------------------------*/ typedef struct cdbrecs { char type ; /* type of line */ char *line; /* contents of line */ - struct cdbrecs *next; /* next in chain */ + struct cdbrecs *next; /* next in chain */ } cdbrecs ; /*-----------------------------------------------------------------*/ @@ -177,9 +177,9 @@ typedef struct module { char *asm_name; /* asm file name */ int ncLines; /* number of lines in this module */ int nasmLines; /* # of lines in the assembler file */ - srcLine **cLines; /* actual source lines */ + srcLine **cLines; /* actual source lines */ srcLine **asmLines; /* actual assembler source lines*/ - set *cfpoints; /* set of double line execution points */ + set *cfpoints; /* set of double line execution points */ } module; /*-----------------------------------------------------------------*/ @@ -191,19 +191,19 @@ typedef struct exePoint int line ; short block , level ; } exePoint ; - + /*-----------------------------------------------------------------*/ /* definition for a function */ /*-----------------------------------------------------------------*/ typedef struct function { - struct symbol *sym ;/* pointer to symbol for function */ - char *modName ;/* module name */ - module *mod ;/* module for this function */ + struct symbol *sym ;/* pointer to symbol for function */ + char *modName ;/* module name */ + module *mod ;/* module for this function */ int entryline ;/* first line in the function */ int aentryline ; int exitline ;/* last line in the function */ int aexitline ; - set *cfpoints ;/* set of all C execution points in func */ + set *cfpoints ;/* set of all C execution points in func */ set *afpoints ;/* set of all ASM execution points in func */ unsigned int laddr ;/* last executed address */ int lline ;/* last executed linenumber */ @@ -223,7 +223,7 @@ typedef struct linkrec { /*-----------------------------------------------------------------*/ /* program context */ /*-----------------------------------------------------------------*/ -typedef struct context { +typedef struct context { function *func; /* current function we are in */ char *modName; /* name of the module */ unsigned int addr ; /* current pc */ diff --git a/debugger/mcs51/simi.c b/debugger/mcs51/simi.c index 6eb859ca..a9e67b72 100644 --- a/debugger/mcs51/simi.c +++ b/debugger/mcs51/simi.c @@ -1,29 +1,36 @@ /*------------------------------------------------------------------------- simi.c - source file for simulator interaction - - Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve - what you give them. Help stamp out software-hoarding! + what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ #include "sdcdb.h" #include "simi.h" +#include "newalloc.h" +#ifdef _WIN32 +#include +#include +#include +#include +#include +#else #ifdef HAVE_SYS_SOCKET_H #include #include @@ -34,11 +41,18 @@ #else #error "Cannot build debugger without socket support" #endif +#endif + FILE *simin ; /* stream for simulator input */ FILE *simout; /* stream for simulator output */ +#ifdef _WIN32 +SOCKET sock = INVALID_SOCKET; +PROCESS_INFORMATION *simPid = NULL; +#else int sock = -1; /* socket descriptor to comm with simulator */ pid_t simPid = -1; +#endif static char simibuff[MAX_SIM_BUFF]; /* sim buffer */ static char regBuff[MAX_SIM_BUFF]; static char *sbp = simibuff; /* simulator buffer pointer */ @@ -113,7 +127,7 @@ static char *getMemCache(unsigned int addr,int cachenum, int size) /*-----------------------------------------------------------------*/ static void invalidateCache( int cachenum ) { - memCache[cachenum].size = 0; + memCache[cachenum].size = 0; } /*-----------------------------------------------------------------*/ @@ -138,11 +152,197 @@ Dprintf(D_simi, ("simi: waitForSim start(%d)\n", timeout_ms)); /*-----------------------------------------------------------------*/ /* openSimulator - create a pipe to talk to simulator */ /*-----------------------------------------------------------------*/ +#ifdef _WIN32 +char *argsToCmdLine(char **args, int nargs) +{ +#define CHUNCK 256 + int i; + int cmdPos = 0; + char *cmd = Safe_malloc(CHUNCK); + int cmdLen = CHUNCK; + + for (i = 0; i < nargs; i++) + { + int quote = 0; + int argLen = strlen(args[i]); + + if (NULL != strchr(args[i], ' ')) + { + quote = 1; + argLen += 2; + } + + if (0 < nargs) + ++argLen; + + if (argLen >= cmdLen) + { + do + { + cmdLen += cmdLen; + } + while (argLen >= cmdLen); + cmd = Safe_realloc(cmd, cmdLen); + } + + if (0 < nargs) + { + cmd[cmdPos++] = ' '; + --argLen; + } + + if (quote) + { + cmd[cmdPos++] = '"'; + --argLen; + } + + memcpy(&cmd[cmdPos], args[i], argLen); + cmdPos += argLen; + + if (quote) + cmd[cmdPos++] = '"'; + } + + return cmd; +} + +PROCESS_INFORMATION *execSimulator(char **args, int nargs) +{ + STARTUPINFO si; + static PROCESS_INFORMATION pi; + char *cmdLine = argsToCmdLine(args, nargs); + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + memset(&pi, 0, sizeof(pi)); + + // Start the child process. + if (!CreateProcess(NULL, // No module name (use command line) + cmdLine, // Command line + NULL, // Process handle not inheritable + NULL, // Thread handle not inheritable + FALSE, // Set handle inheritance to FALSE + 0, // No creation flags + NULL, // Use parent's environment block + NULL, // Use parent's starting directory + &si, // Pointer to STARTUPINFO structure + &pi) // Pointer to PROCESS_INFORMATION structure + ) + { + Safe_free(cmdLine); + printf( "CreateProcess failed (%d).\n", GetLastError() ); + return NULL; + } + + Safe_free(cmdLine); + return π +} + +void openSimulator (char **args, int nargs) +{ + struct sockaddr_in sin; + int retry = 0; + int i; + int fh; + Dprintf(D_simi, ("simi: openSimulator\n")); +#ifdef SDCDB_DEBUG + if (D_simi & sdcdbDebug) + { + printf("simi: openSimulator: "); + for (i=0; i < nargs; i++ ) + { + printf("arg%d: %s ",i,args[i]); + } + printf("\n"); + } +#endif + invalidateCache(XMEM_CACHE); + invalidateCache(IMEM_CACHE); + invalidateCache(SREG_CACHE); + + try_connect: + sock = WSASocket(PF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0); + + memset(&sin,0,sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = inet_addr("127.0.0.1"); + sin.sin_port = htons(9756); + + /* connect to the simulator */ + if (INVALID_SOCKET == connect(sock,(struct sockaddr *) &sin, sizeof(sin))) + { + /* if failed then wait 1 second & try again + do this for 10 secs only */ + if (retry < 10) + { + if ( !retry ) + simPid = execSimulator(args, nargs); + retry ++; + Sleep(1000); + goto try_connect; + } + perror("connect failed :"); + exit(1); + } + fh = _open_osfhandle((intptr_t)socket, _O_TEXT); + if (-1 == fh) + { + fprintf(stderr, "cannot _open_osfhandle\n"); + exit(1); + } + + /* go the socket now turn it into a file handle */ + if (!(simin = fdopen(sock,"r"))) + { + fprintf(stderr,"cannot open socket for read\n"); + exit(1); + } + + fh = _open_osfhandle((intptr_t)socket, _O_TEXT); + if (-1 == fh) + { + fprintf(stderr, "cannot _open_osfhandle\n"); + exit(1); + } + + if (!(simout = fdopen(sock,"w"))) + { + fprintf(stderr,"cannot open socket for write\n"); + exit(1); + } + /* now that we have opened, wait for the prompt */ + waitForSim(200,NULL); + simactive = 1; +} +#else +int execSimulator(char **args, int nargs) +{ + if ((simPid = fork())) + { + Dprintf(D_simi, ("simi: simulator pid %d\n",(int) simPid)); + } + else + { + /* we are in the child process : start the simulator */ + signal(SIGINT , SIG_IGN ); + signal(SIGABRT, SIG_IGN ); + signal(SIGHUP , SIG_IGN ); + signal(SIGCHLD, SIG_IGN ); + + if (execvp(args[0],args) < 0) + { + perror("cannot exec simulator"); + exit(1); + } + } +} + void openSimulator (char **args, int nargs) { - struct sockaddr_in sin; + struct sockaddr_in sin; int retry = 0; - int i ; + int i; Dprintf(D_simi, ("simi: openSimulator\n")); #ifdef SDCDB_DEBUG if (D_simi & sdcdbDebug) @@ -158,61 +358,51 @@ void openSimulator (char **args, int nargs) invalidateCache(XMEM_CACHE); invalidateCache(IMEM_CACHE); invalidateCache(SREG_CACHE); - + try_connect: sock = socket(AF_INET,SOCK_STREAM,0); - + memset(&sin,0,sizeof(sin)); sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr("127.0.0.1"); sin.sin_port = htons(9756); - + /* connect to the simulator */ - if (connect(sock,(struct sockaddr *) &sin, sizeof(sin)) < 0) { - /* if failed then wait 1 second & try again - do this for 10 secs only */ - if (retry < 10) { - if ( !retry ) + if (connect(sock,(struct sockaddr *) &sin, sizeof(sin)) < 0) + { + /* if failed then wait 1 second & try again + do this for 10 secs only */ + if (retry < 10) { - /* fork and start the simulator as a subprocess */ - if ((simPid = fork())) { - Dprintf(D_simi, ("simi: simulator pid %d\n",(int) simPid)); - } - else { - /* we are in the child process : start the simulator */ - signal(SIGHUP , SIG_IGN ); - signal(SIGINT , SIG_IGN ); - signal(SIGABRT, SIG_IGN ); - signal(SIGCHLD, SIG_IGN ); - - if (execvp(args[0],args) < 0) { - perror("cannot exec simulator"); - exit(1); - } + if ( !retry ) + { + simPid = execSimulator(args, nargs); } + retry ++; + sleep (1); + goto try_connect; } - retry ++; - sleep (1); - goto try_connect; - } - perror("connect failed :"); - exit(1); + perror("connect failed :"); + exit(1); } /* go the socket now turn it into a file handle */ - if (!(simin = fdopen(sock,"r"))) { - fprintf(stderr,"cannot open socket for read\n"); - exit(1); + if (!(simin = fdopen(sock,"r"))) + { + fprintf(stderr,"cannot open socket for read\n"); + exit(1); } - if (!(simout = fdopen(sock,"w"))) { - fprintf(stderr,"cannot open socket for write\n"); - exit(1); + if (!(simout = fdopen(sock,"w"))) + { + fprintf(stderr,"cannot open socket for write\n"); + exit(1); } - /* now that we have opened, wait for the prompt */ waitForSim(200,NULL); simactive = 1; } +#endif + /*-----------------------------------------------------------------*/ /* simResponse - returns buffer to simulator's response */ /*-----------------------------------------------------------------*/ @@ -226,7 +416,7 @@ char *simResponse() /*-----------------------------------------------------------------*/ void sendSim(char *s) { - if ( ! simout ) + if ( ! simout ) return; Dprintf(D_simi, ("simi: sendSim-->%s", s)); // s has LF at end already @@ -235,7 +425,7 @@ void sendSim(char *s) } -static int getMemString(char *buffer, char wrflag, +static int getMemString(char *buffer, char wrflag, unsigned int *addr, char mem, int size ) { int cachenr = NMEM_CACHE; @@ -248,7 +438,7 @@ static int getMemString(char *buffer, char wrflag, cmd = "dump"; buffer[0] = '\0' ; - switch (mem) + switch (mem) { case 'A': /* External stack */ case 'F': /* External ram */ @@ -259,7 +449,7 @@ static int getMemString(char *buffer, char wrflag, case 'D': /* Code / static segment */ prefix = "rom"; break; - case 'B': /* Internal stack */ + case 'B': /* Internal stack */ case 'E': /* Internal ram (lower 128) bytes */ case 'G': /* Internal ram */ prefix = "iram"; @@ -279,14 +469,14 @@ static int getMemString(char *buffer, char wrflag, prefix = "sfr" ; cachenr = SREG_CACHE; break; - case 'R': /* Register space */ + case 'R': /* Register space */ prefix = "iram"; /* get register bank */ - cachenr = simGetValue (0xd0,'I',1); + cachenr = simGetValue (0xd0,'I',1); *addr += cachenr & 0x18 ; cachenr = IMEM_CACHE; break; - default: + default: case 'Z': /* undefined space code */ return cachenr; } @@ -303,7 +493,7 @@ void simSetPC( unsigned int addr ) sprintf(buffer,"pc %d\n", addr); sendSim(buffer); waitForSim(100,NULL); - simResponse(); + simResponse(); } int simSetValue (unsigned int addr,char mem, int size, unsigned long val) @@ -330,7 +520,7 @@ int simSetValue (unsigned int addr,char mem, int size, unsigned long val) sprintf(s,"\n"); sendSim(buffer); waitForSim(100,NULL); - simResponse(); + simResponse(); return 0; } @@ -363,7 +553,7 @@ unsigned long simGetValue (unsigned int addr,char mem, int size) resp = simResponse(); /* got the response we need to parse it the response - is of the form + is of the form [address] [v] [v] [v] ... special case in case of bit variables which case it becomes [address] [assembler bit address] [v] */ @@ -376,28 +566,28 @@ unsigned long simGetValue (unsigned int addr,char mem, int size) /* skip thru the address part */ while (isxdigit(*resp)) resp++; - } + } /* make the branch for bit variables */ - if ( cachenr == BIT_CACHE) + if ( cachenr == BIT_CACHE) { /* skip until newline */ while (*resp && *resp != '\n' ) resp++ ; if ( *--resp != '0' ) b[0] = 1; } - else - { - for (i = 0 ; i < size ; i++ ) + else + { + for (i = 0 ; i < size ; i++ ) { /* skip white space */ while (isspace(*resp)) resp++ ; - + b[i] = strtol(resp,&resp,16); } } return b[0] | b[1] << 8 | b[2] << 16 | b[3] << 24 ; - + } /*-----------------------------------------------------------------*/ @@ -443,7 +633,7 @@ void simLoadFile (char *s) unsigned int simGoTillBp ( unsigned int gaddr) { char *sr; - unsigned addr ; + unsigned addr ; char *sfmt; int wait_ms = 1000; @@ -464,25 +654,25 @@ unsigned int simGoTillBp ( unsigned int gaddr) sendSim("reset\n"); waitForSim(wait_ms, NULL); sendSim("run 0x0\n"); - } else if (gaddr == -1) { /* resume */ + } else if (gaddr == -1) { /* resume */ sendSim ("run\n"); wait_ms = 100; } - else if (gaddr == 1 ) { /* nexti or next */ + else if (gaddr == 1 ) { /* nexti or next */ sendSim ("next\n"); wait_ms = 100; } - else if (gaddr == 2 ) { /* stepi or step */ + else if (gaddr == 2 ) { /* stepi or step */ sendSim ("step\n"); wait_ms = 100; } - else { + else { printf("Error, simGoTillBp > 0!\n"); exit(1); } waitForSim(wait_ms, NULL); - + /* get the simulator response */ sr = simResponse(); /* check for errors */ @@ -532,7 +722,11 @@ void simReset () /*-----------------------------------------------------------------*/ void closeSimulator () { +#ifdef _WIN32 + if ( ! simin || ! simout || INVALID_SOCKET == sock ) +#else if ( ! simin || ! simout || sock == -1 ) +#endif { simactive = 0; return; @@ -541,11 +735,19 @@ void closeSimulator () sendSim("quit\n"); fclose (simin); fclose (simout); - shutdown(sock,2); - close(sock); + shutdown(sock,2); +#ifdef _WIN32 + closesocket(sock); + sock = -1; + if (NULL != simPid) + TerminateProcess(simPid->hProcess, 0); + // Close process and thread handles. + CloseHandle(simPid->hProcess); + CloseHandle(simPid->hThread); +#else + close(sock); sock = -1; if ( simPid > 0 ) kill (simPid,SIGKILL); +#endif } - - diff --git a/debugger/mcs51/simi.h b/debugger/mcs51/simi.h index ef32808d..237fe27a 100644 --- a/debugger/mcs51/simi.h +++ b/debugger/mcs51/simi.h @@ -1,30 +1,39 @@ /*------------------------------------------------------------------------- simi.h - Header file for simulator interaction - - Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve - what you give them. Help stamp out software-hoarding! + what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ #ifndef SIMI_H #define SIMI_H +#ifdef _WIN32 +/* ugly hack to prevent the incusion of objidl.h */ +#ifdef __MINGW32__ +#define _OLE2_H +#elif defined _MSC_VER +#define _OLE2_H_ +#endif +#include +#endif + #define MAX_SIM_BUFF 8*1024 #define MAX_CACHE_SIZE 2048 @@ -44,7 +53,11 @@ typedef struct _memcache } memcache_t; //#define SIMNAME "s51" +#ifdef _WIN32 +extern SOCKET sock; +#else extern int sock; +#endif extern char simactive; void openSimulator (char **,int); void waitForSim(int timeout_ms, char *expect); diff --git a/debugger/mcs51/symtab.c b/debugger/mcs51/symtab.c index 7c14aa89..13848cae 100644 --- a/debugger/mcs51/symtab.c +++ b/debugger/mcs51/symtab.c @@ -660,7 +660,7 @@ static void lnkSymRec (char *s) sym->rname = alloccpy(s,bp - s); sym->scopetype = *s; sym->name = sym->rname; - addSet(&symbols,sym); + addSet(&symbols,sym); } *bp = save_ch; if ( *bp ) @@ -736,7 +736,7 @@ static void lnkCSrc (char *s) /* one line can have more than one address : (for loops !)*/ if (line < mod->ncLines && line > 0 /*&& ( !mod->cLines[line]->addr || - mod->cLines[line]->level > level )*/ ) + mod->cLines[line]->level > level )*/ ) { if ( mod->cLines[line]->addr != INT_MAX ) { diff --git a/debugger/mcs51/symtab.h b/debugger/mcs51/symtab.h index 384d4c1f..9ca40f30 100644 --- a/debugger/mcs51/symtab.h +++ b/debugger/mcs51/symtab.h @@ -1,24 +1,24 @@ /*------------------------------------------------------------------------- symtab.h - Header file for symbol table for sdcdb ( debugger ) - Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) + Written By - Sandeep Dutta . sandeep.dutta@usa.net (1999) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - + In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve - what you give them. Help stamp out software-hoarding! + what you give them. Help stamp out software-hoarding! -------------------------------------------------------------------------*/ #ifndef SYMTAB_H @@ -38,7 +38,7 @@ typedef struct structdef { /* noun definitions */ enum { V_INT = 0, - V_FLOAT , + V_FLOAT , V_CHAR , V_VOID , V_STRUCT , @@ -49,7 +49,7 @@ enum { V_INT = 0, /* storage class */ enum { S_FIXED = 0, S_AUTO , - S_REGISTER , + S_REGISTER , S_CONSTANT , S_SFR , S_SBIT , @@ -68,7 +68,7 @@ typedef struct specifier { unsigned noun ; /* CHAR INT STRUCTURE LABEL */ unsigned sclass ; /* REGISTER,AUTO,FIX,CONSTANT */ unsigned _long : 1 ; /* 1=long */ - unsigned _short: 1 ; /* 1=short int */ + unsigned _short: 1 ; /* 1=short int */ unsigned _unsigned: 1 ; /* 1=unsigned, 0=signed */ unsigned _static: 1 ; /* 1=static keyword found */ unsigned _extern: 1 ; /* 1=extern found */ @@ -85,8 +85,8 @@ typedef struct specifier { unsigned _addr ; /* address of symbol */ unsigned _stack ; /* stack offset for stacked v */ unsigned _bitStart ; /* bit start position */ - int _bitLength ; /* bit length */ - + int _bitLength ; /* bit length */ + struct structdef *v_struct; /* structure pointer */ } specifier ; @@ -97,7 +97,7 @@ enum { POINTER = 0, /* pointer to near data */ GPOINTER , /* _generic pointer */ PPOINTER , /* paged area pointer */ IPOINTER , /* pointer to upper 128 bytes */ - UPOINTER , /* unknown pointer used only when parsing */ + UPOINTER , /* unknown pointer used only when parsing */ ARRAY , FUNCTION }; @@ -117,22 +117,22 @@ typedef struct link { unsigned tdef : 1 ; /* current link created by */ /* typedef if this flag is set*/ union { - specifier s ; /* if CLASS == SPECIFIER */ - declarator d ; /* if CLASS == DECLARATOR */ + specifier s ; /* if CLASS == SPECIFIER */ + declarator d ; /* if CLASS == DECLARATOR */ } select ; - + struct link *next ; /* next element on the chain */ } link ; typedef struct symbol { char *name ; - + short size ; - short level ; /* declration lev,fld offset */ - short block ; /* sequential block # of defintion */ + short level ; /* declration lev,fld offset */ + short block ; /* sequential block # of defintion */ short isonstack ; /* is the variable on stack */ unsigned isfunc :1 ; /* is a functions */ - unsigned offset ; /* offset from top if struct */ + unsigned offset ; /* offset from top if struct */ unsigned addr ; /* address if the symbol */ unsigned eaddr ; /* end address for functions */ char addr_type ; /* which address space */ @@ -163,12 +163,12 @@ typedef struct symbol { #define DCL_PTR_CONST(l) l->select.d.ptr_const #define DCL_PTR_VOLATILE(l) l->select.d.ptr_volatile #define DCL_TSPEC(l) l->select.d.tspec -#define SPEC_NOUN(x) x->select.s.noun +#define SPEC_NOUN(x) x->select.s.noun #define SPEC_LONG(x) x->select.s._long #define SPEC_SHORT(x) x->select.s._short #define SPEC_USIGN(x) x->select.s._unsigned #define SPEC_SCLS(x) x->select.s.sclass -#define SPEC_OCLS(x) x->select.s.oclass +#define SPEC_OCLS(x) x->select.s.oclass #define SPEC_STAT(x) x->select.s._static #define SPEC_EXTR(x) x->select.s._extern #define SPEC_CODE(x) x->select.s._codesg @@ -190,14 +190,14 @@ typedef struct symbol { #define SPEC_TYPEDEF(x) x->select.s._typedef /* type check macros */ -#define IS_DECL(x) ( x && x->class == DECLARATOR ) +#define IS_DECL(x) ( x && x->class == DECLARATOR ) #define IS_SPEC(x) ( x && x->class == SPECIFIER ) #define IS_ARRAY(x) (IS_DECL(x) && DCL_TYPE(x) == ARRAY) #define IS_PTR(x) (IS_DECL(x) && (DCL_TYPE(x) == POINTER || \ DCL_TYPE(x) == FPOINTER || \ - DCL_TYPE(x) == GPOINTER || \ - DCL_TYPE(x) == IPOINTER || \ - DCL_TYPE(x) == PPOINTER || \ + DCL_TYPE(x) == GPOINTER || \ + DCL_TYPE(x) == IPOINTER || \ + DCL_TYPE(x) == PPOINTER || \ DCL_TYPE(x) == CPOINTER || \ DCL_TYPE(x) == UPOINTER )) #define IS_PTR_CONST(x) (IS_PTR(x) && DCL_PTR_CONST(x)) @@ -217,7 +217,7 @@ typedef struct symbol { #define IS_INT(x) (IS_SPEC(x) && x->select.s.noun == V_INT) #define IS_VOID(x) (IS_SPEC(x) && x->select.s.noun == V_VOID) #define IS_CHAR(x) (IS_SPEC(x) && x->select.s.noun == V_CHAR) -#define IS_EXTERN(x) (IS_SPEC(x) && x->select.s._extern) +#define IS_EXTERN(x) (IS_SPEC(x) && x->select.s._extern) #define IS_VOLATILE(x) (IS_SPEC(x) && x->select.s._volatile ) #define IS_INTEGRAL(x) (IS_SPEC(x) && (x->select.s.noun == V_INT || \ x->select.s.noun == V_CHAR || \ @@ -230,7 +230,7 @@ typedef struct symbol { #define IS_ARITHMETIC(x) (IS_INTEGRAL(x) || IS_FLOAT(x)) #define IS_AGGREGATE(x) (IS_ARRAY(x) || IS_STRUCT(x)) #define IS_LITERAL(x) (IS_SPEC(x) && x->select.s.sclass == S_LITERAL) -#define IS_ISR(x) (IS_SPEC(x) && SPEC_INTRTN(x)) +#define IS_ISR(x) (IS_SPEC(x) && SPEC_INTRTN(x)) symbol *parseSymbol (char *, char **, int ); -- 2.30.2