diff 032081309174e6f419dc8c981b99dfee367bc518 uncommitted --- a/sys/src/cmd/6l/l.h +++ b/sys/src/cmd/6l/l.h @@ -344,6 +344,7 @@ void doinit(void); void doprof1(void); void doprof2(void); +void doprofcall(void); void dostkoff(void); void dynreloc(Sym*, ulong, int); vlong entryvalue(void); --- a/sys/src/cmd/6l/obj.c +++ b/sys/src/cmd/6l/obj.c @@ -326,6 +326,8 @@ } patch(); follow(); + if(debug['p']) + doprofcall(); dodata(); dostkoff(); paramspace = "SP"; /* (FP) now (SP) on output */ @@ -1365,6 +1367,36 @@ continue; } } +} + +void +doprofcall(void) +{ + Prog *p; + ulong calls; + Sym *s; + + calls = 0; + /* err on the larger size */ + for(p = firstp; p != P; p = p->link) + if(p->as == ACALL) + calls++; + s = lookup("__ncalls", 0); + s->type = SDATA; + s->value = 4; + + p = prg(); + p->line = 0; + p->link = datap; + datap = p; + + p->as = ADATA; + p->width = 4; + p->from.scale = 4; + p->from.type = D_EXTERN; + p->from.sym = s; + p->to.type = D_CONST; + p->to.offset = calls; } void --- a/sys/src/libc/port/profile.c +++ b/sys/src/libc/port/profile.c @@ -237,21 +237,14 @@ void _profmain(int argc, char **argv) { + extern ulong __ncalls; char ename[50]; - int n, f; + int f; - n = 2000; if (_tos->cyclefreq != 0LL){ khz = _tos->cyclefreq / 1000; /* Report times in milliseconds */ havecycles = 1; } - f = open("/env/profsize", OREAD|OCEXEC); - if(f >= 0) { - memset(ename, 0, sizeof(ename)); - read(f, ename, sizeof(ename)-1); - close(f); - n = atol(ename); - } _tos->prof.what = Profuser; f = open("/env/proftype", OREAD|OCEXEC); if(f >= 0) { @@ -267,7 +260,7 @@ else if (strcmp(ename, "sample") == 0) _tos->prof.what = Profsample; } - _tos->prof.first = sbrk(n*sizeof(Plink)); + _tos->prof.first = sbrk(__ncalls*sizeof(Plink)); _tos->prof.last = sbrk(0); _tos->prof.next = _tos->prof.first; _tos->prof.pp = nil;