#!/bin/sh
TMP1=find-routine.tmp1
TMP=find-routine.tmp
trap "rm -f $TMP $TMP1" 0
OBJ=$1
shift
echo 'set width 500' > $TMP1
echo 'break main' >> $TMP1
echo 'r' >> $TMP1
for i in `grep '\(return stack:\)\|\(allocated at\)' $* |
tr ' ' '\012' |
grep 0x | sort -u`;
do
echo 'x/i '$i >> $TMP1
echo 'i line * '$i >> $TMP1
done
cat $TMP1 | gdb $OBJ \
| awk '\
/^\(gdb\) \(?g?d?b?\)? ?0x[[:xdigit:]]*.*:.*/ \
{a = gensub(/^\(gdb\) \(?g?d?b?\)? ?(0x[[:xdigit:]]*).*:.*/,"\\1","G");\
b = gensub(/^\(gdb\) \(?g?d?b?\)? ?(0x[[:xdigit:]]*.*):.*/,"\\1","G");\
printf("s;%s;%s",a,b); next; } \
/.*No line.*/ \
{printf(";\n",a);next} \
/.*Line [[:digit:]]+.*/ \
{a = gensub(/.*(Line [[:digit:]]+ of .*) starts.*/,"\\1","G"); \
printf(" at %s;\n", a); next}'>> $TMP
awk '/return stack/ { printf ("return stack\n");
for (i = 3; i <= NF; i++)
printf ("\troutine %s\n", $i); }
/allocated at/ { printf ("allocated at\n");
for (i = 3; i <= NF; i++)
printf ("\t\troutine %s\n", $i); }
/^[A-Z]/ { print }' $* |
sed -f $TMP