X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=debugger%2Fmcs51%2Fsymtab.c;h=6d12e577917c745c4f436218e2e5060975cb7574;hb=a184272eb0b928242976fa37d5873f59d743d027;hp=1305cc3ee8f610f8b2bbc8a5fdc982db4e98997d;hpb=89abf15734e43f91069394872c69e8384efea752;p=fw%2Fsdcc diff --git a/debugger/mcs51/symtab.c b/debugger/mcs51/symtab.c index 1305cc3e..6d12e577 100644 --- a/debugger/mcs51/symtab.c +++ b/debugger/mcs51/symtab.c @@ -25,8 +25,8 @@ #include "symtab.h" #include "newalloc.h" -extern char *currModName ; structdef *structWithName (char *); +DEFSETFUNC(symWithRName); /*------------------------------------------------------------------*/ /* getSize - returns size of a type chain in bits */ @@ -89,13 +89,21 @@ unsigned int getSize ( link *p ) void parseFunc (char *line) { function *func ; - char *rs; + char *rs = line ; int i; + + while (*rs && *rs != '(') rs++ ; + *--rs = '\0'; + func = Safe_calloc(1,sizeof(function)); - func->sym = parseSymbol(line,&rs); + func->sym = NULL; + applyToSetFTrue(symbols,symWithRName,line,&func->sym); + *rs++ = '0'; + if (! func->sym) + func->sym = parseSymbol(line,&rs,1); func->sym->isfunc = 1; func->modName = currModName ; - while(*rs != ',') rs++; + while(*rs && *rs != ',') rs++; rs++; sscanf(rs,"%d,%d,%d",&i, &(SPEC_INTN(func->sym->etype)), @@ -236,18 +244,33 @@ static char *parseTypeInfo (symbol *sym, char *s) /* {G|F|L}'$''$' */ /* '$' */ /*-----------------------------------------------------------------*/ -symbol *parseSymbol (char *s, char **rs) +symbol *parseSymbol (char *s, char **rs, int doadd) { symbol *nsym ; + char save_ch; char *bp = s; - nsym = Safe_calloc(1,sizeof(symbol)); - - /* copy over the mangled name */ - while (*bp != '(') bp++; - bp -= 1; - nsym->rname = alloccpy(s,bp - s); - + /* go the mangled name */ + for ( bp = s; *bp && *bp != '('; bp++ ); + save_ch = *--bp; + *bp = '\0'; + nsym = NULL; + if ( doadd == 2 ) + { + /* add only if not present and if linkrecord before symbol record*/ + if ( applyToSetFTrue(symbols,symWithRName,s,&nsym)) + { + if ( nsym->rname != nsym->name ) + return; + doadd = 0; + } + } + if ( ! nsym ) + { + nsym = Safe_calloc(1,sizeof(symbol)); + nsym->rname = alloccpy(s,bp - s); + } + *bp = save_ch; /* if this is a Global Symbol */ nsym->scopetype = *s; s++ ; @@ -281,9 +304,23 @@ symbol *parseSymbol (char *s, char **rs) /* get the stack offset */ s++; nsym->offset = strtol(s,&s,10); + + if ( nsym->addrspace == 'R' ) + { + /* get registeroffset */ + while (*s && *s != '[') s++ ; + s++ ; + if ( *s == 'r' ) + { + nsym->addr = strtol(s+1,&s,10); + } + while (*s && *s != ']') s++ ; + } + *rs = s; + if ( doadd ) addSet(&symbols,nsym); - addSet(&symbols,nsym); + Dprintf(D_symtab, ("symtab: par %s(0x%x) add=%d sym=%p\n",nsym->name,nsym->addr,doadd,nsym)); return nsym; } @@ -307,6 +344,7 @@ structdef *parseStruct (char *s) name = alloccpy(bp,s - bp); nsdef = structWithName(name); nsdef->fields = NULL; + nsdef->size = 0; s++; while (*s && *s != ']') { int offset ; @@ -315,14 +353,14 @@ structdef *parseStruct (char *s) offset = strtol(s,&s,10); while (*s != ':') s++; s++; - sym = parseSymbol(s,&s); + sym = parseSymbol(s,&s,0); sym->offset = offset ; s += 3; if (!fields) fields = nsdef->fields = sym; else fields = fields->next = sym; - + nsdef->size += sym->size; } return nsdef; @@ -597,7 +635,7 @@ static void lnkFuncEnd (char *s) s++; sscanf(s,"%x",&func->sym->eaddr); - Dprintf(D_symtab, ("%s(eaddr%x)\n",func->sym->name,func->sym->eaddr)); + Dprintf(D_symtab, ("symtab: ead %s(0x%x)\n",func->sym->name,func->sym->eaddr)); } /*-----------------------------------------------------------------*/ @@ -605,24 +643,31 @@ static void lnkFuncEnd (char *s) /*-----------------------------------------------------------------*/ static void lnkSymRec (char *s) { - char sname[128], *bp = sname; + char *bp, save_ch ; symbol *sym; - /* copy till we get to a ':' */ - while ( *s != ':') - *bp++ = *s++; - bp -= 1; + /* search to a ':' */ + for ( bp = s; *bp && *bp != ':'; bp++ ); + save_ch = *--bp; *bp = '\0'; sym = NULL; - if (!applyToSet(symbols,symWithRName,sname,&sym)) - return ; - - s++; - sscanf(s,"%x",&sym->addr); - - Dprintf(D_symtab, ("%s(%x)\n",sym->name,sym->addr)); + applyToSetFTrue(symbols,symWithRName,s,&sym); + if (! sym) + { + sym = Safe_calloc(1,sizeof(symbol)); + sym->rname = alloccpy(s,bp - s); + sym->scopetype = *s; + sym->name = sym->rname; + addSet(&symbols,sym); + } + *bp = save_ch; + if ( *bp ) + { + sscanf(bp+2,"%x",&sym->addr); + } + Dprintf(D_symtab, ("symtab: lnk %s(0x%x)\n",sym->name,sym->addr)); } /*-----------------------------------------------------------------*/ @@ -652,7 +697,7 @@ static void lnkAsmSrc (char *s) line--; if (line < mod->nasmLines) { mod->asmLines[line]->addr = addr; - Dprintf(D_symtab, ("%s(%d:%x) %s",mod->asm_name,line,addr,mod->asmLines[line]->src)); + Dprintf(D_symtab, ("symtab: asm %s(%d:0x%x) %s",mod->asm_name,line,addr,mod->asmLines[line]->src)); } } @@ -688,12 +733,29 @@ static void lnkCSrc (char *s) } line--; - if (line < mod->ncLines && line > 0) { - mod->cLines[line]->addr = addr; - mod->cLines[line]->block = block; - mod->cLines[line]->level = level; - Dprintf(D_symtab, ("%s(%d:%x) %s",mod->c_name, - line+1,addr,mod->cLines[line]->src)); + /* 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 )*/ ) + { + if ( mod->cLines[line]->addr ) + { + /* save double line information for exepoints */ + exePoint *ep ; + ep = Safe_calloc(1,sizeof(exePoint)); + ep->addr = mod->cLines[line]->addr ; + ep->line = line; + ep->block= mod->cLines[line]->block; + ep->level= mod->cLines[line]->level; + addSet(&mod->cfpoints,ep); + Dprintf(D_symtab, ("symtab: exe %s(%d:0x%x) %s",mod->c_name, + line+1,addr,mod->cLines[line]->src)); + } + mod->cLines[line]->addr = addr; + mod->cLines[line]->block = block; + mod->cLines[line]->level = level; + Dprintf(D_symtab, ("symtab: ccc %s(%d:0x%x) %s",mod->c_name, + line+1,addr,mod->cLines[line]->src)); } return;