#include "symtab.h"
#include "newalloc.h"
-extern char *currModName ;
structdef *structWithName (char *);
+DEFSETFUNC(symWithRName);
/*------------------------------------------------------------------*/
/* getSize - returns size of a type chain in bits */
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)),
/* {G|F<filename>|L<functionName>}'$'<name>'$'<level> */
/* '$'<block><type info> */
/*-----------------------------------------------------------------*/
-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 NULL;
+ 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++ ;
/* 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;
}
name = alloccpy(bp,s - bp);
nsdef = structWithName(name);
nsdef->fields = NULL;
+ nsdef->size = 0;
s++;
while (*s && *s != ']') {
int offset ;
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;
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));
}
/*-----------------------------------------------------------------*/
/*-----------------------------------------------------------------*/
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));
}
/*-----------------------------------------------------------------*/
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));
}
}
module *mod ;
/* input will be of format
- filename.ext$<level>$<block>$<line>:<address> */
+ filename.ext$<line>$<level>$<block>:<address> */
/* get the module name */
while (*s != '$' )
*bp++ = *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 != INT_MAX )
+ {
+ /* 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;