}
void
-putsymb(char *s, int t, int32 v, int ver, char *go)
+putsymb(char *s, int t, int32 v, int ver, vlong go)
{
- int i, j, f;
+ int i, f;
if(t == 'f')
s++;
cput(s[i]);
cput(0);
}
- j = 0;
- if(go) {
- for(j=0; go[j]; j++)
- cput(go[j]);
- }
- cput(0);
+ lput(go);
- symsize += 4 + 1 + i + 1 + j + 1;
+ symsize += 4 + 1 + i + 1 + 4;
if(debug['n']) {
if(t == 'z' || t == 'Z') {
s = lookup("etext", 0);
if(s->type == STEXT)
- putsymb(s->name, 'T', s->value, s->version, nil);
+ putsymb(s->name, 'T', s->value, s->version, 0);
for(h=0; h<NHASH; h++)
for(s=hash[h]; s!=S; s=s->link)
continue;
case SFILE:
- putsymb(s->name, 'f', s->value, s->version, nil);
+ putsymb(s->name, 'f', s->value, s->version, 0);
continue;
}
/* filenames first */
for(a=p->to.autom; a; a=a->link)
if(a->type == D_FILE)
- putsymb(a->asym->name, 'z', a->aoffset, 0, nil);
+ putsymb(a->asym->name, 'z', a->aoffset, 0, 0);
else
if(a->type == D_FILE1)
- putsymb(a->asym->name, 'Z', a->aoffset, 0, nil);
+ putsymb(a->asym->name, 'Z', a->aoffset, 0, 0);
putsymb(s->name, 'T', s->value, s->version, gotypefor(s->name));
/* frame, auto and param after */
- putsymb(".frame", 'm', p->to.offset+4, 0, nil);
+ putsymb(".frame", 'm', p->to.offset+4, 0, 0);
for(a=p->to.autom; a; a=a->link)
if(a->type == D_AUTO)
- putsymb(a->asym->name, 'a', -a->aoffset, 0, nil);
+ putsymb(a->asym->name, 'a', -a->aoffset, 0, 0);
else
if(a->type == D_PARAM)
- putsymb(a->asym->name, 'p', a->aoffset, 0, nil);
+ putsymb(a->asym->name, 'p', a->aoffset, 0, 0);
}
if(debug['v'] || debug['n'])
Bprint(&bso, "symsize = %lud\n", symsize);
static void cleansyms(void);
static int32 decodename(Biobuf*, Sym*);
-static int32 decodegotype(Biobuf*, Sym*);
static short *encfname(char*);
static int fline(char*, int, int32, Hist*, Hist**);
static void fillsym(Sym*, Symbol*);
if(i < 0)
return -1;
size += i+svalsz+sizeof(p->type);
- i = decodegotype(&b, p);
- if(i < 0)
- return -1;
- size += i;
+
+ if(svalsz == 8){
+ if(Bread(&b, &vl, 8) != 8)
+ return symerrmsg(8, "symbol");
+ p->gotype = beswav(vl);
+ }
+ else{
+ if(Bread(&b, &l, 4) != 4)
+ return symerrmsg(4, "symbol");
+ p->gotype = (u32int)beswal(l);
+ }
+ size += svalsz;
/* count global & auto vars, text symbols, and file names */
switch (p->type) {
return n;
}
-static int32
-decodegotype(Biobuf *bp, Sym *p)
-{
- char *cp;
- int32 n;
-
- cp = Brdline(bp, '\0');
- if(cp == 0) {
- werrstr("can't read go type");
- return -1;
- }
- n = Blinelen(bp);
- p->gotype = malloc(n);
- if(p->gotype == 0) {
- werrstr("can't malloc %ld bytes", n);
- return -1;
- }
- strcpy(p->gotype, cp);
- return n;
-}
-
/*
* free any previously loaded symbol tables
*/