diff --git a/gprof/.Sanitize b/gprof/.Sanitize index 2afc0bbd250..25209f6662a 100644 --- a/gprof/.Sanitize +++ b/gprof/.Sanitize @@ -27,12 +27,15 @@ Things-to-keep: ChangeLog Makefile.in arcs.c -blurbs.c +bsd_callg_bl.m config configure.in dfn.c dummy.c dummy.h +flat_bl.m +fsf_callg_bl.m +gen-c-prog.awk gmon.h gprof.1 gprof.c diff --git a/gprof/ChangeLog b/gprof/ChangeLog index 4277dfcc9e4..913df00df26 100644 --- a/gprof/ChangeLog +++ b/gprof/ChangeLog @@ -1,3 +1,17 @@ +Mon Oct 5 17:50:16 1992 Per Bothner (bothner@cygnus.com) + + * gen-c-prog.awk: New awk script, lightly changed from + previously deleted make-c-prog.awk. Converts a text file + to a c function that prints that text. + * flat_bl.m, fsf_callg_bl.m, bsd_callg_bl.m: New files. + Inputs to gen-c-prog.awk, containing text describing + gprof output. + * blurbs.c: Removed. Use *_bl.c instead. + * Makefile.in: Use gen-cprog.awk to generate *_bl.c files + from *_bl.m files. Also, improve *clean rules. + * printgprof.c (printgprof): Usw new function names from *_bl.c. + + Sun Aug 30 19:54:53 1992 Per Bothner (bothner@rtl.cygnus.com) * gprof.h, gprof.c, printfgprof.c: Add support for two diff --git a/gprof/Makefile.in b/gprof/Makefile.in index 26ef25abe6d..ef09ae7f683 100644 --- a/gprof/Makefile.in +++ b/gprof/Makefile.in @@ -26,16 +26,30 @@ SRCS= gprof.c arcs.c dfn.c lookup.c $(MACHINE).c hertz.c \ printgprof.c printlist.c LIBS = ../bfd/libbfd.a ../libiberty/libiberty.a -OBJS= blurbs.o gprof.o arcs.o dfn.o lookup.o $(MACHINE).o hertz.o \ - printgprof.o printlist.o +OBJS= gprof.o arcs.o dfn.o lookup.o $(MACHINE).o hertz.o \ + printgprof.o printlist.o \ + flat_bl.o bsd_callg_bl.o fsf_callg_bl.o + +# Files that can be generated, but should be included in distribution. +DISTSTUFF = flat_bl.c bsd_callg_bl.c fsf_callg_bl.c CFLAGS= .c.o: $(CC) -c $(CFLAGS) -I$(srcdir) -I$(srcdir)/../include -DMACHINE_H=\"$(MACHINE).h\" $(TCFLAGS) $(HCFLAGS) $< -all: $(PROG) +all: diststuff $(PROG) .PHONY: check info install-info +.SUFFIXES: .m + +.m.c: + awk -f $(srcdir)/gen-c-prog.awk > ./$*.c \ + FUNCTION=`(echo $*|sed -e 's/_bl//')`_blurb \ + FILE=$*.m $(srcdir)/$*.m + +diststuff: $(DISTSTUFF) + + check: info: install-info: @@ -53,8 +67,14 @@ install: all $(PROG): $(OBJS) $(CC) $(CFLAGS) $(OBJS) -o $(PROG) $(LIBS) -clean: - -rm -f $(OBJS) core gprof nohup.out +mostlyclean: + -rm -f *.o core gprof nohup.out +clean: mostlyclean + -rm -f gprof +distclean: clean + -rm -f config.status Makefile +realclean: distclean + -rm -f $(DISTSTUFF) Makefile : Makefile.in sh config.status @@ -69,4 +89,6 @@ $(MACHINE).o: $(MACHINE).c hertz.o: hertz.c printgprof.o: printgprof.c printlist.o: printlist.c -blurbs.o: blurbs.c +flat_bl.o: flat_bl.c +bsd_callg_bl.o: bsd_callg_bl.c +fsf_callg_bl.o: fsf_callg_bl.c diff --git a/gprof/bsd_callg_bl.m b/gprof/bsd_callg_bl.m new file mode 100644 index 00000000000..533c96ca439 --- /dev/null +++ b/gprof/bsd_callg_bl.m @@ -0,0 +1,108 @@ + + + +call graph profile: + The sum of self and descendents is the major sort + for this listing. + + function entries: + +index the index of the function in the call graph + listing, as an aid to locating it (see below). + +%time the percentage of the total time of the program + accounted for by this function and its + descendents. + +self the number of seconds spent in this function + itself. + +descendents + the number of seconds spent in the descendents of + this function on behalf of this function. + +called the number of times this function is called (other + than recursive calls). + +self the number of times this function calls itself + recursively. + +name the name of the function, with an indication of + its membership in a cycle, if any. + +index the index of the function in the call graph + listing, as an aid to locating it. + + + + parent listings: + +self* the number of seconds of this function's self time + which is due to calls from this parent. + +descendents* + the number of seconds of this function's + descendent time which is due to calls from this + parent. + +called** the number of times this function is called by + this parent. This is the numerator of the + fraction which divides up the function's time to + its parents. + +total* the number of times this function was called by + all of its parents. This is the denominator of + the propagation fraction. + +parents the name of this parent, with an indication of the + parent's membership in a cycle, if any. + +index the index of this parent in the call graph + listing, as an aid in locating it. + + + + children listings: + +self* the number of seconds of this child's self time + which is due to being called by this function. + +descendent* + the number of seconds of this child's descendent's + time which is due to being called by this + function. + +called** the number of times this child is called by this + function. This is the numerator of the + propagation fraction for this child. + +total* the number of times this child is called by all + functions. This is the denominator of the + propagation fraction. + +children the name of this child, and an indication of its + membership in a cycle, if any. + +index the index of this child in the call graph listing, + as an aid to locating it. + + + + * these fields are omitted for parents (or + children) in the same cycle as the function. If + the function (or child) is a member of a cycle, + the propagated times and propagation denominator + represent the self time and descendent time of the + cycle as a whole. + + ** static-only parents and children are indicated + by a call count of 0. + + + + cycle listings: + the cycle as a whole is listed with the same + fields as a function entry. Below it are listed + the members of the cycle, and their contributions + to the time and call counts of the cycle. + diff --git a/gprof/flat_bl.m b/gprof/flat_bl.m new file mode 100644 index 00000000000..6fc3340a6c7 --- /dev/null +++ b/gprof/flat_bl.m @@ -0,0 +1,28 @@ + + % the percentage of the total running time of the +time program used by this function. + +cumulative a running sum of the number of seconds accounted + seconds for by this function and those listed above it. + + self the number of seconds accounted for by this +seconds function alone. This is the major sort for this + listing. + +calls the number of times this function was invoked, if + this function is profiled, else blank. + + self the average number of milliseconds spent in this +ms/call function per call, if this function is profiled, + else blank. + + total the average number of milliseconds spent in this +ms/call function and its descendents per call, if this + function is profiled, else blank. + +name the name of the function. This is the minor sort + for this listing. The index shows the location of + the function in the gprof listing. If the index is + in parenthesis it shows where it would appear in + the gprof listing if it were to be printed. + diff --git a/gprof/fsf_callg_bl.m b/gprof/fsf_callg_bl.m new file mode 100644 index 00000000000..7e16821ede2 --- /dev/null +++ b/gprof/fsf_callg_bl.m @@ -0,0 +1,83 @@ + + This table describes the call tree of the program, and was sorted by + the total amount of time spent in each function and its children. + + Each entry in this table consists of several lines. The line with the + index number at the left hand margin lists the current function. + The lines above it list the functions that called this function, + and the lines below it list the functions this one called. + This line lists: + index A unique number given to each element of the table. + Index numbers are sorted numerically. + The index number is printed next to every function name so + it is easier to look up where the function in the table. + + % time This is the percentage of the `total' time that was spent + in this function and its children. Note that due to + different viewpoints, functions excluded by options, etc, + these numbers will NOT add up to 100%. + + self This is the total amount of time spent in this function. + + children This is the total amount of time propagated into this + function by its children. + + called This is the number of times the function was called. + If the function called itself recursively, the number + only includes non-recursive calls, and is followed by + a `+' and the number of recursive calls. + + name The name of the current function. The index number is + printed after it. If the function is a member of a + cycle, the cycle number is printed between the + function's name and the index number. + + + For the function's parents, the fields have the following meanings: + + self This is the amount of time that was propagated directly + from the function into this parent. + + children This is the amount of time that was propagated from + the function's children into this parent. + + called This is the number of times this parent called the + function `/' the total number of times the function + was called. Recursive calls to the function are not + included in the number after the `/'. + + name This is the name of the parent. The parent's index + number is printed after it. If the parent is a + member of a cycle, the cycle number is printed between + the name and the index number. + + If the parents of the function cannot be determined, the word + `' is printed in the `name' field, and all the other + fields are blank. + + For the function's children, the fields have the following meanings: + + self This is the amount of time that was propagated directly + from the child into the function. + + children This is the amount of time that was propagated from the + child's children to the function. + + called This is the number of times the function called + this child `/' the total number of times the child + was called. Recursive calls by the child are not + listed in the number after the `/'. + + name This is the name of the child. The child's index + number is printed after it. If the child is a + member of a cycle, the cycle number is printed + between the name and the index number. + + If there are any cycles (circles) in the call graph, there is an + entry for the cycle-as-a-whole. This entry shows who called the + cycle (as parents) and the members of the cycle (as children.) + The `+' recursive calls entry shows the number of function calls that + were internal to the cycle, and the calls entry for each member shows, + for that member, how many times it was called from other members of + the cycle. + diff --git a/gprof/gen-c-prog.awk b/gprof/gen-c-prog.awk new file mode 100644 index 00000000000..cccf4280ef5 --- /dev/null +++ b/gprof/gen-c-prog.awk @@ -0,0 +1,26 @@ +NR == 1 { + FS="\""; + print "/* ==> Do not modify this file!! It is created automatically" + printf " from %s using the make-c-prog.awk script. <== */\n\n", FILE + print "#include " +} + + { + if (curfun != FUNCTION) + { + if (curfun) + print "}" + curfun = FUNCTION + print "" + print "void"; + printf "%s (file)\n", FUNCTION + print " FILE *file;"; + print "{"; + } + printf " fputs (\""; + for (i = 1; i < NF; i++) + printf "%s\\\"", $i; + printf "%s\\n\", file);\n", $NF; +} + +END { print "}" } diff --git a/gprof/printgprof.c b/gprof/printgprof.c index 868d647c3ad..e8d55821f9b 100644 --- a/gprof/printgprof.c +++ b/gprof/printgprof.c @@ -212,7 +212,7 @@ printgprof(timesortnlp) * Print out the structured profiling list */ if ( bflag && bsd_style_output ) { - callg_blurb(stdout); + bsd_callg_blurb(stdout); } gprofheader(); for ( index = 0 ; index < nname + ncycle ; index ++ ) { @@ -246,7 +246,7 @@ printgprof(timesortnlp) } cfree( timesortnlp ); if ( bflag && !bsd_style_output) { - callg_blurb(stdout); + fsf_callg_blurb(stdout); } }