Update kernbb(8) to deal with GCC's new way of doing things.
This commit is contained in:
parent
578c478621
commit
ae51b3cd4a
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=108780
@ -6,5 +6,6 @@ MAN= kernbb.8
|
||||
DPADD= ${LIBKVM}
|
||||
LDADD= -lkvm
|
||||
|
||||
WARNS?= 3
|
||||
.include <bsd.prog.mk>
|
||||
|
||||
|
@ -42,20 +42,28 @@
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
utility is used to dump the basic-block profiling buffers of the running
|
||||
kernel.
|
||||
utility is used to extract the basic-block profiling buffers of the running
|
||||
kernel into the files needed for the
|
||||
.Xr gcov 1
|
||||
tool.
|
||||
.Pp
|
||||
At least one source file in the running kernel must have been compiled
|
||||
with the
|
||||
.Fl a
|
||||
option.
|
||||
.Fl --test-coverage
|
||||
and
|
||||
.Fl --profile-arcs
|
||||
options.
|
||||
.Pp
|
||||
The output format is
|
||||
.Tn ASCII ,
|
||||
consisting of one line per record with the
|
||||
following fields: filename, linenumber, procedure, address, count
|
||||
of executions, length of the basic-block in bytes and the product of
|
||||
the previous two fields.
|
||||
The output is stored in the filenames compiled into the kernel by
|
||||
.Xr gcc 1 .
|
||||
If the absolute pathname cannot be written to, the directory part
|
||||
of the filename is discarded and the file stored in the current
|
||||
directory under its basename.
|
||||
.Pp
|
||||
The output files are named *.da, and the
|
||||
.Xr gcov 1
|
||||
program will extract the counts and merge them with the source
|
||||
file to show actual execution counts.
|
||||
.Sh FILES
|
||||
.Bl -tag -width /boot/kernel/kernel -compact
|
||||
.It Pa /boot/kernel/kernel
|
||||
@ -65,9 +73,12 @@ the default memory
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
.Xr cc 1
|
||||
.Xr gcov 1
|
||||
.Sh AUTHORS
|
||||
The
|
||||
.Nm
|
||||
utility was written by
|
||||
.An Poul-Henning Kamp ,
|
||||
along with the kernel-support.
|
||||
.Sh BUGS
|
||||
There are far too much magic and internal knowledge from GCC in this.
|
||||
|
@ -22,8 +22,6 @@ static const char rcsid[] =
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define MAXBB 32768
|
||||
|
||||
struct bb {
|
||||
u_long zero_one;
|
||||
u_long filename;
|
||||
@ -38,27 +36,20 @@ struct bb {
|
||||
};
|
||||
|
||||
struct nlist namelist[] = {
|
||||
{ "bbhead" },
|
||||
{ NULL }
|
||||
{ "bbhead", 0, 0, 0, 0 },
|
||||
{ NULL, 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
u_long lineno[MAXBB];
|
||||
u_long counts[MAXBB];
|
||||
u_long addr[MAXBB];
|
||||
u_long func[MAXBB];
|
||||
u_long file[MAXBB];
|
||||
char *fn[MAXBB];
|
||||
char *pn[MAXBB];
|
||||
|
||||
kvm_t *kv;
|
||||
|
||||
int
|
||||
main()
|
||||
main(int argc __unused, char **argv __unused)
|
||||
{
|
||||
int i,j;
|
||||
int i;
|
||||
u_long l1,l2,l4;
|
||||
struct bb bb;
|
||||
char buf[128];
|
||||
char buf[BUFSIZ], *p;
|
||||
FILE *f;
|
||||
|
||||
kv = kvm_open(NULL,NULL,NULL,O_RDWR,"dnc");
|
||||
if (!kv)
|
||||
@ -73,68 +64,30 @@ main()
|
||||
l1 += sizeof l1;
|
||||
kvm_read(kv,l2,&bb,sizeof bb);
|
||||
l2 = bb.next;
|
||||
if (!bb.ncounts)
|
||||
continue;
|
||||
if (bb.ncounts > MAXBB)
|
||||
errx(1, "found %lu counts above limit of %u",
|
||||
bb.ncounts, MAXBB);
|
||||
kvm_read(kv,bb.lineno,lineno, bb.ncounts * sizeof lineno[0]);
|
||||
kvm_read(kv,bb.counts,counts, bb.ncounts * sizeof counts[0]);
|
||||
kvm_read(kv,bb.addr, addr, bb.ncounts * sizeof addr[0]);
|
||||
kvm_read(kv,bb.file, file, bb.ncounts * sizeof file[0]);
|
||||
kvm_read(kv,bb.func, func, bb.ncounts * sizeof func[0]);
|
||||
kvm_read(kv, bb.filename, buf, sizeof(buf));
|
||||
p = buf;
|
||||
f = fopen(p, "w");
|
||||
if (f != NULL) {
|
||||
printf("Writing \"%s\"\n", p);
|
||||
} else {
|
||||
p = strrchr(buf, '/');
|
||||
if (p == NULL)
|
||||
p = buf;
|
||||
else
|
||||
p++;
|
||||
printf("Writing \"%s\" (spec \"%s\")\n", p, buf);
|
||||
f = fopen(p, "w");
|
||||
}
|
||||
if (f == NULL)
|
||||
err(1,"%s", p);
|
||||
fwrite(&bb.ncounts, 4, 1, f);
|
||||
l4 = 0;
|
||||
for (i=0; i < bb.ncounts; i++) {
|
||||
if (counts[i])
|
||||
l4++;
|
||||
if (!func[i] && i+1 < bb.ncounts)
|
||||
func[i] = func[i+1];
|
||||
}
|
||||
if (!l4)
|
||||
continue;
|
||||
for (i=0; i < bb.ncounts; i++) {
|
||||
|
||||
if (0 && !counts[i])
|
||||
continue;
|
||||
|
||||
if (!pn[i] && func[i]) {
|
||||
kvm_read(kv,func[i], buf, sizeof buf);
|
||||
buf[sizeof buf -1] = 0;
|
||||
pn[i] = strdup(buf);
|
||||
for(j=i+1;j<bb.ncounts;j++)
|
||||
if (func[j] == func[i]) {
|
||||
pn[j] = pn[i];
|
||||
func[j] = 0;
|
||||
}
|
||||
}
|
||||
if (!pn[i])
|
||||
pn[i] = "-";
|
||||
if (!fn[i] && file[i]) {
|
||||
kvm_read(kv,file[i], buf, sizeof buf);
|
||||
buf[sizeof buf -1] = 0;
|
||||
fn[i] = strdup(buf);
|
||||
for(j=i+1;j<bb.ncounts;j++)
|
||||
if (file[j] == file[i]) {
|
||||
fn[j] = fn[i];
|
||||
file[j] = 0;
|
||||
}
|
||||
}
|
||||
if (!fn[i])
|
||||
fn[i] = "-";
|
||||
l4 = 0;
|
||||
if (i+1 < bb.ncounts)
|
||||
l4 = addr[i+1] - addr[i];
|
||||
printf("%s %5lu %s %lu %lu %lu %lu\n",
|
||||
fn[i], lineno[i], pn[i], addr[i], counts[i], l4, counts[i] * l4);
|
||||
}
|
||||
for(i=0;i<bb.ncounts;i++) {
|
||||
if (func[i] && pn[i])
|
||||
free(pn[i]);
|
||||
if (file[i] && fn[i])
|
||||
free(fn[i]);
|
||||
pn[i] = 0;
|
||||
fn[i] = 0;
|
||||
}
|
||||
fwrite(&l4, 4, 1, f);
|
||||
p = malloc(bb.ncounts * 8);
|
||||
kvm_read(kv, bb.counts, p, bb.ncounts * 8);
|
||||
fwrite(p, 8, bb.ncounts, f);
|
||||
fclose(f);
|
||||
free(p);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user