#include "gprof.h"
static int searchmsg = 0;
nltype *
nllookup(mod_info_t *module, pctype address, pctype *nxtsym)
{
size_t low = 0, middle, high = module->nname - 1;
pctype keyval;
nltype *mnl = module->nl;
keyval = module->txt_origin + (address - module->load_base);
if (keyval < mnl[low].value) {
if (nxtsym) {
*nxtsym = module->load_base +
(mnl[low].value - module->txt_origin);
}
return (NULL);
}
if (keyval >= mnl[high].value) {
if (nxtsym)
*nxtsym = module->load_end;
return (&mnl[high]);
}
while (low != high) {
middle = (high + low) >> 1;
if (mnl[middle].value <= keyval &&
mnl[middle + 1].value > keyval) {
if (nxtsym) {
*nxtsym = module->load_base +
(mnl[middle + 1].value -
module->txt_origin);
}
return (&mnl[middle]);
}
if (mnl[middle].value > keyval) {
high = middle;
} else {
low = middle + 1;
}
}
if (searchmsg++ == 0)
(void) fprintf(stderr, "[nllookup] binary search fails???\n");
return (0);
}
arctype *
arclookup(nltype *parentp, nltype *childp)
{
arctype *arcp;
if (parentp == 0 || childp == 0) {
(void) fprintf(stderr,
"[arclookup] parentp == 0 || childp == 0\n");
return (0);
}
#ifdef DEBUG
if (debug & LOOKUPDEBUG) {
(void) printf("[arclookup] parent %s child %s\n",
parentp->name, childp->name);
}
#endif
for (arcp = parentp->children; arcp; arcp = arcp->arc_childlist) {
#ifdef DEBUG
if (debug & LOOKUPDEBUG) {
(void) printf(
"[arclookup]\t arc_parent %s arc_child %s\n",
arcp->arc_parentp->name,
arcp->arc_childp->name);
}
#endif
if (arcp->arc_childp == childp) {
return (arcp);
}
}
return (0);
}