profiling
Henry Cejtin
henry@sourcelight.com
Tue, 10 Apr 2001 00:46:05 -0500
It seems to work perfectly. I used some fancyness so that to turn profiling
on you just have to link it with prof.o. Nothing else changes. The only
cost of this is that initSignalStack() has one extra test in it of a (link-
time) constant against 0.
The change to gc.c consists of the following new version of
initSignalStack():
static void initSignalStack(GC_state s) {
extern void startProf(void)
__attribute__((weak));
static stack_t altstack;
size_t ss_size = roundPage(SIGSTKSZ);
size_t psize = getpagesize();
void *ss_sp = ssmmap(2 * ss_size, psize, psize);
altstack.ss_sp = ss_sp + ss_size;
altstack.ss_size = ss_size;
altstack.ss_flags = 0;
sigaltstack(&altstack, NULL);
unless (startProf == NULL)
startProf();
}
The only change is the funny declaration of startProf() and the call to it if
it isn't NULL.
Next comes the new C file prof.c:
Finally, the Makefile in src/runtime has to be fixed to compile prof.o.
Note, this .o must NOT go in any of the libraries built. It ends up going
directly in /usr/local/lib/mlton/lib. (It is essentially the analogue of
/usr/lib/gcrt1.o.)
Now in the mlton executable, for the -p case, we still want to set keepCps
true. We only need to set keepGenerated to true if information still has to
be extracted from the C files, and I don't think that that needs to be the
case if Matthew encodes what he needs in the static symbol names. Also we
shouldn't need to turn on -g if profile is true any more. On the other hand,
if profile is true and you are linking, then you must add
/usr/local/lib/mlton/lib/prof.o onto the list of things.
Note, at the moment there still doesn't seem to be any way to, for instance,
keep the .c file that gets generated. I often want to keep this, but NOT the
.s or .o that gets generated from that.
Matthew, if there seems to be something wrong with this, I'm open to changes.
Also if you don't want to write the thing that scans the resulting mlprof.out
file, tell me what symbols you are including in your generated code and I can
do that part.
One thing I should point out that I discovered the hard way: If the call to
sigaction does NOT specify the SA_ONSTACK flag, then even if you have called
sigaltstack(), it will NOT switch stacks, so you will probably die. Worse,
if the call to sigaction DOES have SA_ONSTACK and you ahve NOT called
sigaltstack(), it still switches stacks (to location 0) and you die of a
SEGV. Thus the sigaction() call MUST occur after the call to sigaltstack(),
and in order to have profiling cover as much as possible, you want it to
occur right after the sigaltstack() call.
begin 600 prof.c.tgz
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
FT$$''73000<==-!!!QUTT$$''73000<==-#!Q^$O"\>'X@`H```=
`
end