X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=debugger%2Fmcs51%2Fbreak.c;h=0637661932aaf1ad4edf63fe4384114dfa1cd90a;hb=f3a44fc094dc5ce393e2029d3c7c6587a4b1a835;hp=d71f9bf0667f6efcae69e4a57bfbca8245f5a8b8;hpb=274f997bf808d919e31605700ff8ce4b1a0c5a7c;p=fw%2Fsdcc diff --git a/debugger/mcs51/break.c b/debugger/mcs51/break.c index d71f9bf0..06376619 100644 --- a/debugger/mcs51/break.c +++ b/debugger/mcs51/break.c @@ -27,10 +27,10 @@ #include "cmd.h" #include "newalloc.h" -static hTab *bptable = NULL; +hTab *bptable = NULL; char doingSteps = 0; char userBpPresent = 0; - + /* call stack can be 1024 deep */ STACK_DCL(callStack,function *,1024); @@ -59,7 +59,7 @@ void resetHitCount() int k; breakp *bp; for ( bp = hTabFirstItem(bptable,&k); bp ; - bp = hTabNextItem(bptable,&k)) + bp = hTabNextItem(bptable,&k)) { bp->hitCnt = 0; bp->ignoreCnt = 0; @@ -74,7 +74,6 @@ int setBreakPoint (unsigned addr, char addrType, char bpType, char *fileName, int lineno) { breakp *bp, *bpl; - char simbuf[50]; Dprintf(D_break, ("setBreakPoint: addr:%x atype:%s bpType:%s [%s:%d]\n", addr, @@ -97,7 +96,7 @@ int setBreakPoint (unsigned addr, char addrType, char bpType, if (bpType == USER || bpType == TMPUSER) { for ( bpl = hTabFirstItemWK(bptable,addr) ; bpl; - bpl = hTabNextItemWK(bptable)) + bpl = hTabNextItemWK(bptable)) { /* if also a user break point then issue Note : */ @@ -138,11 +137,11 @@ void deleteSTEPbp () Dprintf(D_break, ("break: Deleting all STEP BPs\n")); /* for break points delete if they are STEP */ for ( bp = hTabFirstItem(bptable,&k); bp ; - bp = hTabNextItem(bptable,&k)) + bp = hTabNextItem(bptable,&k)) { /* if this is a step then delete */ - if (bp->bpType == STEP) + if (bp->bpType == STEP) { hTabDeleteItem(&bptable,bp->addr,bp,DELETE_ITEM,NULL); Safe_free(bp); @@ -158,17 +157,16 @@ void deleteNEXTbp () { breakp *bp; int k; - char simcmd[50]; Dprintf(D_break, ("break: Deleting all NEXT BPs\n")); /* for break points delete if they are NEXT */ for ( bp = hTabFirstItem(bptable,&k); bp ; - bp = hTabNextItem(bptable,&k)) + bp = hTabNextItem(bptable,&k)) { /* if this is a step then delete */ - if (bp->bpType == NEXT) + if (bp->bpType == NEXT) { hTabDeleteItem(&bptable,bp->addr,bp,DELETE_ITEM,NULL); Safe_free(bp); @@ -193,7 +191,6 @@ void deleteUSERbp (int bpnum) { breakp *bp; int k; - char simcmd[50]; Dprintf(D_break, ("break: deleteUSERbp %d\n", bpnum)); @@ -205,7 +202,7 @@ void deleteUSERbp (int bpnum) point matches or bpnumber == -1 (meaning delete all user break points */ if ((bp->bpType == USER || bp->bpType == TMPUSER ) - && ( bp->bpnum == bpnum || bpnum == -1)) + && ( bp->bpnum == bpnum || bpnum == -1)) { hTabDeleteItem(&bptable,bp->addr,bp,DELETE_ITEM,NULL); @@ -241,10 +238,10 @@ void setUserbpCommand (int bpnum, char *cmds) bpnum, cmds)); for ( bp = hTabFirstItem(bptable,&k); bp ; - bp = hTabNextItem(bptable,&k)) + bp = hTabNextItem(bptable,&k)) { if ((bp->bpType == USER || bp->bpType == TMPUSER ) - && ( bp->bpnum == bpnum )) + && ( bp->bpnum == bpnum )) { if ( bp->commands ) Safe_free(bp->commands); @@ -266,10 +263,10 @@ void setUserbpCondition (int bpnum, char *cond) bpnum, cond?cond:"")); for ( bp = hTabFirstItem(bptable,&k); bp ; - bp = hTabNextItem(bptable,&k)) + bp = hTabNextItem(bptable,&k)) { if ((bp->bpType == USER || bp->bpType == TMPUSER ) - && ( bp->bpnum == bpnum )) + && ( bp->bpnum == bpnum )) { if ( bp->condition ) Safe_free(bp->condition); @@ -291,10 +288,10 @@ void setUserbpIgnCount (int bpnum, int ignorecnt ) bpnum, ignorecnt)); for ( bp = hTabFirstItem(bptable,&k); bp ; - bp = hTabNextItem(bptable,&k)) + bp = hTabNextItem(bptable,&k)) { if ((bp->bpType == USER || bp->bpType == TMPUSER ) - && ( bp->bpnum == bpnum )) + && ( bp->bpnum == bpnum )) { bp->ignoreCnt = bp->hitCnt + ignorecnt; return; @@ -343,7 +340,7 @@ void listUSERbp () if ( bp->hitCnt > 0 ) fprintf(stdout,"\tbreakpoint already hit %d time%s\n", bp->hitCnt,bp->hitCnt>1?"s":"" ); - + } } @@ -364,20 +361,19 @@ static int simStopBPCB( unsigned int addr) void clearUSERbp ( unsigned int addr ) { breakp *bp; - char simcmd[50]; /* for break points delete if they are STEP */ for ( bp = hTabFirstItemWK(bptable,addr); bp ; bp = hTabNextItemWK(bptable)) { /* if this is a step then delete */ - if (bp->bpType == USER || bp->bpType == TMPUSER) + if (bp->bpType == USER || bp->bpType == TMPUSER) { hTabDeleteItem(&bptable,bp->addr,bp,DELETE_ITEM,NULL); /* if this leaves no other break points then send command to simulator to delete bp from this addr */ - if (hTabSearch(bptable,bp->addr) == NULL) + if (hTabSearch(bptable,bp->addr) == NULL) { simClearBP(bp->addr); } @@ -413,7 +409,7 @@ int dispatchCB (unsigned addr, context *ctxt) } /* dispatch the call back functions */ - for (; bp; bp = hTabNextItemWK(bptable)) + for (; bp; bp = hTabNextItemWK(bptable)) { rv += (*bp->callBack)(addr,bp,ctxt); } @@ -438,12 +434,12 @@ BP_CALLBACK(fentryCB) ctxt->func->stkaddr = simGetValue (0x81,'I',1); Dprintf(D_break, ("break: fentryCB: BP_CALLBACK entry %s sp=0x%02x %p\n", - ctxt->func->sym->name, + ctxt->func->sym->name, ctxt->func->stkaddr, p_callStack)); /* and set laddr of calling function to return addr from stack */ if ((func = STACK_PEEK(callStack))) - { + { /* extern stack ?? 'A' */ func->laddr = simGetValue (ctxt->func->stkaddr-1,'B',2); } @@ -462,12 +458,18 @@ BP_CALLBACK(fexitCB) /* pop the top most from the call stack */ func = STACK_POP(callStack); - Dprintf(D_break, ("break: fexitCB: BP_CALLBACK entry %s %p\n",func->sym->name, p_callStack)); + if (!func) + { + fprintf(stdout, "Stack underflow\n"); + return 1; + } + + Dprintf(D_break, ("break: fexitCB: BP_CALLBACK entry %s %p\n", func->sym->name, p_callStack)); /* check main function */ - if ( STACK_EMPTY(callStack)) + if ( !strcmp(func->sym->name, "main")) { - fprintf(stdout,"Program exited with code %d.\n",simGetValue (0x82,'I',2)); + fprintf(stdout, "Program exited with code %lu.\n", simGetValue (0x82,'I',2)); return 1; } return 0; @@ -492,10 +494,10 @@ BP_CALLBACK(userBpCB) if ( bp->commands ) { - Dprintf(D_break, ("break: userBpCB: commands:%d\n", bp->commands)); + Dprintf(D_break, ("break: userBpCB: commands:%p\n", bp->commands)); setCmdLine(bp->commands); } - + if (srcMode == SRC_CMODE) { fprintf(stdout,"Breakpoint %d, %s() at %s:%d\n", bp->bpnum, @@ -522,7 +524,7 @@ BP_CALLBACK(userBpCB) /* if this leaves no other break points then send command to simulator to delete bp from this addr */ - if (hTabSearch(bptable,bp->addr) == NULL) + if (hTabSearch(bptable,bp->addr) == NULL) { simClearBP (bp->addr); Dprintf(D_break, ("break: simClearBP 0x%x\n", bp->addr));