diff options
author | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:34:07 +0000 |
---|---|---|
committer | Stan Shebs <shebs@codesourcery.com> | 1999-04-16 01:34:07 +0000 |
commit | 071ea11e85eb9d529cc5eb3d35f6247466a21b99 (patch) | |
tree | 5deda65b8d7b04d1f4cbc534c3206d328e1267ec /gprof | |
parent | 1730ec6b1848f0f32154277f788fb29f88d8475b (diff) | |
download | gdb-071ea11e85eb9d529cc5eb3d35f6247466a21b99.zip gdb-071ea11e85eb9d529cc5eb3d35f6247466a21b99.tar.gz gdb-071ea11e85eb9d529cc5eb3d35f6247466a21b99.tar.bz2 |
Initial creation of sourceware repository
Diffstat (limited to 'gprof')
67 files changed, 0 insertions, 19851 deletions
diff --git a/gprof/.Sanitize b/gprof/.Sanitize deleted file mode 100644 index e8c2959..0000000 --- a/gprof/.Sanitize +++ /dev/null @@ -1,123 +0,0 @@ -# .Sanitize for devo/gprof - -# Each directory to survive its way into a release will need a file -# like this one called "./.Sanitize". All keyword lines must exist, -# and must exist in the order specified by this file. Each directory -# in the tree will be processed, top down, in the following order. - -# Hash started lines like this one are comments and will be deleted -# before anything else is done. Blank lines will also be squashed -# out. - -# The lines between the "Do-first:" line and the "Things-to-keep:" -# line are executed as a /bin/sh shell script before anything else is -# done in this directory. - -Do-first: - - -# All files listed between the "Things-to-keep:" line and the -# "Do-last:" line will be kept. All other files will be removed. -# Directories listed in this section will have their own Sanitize -# called. Directories not listed will be removed in their entirety -# with rm -rf. - -Things-to-keep: - -.gdbinit -ChangeLog -Makefile.am -Makefile.in -NOTES -TEST -TODO -acconfig.h -aclocal.m4 -alpha.c -basic_blocks.c -basic_blocks.h -bb_exit_func.c -bbconv.pl -bsd_callg_bl.m -call_graph.c -call_graph.h -cg_arcs.c -cg_arcs.h -cg_dfn.c -cg_dfn.h -cg_print.c -cg_print.h -configure -configure.bat -configure.in -corefile.c -corefile.h -flat_bl.m -fsf_callg_bl.m -gconfig.in -gen-c-prog.awk -gmon.h -gmon_io.c -gmon_io.h -gmon_out.h -gprof.1 -gprof.c -gprof.h -gprof.texi -hertz.c -hertz.h -hist.c -hist.h -i386.c -po -search_list.c -search_list.h -source.c -source.h -sparc.c -stamp-h.in -sym_ids.c -sym_ids.h -symtab.c -symtab.h -tahoe.c -utils.c -utils.h -vax.c - -Things-to-lose: - -.cvsignore -make_hp_order_obj -make_solaris_order_map - -# The lines between the "Do-last:" line and the end of the file -# are executed as a /bin/sh shell script after everything else is -# done. - -Do-last: - -# This must come after all other sanitizations. Re-sanitize the .pot -# file. -if [ -n "${verbose}" ]; then - echo Re-computing files for gettext ... -fi - -if [ -n "${safe}" -a ! -f po/.Recover/POTFILES.in ]; then - if [ -n "${verbose}" ]; then - echo Caching po/POTFILES.in in .Recover... - fi - mv po/POTFILES.in po/.Recover -fi -find . -name '*.[ch]' | sed -e 's,^\./,,' > po/POTFILES.in - -if [ -n "${safe}" -a ! -f po/.Recover/gprof.pot ]; then - if [ -n "${verbose}" ]; then - echo Caching po/gprof.pot in .Recover... - fi - mv po/gprof.pot po/.Recover -fi -# If this fails, Sanitization must fail. -xgettext -c -k_ -kN_ -f po/POTFILES.in -o po/gprof.pot || exit 1 - -# eof diff --git a/gprof/.cvsignore b/gprof/.cvsignore deleted file mode 100644 index e41b2fb..0000000 --- a/gprof/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -*_bl.c diff --git a/gprof/.gdbinit b/gprof/.gdbinit deleted file mode 100644 index e519472..0000000 --- a/gprof/.gdbinit +++ /dev/null @@ -1 +0,0 @@ -dir .. diff --git a/gprof/ChangeLog b/gprof/ChangeLog deleted file mode 100644 index 6d8a78b..0000000 --- a/gprof/ChangeLog +++ /dev/null @@ -1,1279 +0,0 @@ -Sun Dec 6 21:57:50 1998 Ian Lance Taylor <ian@cygnus.com> - - * gprof.texi (Symspecs): Mention that you have to add any - underscore yourself when naming a symbol. - -Mon Nov 2 15:05:33 1998 Geoffrey Noer <noer@cygnus.com> - - * configure.in: detect cygwin* instead of cygwin32* - * configure: regenerate - -Wed Aug 12 14:59:06 1998 Ian Lance Taylor <ian@cygnus.com> - - Avoid some overflow cases: - * basic_blocks.h (bb_min_calls): Change to unsigned long. - * call_graph.h (cg_tally): Change count parameter to unsigned - long. - * cg_arcs.h (Arc): Change count field to unsigned long. - (arc_add): Change count parameter to unsigned long. - * source.h (Source_File): Change ncalls field to unsigned long. - * symtab.h (Sym): Change fields ncalls, bb_calls, and - cg.self_calls to unsigned long. - * Many files: Update accordingly. - - * configure, Makefile.in, aclocal.m4: Rebuild with current tools. - -Fri Jul 10 17:29:49 1998 Stan Cox <scox@equinox.cygnus.com> - - * configure.in (BSD44_FORMAT): Define for cygwin32, win32, mingw32 - * configure: Rebuild. - -Fri Jun 12 13:40:05 1998 Tom Tromey <tromey@cygnus.com> - - * po/Make-in (all-yes): If maintainer mode, depend on .pot file. - ($(PACKAGE).pot): Unconditionally depend on POTFILES. - -Sun May 10 22:35:33 1998 Jeffrey A Law (law@cygnus.com) - - * po/Make-in (install-info): New target. - -Tue May 5 18:28:40 1998 Tom Tromey <tromey@cygnus.com> - - * gprof.h (_): Undefine BFD's version. - -Tue Apr 28 19:17:33 1998 Tom Tromey <tromey@cygnus.com> - - * gprof.c (main): Conditionally call setlocale. - * gprof.h: Include <locale.h> if HAVE_LOCALE_H. - (LC_MESSAGES): Now can be defined even when ENABLE_NLS. - -Tue Apr 28 19:50:09 1998 Ian Lance Taylor <ian@cygnus.com> - - * corefile.c: Rename from core.c. - * corefile.h: Rename from core.h. - * Many .c files: Include corefile.h rather than core.h. - * Makefile.am (sources): Change core.c to corefile.c. - (noinst_HEADERS): Change core.h to corefile.h. - ($(OBJECTS)): Depend upon corefile.h rather than core.h. - (corefile.o): Rename target from core.o, depend upon corefile.c. - * Makefile.in, po/POTFILES.in: Rebuild. - -Mon Apr 27 16:50:40 1998 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Change version number to 2.9.4 - * configure: Rebuild. - -Wed Apr 22 16:01:17 1998 Tom Tromey <tromey@cygnus.com> - - * po/Make-in (MKINSTALLDIRS): Don't look in $(top_srcdir). - -Wed Apr 22 00:00:22 1998 Tom Tromey <tromey@scribbles.cygnus.com> - - * gprof.h: Added includes and defines for gettext. - * configure.in (ALL_LINGUAS): New macro. - Call CY_GNU_GETTEXT. Create po/Makefile.in and po/Makefile. - * acconfig.h (ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT, HAVE_STPCPY, - HAVE_LC_MESSAGES): Define. - * gprof.c (main): Call setlocale, bindtextdomain, textdomain. - * Makefile.am (SUBDIRS): New macro. - (INCLUDES): Look in intl dirs for headers. Define LOCALEDIR. - (gprof_DEPENDENCIES): Added INTLDEPS. - (gprof_LDADD): Added INTLLLIBS. - (POTFILES): New macro. - (po/POTFILES.in): New target. - * Many files: Wrap user-visible strings with gettext invocation. - -Tue Apr 7 12:43:37 1998 Ian Lance Taylor <ian@cygnus.com> - - From hjl@lucon.org <H.J. Lu>: - * Makefile.am (diststuff): New target. - * Makefile.in: Rebuild. - -Mon Mar 30 12:47:48 1998 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Set version to 2.9.1. - * configure: Rebuild. - - * Branched binutils 2.9. - -Sat Mar 28 23:09:08 1998 Ian Lance Taylor <ian@cygnus.com> - - Fix some gcc -Wall warnings: - * cg_arcs.c (num_cycles): Change to unsigned int. - (numarcs): Likewise. - (arc_add): Change maxarcs to unsigned int. - (cg_assemble): Change index to unsigned int. - * cg_arcs.h (num_cycles, numarcs): Update declarations. - * cg_print.c (cg_print): Change index to unsigned int. - (cg_print_index): Change index, nnames, todo, i, and j to unsigned - int. - (cg_print_file_ordering): Change symbol_count and index2 to - unsigned int. - * core.c (symbol_map_count): Change to unsigned int. - (core_create_function_syms): Change j to unsigned int. - (core_create_line_syms): Add cast to avoid warning. - * hist.c (hist_assign_samples): Change j to unsigned int. - (hist_print): Change index to unsigned i nt. Add cast to avoid - warning. - * sym_ids.c (parse_spec): Add casts to avoid warning. - * symtab.c (symtab_finalize): Change j to unsigned int. - (sym_lookup): Update printf format strings. - * symtab.h (Sym_Table): Change len to unsigned int. - * tahoe.c (tahoe_reladdr): Add casts to avoid warnings. - -Tue Mar 24 19:00:11 1998 Ian Lance Taylor <ian@cygnus.com> - - Add --demangle and --no-demangle options: - * gprof.h (demangle): Declare. - * gprof.c (demangle): New global variable. - (OPTION_DEMANGLE, OPTION_NO_DEMANGLE): Define. - (long_options): Add "demangle" and "no-demangle". - (usage): Mention --demangle and --no-demangle. - (main): Handle OPTION_DEMANGLE and OPTION_NO_DEMANGLE. - * utils.c (print_name_only): Only demangle symbol name if demangle - is true. - * gprof.texi (Output Options): Document new options. - -Fri Mar 20 19:21:56 1998 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in: Rebuild with automake 1.2e. - * aclocal.m4, configure: Rebuild with libtool 1.2. - -Thu Feb 12 14:36:05 1998 Ian Lance Taylor <ian@cygnus.com> - - * gprof.c (usage): Update bug-gnu-utils address. - -Sat Feb 7 15:43:12 1998 Ian Lance Taylor <ian@cygnus.com> - - * configure, aclocal.m4: Rebuild with new libtool. - -Fri Feb 6 12:02:28 1998 Ian Lance Taylor <ian@cygnus.com> - - * alpha.c (alpha_Instruction): Use int, not signed. - -Fri Feb 6 02:00:19 1998 Jeffrey A Law (law@cygnus.com) - - * core.c (core_init): Adding missing "break". - -Thu Feb 5 12:49:37 1998 Ian Lance Taylor <ian@cygnus.com> - - * configure, Makefile.in, aclocal.m4: Rebuild with new libtool. - -Tue Feb 3 14:25:25 1998 Brent Baccala <baccala@freesoft.org> - - * bbconv.pl: New file. - * Makefile.am (EXTRA_DIST): Add bbconv.pl. - * Makefile.in: Rebuild. - - * gprof.texi: Extensive additions to document all arguments and - output formats. - - * symtab.c (symtab_finalize): Prefer function symbols over line - symbols. - (dbg_sym_lookup): Correct debugging messages. - - * gprof.c (main): --sum implies --line. - - * cg_print.c (cg_print): When doing line by line profiling, don't - use a non-function as a main listing item. - - * call_graph.c (cg_tally): When using line by line profiling, use - the function symbol as the child. - - * symtab.h (NBBS): Define. - (Sym): Add bb_addr and bb_calls fields. - * basic_blocks.c (bb_read_rec): Save multiple basic blocks per - symbol. - (bb_write_blocks): Adjust for multiple basic blocks per symbol. - (print_exec_counts): Don't check whether a symbol is the start of - a basic block. Print all basic blocks for a symbol. - (annotate_with_count): Rewrite to print all basic block counts and - to pay attention to width argument. - (print_annotated_source): Don't check whether symbol is the start - of a basic block. - - Make it possible to build a cross gprof, although a few cases are - still not handled: - * configure.in: Don't set MY_TARGET. - * gprof.h: Don't include MACHINE_H. Don't define FOPEN_RB or - FOPEN_WB; just get them from sysdep.h. - * core.h (min_insn_size, offset_to_code): Declare. - * core.c (MIN_INSN_SIZE): Don't define. - (min_insn_size, offset_to_code): New variables. - (core_init): Initialize min_insn_size and offset_to_code. - (find_call): New function. - (core_create_line_syms): Don't use min_dist. Set is_static in - pass 2. - * hist.c (UNITS_TO_CODE): Define. - * gprof.c (default_excluded_list): Add "__mcount_internal". - * gmon.h: Change TARGET_alpha to __alpha__. - * hertz.h: Ifdef MACH, define hertz as HZ. - * alpha.c (alpha_Instruction): Rename from Instruction. Change - all references. - (alpha_find_call): Rename from find_call. - * alpha.h: Remove. - * dummy.c, dummy.h: Remove. - * i386.c (i386_iscall): Rename from iscall. Change all - references. Check for call instruction, not jump or lcall. - (i386_find_call): Rename from find_call. Correct for VMA. - Correct call destination computation. Don't dereference symbol if - it is NULL. - * i386.h: Remove. - * ns532.c, ns532.h: Remove. - * sparc.c (CALL): Define. - (sparc_find_call): Rename from find_call. - * sparc.h: Remove. - * tahoe.c: Include cg_arcs.h, core.h, hist.h, and symtab.h. Don't - include time_host.h. - (CALLF, PC): Define. - (enum tahoe_opermodes, tahoe_operandenum): Define. Rename all - references to opermodes or operandenum to these. - (tahoe_operandmode): Rename from operandmode. Call abort if - switch does not return. - (tahoe_operandname): Rename from operandname. Call abort if - switch does not return. - (tahoe_operandlength): Rename from operandlength. Call abort if - switch does not return. - (tahoe_reladdr): Rename from reladdr. - (tahoe_find_call): Rename from find_call. Use core_text_space - rather than textspace. - * tahoe.h: Remove. - * vax.c (CALLS, PC): Define. - (enum opermodes, operandenum, struct modebyte): Define. - (vax_operandmode): Rename from operandmode. Call abort if switch - does not return. - (vax_operandname): Rename from operandname. Call abort if switch - does not return. - (vax_operandlength): Rename from operandlength. Call abort if - switch does not return. - (vax_reladdr): Rename from reladdr. - (vax_find_call): Rename from find_call. - * vax.h: Remove. - * Makefile.am (AUTOMAKE_OPTIONS): Set to cygnus. - (MY_TARGET): Remove. - (INCLUDES): Remove -DTARGET_$(MY_TARGET) and -DMACHINE_H= - \"$(MY_TARGET).h\". - (gprof_SOURCES): Add i386.c, alpha.c, vax.c, tahoe.c, sparc.c. - (gprof_DEPENDENCIES): Remove $(MY_TARGET).o. - (gprof_LDADD): Likewise. - (noinst_HEADERS): Remove alpha.h, i386.h, ns532.h, sparc.h, - tahoe.h, vax.h, dummy.h. - (EXTRA_DIST): Remove alpha.c, i386.c, ns532.c, sparc.c, tahoe.c, - vax.c, dummy.c. - ($(OBJECTS)): Don't depend upon $(MY_TARGET).h. - ($(MY_TARGET).o): Remove target. - (i386.o, alpha.o, vax.o, tahoe.o, sparc.o): New targets. - * configure, Makefile.in, aclocal.m4: Rebuild. - -Mon Dec 29 14:17:08 1997 Ian Lance Taylor <ian@cygnus.com> - - * core.c (core_sym_class): Treat weak symbols as text symbols. - From Dean Gaudet <dgaudet@arctic.org>. - -Wed Sep 24 11:35:43 1997 Ian Lance Taylor <ian@cygnus.com> - - * aclocal.m4: Rebuild with new libtool. - * Makefile.in: Rebuild with current automake. - * configure: Rebuild. - -Sat Aug 9 16:25:01 1997 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Change version number to 2.8.2. Call - AM_PROG_LIBTOOL. Remove shared library handling; now handled by - libtool. Add AM_CONFIG_HEADER. Change AC_PROG_INSTALL to - AM_PROG_INSTALL. Add AM_EXEEXT. - * Makefile.am (LINK): Remove. - (gprof_LDFLAGS): Remove - (gprof_DEPENDENCIES): Change libbfd.a to libbfd.la. - (gprof_LDADD): Likewise. - ($(OBJECTS)): Depend upon gconfig.h and ../bfd/config.h. - * gprof.h: Undefine PACKAGE and VERSION after including BFD - sysdep.h file, then include new gconfig.h file. - * gprof.c (VERSION): Don't define. - * acconfig.h: New file. - * stamp-h.in: New file. - * gconfig.in: New file, created by autoheader. - * Makefile.in, configure, aclocal.m4: Rebuild. - -Sat Jun 28 23:20:42 1997 Ian Lance Taylor <ian@cygnus.com> - - * aclocal.m4, configure, Makefile.in: Rebuild with automake 1.2. - -Mon Jun 16 15:31:39 1997 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.am (INCLUDES): Add -DDEBUG. - * Makefile.in: Rebuild. - -Tue Apr 15 14:19:30 1997 Ian Lance Taylor <ian@cygnus.com> - - Change to use automake: - * Makefile.am: New file. - * configure.in: Run AM_INIT_AUTOMAKE, AM_MAINTAINER_MODE, and - AM_CYGWIN32. - * aclocal.m4: New file, created by aclocal. - * Makefile.in: Replace with file created by automake --cygnus. - * configure: Rebuild. - -Thu Apr 3 13:21:25 1997 Ian Lance Taylor <ian@cygnus.com> - - * gprof.c (VERSION): Define as "2.8.1". - - * Branched binutils 2.8. - -Thu Mar 27 17:15:23 1997 Ian Lance Taylor <ian@cygnus.com> - - * gprof.c (main): Correct copyright message. - -Mon Mar 24 11:12:26 1997 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (.c.o): Define TARGET_$(MY_TARGET) when compiling. - * gmon.h: Use bytes counts rather than sizeof in struct raw_phdr - and struct raw_arc. - -Mon Mar 17 10:54:47 1997 David Mosberger-Tang <davidm@azstarnet.com> - - * cg_arcs.c (arc_add): memset() newly alloced arc to ensure - all fields are initialized with 0. - -Sat Mar 15 19:17:31 1997 H.J. Lu <hjl@lucon.org> - - * symtab.h (find_call): Declare. - * cg_arcs.c (cg_assemble): Don't declare find_call. - * hist.c (scale_and_align_entries): Declare. - -Thu Feb 27 12:46:53 1997 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Define BSD44_FORMAT if the target looks like a - BSD4.4 derived system. - * configure: Rebuild. - * Makefile.in (.c.o): Add @DEFS@. - * gmon_io.c (gmon_out_read): In BSD44_FORMAT code, get profrate - from profrate field, not version field. - -Thu Jan 16 17:42:54 1997 Ian Lance Taylor <ian@cygnus.com> - - * dummy.c (find_call): Clear ignore_direct_calls. - -Tue Dec 31 15:44:10 1996 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (.c.o): Add -D_GNU_SOURCE. Put $(CFLAGS) at the - end. - (gprof): Put $(CFLAGS) after the other options. - -Tue Nov 26 17:08:38 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure: Rebuild with autoconf 2.12. - -Wed Oct 2 15:23:16 1996 Ian Lance Taylor <ian@cygnus.com> - - * sparc.c (find_call): Align p_lowpc to avoid bus error. - -Tue Oct 1 15:58:10 1996 Ian Lance Taylor <ian@cygnus.com> - - * gprof.c (usage): Print bug report address. - (main): Change version printing to match current GNU standards. - -Fri Aug 30 12:16:11 1996 Ian Lance Taylor <ian@cygnus.com> - - * gmon.h: Replace #elif with #else/#endif. - -Thu Aug 29 17:04:10 1996 Michael Meissner <meissner@tiktok.cygnus.com> - - * configure.in (i[345]86-*-*): Recognize i686 for pentium pro. - * configure: Regenerate. - -Thu Aug 22 17:12:30 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Set and substitute HLDENV. - * configure: Rebuild. - * Makefile.in (HLDENV): New variable. - (gprof): Use $(HLDENV). - -Wed Aug 7 14:43:51 1996 Philippe De Muyter <phdm@info.ucl.ac.be> - - * core.c (read_function_mappings): Cast xmalloc return. - -Thu Jul 4 12:01:42 1996 Ian Lance Taylor <ian@cygnus.com> - - * gprof.c (VERSION): Define as "2.7.1". - - * Released binutils 2.7. - - * bb_exit_func.c: Rename from __bb_exit_func.c, so that it can be - stored on a System V file system. - -Thu Jun 27 11:36:22 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Call AC_ISC_POSIX. - * configure: Rebuild. - * Makefile.in (gprof): Pass $(CFLAGS) during link. - * hertz.c: Don't include <sys/time.h>; let sysdep.h handle that. - If HAVE_SETITIMER is not defined, try using sysconf. - -Mon Jun 24 18:27:28 1996 Jason Molenda (crash@godzilla.cygnus.co.jp) - - * Makefile.in (exec_prefix, bindir, libdir, mandir, infodir, datadir, - INSTALL_PROGRAM, INSTALL_DATA): Use autoconf-set values. - * configure.in (AC_PREREQ): autoconf 2.5 or higher. - (AC_PROG_INSTALL): added. - * configure: Rebuilt. - -Mon Jun 24 12:03:09 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: On alpha*-*-osf*, link against libbfd.a if not - using shared libraries. - * configure: Rebuild with autoconf 2.10. - -Tue Jun 18 17:35:58 1996 Ian Lance Taylor <ian@cygnus.com> - - * core.c (core_create_line_syms): Use xstrdup rather than strdup. - * source.c (source_file_lookup_path): Likewise. - -Mon Apr 8 14:44:33 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Permit --enable-shared to specify a list of - directories. - * configure: Rebuild. - -Thu Mar 21 17:18:25 1996 Ian Lance Taylor <ian@cygnus.com> - - * core.c (core_create_function_syms): Move filename and func_name - inside ifdef where they are used. - - * core.c (core_sym_class): Parenthesize && within ||. - * symtab.c (symtab_finalize): Correct parenthesization. - - * cg_print.h (cg_print_file_ordering): Declare. - (cg_print_function_ordering): Declare. - - * __bb_exit_func.c (__bb_exit_func): Replace bcopy with memcpy. - * cg_arcs.c (arc_add): Likewise. - * cg_print.c (cg_print_function_ordering): Likewise. - -Thu Mar 21 17:02:02 1996 David Mosberger-Tang <davidm@azstarnet.com> - - * gprof.c (default_excluded_list): Add "__mcount". - - * gprof.c (main): Change ifdef __osf__ to __alpha__. - - * gmon_io.c (gmon_out_read): If BSD44_FORMAT is defined, get the - profiling rate from the header. - - * gmon.h (struct raw_phdr): Only include pad if both __alpha__ and - __osf__ are defined. Add new fields if BSD44_FORMAT is defined. - - * alpha.h (MIN_INSN_SIZE): Define. - * core.c (MIN_INSN_SIZE): If not defined, define as 1. - (core_sym_class): Ignore debugging symbols. - (core_create_line_syms): Use MIN_INSN_SIZE when gathering line - information. - -Wed Mar 20 18:15:47 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> - - * cg_print.c (cg_print_function_ordering): Fix __GNUC__ misspelled - as __GNU_C__. - (order_and_dump_functions_by_arcs): Likewise. - -Tue Mar 12 12:19:50 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure: Rebuild with autoconf 2.8. - -Sun Feb 18 15:06:18 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Check for 'do not mix' from native linker before - trying to use -rpath. - * configure: Rebuild. - -Tue Feb 13 15:32:53 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Set HDLFLAGS for *-*-hpux with --enable-shared. - * configure: Rebuild. - -Wed Feb 7 14:03:17 1996 Ian Lance Taylor <ian@cygnus.com> - - * configure.in: Don't set CC. Look for --enable-shared. Set - BFDLIB and HLDFLAGS and substitute them. - * configure: Rebuild. - * Makefile.in (LIBS): Use @BFDLIB@. - (HLDFLAGS): New variable. - (gprof): Use $(HLDFLAGS). - -Mon Feb 5 16:34:44 1996 Ian Lance Taylor <ian@cygnus.com> - - Support for building bfd and opcodes as shared libraries, based on - patches from Alan Modra <alan@spri.levels.unisa.edu.au>: - * Makefile.in (LIBDEPS): New variable. - (LIBS): Use -L../bfd -lbfd. - (gprof): Depend upon $(LIBDEPS) rather than $(LIBS). - -Sat Dec 30 10:11:03 1995 Jeffrey A Law (law@cygnus.com) - - * gprof.c (long_options): Add "--function-ordering" and - "--file-ordering" options. - (usage): Add new options to usage message. - (main): Handle new options. - * gprof.h (STYLE_FUNCTION_ORDER): Define. - (STYLE_FILE_ORDER): Define. - (function_mapping_file): Declare. - * cg_arcs.c (arcs, numarcs): New globals. - (arc_add): Put new arcs into the arc array so the function/file - ordering code can examine them. - * cg_arcs.h (struct arc): New field "has_been_placed". - (arcs, numarcs): Declare new globals. - * core.c (symbol_map, symbol_map_count): New globals. - (read_function_mappings): New function to read in a function - to object map file. - (core_init): Call read_function_mappings if a function mapping - file exists. - (core_create_function_syms): Handle function to object file - mappings. - * symtab.h (struct sym): New fields "mapped", "has_been_placed", - "nuses", "prev". - * cg_print.c (cmp_arc_count): New function for sorting arcs. - (cmp_fun_nuses): Likewise for functions. - (cg_print_function_ordering): New function to print a suggested - function ordering. - (cg_print_file_ordering): Likewise for ordering .o files. - (order_and_dump_functions_by_arcs): Helper function for function - and object file ordering code. - -Sun Dec 24 21:32:27 1995 Jeffrey A Law (law@cygnus.com) - - * core.c (core_sym_class): Ignore symbols without BSF_FUNCTION - set if ignore_non_function is set. - * gprof.h (ignore_non_functions): Declare. - * gprof.c (ignore_non_functions): Define. - (long_options): Add "ignore-non-functions". - (usage): Add new options. - (main): Recognize "-D" and "--ignore-non-functions" option. - -Tue Nov 21 13:24:39 1995 Ken Raeburn <raeburn@cygnus.com> - - * Makefile.in (.m.c): Strip out directory name from function - name. - - * hist.c (scale_and_align_entries): Don't use DEFUN_VOID. Do - UNITS_TO_CODE adjustment unconditionally; compiler can optimize - away zero-offset case. Refer to scaled_addr, not aligned_addr. - - * vax.c: Don't include vax.h here. - -Thu Nov 16 03:41:37 1995 Ken Raeburn <raeburn@cygnus.com> - - Version 2.6 released. - -Wed Nov 8 11:40:04 1995 Ian Lance Taylor <ian@cygnus.com> - - * gprof.c (main): Cast getenv return value. - -Mon Nov 6 15:05:00 1995 Ken Raeburn <raeburn@cygnus.com> - - * Makefile.in (TAGS): New target. - -Wed Nov 1 12:51:21 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * Makefile.in (DISTSTUFF): Rename to GEN_FILES, to avoid confusion. - (all): Depend on $(GEN_FILES), not diststuff (which also depends - on info). - -Wed Nov 1 15:23:15 1995 Manfred Hollstein KS/EF4A 60/1F/110 #40283 <manfred@lts.sel.alcatel.de> - - * sym_ids.c: Include <ctype.h>. - -Wed Oct 25 13:24:31 1995 Per Bothner <bothner@kalessin.cygnus.com> - - * Makefile.in (diststuff): Also make info. - (mostlyclean): Don't remove gprof.info*. - (maintainer-clean realclean): Also remove *.info*. - -Fri Oct 6 16:25:32 1995 Ken Raeburn <raeburn@cygnus.com> - - Mon Sep 25 22:49:32 1995 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> - - * Makefile.in: Add dependecies for $(OBJS) on header files. - - * cg_print.c (print_cycle, print_members, cg_print_index): Fix new - style output format to make it consistent. - * dummy.c (find_call): Fix typo in error message. - -Wed Sep 20 13:21:02 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (maintainer-clean): New target, synonym for - realclean. - -Fri Sep 8 14:38:08 1995 Ian Lance Taylor <ian@cygnus.com> - - * Makefile.in (install): Don't install in $(tooldir). - -Fri Aug 25 15:30:05 1995 Ken Raeburn <raeburn@cygnus.com> - - NS32K changes from Ian Dall: - * configure.in: Use ns32k, not ns532. - * ns532.c: Include symtab.h. - (find_call): Renamed from findcall. Print a message. - * ns532.h: Remove dummy.h comments. - -Tue Aug 22 10:00:45 1995 Jeffrey A. Law <law@rtl.cygnus.com> - - * Makefile.in (install): Remove "brokensed" hack, unnecessary now - that we're using autoconf. - -Wed Jul 19 18:46:13 1995 Fred Fish <fnf@cygnus.com> - - * core.c (get_src_info): Cast arg 7 of bfd_find_nearest_line - to proper type of "unsigned int *". - -Fri Jun 16 15:29:36 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * configure.in: Use changequote around use of []. - -Mon Jun 12 12:14:52 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * Makefile.in (distclean, realclean): Remove config.cache and - config.log. - -Wed May 17 17:56:53 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * Makefile.in (Makefile): Added config.status to dependency list. - (config.status): New target. - (SHELL): New definition. - -Tue Apr 25 21:11:12 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * Makefile.in (install): Depend on "all". - -Thu Apr 20 17:29:07 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * Makefile.in: Change all references to MY_MACHINE to MY_TARGET, - to match configure script. - -Wed Apr 19 11:19:37 1995 J.T. Conklin <jtc@rtl.cygnus.com> - - * gen-c-prog.awk: Changed reference to "make-c-prog.awk" in - comment emitted by this script to gen-c-prog.awk. - - * Makefile.in, configure.in: Converted to use autoconf. - * configure: New file, generated with autoconf 2.3. - * config/{mt-alpha, mt-dummy, mt-i386, mt-ns532, mt-sparc, - mt-tahoe, mt-vax}: Removed. - -Mon Mar 13 21:44:24 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * __bb_exit_func.c: New file, from David Mosberger-Tang. - - Thu Feb 9 16:56:07 1995 David Mosberger-Tang <davidm@piston.cs.arizona.edu> - - * All *.c: More cleanup towards GNU format. - - * gmon_out.h (struct gmon_hist_hdr, struct gmon_cg_arc_record): - replaced sizeof (bfd_vma) by size (char*) because Ken tells me - that bfd_vma is only guaranteed to be at least as big as a pointer. - - (GMON_Record_tag): added explicit enumeration values to ensure - compatibility across compilers. - - * gmon_io.c (get_vma, put_vma): replaced sizeof(bfd_vma) by - sizeof(char*). - -Tue Feb 7 17:24:12 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * All *.c and *.h files: Ran "indent -gnu". Cleaned up a couple - of constructs GNU indent couldn't handle. Block comments not yet - rewritten in GNU format. - - * gprof.c (VERSION): Changed to 2.6, to get in sync for next - binutils release. - -Sun Feb 5 16:19:46 1995 David Mosberger-Tang <davidm@piston.cs.arizona.edu> - - * symtab.c (symtab_finalize): ensure globals symbols really - are favored over static ones---even if their name looks less - preferable; this is important for HP-UX; for example, there - is a static label Ltext_something that aliases the global - symbol _start - - * hist.c (hist_print): auto-scaling is now in effect for FSF-style - output only; also, auto-scaling is now performed based on - per-call, rather than total execution time, which is what it was - meant to be. - - * gprof.h (File_Format): new type. - - * gprof.c (VERSION): upped to 2.7---seems to be completely out of - sync with Cygnus version numbers though... - - (long_options): renamed --gmon-info to --file-info, --width added, - renamed --old-file-format to --file-format - (main): dito; also added support to read prof files, but as - mon_out_read() is not implemented, it's #ifdef'd out for now - - (usage): update to reflect new options. - - * gmon_io.c: replaced "old_file_format" by more general - "file_format" option - - * gmon.h (struct raw_phdr): fixed declaration for OSF/1. - - * core.c (core_sym_class): added back check for __gnu_compiled and - ___gnu_compiled for the benefit of systems without - bfd_find_nearest_line() support - - (get_src_info): now the libbfd is fixed, invoke bfd_find_nearest_line() - with section-relative addresses - - (core_create_function_syms): get_src_info() calls are currently - enabled for OSF/1 only. It appears to work allright for SunOS - 4.1.x as well, but on SPARCs it gets painfully slow with the - current implementation of aout_32_find_nearest_line(); - unfortunately, this means that static functions will not have their - filename printed in the call-graph function index; line-level - profiling should still work, but requires some patience - - * cg_print.c (cg_print_index): sanitised printing of index when - using FSF-style output; in particular, output width is now controlled - via option --width and the function tries hard to keep columns - aligned even in the presence of (occasional) long names - - * NOTES: a first shot at updating the documentation. - -Wed Feb 1 19:07:44 1995 David Mosberger-Tang <davidm@piston.cs.arizona.edu> - - * core.c (core_create_function_syms): fixed computation of min_vma - and max_vma. - - * *.c: removed rcsid. - -Tue Jan 31 16:18:18 1995 Ken Raeburn <raeburn@cujo.cygnus.com> - - * Lots of changes from David Mosberger-Tang: - - Tue Oct 25 19:20:14 1994 David Mosberger-Tang <davidm@piston.cs.arizona.edu> - - * gprof.c (main): put parentheses around & within &&. - - * basic_blocks.c (bb_read_rec): print warning message (once) when - ignoring basic-block execution counts. - - * source.c (source_file_lookup_name): corrected second argument to - strcmp(). - - * hist.c (print_header): merged Fri Oct 21 18:58:02 1994 change by - Ken Raeburn <raeburn@cujo.cygnus.com> from binutils-2.5.1. - - * gmon_io.c (gmon_out_read): the output stule STYLE_GMON_INFO is now - supported both for old and new (versioned) gmon.out files. Old - files are identified as version 0. - - * gmon.h (struct raw_arc): count field is now sizeof(long) bytes - long (instead of 4) because that is what OSF/1 v3.0 uses. - - * core.c: minor fixes and debugging info changes. - - Sun Sep 11 18:47:47 1994 David Mosberger-Tang (davidm@piston.cs.arizona.edu) - - * core.c (core_init): if .text cannot be found, try $CODE$ (the - name of the text-section under HP-UX). - - * hist.c (hist_assign_samples): fixed off-by-one bug: highpc - points one past the last sampling bin, so hist_scale should be - computed as "hist_scale /= hist_num_bins", not "hist_scale /= - hist_num_bins - 1". - - * gmon_io.c, hist.c, hist.h: renamed hist_num_samples to - hist_num_bins. - - * configure.in: added alpha-*-*) for per-target config. - - * alpha.c, alpha.h: created. - - * gprof.c (default_excluded_list): <locore>, <hicore> added. - - * core.c (core_create_function_syms, core_create_line_syms): - explicitly keep two sentinels "<locore>" and "<hicore>" that catch - all addresses outside the text-space. Thus, sym_lookup(&symtab, - addr) continues to guarantee not to return 0 on any address. It - also avoids incorrectly crediting the first/last symbol in the - text-space. - - * core.c (core_create_line_syms): always create function symbols - first, then merge in line symbols; this is so that if parts of the - program were compiled without -g, function-level symbols are - available still. - - * utils.c (print_name_only): support for print_path added. - - * symtab.c (cmp_addr): also use is_func flag in comparison. - (symtab_finalize): return immediately when table empty; now - more careful about getting rid of the right duplicate symbol. - - * sparc.c (find_call): many fixes---this function was rather - botched in binutils-2.4 already; it should work again. - - * source.c (source_file_lookup_path): PATH is now strdup'ed (it is - not good to rely on get_src_info() to return distinct string - pointers). - - * search_list.c (search_list_append): added cast for xmalloc(). - - * hist.c: added explicit initialization to some of the global - variables; fixed SItab (scales were off by a factor of 10). - - * hist.h: include of bfd.h added. - - * gprof.c, gprof.h (print_path): added. - - * gprof.h (MAX): fixed. - - * gmon_out.h: renamed gmon_time_hist_hdr to gmon_hist_hdr. - - * gmon_io.c: added some casts to (long) so we can always print as %lx - - * core.c (core_get_text_space): fixed to make it work. - - * cg_print.c (cg_print_index): added support for print_path option. - - * cg_dfn.h (cg_dfn): wrap prototype in PARAMS(). - - * call_graph.c, gmon_io.c, hist.c: avoid taking address of array - as some compilers complain (e.g., DEC's OSF/1 compiler) - - * basic_blocks.c, gmon_io.c, hist.c, source.c, sym_ids.c, - symtab.c: calls to memset() had 2nd and 3rd args reversed. - - Sat Sep 10 21:53:13 1994 David Mosberger-Tang (davidm@piston.cs.arizona.edu) - - * gprof.c: added "_mcount" to default_excluded_list. - (main): if output_style==0 and there is either a histogram or a - call-graph, always generate flat and call-graph, no matter what - line_granularity is set to. - - * source.c (source_file_lookup_name): if searching for sf->name - fails, try again with filename obtained after stripping off any - partial path from sf->name. - - * gprof.h (SRCDEBUG): added. - - * search_list.c (search_list_append): directories were added in wrong - order. - - * reimplemented selection mechanism from ground up; it is now possible - to accurately control what gets included/excluded in each of the - output styles; a "symbol-specification" (spec) is the basic means - to select a set of symbols; a spec has the syntax: - - spec == (FILENAME:(FUNCNAME|LINE_NUM) | NAME). - arc == spec/spec. - - any of the terminal symbols can be empty, in which case they - match anything (wildcards). NAME is interpreted as a FILENAME - if it contains a dot (e.g., foo.c), as LINE_NUM if it starts - with a digit, and as FUNCNAME otherwise. - - For example, to get a call-graph display that ignores arcs - from foo() to bar(), you'd say "--no-graph=foo/bar"; to - show only arcs into bar() (no matter what the caller), - you'd say "--graph=/bar"; and to get a call-graph without - any arc info, you'd say "--graph=/"; similarly, to - get a flat profile without mcount, you'd say "--no-flat=mcount" - and to get a flat profile that shows includes all functions - you'd say "--flat=""" (i.e., an empty spec) - - * hist.c (hist_print): top_time wasn't initialized to 0.0. - - Fri Sep 9 01:10:21 1994 David Mosberger-Tang (davidm@piston.cs.arizona.edu) - - * gmon_out.h: all headers now declared in terms of characters - to avoid getting into trouble with different compilers introducing - different amount of padding; the code already accessed the fields - through bfd functions, so that didn't have to change. - - * hist.c (hist_read_rec, hist_write_rec): added support for - collection pc histograms measuring quantities other than time; - the histogram header now includes a field that specifies the - dimension of the quantity measured by the histogram bins - (normally, this is "seconds", but other meaningful dimensions - include such things as "I-cache misses", "instruction issue stalls" - etc.); there is also a field to specify a one-character - abbreviation for the dimension; in the case of time, this would - be 's'; in most other cases it probably would be '1' (not a physical - dimension). - - Thu Sep 8 16:05:08 1994 David Mosberger-Tang (davidm@piston.cs.arizona.edu) - - * gprof.c, gmon_io.[ch]: BSD_COMPATIBLE is gone and new_file_version - has become old_file_version; gmon_io.c now always supports old-style - gmon.out files; it first tries to read gmon.out as a new version - file, if that fails, it tries to read it in the old format; - although not very likely, it is possible for gprof to mistake an - old-style file as a new one (the first 4 bytes would have to - be "gmon"---including the trailing '\0'); in that case, it is - necessary to specify --old-file-version - - * gprof.h: removed dependency on SYSV; the code now always uses - strrchr(), memset(), and memcpy() and does not include either - of string.h or strings.h; this should make gprof compile on - any (Unix) system without configuration (per suggestion of - raeburn@cygnus.com) - - * gprof.c (usage): fixed location of --new-file-format option. - - * cg_arcs.c (propagate_flags): fixed typo in declaration. - - * flat_bl.m: removed formfeed at end of file; the form-feed - is now printed cg_print.c only when necessary. - - * major rewrite of gprof---too many changes to mention all of - them. new features: - - + -l now requests profiling at the line level (as opposed - to function level); in this mode, gprof creates a "symbol" - (aka name-list entry) for each line of source code, instead - of one per function) - - + support for a new gmon.out file format; the new format - consists of a header with a magic and a version number, - followed by a sequence of profile data; profile data - can any of: (a) PC histogram, (b) call-graph arcs, or - (c) basic-block execution counts; the version number makes - it possible to extend gmon.out in a backwards compatible - fashion - - + support for tcov style annotated output: if the gmon.out file - contains basic-block execution counts, the user can request - the generation of annotated source files, much like Sun's - tcov used to do - - + long options - - + new scheme to suppress symbols that aren't function names - (e.g., avoids mistaking a goto label as a function) - - + reorganized source code to make it more managable; as a - side effect, gprof now compiles cleanly with "gcc -Wall" - - Thu Sep 1 15:46:49 1994 David Mosberger-Tang (davidm@piston.cs.arizona.edu) - - * gprof.c (funcsymbol): bfd_find_nearest_line() is now used as a - final cross-check to determine whether a static symbol should be - considered as a function-name. - - Fri Aug 5 19:32:36 1994 David Mosberger-Tang (davidm@piston.cs.arizona.edu) - - * gmon_io.c (gmon_out_read): recognize "-" as the filename for - stdin; this is useful if you wanna keep gmon.out files compressed; - this way you can "gzcat" the compressed file into gprof. - - * gprof.c: flag_min_count now initialized with 1 instead of 0. - - * basic_blocks.c (bb_annotate_source): added support for creating - .tcov files when option flag_annotate_make_files is TRUE. - (annotate_with_count): all counts less than the minimum count - specified by -m are now annotated with hash-marks. - - * gprof.c (main): -A is now followed by a string of option chars. - - * basic_blocks.c (annotate_with_count): replaced b->count with - cnt. - - * source.c: flag_annotate_source replaced by source_lock_map. - - * source.h: source_lock_map added. - - * gprof.c (main): new command-line syntax: -S simply specifies - which source-files user is interested in; -A requests annotated - source files and -AA requests that all lines in a source file - are annotated. - - Thu Aug 4 23:27:03 1994 David Mosberger-Tang (davidm@piston.cs.arizona.edu) - - * basic_blocks.c (PATH_MAX): if undefined, define as 1024. - - * sparc.c, i386.c, tahoe.c, vax.c: added include of "time_hist.h" - so s_lowpc etc. get declared. - - * arcs.h (doarcs): created. - - * arcs.c: reordered static functions such that they get defined - before use. - - * gprof.c (main): added options: - -A: request annotation of all source lines (with -S) - -m: minimum execution count (with default basic-block display) - -N: force new file format (only if BSD_COMPATIBLE is defined) - -S: annotate source file - -t: set table length (with -S) - - * Makefile (OBJS): added basic_blocks.o call_graph.o gmon_io.o - source.o time_hist.o - - Fri Jul 1 15:23:50 1994 David Mosberger-Tang (davidm@piston.cs.arizona.edu) - - * gprof.c (asgnsamples): computation of "pcl" and "pch" depended - on the fact being able to store a long in a double without loss of - precision; this does not hold on machines with 64 bit longs and 64 - bit doubles. - -Fri Oct 21 18:58:02 1994 Ken Raeburn <raeburn@cujo.cygnus.com> - - * printgprof.c (flatprofheader): Always set totime to 1.0 if not - greater than 0.0. Suggested by Harold Assink - <carlo@sg.tn.tudelft.nl>. - -Fri Sep 23 15:06:45 1994 Ken Raeburn <raeburn@cujo.cygnus.com> - - * printgprof.c (printprof): Use free, not cfree. - (printgprof, printindex): Ditto. - -Thu Sep 1 10:40:45 1994 Jeff Law (law@snake.cs.utah.edu) - - * gprof.h (kfromlist, ktolist, flist, Flist, elist, Elist): Make - decls extern to keep native HP compiler quiet. - -Tue Aug 30 11:12:13 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * gprof.c (funcsymbol): Ignore ___gnu_compiled as well as - __gnu_compiled, for the benefit of systems which add a leading - underscore. - -Wed Aug 24 12:49:13 1994 Ian Lance Taylor (ian@sanguine.cygnus.com) - - * configure.in: Change i386-*-* to i[345]86-*-*. - -Sun Jul 10 00:35:31 1994 Ian Dall (dall@hfrd.dsto.gov.au) - - * ns532.c, ns532.h: New Files. ns532 support. - - * config/mt-ns532: New File. ns532 support. - - * gprof.c: user register int i instead of defaulting the int. - Allows compilation with -Dregister= for debugging. - - * configure.in: Add ns532 support. - -Thu Jun 23 11:22:41 1994 Jeff Law (law@snake.cs.utah.edu) - - * Makefile.in (gprof): Depend on $(LIBS). - -Fri May 27 12:24:57 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - From binutils-2.4 release: - - Wed May 11 22:32:00 1994 DJ Delorie (dj@ctron.com) - - * configure.bat: [new] build makefile from makefile.in (dos) - * hertz.c: allow static HERTZ (msdos needs it) - * gprof.c: allow target to select "r" or "rb" for fopen - * gprof.c: ignore __gnu_compiled symbols - * i386.h: dfine FOPEN_RB to "rb" for dos. - -Tue May 17 15:30:22 1994 E. Michael Smith (ems@cygnus.com) - - * Makefile.in (.m.c:): Added .SUFFIXES : .m - so flat_bl.c would make from flat_bl.m file. - -Thu May 5 19:23:24 1994 Ken Raeburn (raeburn@cujo.cygnus.com) - - * Makefile.in (install-info): Check for gprof.info in build dir, - fall back to srcdir. Depend on it. - - * gprof.h (TRUE, FALSE): Always use undef before defining them. - -Mon Apr 4 23:47:30 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * Makefile.in (MY_MACHINE): Renamed from MACHINE to avoid losing - makes (osf1) in which the value of MACHINE can not be changed. - * config/*.mt: Changed appropriately. - -Wed Mar 30 16:12:40 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com) - - * gprof.c (getsymtab): Change nosyms to long. Rename - get_symtab_upper_bound to bfd_get_symtab_upper_bound. Check for - errors from bfd_get_symtab_upper_bound and - bfd_canonicalize_symtab. - -Tue Mar 22 10:50:52 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * gprof.c (funcsymbol): Use bfd_get_symbol_info instead of - bfd_decode_symclass. - -Sun Mar 20 15:40:21 1994 Jeffrey A. Law (law@snake.cs.utah.edu) - - * Makefile.in: Avoid bug in hpux sed. - -Wed Dec 15 20:16:40 1993 david d `zoo' zuhn (zoo@andros.cygnus.com) - - * gprof.texi (Invoking): add text about -v flag - - * gprof.1: add text about -v flag - -Wed Dec 8 16:55:06 1993 david d `zoo' zuhn (zoo@andros.cygnus.com) - - * gprof.c (VERSION): defined a version macro, print the value - when the -v option is used - -Tue Jul 6 10:11:56 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * Makefile.in: Install correctly. - -Thu Jun 24 14:43:22 1993 David J. Mackenzie (djm@thepub.cygnus.com) - - * gprof.c (main): Get whoami from argv, instead of hardcoding. - Use it in usage message. Split usage message to fit in 80 cols. - -Sun Jun 20 20:58:02 1993 Ken Raeburn (raeburn@poseidon.cygnus.com) - - * Makefile.in: Undo 15 June change. - -Wed Jun 16 12:54:53 1993 Steve Chamberlain (sac@phydeaux.cygnus.com) - - * gmon.h, gprof.h: structs of chars used to hold external - representations. - * gprof.c (getpfile, openpfile, readsamples): Swap data in using - new structures. - -Tue Jun 15 23:09:17 1993 Ken Raeburn (raeburn@cambridge.cygnus.com) - - * Makefile.in (.c.o): Look in ../include, not ../bfd, for bfd.h. - -Mon Jun 14 16:22:59 1993 david d `zoo' zuhn (zoo at rtl.cygnus.com) - - * Makefile.in: remove parentdir support - -Mon Jun 7 12:56:17 1993 Per Bothner (bothner@rtl.cygnus.com) - - * Makefile.in (INCLUDES): Add -I../bfd for sysdep.h and bfd.h. - * configure.in: No longer need to configure to get sysdep.h. - -Tue May 18 21:44:11 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in (install): should not depend on install-info - -Mon Apr 26 12:37:46 1993 Ian Lance Taylor (ian@cygnus.com) - - * gprof.h: Include ansidecl.h before sysdep.h. Undefine hz. - -Tue Apr 13 16:14:03 1993 Per Bothner (bothner@cygnus.com) - - * M Makefile.in: Add -g to CFLAGS. - Ads LDFLAGS and use in place of CFLAGS where appropriate. - * configure.in: Make a sysdep.hlink in the same way other - bfd-based directories do. - * gprof.h (UNIT): Replace non-standard 'u_short' by 'unsigned - short'. - * gprof.h: #include sysdep.h instead of a bunch of stuff. - * gprof.c (main): Fix typo gproff->gprof. - -Thu Mar 25 19:00:37 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * gprof.texi: add INFO-DIR-ENTRY - -Tue Mar 23 00:03:11 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: add installcheck target - -Sat Feb 27 18:17:10 1993 Per Bothner (bothner@rtl.cygnus.com) - - * gprof.c (funcsymbol): Invert test for aflag. - -Thu Feb 25 16:01:50 1993 Per Bothner (bothner@rtl.cygnus.com) - - * printgprof (xmalloc, xrealloc): Cast results of malloc - and realloc to PTR. - -Wed Feb 3 13:55:33 1993 Jeffrey Osier (jeffrey@fowanton.cygnus.com) - - * Makefile.in: created info, install-info, dvi - -Wed Jan 6 00:58:09 1993 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: fix install rule for $(PROG) - -Fri Oct 9 11:25:41 1992 Mark Eichin (eichin@cygnus.com) - - * gprof.1: updated SYNOPSIS to match actual behavior. - -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 - output styles: The default is similar to the old FSF gprof, - while -T sets the variable bsd_style_output, which causes - output matching Berkeley's gprof. The biggest differences - are that with the FSF style output, the flat profile comes - before the call graph; numbers come before explanations; - and there is less gratuitous white space. - * gprof.h, gprof.c, printfgprof.c: New discard_underscores - variable causes discarding of initial underscores when - printing symbol names. It is set unless there is a "main" - symbol (without an underscore). - * printfgprof.c: New function printnameonly(), called - by printname(). It handles stripping of initial '_', - as well as C++ name-demangling. - * gprof.callg, gprof.flat, make-c-prog.awk: Removed. - It is just as convenient to edit blurbs.c directly. - * Makefile.in: Removed rule for making blurbs.c. - * blurbs.c: This is now a true source file (as opposed - to being generated from gprof.callg and gprof.flat). - Change style to use one long string literal, instead of - one literal per output line. Add FSF-style blurb for call graph. - -Wed Aug 19 14:36:39 1992 Ian Lance Taylor (ian@cygnus.com) - - * Makefile.in: always create installation directories. - -Wed Aug 12 15:14:14 1992 Mark Eichin (eichin@cygnus.com) - - * Makefile.in: change ${MACHINE} to $(MACHINE). - -Sun Jul 19 17:34:01 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: removed installation of the now useless - call.{flag,callg} files. - - * gprof.1: now uses the standard man macros instead of the new BSD - mandoc macros. - -Sun Jul 12 19:06:00 1992 John Gilmore (gnu at cygnus.com) - - * configure.in: Remove host section, expand target section. - * config/mt-{tahoe,vax}: Add, to match existing support files. - * config/tmake-*: Remove leftover crud. - - * blurbs.c: New file, created from gprof.flat and gprof.callg by - * make-c-prog.awk: which processes text files into C programs. - * printgprof.c (flatprofheader, gprofheader): Call new functions - to print blurbs. - (printblurb): Remove. - * Makefile.in: Infrastructure to build blurbs. - * pathnames.h: has been removed. Gprof now has no filename - dependencies in it. - * gprof.c: Lint. - -Sat Jul 11 18:07:21 1992 david d `zoo' zuhn (zoo at cirdan.cygnus.com) - - * Makefile.in: define man1dir and install the man page - -Fri Jul 10 21:14:08 1992 david d `zoo' zuhn (zoo@cygnus.com) - - * Makefile.in: added dummy info and install-info targets - -Thu Jun 4 11:34:02 1992 Mark Eichin (eichin at cygnus.com) - - * lookup.c: fixed fencepost in nllookup and added dbg_nllookup for - help in debugging the problem (with -DDEBUG) - * gprof.c: symbol values are now real values, don't add the vma - anymore. (done for solaris; should verify this on other platforms) - * ChangeLog: created. diff --git a/gprof/Makefile.am b/gprof/Makefile.am deleted file mode 100644 index 7ae1492..0000000 --- a/gprof/Makefile.am +++ /dev/null @@ -1,74 +0,0 @@ -## Process this file with automake to generate Makefile.in - -AUTOMAKE_OPTIONS = cygnus - -SUFFIXES = .m - -SUBDIRS = po - -INCLUDES = -D_GNU_SOURCE -DDEBUG -I../bfd -I$(srcdir)/../include -I$(srcdir)/../bfd -I$(srcdir)/../intl -I../intl -DLOCALEDIR="\"$(prefix)/share/locale\"" - -bin_PROGRAMS = gprof - -## Convenience var listing pure sources. -sources = basic_blocks.c call_graph.c cg_arcs.c cg_dfn.c \ - cg_print.c corefile.c gmon_io.c gprof.c hertz.c hist.c source.c \ - search_list.c symtab.c sym_ids.c utils.c \ - i386.c alpha.c vax.c tahoe.c sparc.c -gprof_SOURCES = $(sources) flat_bl.c bsd_callg_bl.c fsf_callg_bl.c -gprof_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a $(INTLDEPS) -gprof_LDADD = ../bfd/libbfd.la ../libiberty/libiberty.a $(INTLLIBS) - -noinst_HEADERS = \ - basic_blocks.h call_graph.h cg_arcs.h cg_dfn.h cg_print.h \ - corefile.h gmon.h gmon_io.h gmon_out.h gprof.h hertz.h hist.h \ - search_list.h source.h sym_ids.h symtab.h utils.h - -EXTRA_DIST = flat_bl.c bsd_callg_bl.c fsf_callg_bl.c bbconv.pl - -BUILT_SOURCES = flat_bl.c bsd_callg_bl.c fsf_callg_bl.c - -diststuff: $(BUILT_SOURCES) info - -.m.c: - awk -f $(srcdir)/gen-c-prog.awk > ./$*.c \ - FUNCTION=`(echo $*|sed -e 's,.*/,,g' -e 's/_bl//')`_blurb \ - FILE=$*.m $(srcdir)/$*.m - -POTFILES = $(sources) $(noinst_HEADERS) -po/POTFILES.in: @MAINT@ Makefile - for file in $(POTFILES); do echo $$file; done | sort > tmp \ - && mv tmp $(srcdir)/po/POTFILES.in - -info_TEXINFOS = gprof.texi -man_MANS = gprof.1 - -# Dependencies. -$(OBJECTS): ../bfd/bfd.h call_graph.h cg_arcs.h cg_print.h \ - corefile.h gmon_io.h gmon_out.h gprof.h hertz.h hist.h \ - search_list.h source.h sym_ids.h symtab.h utils.h \ - $(srcdir)/../include/libiberty.h $(srcdir)/../bfd/sysdep.h \ - gconfig.h ../bfd/config.h -basic_blocks.o: basic_blocks.c -bsd_call_bl.o: bsd_call_bl.c -call_graph.o: call_graph.c -cg_arcs.o: cg_arcs.c -cg_dfn.o: cg_dfn.c -cg_print.o: cg_print.c -corefile.o: corefile.c -flat_bl.o: flat_bl.c -fsf_callg_bl.o: fsf_callg_bl.c -gmon_io.o: gmon_io.c -gprof.o: gprof.c -hertz.o: hertz.c -hist.o: hist.c -search_list.o: search_list.c -source.o: source.c -symtab.o: symtab.c -sym_ids.o: sym_ids.c -utils.o: utils.c -i386.o: i386.c -alpha.o: alpha.c -vax.o: vax.c -tahoe.o: tahoe.c -sparc.o: sparc.c diff --git a/gprof/Makefile.in b/gprof/Makefile.in deleted file mode 100644 index dad6557..0000000 --- a/gprof/Makefile.in +++ /dev/null @@ -1,683 +0,0 @@ -# Makefile.in generated automatically by automake 1.3 from Makefile.am - -# Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DISTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = . - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_alias = @build_alias@ -build_triplet = @build@ -host_alias = @host_alias@ -host_triplet = @host@ -target_alias = @target_alias@ -target_triplet = @target@ -AS = @AS@ -CATALOGS = @CATALOGS@ -CATOBJEXT = @CATOBJEXT@ -CC = @CC@ -DATADIRNAME = @DATADIRNAME@ -DLLTOOL = @DLLTOOL@ -EXEEXT = @EXEEXT@ -GMOFILES = @GMOFILES@ -GMSGFMT = @GMSGFMT@ -GT_NO = @GT_NO@ -GT_YES = @GT_YES@ -INCLUDE_LOCALE_H = @INCLUDE_LOCALE_H@ -INSTOBJEXT = @INSTOBJEXT@ -INTLDEPS = @INTLDEPS@ -INTLLIBS = @INTLLIBS@ -INTLOBJS = @INTLOBJS@ -LD = @LD@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -MAINT = @MAINT@ -MAKEINFO = @MAKEINFO@ -MKINSTALLDIRS = @MKINSTALLDIRS@ -MSGFMT = @MSGFMT@ -NM = @NM@ -PACKAGE = @PACKAGE@ -POFILES = @POFILES@ -POSUB = @POSUB@ -RANLIB = @RANLIB@ -USE_INCLUDED_LIBINTL = @USE_INCLUDED_LIBINTL@ -USE_NLS = @USE_NLS@ -VERSION = @VERSION@ -l = @l@ - -AUTOMAKE_OPTIONS = cygnus - -SUFFIXES = .m - -SUBDIRS = po - -INCLUDES = -D_GNU_SOURCE -DDEBUG -I../bfd -I$(srcdir)/../include -I$(srcdir)/../bfd -I$(srcdir)/../intl -I../intl -DLOCALEDIR="\"$(prefix)/share/locale\"" - -bin_PROGRAMS = gprof - -sources = basic_blocks.c call_graph.c cg_arcs.c cg_dfn.c \ - cg_print.c corefile.c gmon_io.c gprof.c hertz.c hist.c source.c \ - search_list.c symtab.c sym_ids.c utils.c \ - i386.c alpha.c vax.c tahoe.c sparc.c -gprof_SOURCES = $(sources) flat_bl.c bsd_callg_bl.c fsf_callg_bl.c -gprof_DEPENDENCIES = ../bfd/libbfd.la ../libiberty/libiberty.a $(INTLDEPS) -gprof_LDADD = ../bfd/libbfd.la ../libiberty/libiberty.a $(INTLLIBS) - -noinst_HEADERS = \ - basic_blocks.h call_graph.h cg_arcs.h cg_dfn.h cg_print.h \ - corefile.h gmon.h gmon_io.h gmon_out.h gprof.h hertz.h hist.h \ - search_list.h source.h sym_ids.h symtab.h utils.h - -EXTRA_DIST = flat_bl.c bsd_callg_bl.c fsf_callg_bl.c bbconv.pl - -BUILT_SOURCES = flat_bl.c bsd_callg_bl.c fsf_callg_bl.c - -POTFILES = $(sources) $(noinst_HEADERS) - -info_TEXINFOS = gprof.texi -man_MANS = gprof.1 -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs -CONFIG_HEADER = gconfig.h -CONFIG_CLEAN_FILES = -bin_PROGRAMS = gprof$(EXEEXT) -PROGRAMS = $(bin_PROGRAMS) - - -DEFS = @DEFS@ -I. -I$(srcdir) -I. -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -gprof_OBJECTS = basic_blocks.o call_graph.o cg_arcs.o cg_dfn.o \ -cg_print.o corefile.o gmon_io.o gprof.o hertz.o hist.o source.o \ -search_list.o symtab.o sym_ids.o utils.o i386.o alpha.o vax.o tahoe.o \ -sparc.o flat_bl.o bsd_callg_bl.o fsf_callg_bl.o -gprof_LDFLAGS = -CFLAGS = @CFLAGS@ -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) -LINK = $(LIBTOOL) --mode=link $(CC) $(CFLAGS) $(LDFLAGS) -o $@ -TEXI2DVI = `if test -f $(top_srcdir)/../texinfo/util/texi2dvi; then echo $(top_srcdir)/../texinfo/util/texi2dvi; else echo texi2dvi; fi` -TEXINFO_TEX = $(top_srcdir)/../texinfo/texinfo.tex -INFO_DEPS = gprof.info -DVIS = gprof.dvi -TEXINFOS = gprof.texi -man1dir = $(mandir)/man1 -MANS = $(man_MANS) - -NROFF = nroff -HEADERS = $(noinst_HEADERS) - -DIST_COMMON = ChangeLog Makefile.am Makefile.in TODO acconfig.h \ -aclocal.m4 configure configure.in gconfig.in stamp-h.in - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP = --best -SOURCES = $(gprof_SOURCES) -OBJECTS = $(gprof_OBJECTS) - -all: all-recursive-am all-am - -.SUFFIXES: -.SUFFIXES: .S .c .dvi .info .lo .m .o .ps .s .texi .texinfo .txi -$(srcdir)/Makefile.in: @MAINT@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --cygnus Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -$(ACLOCAL_M4): @MAINT@ configure.in - cd $(srcdir) && $(ACLOCAL) - -config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck -$(srcdir)/configure: @MAINT@$(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) - cd $(srcdir) && $(AUTOCONF) - -gconfig.h: stamp-h - @: -stamp-h: $(srcdir)/gconfig.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES= CONFIG_HEADERS=gconfig.h:gconfig.in \ - $(SHELL) ./config.status - @echo timestamp > stamp-h -$(srcdir)/gconfig.in: @MAINT@$(srcdir)/stamp-h.in -$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h - cd $(top_srcdir) && $(AUTOHEADER) - @echo timestamp > $(srcdir)/stamp-h.in - -mostlyclean-hdr: - -clean-hdr: - -distclean-hdr: - -rm -f gconfig.h - -maintainer-clean-hdr: - -mostlyclean-binPROGRAMS: - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) - -distclean-binPROGRAMS: - -maintainer-clean-binPROGRAMS: - -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(bindir) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - list='$(bin_PROGRAMS)'; for p in $$list; do \ - rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - done - -.c.o: - $(COMPILE) -c $< - -.s.o: - $(COMPILE) -c $< - -.S.o: - $(COMPILE) -c $< - -mostlyclean-compile: - -rm -f *.o core *.core - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -.c.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -.s.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -.S.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -maintainer-clean-libtool: - -gprof$(EXEEXT): $(gprof_OBJECTS) $(gprof_DEPENDENCIES) - @rm -f gprof$(EXEEXT) - $(LINK) $(gprof_LDFLAGS) $(gprof_OBJECTS) $(gprof_LDADD) $(LIBS) - -gprof.info: gprof.texi -gprof.dvi: gprof.texi - - -DVIPS = dvips - -.texi.info: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< - -.texi.dvi: - TEXINPUTS=$(top_srcdir)/../texinfo:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.texi: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< - -.texinfo.info: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< - -.texinfo: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< - -.texinfo.dvi: - TEXINPUTS=$(top_srcdir)/../texinfo:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.txi.info: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< - -.txi.dvi: - TEXINPUTS=$(top_srcdir)/../texinfo:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.txi: - @rm -f $@ $@-[0-9] $@-[0-9][0-9] - $(MAKEINFO) -I $(srcdir) $< -.dvi.ps: - $(DVIPS) $< -o $@ - -install-info-am: $(INFO_DEPS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(infodir) - @for file in $(INFO_DEPS); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ - for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \ - if test -f $$d/$$ifile; then \ - echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \ - $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \ - else : ; fi; \ - done; \ - done - @$(POST_INSTALL) - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - for file in $(INFO_DEPS); do \ - echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\ - install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\ - done; \ - else : ; fi - -uninstall-info: - $(PRE_UNINSTALL) - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - ii=yes; \ - else ii=; fi; \ - for file in $(INFO_DEPS); do \ - test -z "$ii" \ - || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \ - done - @$(NORMAL_UNINSTALL) - for file in $(INFO_DEPS); do \ - (cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \ - done - -dist-info: $(INFO_DEPS) - for base in $(INFO_DEPS); do \ - if test -f $$base; then d=.; else d=$(srcdir); fi; \ - for file in `cd $$d && eval echo $$base*`; do \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file; \ - done; \ - done - -mostlyclean-aminfo: - -rm -f gprof.aux gprof.cp gprof.cps gprof.dvi gprof.fn gprof.fns \ - gprof.ky gprof.kys gprof.ps gprof.log gprof.pg gprof.toc \ - gprof.tp gprof.tps gprof.vr gprof.vrs gprof.op gprof.tr \ - gprof.cv gprof.cn - -clean-aminfo: - -distclean-aminfo: - -maintainer-clean-aminfo: - for i in $(INFO_DEPS); do \ - rm -f $$i; \ - if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \ - rm -f $$i-[0-9]*; \ - fi; \ - done -clean-info: mostlyclean-aminfo - -install-man1: - $(mkinstalldirs) $(DESTDIR)$(man1dir) - @list='$(man1_MANS)'; \ - l2='$(man_MANS)'; for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ - $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ - done - -uninstall-man1: - @list='$(man1_MANS)'; \ - l2='$(man_MANS)'; for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ - rm -f $(DESTDIR)$(man1dir)/$$inst; \ - done -install-man: $(MANS) - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-man1 -uninstall-man: - @$(NORMAL_UNINSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. - -@SET_MAKE@ - -all-recursive install-data-recursive install-exec-recursive \ -installdirs-recursive install-recursive uninstall-recursive install-info-recursive \ -check-recursive installcheck-recursive info-recursive dvi-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - target=`echo $@ | sed s/-recursive//`; \ - echo "Making $$target in $$subdir"; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ - rev="$$subdir $$rev"; \ - done; \ - for subdir in $$rev; do \ - target=`echo $@ | sed s/-recursive//`; \ - echo "Making $$target in $$subdir"; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $(SOURCES) $(HEADERS) $(LISP) - -TAGS: tags-recursive $(HEADERS) $(SOURCES) gconfig.in $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ - done; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)gconfig.in$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags gconfig.in $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - -rm -rf $(distdir) - GZIP=$(GZIP) $(TAR) zxf $(distdir).tar.gz - mkdir $(distdir)/=build - mkdir $(distdir)/=inst - dc_install_base=`cd $(distdir)/=inst && pwd`; \ - cd $(distdir)/=build \ - && ../configure --srcdir=.. --prefix=$$dc_install_base \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) dist - -rm -rf $(distdir) - @echo "========================"; \ - echo "$(distdir).tar.gz is ready for distribution"; \ - echo "========================" -dist: distdir - -chmod -R a+r $(distdir) - GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir) - -rm -rf $(distdir) -dist-all: distdir - -chmod -R a+r $(distdir) - GZIP=$(GZIP) $(TAR) chozf $(distdir).tar.gz $(distdir) - -rm -rf $(distdir) -distdir: $(DISTFILES) - -rm -rf $(distdir) - mkdir $(distdir) - -chmod 777 $(distdir) - @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file; \ - done - for subdir in $(SUBDIRS); do \ - test -d $(distdir)/$$subdir \ - || mkdir $(distdir)/$$subdir \ - || exit 1; \ - chmod 777 $(distdir)/$$subdir; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ - || exit 1; \ - done - $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info -info: $(INFO_DEPS) info-recursive -dvi: $(DVIS) dvi-recursive -check: - $(MAKE) $(AM_MAKEFLAGS) check-recursive -installcheck: installcheck-recursive -install-info: install-info-am install-info-recursive -all-recursive-am: gconfig.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -all-am: Makefile $(PROGRAMS) $(MANS) $(HEADERS) gconfig.h - -install-exec-am: install-binPROGRAMS - -install-data-am: install-man - -uninstall-am: uninstall-binPROGRAMS uninstall-man - -install-exec: install-exec-recursive install-exec-am - @$(NORMAL_INSTALL) - -install-data: install-data-recursive install-data-am - @$(NORMAL_INSTALL) - -install: install-recursive install-exec-am install-data-am - @: - -uninstall: uninstall-recursive uninstall-am - -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' INSTALL_SCRIPT='$(INSTALL_PROGRAM)' install -installdirs: installdirs-recursive - $(mkinstalldirs) $(DATADIR)$(bindir) $(DESTDIR)$(mandir)/man1 - - -mostlyclean-generic: - -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) - -clean-generic: - -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) - -distclean-generic: - -rm -f Makefile $(DISTCLEANFILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) - -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -mostlyclean-am: mostlyclean-hdr mostlyclean-binPROGRAMS \ - mostlyclean-compile mostlyclean-libtool \ - mostlyclean-aminfo mostlyclean-tags mostlyclean-generic - -clean-am: clean-hdr clean-binPROGRAMS clean-compile clean-libtool \ - clean-aminfo clean-tags clean-generic mostlyclean-am - -distclean-am: distclean-hdr distclean-binPROGRAMS distclean-compile \ - distclean-libtool distclean-aminfo distclean-tags \ - distclean-generic clean-am - -maintainer-clean-am: maintainer-clean-hdr maintainer-clean-binPROGRAMS \ - maintainer-clean-compile maintainer-clean-libtool \ - maintainer-clean-aminfo maintainer-clean-tags \ - maintainer-clean-generic distclean-am - -mostlyclean: mostlyclean-recursive mostlyclean-am - -clean: clean-recursive clean-am - -distclean: distclean-recursive distclean-am - -rm -f config.status - -rm -f libtool - -maintainer-clean: maintainer-clean-recursive maintainer-clean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -rm -f config.status - -.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ -mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ -maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile mostlyclean-libtool distclean-libtool \ -clean-libtool maintainer-clean-libtool install-info-am uninstall-info \ -mostlyclean-aminfo distclean-aminfo clean-aminfo \ -maintainer-clean-aminfo install-man1 uninstall-man1 install-man \ -uninstall-man install-data-recursive uninstall-data-recursive \ -install-exec-recursive uninstall-exec-recursive installdirs-recursive \ -uninstalldirs-recursive all-recursive check-recursive \ -installcheck-recursive info-recursive dvi-recursive \ -mostlyclean-recursive distclean-recursive clean-recursive \ -maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ -distclean-tags clean-tags maintainer-clean-tags distdir info dvi \ -installcheck install-info all-recursive-am all-am install-exec-am \ -install-data-am uninstall-am install-exec install-data install \ -uninstall all installdirs mostlyclean-generic distclean-generic \ -clean-generic maintainer-clean-generic clean mostlyclean distclean \ -maintainer-clean - - -diststuff: $(BUILT_SOURCES) info - -.m.c: - awk -f $(srcdir)/gen-c-prog.awk > ./$*.c \ - FUNCTION=`(echo $*|sed -e 's,.*/,,g' -e 's/_bl//')`_blurb \ - FILE=$*.m $(srcdir)/$*.m -po/POTFILES.in: @MAINT@ Makefile - for file in $(POTFILES); do echo $$file; done | sort > tmp \ - && mv tmp $(srcdir)/po/POTFILES.in - -# Dependencies. -$(OBJECTS): ../bfd/bfd.h call_graph.h cg_arcs.h cg_print.h \ - corefile.h gmon_io.h gmon_out.h gprof.h hertz.h hist.h \ - search_list.h source.h sym_ids.h symtab.h utils.h \ - $(srcdir)/../include/libiberty.h $(srcdir)/../bfd/sysdep.h \ - gconfig.h ../bfd/config.h -basic_blocks.o: basic_blocks.c -bsd_call_bl.o: bsd_call_bl.c -call_graph.o: call_graph.c -cg_arcs.o: cg_arcs.c -cg_dfn.o: cg_dfn.c -cg_print.o: cg_print.c -corefile.o: corefile.c -flat_bl.o: flat_bl.c -fsf_callg_bl.o: fsf_callg_bl.c -gmon_io.o: gmon_io.c -gprof.o: gprof.c -hertz.o: hertz.c -hist.o: hist.c -search_list.o: search_list.c -source.o: source.c -symtab.o: symtab.c -sym_ids.o: sym_ids.c -utils.o: utils.c -i386.o: i386.c -alpha.o: alpha.c -vax.o: vax.c -tahoe.o: tahoe.c -sparc.o: sparc.c - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/gprof/NOTES b/gprof/NOTES deleted file mode 100644 index 511af30..0000000 --- a/gprof/NOTES +++ /dev/null @@ -1,438 +0,0 @@ -Sun Feb 5 16:09:16 1995 - -This file documents the changes and new features available with this -version of GNU gprof. - -* New Features - - o Long options - - o Supports generalized file format, without breaking backward compatibility: - new file format supports basic-block execution counts and non-realtime - histograms (see below) - - o Supports profiling at the line level: flat profiles, call-graph profiles, - and execution-counts can all be displayed at a level that identifies - individual lines rather than just functions - - o Test-coverage support (similar to Sun tcov program): source files - can be annotated with the number of times a function was invoked - or with the number of times each basic-block in a function was - executed - - o Generalized histograms: not just execution-time, but arbitrary - histograms are support (for example, performance counter based - profiles) - - o Powerful mechanism to select data to be included/excluded from - analysis and/or output - - o Support for DEC OSF/1 v3.0 - - o Full cross-platform profiling support: gprof uses BFD to support - arbitrary, non-native object file formats and non-native byte-orders - (this feature has not been tested yet) - - o In the call-graph function index, static function names are now - printed together with the filename in which the function was defined - (required bfd_find_nearest_line() support and symbolic debugging - information to be present in the executable file) - - o Major overhaul of source code (compiles cleanly with -Wall, etc.) - -* Supported Platforms - -The current version is known to work on: - - o DEC OSF/1 v3.0 - All features supported. - - o SunOS 4.1.x - All features supported. - - o Solaris 2.3 - Line-level profiling unsupported because bfd_find_nearest_line() - is not fully implemented for Elf binaries. - - o HP-UX 9.01 - Line-level profiling unsupported because bfd_find_nearest_line() - is not fully implemented for SOM binaries. - -* Detailed Description - -** User Interface Changes - -The command-line interface is backwards compatible with earlier -versions of GNU gprof and Berkeley gprof. The only exception is -the option to delete arcs from the call graph. The old syntax -was: - - -k fromname toname - -while the new syntax is: - - -k fromname/toname - -This change was necessary to be compatible with long-option parsing. -Also, "fromname" and "toname" can now be arbitrary symspecs rather -than just function names (see below for an explanation of symspecs). -For example, option "-k gprof.c/" suppresses all arcs due to calls out -of file "gprof.c". - -*** Sym Specs - -It is often necessary to apply gprof only to specific parts of a -program. GNU gprof has a simple but powerful mechanism to achieve -this. So called {\em symspecs\/} provide the foundation for this -mechanism. A symspec selects the parts of a profiled program to which -an operation should be applied to. The syntax of a symspec is -simple: - - filename_containing_a_dot - | funcname_not_containing_a_dot - | linenumber - | ( [ any_filename ] `:' ( any_funcname | linenumber ) ) - -Here are some examples: - - main.c Selects everything in file "main.c"---the - dot in the string tells gprof to interpret - the string as a filename, rather than as - a function name. To select a file whose - name does contain a dot, a trailing colon - should be specified. For example, "odd:" is - interpreted as the file named "odd". - - main Selects all functions named "main". Notice - that there may be multiple instances of the - same function name because some of the - definitions may be local (i.e., static). - Unless a function name is unique in a program, - you must use the colon notation explained - below to specify a function from a specific - source file. Sometimes, functionnames contain - dots. In such cases, it is necessar to - add a leading colon to the name. For example, - ":.mul" selects function ".mul". - - main.c:main Selects function "main" in file "main.c". - - main.c:134 Selects line 134 in file "main.c". - -IMPLEMENTATION NOTE: The source code uses the type sym_id for symspecs. -At some point, this probably ought to be changed to "sym_spec" to make -reading the code easier. - -*** Long options - -GNU gprof now supports long options. The following is a list of all -supported options. Options that are listed without description -operate in the same manner as the corresponding option in older -versions of gprof. - -Short Form: Long Form: ------------ ---------- --l --line - Request profiling at the line-level rather - than just at the function level. Source - lines are identified by symbols of the form: - - func (file:line) - - where "func" is the function name, "file" is the - file name and "line" is the line-number that - corresponds to the line. - - To work properly, the binary must contain symbolic - debugging information. This means that the source - have to be translated with option "-g" specified. - Functions for which there is no symbolic debugging - information available are treated as if "--line" - had not been specified. However, the line number - printed with such symbols is usually incorrect - and should be ignored. - --a --no-static --A[symspec] --annotated-source[=symspec] - Request output in the form of annotated source - files. If "symspec" is specified, print output only - for symbols selected by "symspec". If the option - is specified multiple times, annotated output is - generated for the union of all symspecs. - - Examples: - - -A Prints annotated source for all - source files. - -Agprof.c Prints annotated source for file - gprof.c. - -Afoobar Prints annotated source for files - containing a function named "foobar". - The entire file will be printed, but - only the function itself will be - annotated with profile data. - --J[symspec] --no-annotated-source[=symspec] - Suppress annotated source output. If specified - without argument, annotated output is suppressed - completely. With an argument, annotated output - is suppressed only for the symbols selected by - "symspec". If the option is specified multiple - times, annotated output is suppressed for the - union of all symspecs. This option has lower - precedence than --annotated-source - --p[symspec] --flat-profile[=symspec] - Request output in the form of a flat profile - (unless any other output-style option is specified, - this option is turned on by default). If - "symspec" is specified, include only symbols - selected by "symspec" in flat profile. If the - option is specified multiple times, the flat - profile includes symbols selected by the union - of all symspecs. - --P[symspec] --no-flat-profile[=symspec] - Suppress output in the flat profile. If given - without an argument, the flat profile is suppressed - completely. If "symspec" is specified, suppress - the selected symbols in the flat profile. If the - option is specified multiple times, the union of - the selected symbols is suppressed. This option - has lower precedence than --flat-profile. - --q[symspec] --graph[=symspec] - Request output in the form of a call-graph - (unless any other output-style option is specified, - this option is turned on by default). If "symspec" - is specified, include only symbols selected by - "symspec" in the call-graph. If the option is - specified multiple times, the call-graph includes - symbols selected by the union of all symspecs. - --Q[symspec] --no-graph[=symspec] - Suppress output in the call-graph. If given without - an argument, the call-graph is suppressed completely. - With a "symspec", suppress the selected symbols - from the call-graph. If the option is specified - multiple times, the union of the selected symbols - is suppressed. This option has lower precedence - than --graph. - --C[symspec] --exec-counts[=symspec] - Request output in the form of execution counts. - If "symspec" is present, include only symbols - selected by "symspec" in the execution count - listing. If the option is specified multiple - times, the execution count listing includes - symbols selected by the union of all symspecs. - --Z[symspec] --no-exec-counts[=symspec] - Suppress output in the execution count listing. - If given without an argument, the listing is - suppressed completely. With a "symspec", suppress - the selected symbols from the call-graph. If the - option is specified multiple times, the union of - the selected symbols is suppressed. This option - has lower precedence than --exec-counts. - --i --file-info - Print information about the profile files that - are read. The information consists of the - number and types of records present in the - profile file. Currently, a profile file can - contain any number and any combination of histogram, - call-graph, or basic-block count records. - --s --sum - --x --all-lines - This option affects annotated source output only. - By default, only the lines at the beginning of - a basic-block are annotated. If this option is - specified, every line in a basic-block is annotated - by repeating the annotation for the first line. - This option is identical to tcov's "-a". - --I dirs --directory-path=dirs - This option affects annotated source output only. - Specifies the list of directories to be searched - for source files. The argument "dirs" is a colon - separated list of directories. By default, gprof - searches for source files relative to the current - working directory only. - --z --display-unused-functions - --m num --min-count=num - This option affects annotated source and execution - count output only. Symbols that are executed - less than "num" times are suppressed. For annotated - source output, suppressed symbols are marked - by five hash-marks (#####). In an execution count - output, suppressed symbols do not appear at all. - --L --print-path - Normally, source filenames are printed with the path - component suppressed. With this option, gprof - can be forced to print the full pathname of - source filenames. The full pathname is determined - from symbolic debugging information in the image file - and is relative to the directory in which the compiler - was invoked. - --y --separate-files - This option affects annotated source output only. - Normally, gprof prints annotated source files - to standard-output. If this option is specified, - annotated source for a file named "path/filename" - is generated in the file "filename-ann". That is, - annotated output is {\em always\/} generated in - gprof's current working directory. Care has to - be taken if a program consists of files that have - identical filenames, but distinct paths. - --c --static-call-graph - --t num --table-length=num - This option affects annotated source output only. - After annotating a source file, gprof generates - an execution count summary consisting of a table - of lines with the top execution counts. By - default, this table is ten entries long. - This option can be used to change the table length - or, by specifying an argument value of 0, it can be - suppressed completely. - --n symspec --time=symspec - Only symbols selected by "symspec" are considered - in total and percentage time computations. - However, this option does not affect percentage time - computation for the flat profile. - If the option is specified multiple times, the union - of all selected symbols is used in time computations. - --N --no-time=symspec - Exclude the symbols selected by "symspec" from - total and percentage time computations. - However, this option does not affect percentage time - computation for the flat profile. - This option is ignored if any --time options are - specified. - --w num --width=num - Sets the output line width. Currently, this option - affects the printing of the call-graph function index - only. - --e <no long form---for backwards compatibility only> --E <no long form---for backwards compatibility only> --f <no long form---for backwards compatibility only> --F <no long form---for backwards compatibility only> --k <no long form---for backwards compatibility only> --b --brief --dnum --debug[=num] - --h --help - Prints a usage message. - --O name --file-format=name - Selects the format of the profile data files. - Recognized formats are "auto", "bsd", "magic", - and "prof". The last one is not yet supported. - Format "auto" attempts to detect the file format - automatically (this is the default behavior). - It attempts to read the profile data files as - "magic" files and if this fails, falls back to - the "bsd" format. "bsd" forces gprof to read - the data files in the BSD format. "magic" forces - gprof to read the data files in the "magic" format. - --T --traditional --v --version - -** File Format Changes - -The old BSD-derived format used for profile data does not contain a -magic cookie that allows to check whether a data file really is a -gprof file. Furthermore, it does not provide a version number, thus -rendering changes to the file format almost impossible. GNU gprof -uses a new file format that provides these features. For backward -compatibility, GNU gprof continues to support the old BSD-derived -format, but not all features are supported with it. For example, -basic-block execution counts cannot be accommodated by the old file -format. - -The new file format is defined in header file \file{gmon_out.h}. It -consists of a header containing the magic cookie and a version number, -as well as some spare bytes available for future extensions. All data -in a profile data file is in the native format of the host on which -the profile was collected. GNU gprof adapts automatically to the -byte-order in use. - -In the new file format, the header is followed by a sequence of -records. Currently, there are three different record types: histogram -records, call-graph arc records, and basic-block execution count -records. Each file can contain any number of each record type. When -reading a file, GNU gprof will ensure records of the same type are -compatible with each other and compute the union of all records. For -example, for basic-block execution counts, the union is simply the sum -of all execution counts for each basic-block. - -*** Histogram Records - -Histogram records consist of a header that is followed by an array of -bins. The header contains the text-segment range that the histogram -spans, the size of the histogram in bytes (unlike in the old BSD -format, this does not include the size of the header), the rate of the -profiling clock, and the physical dimension that the bin counts -represent after being scaled by the profiling clock rate. The -physical dimension is specified in two parts: a long name of up to 15 -characters and a single character abbreviation. For example, a -histogram representing real-time would specify the long name as -"seconds" and the abbreviation as "s". This feature is useful for -architectures that support performance monitor hardware (which, -fortunately, is becoming increasingly common). For example, under DEC -OSF/1, the "uprofile" command can be used to produce a histogram of, -say, instruction cache misses. In this case, the dimension in the -histogram header could be set to "i-cache misses" and the abbreviation -could be set to "1" (because it is simply a count, not a physical -dimension). Also, the profiling rate would have to be set to 1 in -this case. - -Histogram bins are 16-bit numbers and each bin represent an equal -amount of text-space. For example, if the text-segment is one -thousand bytes long and if there are ten bins in the histogram, each -bin represents one hundred bytes. - - -*** Call-Graph Records - -Call-graph records have a format that is identical to the one used in -the BSD-derived file format. It consists of an arc in the call graph -and a count indicating the number of times the arc was traversed -during program execution. Arcs are specified by a pair of addresses: -the first must be within caller's function and the second must be -within the callee's function. When performing profiling at the -function level, these addresses can point anywhere within the -respective function. However, when profiling at the line-level, it is -better if the addresses are as close to the call-site/entry-point as -possible. This will ensure that the line-level call-graph is able to -identify exactly which line of source code performed calls to a -function. - -*** Basic-Block Execution Count Records - -Basic-block execution count records consist of a header followed by a -sequence of address/count pairs. The header simply specifies the -length of the sequence. In an address/count pair, the address -identifies a basic-block and the count specifies the number of times -that basic-block was executed. Any address within the basic-address can -be used. - -IMPLEMENTATION NOTE: gcc -a can be used to instrument a program to -record basic-block execution counts. However, the __bb_exit_func() -that is currently present in libgcc2.c does not generate a gmon.out -file in a suiteable format. This should be fixed for future releases -of gcc. In the meantime, contact davidm@cs.arizona.edu for a version -of __bb_exit_func() to is appropriate. diff --git a/gprof/TEST b/gprof/TEST deleted file mode 100644 index 78a9030..0000000 --- a/gprof/TEST +++ /dev/null @@ -1,7 +0,0 @@ -- check whether old file format is properly read when input comes from - stdin - -- check whether underscores are properly dealt with (both, on systems - that prepend them to each C name and on systems that don't) - -- ensure gprof fails gracefully when no debugging info available diff --git a/gprof/TODO b/gprof/TODO deleted file mode 100644 index 20111c6..0000000 --- a/gprof/TODO +++ /dev/null @@ -1,72 +0,0 @@ - -- gmon_io.c cannot deal with target architecture that have a pointer size - that is different from the host architectures pointer size---fix this - (gmon_out.h, and gmon_io.c) -- add support for prof file format so that prof files can be displayed - at the line-level (this is useful for the uprofile tool under DEC's - OSF/1) -- take a hard look at --file-ordering (broken) and --function-ordering - -+ documentation -+ optimize bfd_find_nearest_line_num() (or replace by different interface) -+ cleanup _bfd_ecoff_find_nearest_line_num() fixes & description -+ ensure "cc -pg" produces good files under OSF/1 v3.0 -+ make sure gprof works together with OSF/1 v3.0's profiling libraries -+ implement symtab_parse(); modify sym_lookup() to consider addr_high -+ change gprof.c to collect lists, then invoke symtab_parse() for - each list -+ Questions: - o is -c (--static-call-graph) useful at all? i can't see - how; if it were deleted, gprof would be completely machine - independent => yup, it is - o are (long) option names appropriate? - o -k (--exclude-arc) cannot be implemented with getopt(); - is new syntax (-k from/to) acceptable? If not, how to - fix it? - o in the FSF output, the call-graph index now prints - the filename of static functions in parentheses; e.g., - static function foo() that is defined in file bar.c - would be printed as: - - [4] foo (bar.c) - - is this acceptable? should it be done only optionally? - o symbols with addresses that map back to a different - name are suppressed (happens with labels, for example); - is this acceptable? should it be done only optionally? -+ generalize to allow arbitrary histograms (not just time histograms) -+ basic-block information currently replaces all symbols created from - the core because of an ugly ordering conflict---for now, the current - solution works, but something cleaner is desirable ==> cleaned up, - but it's slower now -+ convert to very new file format (back to trivial format, that is :) -+ replace "dummy.h" for Alpha (if there is any use to it) -+ add support for execution time profiling at a basic-block level -+ fix filename-off-by-one bug for Alpha (see ~/tmp/d.[ch])---no longer - relevant -+ "-pg -a" doesn't work as expected because mcleanup() will overwrite - the file generated by __bb_exit_func() (or vice versa) -+ first basic-block of fac() seems to get credited to last basic-block - of previous function => bug in basic_blocks.c -+ flat profile should provide automatic scaling for per-call times because - otherwise they'll always be zero on a fast machine with tons of small - functions -+ make "-a" imply to retain line number info (without actually generating - the debugging information (unless -g is specified)---no, this is a - bad idea, because it is not clear what level of debugging info should - be requested (e.g., -g vs. -g3); leaving it up to the user seems best -+ add long options support (or at least use getopt instead of ad-hoc - implementation) -+ split into files according to abstract objects that are manipulated -+ replace sccsid by rcsid & add "end of ..." to every .c file -+ use DBG() everywhere -+ fix spacing (" ," -> "," etc.) -+ use DEFUNs everywhere -+ make compile cleanly with -Wall -+ "gcc -pg -O2" doesn't work on tecc.c unless -fno-omit-frame-pointer is - specified; find out why -+ make things portable (prototypes, const, etc.) -+ if NEW_GMON_OUT is not defined, have a flag that will allow to - read new gmon.out style files. The idea being that everyone - will use the new format for basic-block style profiling but - the old format for regular gpprofiling diff --git a/gprof/acconfig.h b/gprof/acconfig.h deleted file mode 100644 index fa938fa5..0000000 --- a/gprof/acconfig.h +++ /dev/null @@ -1,24 +0,0 @@ - -/* Name of package. */ -#undef PACKAGE - -/* Version of package. */ -#undef VERSION - -/* Whether this system uses the BSD 4.4 gmon.out format. */ -#undef BSD44_FORMAT - -/* Define to 1 if NLS is requested. */ -#undef ENABLE_NLS - -/* Define as 1 if you have catgets and don't want to use GNU gettext. */ -#undef HAVE_CATGETS - -/* Define as 1 if you have gettext and don't want to use GNU gettext. */ -#undef HAVE_GETTEXT - -/* Define as 1 if you have the stpcpy function. */ -#undef HAVE_STPCPY - -/* Define if your locale.h file contains LC_MESSAGES. */ -#undef HAVE_LC_MESSAGES diff --git a/gprof/aclocal.m4 b/gprof/aclocal.m4 deleted file mode 100644 index 8878e11..0000000 --- a/gprof/aclocal.m4 +++ /dev/null @@ -1,817 +0,0 @@ -dnl aclocal.m4 generated automatically by aclocal 1.3 - -dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc. -dnl This Makefile.in is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without -dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. - -# Do all the work for Automake. This macro actually does too much -- -# some checks are only needed if your package does certain things. -# But this isn't really a big deal. - -# serial 1 - -dnl Usage: -dnl AM_INIT_AUTOMAKE(package,version, [no-define]) - -AC_DEFUN(AM_INIT_AUTOMAKE, -[AC_REQUIRE([AM_PROG_INSTALL]) -PACKAGE=[$1] -AC_SUBST(PACKAGE) -VERSION=[$2] -AC_SUBST(VERSION) -dnl test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi -ifelse([$3],, -AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE") -AC_DEFINE_UNQUOTED(VERSION, "$VERSION")) -AC_REQUIRE([AM_SANITY_CHECK]) -AC_REQUIRE([AC_ARG_PROGRAM]) -dnl FIXME This is truly gross. -missing_dir=`cd $ac_aux_dir && pwd` -AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) -AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) -AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) -AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) -AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) -AC_REQUIRE([AC_PROG_MAKE_SET])]) - - -# serial 1 - -AC_DEFUN(AM_PROG_INSTALL, -[AC_REQUIRE([AC_PROG_INSTALL]) -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' -AC_SUBST(INSTALL_SCRIPT)dnl -]) - -# -# Check to make sure that the build environment is sane. -# - -AC_DEFUN(AM_SANITY_CHECK, -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "[$]*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "[$]*" != "X $srcdir/configure conftestfile" \ - && test "[$]*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "[$]2" = conftestfile - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -rm -f conftest* -AC_MSG_RESULT(yes)]) - -dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) -dnl The program must properly implement --version. -AC_DEFUN(AM_MISSING_PROG, -[AC_MSG_CHECKING(for working $2) -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if ($2 --version) < /dev/null > /dev/null 2>&1; then - $1=$2 - AC_MSG_RESULT(found) -else - $1="$3/missing $2" - AC_MSG_RESULT(missing) -fi -AC_SUBST($1)]) - - -# serial 25 AM_PROG_LIBTOOL -AC_DEFUN(AM_PROG_LIBTOOL, -[AC_REQUIRE([AM_ENABLE_SHARED])dnl -AC_REQUIRE([AM_ENABLE_STATIC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([AC_PROG_RANLIB])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AM_PROG_LD])dnl -AC_REQUIRE([AM_PROG_NM])dnl -AC_REQUIRE([AC_PROG_LN_S])dnl -dnl -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -AC_SUBST(LIBTOOL)dnl - -# Check for any special flags to pass to ltconfig. -libtool_flags= -test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" -test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" -test "$silent" = yes && libtool_flags="$libtool_flags --silent" -test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" -test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case "$host" in -*-*-irix6*) - # Find out which ABI we are using. - echo '[#]line __oline__ "configure"' > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile); then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - CFLAGS="$CFLAGS -belf" - ;; - -*-*-cygwin32*) - AM_SYS_LIBTOOL_CYGWIN32 - ;; - -esac - -# Actually configure libtool. ac_aux_dir is where install-sh is found. -CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ -LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \ -DLLTOOL="$DLLTOOL" AS="$AS" \ -${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ -$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \ -|| AC_MSG_ERROR([libtool configure failed]) - -# Redirect the config.log output again, so that the ltconfig log is not -# clobbered by the next message. -exec 5>>./config.log -]) - -# AM_ENABLE_SHARED - implement the --enable-shared flag -# Usage: AM_ENABLE_SHARED[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AM_ENABLE_SHARED, -[define([AM_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(shared, -changequote(<<, >>)dnl -<< --enable-shared[=PKGS] build shared libraries [default=>>AM_ENABLE_SHARED_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_shared=AM_ENABLE_SHARED_DEFAULT)dnl -]) - -# AM_DISABLE_SHARED - set the default shared flag to --disable-shared -AC_DEFUN(AM_DISABLE_SHARED, -[AM_ENABLE_SHARED(no)]) - -# AM_DISABLE_STATIC - set the default static flag to --disable-static -AC_DEFUN(AM_DISABLE_STATIC, -[AM_ENABLE_STATIC(no)]) - -# AM_ENABLE_STATIC - implement the --enable-static flag -# Usage: AM_ENABLE_STATIC[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. -AC_DEFUN(AM_ENABLE_STATIC, -[define([AM_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl -AC_ARG_ENABLE(static, -changequote(<<, >>)dnl -<< --enable-static[=PKGS] build static libraries [default=>>AM_ENABLE_STATIC_DEFAULT], -changequote([, ])dnl -[p=${PACKAGE-default} -case "$enableval" in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac], -enable_static=AM_ENABLE_STATIC_DEFAULT)dnl -]) - - -# AM_PROG_LD - find the path to the GNU or non-GNU linker -AC_DEFUN(AM_PROG_LD, -[AC_ARG_WITH(gnu-ld, -[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], -test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) -AC_REQUIRE([AC_PROG_CC]) -ac_prog=ld -if test "$ac_cv_prog_gcc" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - AC_MSG_CHECKING([for ld used by GCC]) - ac_prog=`($CC -print-prog-name=ld) 2>&5` - case "$ac_prog" in - # Accept absolute paths. -changequote(,)dnl - /* | [A-Za-z]:\\*) -changequote([,])dnl - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - AC_MSG_CHECKING([for GNU ld]) -else - AC_MSG_CHECKING([for non-GNU ld]) -fi -AC_CACHE_VAL(ac_cv_path_LD, -[if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog"; then - ac_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - ac_cv_path_LD="$LD" # Let the user override the test with a path. -fi]) -LD="$ac_cv_path_LD" -if test -n "$LD"; then - AC_MSG_RESULT($LD) -else - AC_MSG_RESULT(no) -fi -test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -AC_SUBST(LD) -AM_PROG_LD_GNU -]) - -AC_DEFUN(AM_PROG_LD_GNU, -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld, -[# I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi]) -]) - -# AM_PROG_NM - find the path to a BSD-compatible name lister -AC_DEFUN(AM_PROG_NM, -[AC_MSG_CHECKING([for BSD-compatible nm]) -AC_CACHE_VAL(ac_cv_path_NM, -[if test -n "$NM"; then - # Let the user override the test. - ac_cv_path_NM="$NM" -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -B" - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -p" - else - ac_cv_path_NM="$ac_dir/nm" - fi - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm -fi]) -NM="$ac_cv_path_NM" -AC_MSG_RESULT([$NM]) -AC_SUBST(NM) -]) - -# AM_SYS_LIBTOOL_CYGWIN32 - find tools needed on cygwin32 -AC_DEFUN(AM_SYS_LIBTOOL_CYGWIN32, -[AC_CHECK_TOOL(DLLTOOL, dlltool, false) -AC_CHECK_TOOL(AS, as, false) -]) - -# Like AC_CONFIG_HEADER, but automatically create stamp file. - -AC_DEFUN(AM_CONFIG_HEADER, -[AC_PREREQ([2.12]) -AC_CONFIG_HEADER([$1]) -dnl When config.status generates a header, we must update the stamp-h file. -dnl This file resides in the same directory as the config header -dnl that is generated. We must strip everything past the first ":", -dnl and everything past the last "/". -AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl -ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, -<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, -<<am_indx=1 -for am_file in <<$1>>; do - case " <<$>>CONFIG_HEADERS " in - *" <<$>>am_file "*<<)>> - echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx - ;; - esac - am_indx=`expr "<<$>>am_indx" + 1` -done<<>>dnl>>) -changequote([,]))]) - -# This file is derived from `gettext.m4'. The difference is that the -# included macros assume Cygnus-style source and build trees. - -# Macro to add for using GNU gettext. -# Ulrich Drepper <drepper@cygnus.com>, 1995. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 3 - -AC_DEFUN(CY_WITH_NLS, - [AC_MSG_CHECKING([whether NLS is requested]) - dnl Default is enabled NLS - AC_ARG_ENABLE(nls, - [ --disable-nls do not use Native Language Support], - USE_NLS=$enableval, USE_NLS=yes) - AC_MSG_RESULT($USE_NLS) - AC_SUBST(USE_NLS) - - USE_INCLUDED_LIBINTL=no - - dnl If we use NLS figure out what method - if test "$USE_NLS" = "yes"; then - AC_DEFINE(ENABLE_NLS) - AC_MSG_CHECKING([whether included gettext is requested]) - AC_ARG_WITH(included-gettext, - [ --with-included-gettext use the GNU gettext library included here], - nls_cv_force_use_gnu_gettext=$withval, - nls_cv_force_use_gnu_gettext=no) - AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) - - nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" - if test "$nls_cv_force_use_gnu_gettext" != "yes"; then - dnl User does not insist on using GNU NLS library. Figure out what - dnl to use. If gettext or catgets are available (in this order) we - dnl use this. Else we have to fall back to GNU NLS library. - dnl catgets is only used if permitted by option --with-catgets. - nls_cv_header_intl= - nls_cv_header_libgt= - CATOBJEXT=NONE - - AC_CHECK_HEADER(libintl.h, - [AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc, - [AC_TRY_LINK([#include <libintl.h>], [return (int) gettext ("")], - gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)]) - - if test "$gt_cv_func_gettext_libc" != "yes"; then - AC_CHECK_LIB(intl, bindtextdomain, - [AC_CACHE_CHECK([for gettext in libintl], - gt_cv_func_gettext_libintl, - [AC_TRY_LINK([], [return (int) gettext ("")], - gt_cv_func_gettext_libintl=yes, - gt_cv_func_gettext_libintl=no)])]) - fi - - if test "$gt_cv_func_gettext_libc" = "yes" \ - || test "$gt_cv_func_gettext_libintl" = "yes"; then - AC_DEFINE(HAVE_GETTEXT) - AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl - if test "$MSGFMT" != "no"; then - AC_CHECK_FUNCS(dcgettext) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; - return _nl_msg_cat_cntr], - [CATOBJEXT=.gmo - DATADIRNAME=share], - [CATOBJEXT=.mo - DATADIRNAME=lib]) - INSTOBJEXT=.mo - fi - fi - ]) - - dnl In the standard gettext, we would now check for catgets. - dnl However, we never want to use catgets for our releases. - - if test "$CATOBJEXT" = "NONE"; then - dnl Neither gettext nor catgets in included in the C library. - dnl Fall back on GNU gettext library. - nls_cv_use_gnu_gettext=yes - fi - fi - - if test "$nls_cv_use_gnu_gettext" = "yes"; then - dnl Mark actions used to generate GNU NLS library. - INTLOBJS="\$(GETTOBJS)" - AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt) - AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) - AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, - [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) - AC_SUBST(MSGFMT) - USE_INCLUDED_LIBINTL=yes - CATOBJEXT=.gmo - INSTOBJEXT=.mo - DATADIRNAME=share - INTLDEPS='$(top_builddir)/../intl/libintl.a' - INTLLIBS=$INTLDEPS - LIBS=`echo $LIBS | sed -e 's/-lintl//'` - nls_cv_header_intl=libintl.h - nls_cv_header_libgt=libgettext.h - fi - - dnl Test whether we really found GNU xgettext. - if test "$XGETTEXT" != ":"; then - dnl If it is no GNU xgettext we define it as : so that the - dnl Makefiles still can work. - if $XGETTEXT --omit-header /dev/null 2> /dev/null; then - : ; - else - AC_MSG_RESULT( - [found xgettext programs is not GNU xgettext; ignore it]) - XGETTEXT=":" - fi - fi - - # We need to process the po/ directory. - POSUB=po - else - DATADIRNAME=share - nls_cv_header_intl=libintl.h - nls_cv_header_libgt=libgettext.h - fi - - # If this is used in GNU gettext we have to set USE_NLS to `yes' - # because some of the sources are only built for this goal. - if test "$PACKAGE" = gettext; then - USE_NLS=yes - USE_INCLUDED_LIBINTL=yes - fi - - dnl These rules are solely for the distribution goal. While doing this - dnl we only have to keep exactly one list of the available catalogs - dnl in configure.in. - for lang in $ALL_LINGUAS; do - GMOFILES="$GMOFILES $lang.gmo" - POFILES="$POFILES $lang.po" - done - - dnl Make all variables we use known to autoconf. - AC_SUBST(USE_INCLUDED_LIBINTL) - AC_SUBST(CATALOGS) - AC_SUBST(CATOBJEXT) - AC_SUBST(DATADIRNAME) - AC_SUBST(GMOFILES) - AC_SUBST(INSTOBJEXT) - AC_SUBST(INTLDEPS) - AC_SUBST(INTLLIBS) - AC_SUBST(INTLOBJS) - AC_SUBST(POFILES) - AC_SUBST(POSUB) - ]) - -AC_DEFUN(CY_GNU_GETTEXT, - [AC_REQUIRE([AC_PROG_MAKE_SET])dnl - AC_REQUIRE([AC_PROG_CC])dnl - AC_REQUIRE([AC_PROG_RANLIB])dnl - AC_REQUIRE([AC_ISC_POSIX])dnl - AC_REQUIRE([AC_HEADER_STDC])dnl - AC_REQUIRE([AC_C_CONST])dnl - AC_REQUIRE([AC_C_INLINE])dnl - AC_REQUIRE([AC_TYPE_OFF_T])dnl - AC_REQUIRE([AC_TYPE_SIZE_T])dnl - AC_REQUIRE([AC_FUNC_ALLOCA])dnl - AC_REQUIRE([AC_FUNC_MMAP])dnl - - AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \ -unistd.h values.h sys/param.h]) - AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \ -__argz_count __argz_stringify __argz_next]) - - if test "${ac_cv_func_stpcpy+set}" != "set"; then - AC_CHECK_FUNCS(stpcpy) - fi - if test "${ac_cv_func_stpcpy}" = "yes"; then - AC_DEFINE(HAVE_STPCPY) - fi - - AM_LC_MESSAGES - CY_WITH_NLS - - if test "x$CATOBJEXT" != "x"; then - if test "x$ALL_LINGUAS" = "x"; then - LINGUAS= - else - AC_MSG_CHECKING(for catalogs to be installed) - NEW_LINGUAS= - for lang in ${LINGUAS=$ALL_LINGUAS}; do - case "$ALL_LINGUAS" in - *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; - esac - done - LINGUAS=$NEW_LINGUAS - AC_MSG_RESULT($LINGUAS) - fi - - dnl Construct list of names of catalog files to be constructed. - if test -n "$LINGUAS"; then - for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done - fi - fi - - dnl The reference to <locale.h> in the installed <libintl.h> file - dnl must be resolved because we cannot expect the users of this - dnl to define HAVE_LOCALE_H. - if test $ac_cv_header_locale_h = yes; then - INCLUDE_LOCALE_H="#include <locale.h>" - else - INCLUDE_LOCALE_H="\ -/* The system does not provide the header <locale.h>. Take care yourself. */" - fi - AC_SUBST(INCLUDE_LOCALE_H) - - dnl Determine which catalog format we have (if any is needed) - dnl For now we know about two different formats: - dnl Linux libc-5 and the normal X/Open format - if test -f $srcdir/po2tbl.sed.in; then - if test "$CATOBJEXT" = ".cat"; then - AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen) - - dnl Transform the SED scripts while copying because some dumb SEDs - dnl cannot handle comments. - sed -e '/^#/d' $srcdir/$msgformat-msg.sed > po2msg.sed - fi - dnl po2tbl.sed is always needed. - sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ - $srcdir/po2tbl.sed.in > po2tbl.sed - fi - - dnl In the intl/Makefile.in we have a special dependency which makes - dnl only sense for gettext. We comment this out for non-gettext - dnl packages. - if test "$PACKAGE" = "gettext"; then - GT_NO="#NO#" - GT_YES= - else - GT_NO= - GT_YES="#YES#" - fi - AC_SUBST(GT_NO) - AC_SUBST(GT_YES) - - MKINSTALLDIRS="\$(srcdir)/../../mkinstalldirs" - AC_SUBST(MKINSTALLDIRS) - - dnl *** For now the libtool support in intl/Makefile is not for real. - l= - AC_SUBST(l) - - dnl Generate list of files to be processed by xgettext which will - dnl be included in po/Makefile. But only do this if the po directory - dnl exists in srcdir. - if test -d $srcdir/po; then - test -d po || mkdir po - if test "x$srcdir" != "x."; then - if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then - posrcprefix="$srcdir/" - else - posrcprefix="../$srcdir/" - fi - else - posrcprefix="../" - fi - rm -f po/POTFILES - sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ - < $srcdir/po/POTFILES.in > po/POTFILES - fi - ]) - -# Search path for a program which passes the given test. -# Ulrich Drepper <drepper@cygnus.com>, 1996. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 1 - -dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, -dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) -AC_DEFUN(AM_PATH_PROG_WITH_TEST, -[# Extract the first word of "$2", so it can be a program name with args. -set dummy $2; ac_word=[$]2 -AC_MSG_CHECKING([for $ac_word]) -AC_CACHE_VAL(ac_cv_path_$1, -[case "[$]$1" in - /*) - ac_cv_path_$1="[$]$1" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in ifelse([$5], , $PATH, [$5]); do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if [$3]; then - ac_cv_path_$1="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" -dnl If no 4th arg is given, leave the cache variable unset, -dnl so AC_PATH_PROGS will keep looking. -ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" -])dnl - ;; -esac])dnl -$1="$ac_cv_path_$1" -if test -n "[$]$1"; then - AC_MSG_RESULT([$]$1) -else - AC_MSG_RESULT(no) -fi -AC_SUBST($1)dnl -]) - -# Check whether LC_MESSAGES is available in <locale.h>. -# Ulrich Drepper <drepper@cygnus.com>, 1995. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 1 - -AC_DEFUN(AM_LC_MESSAGES, - [if test $ac_cv_header_locale_h = yes; then - AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, - [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES], - am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) - if test $am_cv_val_LC_MESSAGES = yes; then - AC_DEFINE(HAVE_LC_MESSAGES) - fi - fi]) - -# Add --enable-maintainer-mode option to configure. -# From Jim Meyering - -# serial 1 - -AC_DEFUN(AM_MAINTAINER_MODE, -[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) - dnl maintainer-mode is disabled by default - AC_ARG_ENABLE(maintainer-mode, -[ --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer], - USE_MAINTAINER_MODE=$enableval, - USE_MAINTAINER_MODE=no) - AC_MSG_RESULT($USE_MAINTAINER_MODE) - if test $USE_MAINTAINER_MODE = yes; then - MAINT= - else - MAINT='#M#' - fi - AC_SUBST(MAINT)dnl -] -) - -# Check to see if we're running under Cygwin32, without using -# AC_CANONICAL_*. If so, set output variable CYGWIN32 to "yes". -# Otherwise set it to "no". - -dnl AM_CYGWIN32() -AC_DEFUN(AM_CYGWIN32, -[AC_CACHE_CHECK(for Cygwin32 environment, am_cv_cygwin32, -[AC_TRY_COMPILE(,[return __CYGWIN32__;], -am_cv_cygwin32=yes, am_cv_cygwin32=no) -rm -f conftest*]) -CYGWIN32= -test "$am_cv_cygwin32" = yes && CYGWIN32=yes]) - -# Check to see if we're running under Win32, without using -# AC_CANONICAL_*. If so, set output variable EXEEXT to ".exe". -# Otherwise set it to "". - -dnl AM_EXEEXT() -dnl This knows we add .exe if we're building in the Cygwin32 -dnl environment. But if we're not, then it compiles a test program -dnl to see if there is a suffix for executables. -AC_DEFUN(AM_EXEEXT, -[AC_REQUIRE([AM_CYGWIN32]) -AC_REQUIRE([AM_MINGW32]) -AC_MSG_CHECKING([for executable suffix]) -AC_CACHE_VAL(am_cv_exeext, -[if test "$CYGWIN32" = yes || test "$MINGW32" = yes; then -am_cv_exeext=.exe -else -cat > am_c_test.c << 'EOF' -int main() { -/* Nothing needed here */ -} -EOF -${CC-cc} -o am_c_test $CFLAGS $CPPFLAGS $LDFLAGS am_c_test.c $LIBS 1>&5 -am_cv_exeext= -for file in am_c_test.*; do - case $file in - *.c) ;; - *.o) ;; - *) am_cv_exeext=`echo $file | sed -e s/am_c_test//` ;; - esac -done -rm -f am_c_test*]) -test x"${am_cv_exeext}" = x && am_cv_exeext=no -fi -EXEEXT="" -test x"${am_cv_exeext}" != xno && EXEEXT=${am_cv_exeext} -AC_MSG_RESULT(${am_cv_exeext}) -AC_SUBST(EXEEXT)]) - -# Check to see if we're running under Mingw, without using -# AC_CANONICAL_*. If so, set output variable MINGW32 to "yes". -# Otherwise set it to "no". - -dnl AM_MINGW32() -AC_DEFUN(AM_MINGW32, -[AC_CACHE_CHECK(for Mingw32 environment, am_cv_mingw32, -[AC_TRY_COMPILE(,[return __MINGW32__;], -am_cv_mingw32=yes, am_cv_mingw32=no) -rm -f conftest*]) -MINGW32= -test "$am_cv_mingw32" = yes && MINGW32=yes]) - diff --git a/gprof/alpha.c b/gprof/alpha.c deleted file mode 100644 index ad4f22e..0000000 --- a/gprof/alpha.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (c) 1983, 1998 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include "gprof.h" -#include "cg_arcs.h" -#include "corefile.h" -#include "hist.h" -#include "symtab.h" - -/* - * Opcodes of the call instructions: - */ -#define OP_Jxx 0x1a -#define OP_BSR 0x34 - -#define Jxx_FUNC_JMP 0 -#define Jxx_FUNC_JSR 1 -#define Jxx_FUNC_RET 2 -#define Jxx_FUNC_JSR_COROUTINE 3 - -typedef union - { - struct - { - unsigned other:26; - unsigned op_code:6; - } - a; /* any format */ - struct - { - int disp:21; - unsigned ra:5; - unsigned op_code:6; - } - b; /* branch format */ - struct - { - int hint:14; - unsigned func:2; - unsigned rb:5; - unsigned ra:5; - unsigned op_code:6; - } - j; /* jump format */ - } -alpha_Instruction; - -static Sym indirect_child; - - -/* - * On the Alpha we can only detect PC relative calls, which are - * usually generated for calls to functions within the same - * object file only. This is still better than nothing, however. - * (In particular it should be possible to find functions that - * potentially call integer division routines, for example.) - */ -void -alpha_find_call (parent, p_lowpc, p_highpc) - Sym *parent; - bfd_vma p_lowpc; - bfd_vma p_highpc; -{ - static bfd_vma delta = 0; - bfd_vma dest_pc; - alpha_Instruction *pc; - Sym *child; - - if (!delta) - { - delta = (bfd_vma) core_text_space - core_text_sect->vma; - - sym_init (&indirect_child); - indirect_child.name = _("<indirect child>"); - indirect_child.cg.prop.fract = 1.0; - indirect_child.cg.cyc.head = &indirect_child; - } - - if (!core_text_space) - { - return; - } - if (p_lowpc < s_lowpc) - { - p_lowpc = s_lowpc; - } - if (p_highpc > s_highpc) - { - p_highpc = s_highpc; - } - DBG (CALLDEBUG, printf (_("[find_call] %s: 0x%lx to 0x%lx\n"), - parent->name, p_lowpc, p_highpc)); - for (pc = (alpha_Instruction *) (p_lowpc + delta); - pc < (alpha_Instruction *) (p_highpc + delta); - ++pc) - { - switch (pc->a.op_code) - { - case OP_Jxx: - /* - * There is no simple and reliable way to determine the - * target of a jsr (the hint bits help, but there aren't - * enough bits to get a satisfactory hit rate). Instead, - * for any indirect jump we simply add an arc from PARENT - * to INDIRECT_CHILD---that way the user it at least able - * to see that there are other calls as well. - */ - if (pc->j.func == Jxx_FUNC_JSR - || pc->j.func == Jxx_FUNC_JSR_COROUTINE) - { - DBG (CALLDEBUG, - printf (_("[find_call] 0x%lx: jsr%s <indirect_child>\n"), - (bfd_vma) pc - delta, - pc->j.func == Jxx_FUNC_JSR ? "" : "_coroutine")); - arc_add (parent, &indirect_child, (unsigned long) 0); - } - break; - - case OP_BSR: - DBG (CALLDEBUG, - printf (_("[find_call] 0x%lx: bsr"), (bfd_vma) pc - delta)); - /* - * Regular PC relative addressing. Check that this is the - * address of a function. The linker sometimes redirects - * the entry point by 8 bytes to skip loading the global - * pointer, so we all for either address: - */ - dest_pc = ((bfd_vma) (pc + 1 + pc->b.disp)) - delta; - if (dest_pc >= s_lowpc && dest_pc <= s_highpc) - { - child = sym_lookup (&symtab, dest_pc); - DBG (CALLDEBUG, - printf (" 0x%lx\t; name=%s, addr=0x%lx", - dest_pc, child->name, child->addr)); - if (child->addr == dest_pc || child->addr == dest_pc - 8) - { - DBG (CALLDEBUG, printf ("\n")); - /* a hit: */ - arc_add (parent, child, (unsigned long) 0); - continue; - } - } - /* - * Something funny going on. - */ - DBG (CALLDEBUG, printf ("\tbut it's a botch\n")); - break; - - default: - break; - } - } -} diff --git a/gprof/basic_blocks.c b/gprof/basic_blocks.c deleted file mode 100644 index 07b6f8d..0000000 --- a/gprof/basic_blocks.c +++ /dev/null @@ -1,635 +0,0 @@ -/* - * Basic-block level related code: reading/writing of basic-block info - * to/from gmon.out; computing and formatting of basic-block related - * statistics. - */ -#include <stdio.h> -#include <unistd.h> -#include "basic_blocks.h" -#include "corefile.h" -#include "gmon_io.h" -#include "gmon_out.h" -#include "gprof.h" -#include "libiberty.h" -#include "source.h" -#include "sym_ids.h" - - -/* - * Default option values: - */ -bool bb_annotate_all_lines = FALSE; -unsigned long bb_min_calls = 1; -int bb_table_length = 10; - -/* - * Variables used to compute annotated source listing stats: - */ -static long num_executable_lines; -static long num_lines_executed; - - -/* - * Helper for sorting. Compares two symbols and returns result - * such that sorting will be increasing according to filename, line - * number, and address (in that order). - */ - -static int -DEFUN (cmp_bb, (lp, rp), const void *lp AND const void *rp) -{ - int r; - const Sym *left = *(const Sym **) lp; - const Sym *right = *(const Sym **) rp; - - if (left->file && right->file) - { - r = strcmp (left->file->name, right->file->name); - if (r) - { - return r; - } - - if (left->line_num != right->line_num) - { - return left->line_num - right->line_num; - } - } - - if (left->addr < right->addr) - { - return -1; - } - else if (left->addr > right->addr) - { - return 1; - } - else - { - return 0; - } -} - - -/* - * Helper for sorting. Order basic blocks in decreasing number of - * calls, ties are broken in increasing order of line numbers. - */ -static int -DEFUN (cmp_ncalls, (lp, rp), const void *lp AND const void *rp) -{ - const Sym *left = *(const Sym **) lp; - const Sym *right = *(const Sym **) rp; - - if (!left) - { - return 1; - } - else if (!right) - { - return -1; - } - - if (left->ncalls < right->ncalls) - return 1; - else if (left->ncalls > right->ncalls) - return -1; - - return left->line_num - right->line_num; -} - - -/* - * Skip over variable length string. - */ -static void -DEFUN (fskip_string, (fp), FILE * fp) -{ - int ch; - - while ((ch = fgetc (fp)) != EOF) - { - if (ch == '\0') - { - break; - } - } -} - - -/* - * Read a basic-block record from file IFP. FILENAME is the name - * of file IFP and is provided for formatting error-messages only. - */ -void -DEFUN (bb_read_rec, (ifp, filename), FILE * ifp AND const char *filename) -{ - int nblocks, b; - bfd_vma addr; - unsigned long ncalls; - Sym *sym; - - if (fread (&nblocks, sizeof (nblocks), 1, ifp) != 1) - { - fprintf (stderr, _("%s: %s: unexpected end of file\n"), whoami, filename); - done (1); - } - - nblocks = bfd_get_32 (core_bfd, (bfd_byte *) & nblocks); - if (gmon_file_version == 0) - { - fskip_string (ifp); - } - - for (b = 0; b < nblocks; ++b) - { - if (gmon_file_version == 0) - { - int line_num; - /* - * Version 0 had lots of extra stuff that we don't - * care about anymore. - */ - if ((fread (&ncalls, sizeof (ncalls), 1, ifp) != 1) - || (fread (&addr, sizeof (addr), 1, ifp) != 1) - || (fskip_string (ifp), FALSE) - || (fskip_string (ifp), FALSE) - || (fread (&line_num, sizeof (line_num), 1, ifp) != 1)) - { - perror (filename); - done (1); - } - } - else - { - if (fread (&addr, sizeof (addr), 1, ifp) != 1 - || fread (&ncalls, sizeof (ncalls), 1, ifp) != 1) - { - perror (filename); - done (1); - } - } - - /* - * Basic-block execution counts are meaningful only if we're - * profiling at the line-by-line level: - */ - if (line_granularity) - { - - /* convert from target to host endianness: */ - - addr = get_vma (core_bfd, (bfd_byte *) & addr); - ncalls = bfd_get_32 (core_bfd, (bfd_byte *) &ncalls); - - sym = sym_lookup (&symtab, addr); - - if (sym) - { - int i; - - DBG (BBDEBUG, - printf ("[bb_read_rec] 0x%lx->0x%lx (%s:%d) cnt=%lu\n", - addr, sym->addr, sym->name, sym->line_num, ncalls)); - - for (i = 0; i < NBBS; i++) - { - if (! sym->bb_addr[i] || sym->bb_addr[i] == addr) - { - sym->bb_addr[i] = addr; - sym->bb_calls[i] += ncalls; - break; - } - } - } - } - else - { - static bool user_warned = FALSE; - - if (!user_warned) - { - user_warned = TRUE; - fprintf (stderr, - _("%s: warning: ignoring basic-block exec counts (use -l or --line)\n"), - whoami); - } - } - } - return; -} - - -/* - * Write all basic-blocks with non-zero counts to file OFP. FILENAME - * is the name of OFP and is provided for producing error-messages - * only. - */ -void -DEFUN (bb_write_blocks, (ofp, filename), FILE * ofp AND const char *filename) -{ - const unsigned char tag = GMON_TAG_BB_COUNT; - int nblocks = 0; - bfd_vma addr; - unsigned long ncalls; - Sym *sym; - int i; - - /* count how many non-zero blocks with have: */ - - for (sym = symtab.base; sym < symtab.limit; ++sym) - { - for (i = 0; i < NBBS && sym->bb_addr[i]; i++) - ; - nblocks += i; - } - - /* write header: */ - bfd_put_32 (core_bfd, nblocks, (bfd_byte *) & nblocks); - if (fwrite (&tag, sizeof (tag), 1, ofp) != 1 - || fwrite (&nblocks, sizeof (nblocks), 1, ofp) != 1) - { - perror (filename); - done (1); - } - - /* write counts: */ - for (sym = symtab.base; sym < symtab.limit; ++sym) - { - for (i = 0; i < NBBS && sym->bb_addr[i]; i++) - { - put_vma (core_bfd, sym->bb_addr[i], (bfd_byte *) & addr); - bfd_put_32 (core_bfd, sym->bb_calls[i], (bfd_byte *) & ncalls); - - if (fwrite (&addr, sizeof (addr), 1, ofp) != 1 - || fwrite (&ncalls, sizeof (ncalls), 1, ofp) != 1) - { - perror (filename); - done (1); - } - } - } -} - - -/* - * Output basic-block statistics in a format that is easily parseable. - * Current the format is: - * - * <filename>:<line-number>: (<function-name>:<bb-addr): <ncalls> - */ -void -DEFUN_VOID (print_exec_counts) -{ - Sym **sorted_bbs, *sym; - int i, j, len; - - if (first_output) - { - first_output = FALSE; - } - else - { - printf ("\f\n"); - } - - /* sort basic-blocks according to function name and line number: */ - - sorted_bbs = (Sym **) xmalloc (symtab.len * sizeof (sorted_bbs[0])); - len = 0; - for (sym = symtab.base; sym < symtab.limit; ++sym) - { - /* - * Accept symbol if it's in the INCL_EXEC table - * or there is no INCL_EXEC table - * and it does not appear in the EXCL_EXEC table. - */ - if (sym_lookup (&syms[INCL_EXEC], sym->addr) - || (syms[INCL_EXEC].len == 0 - && !sym_lookup (&syms[EXCL_EXEC], sym->addr))) - { - sorted_bbs[len++] = sym; - } - } - qsort (sorted_bbs, len, sizeof (sorted_bbs[0]), cmp_bb); - - /* output basic-blocks: */ - - for (i = 0; i < len; ++i) - { - if (sym->ncalls > 0 || ! ignore_zeros) - { - printf (_("%s:%d: (%s:0x%lx) %lu executions\n"), - sym->file ? sym->file->name : _("<unknown>"), sym->line_num, - sym->name, sym->addr, sym->ncalls); - } - for (j = 0; j < NBBS && sym->bb_addr[j]; j ++) - { - if (sym->bb_calls[j] > 0 || ! ignore_zeros) - { - printf (_("%s:%d: (%s:0x%lx) %lu executions\n"), - sym->file ? sym->file->name : _("<unknown>"), sym->line_num, - sym->name, sym->bb_addr[j], sym->bb_calls[j]); - } - } - } - free (sorted_bbs); -} - -/* - * Helper for bb_annotated_source: format annotation containing - * number of line executions. Depends on being called on each - * line of a file in sequential order. - * - * Global variable bb_annotate_all_lines enables execution count - * compression (counts are supressed if identical to the last one) - * and prints counts on all executed lines. Otherwise, print - * all basic-block execution counts exactly once on the line - * that starts the basic-block. - */ - -static void -DEFUN (annotate_with_count, (buf, width, line_num, arg), - char *buf AND int width AND int line_num AND void *arg) -{ - Source_File *sf = arg; - Sym *b; - int i; - static unsigned long last_count; - unsigned long last_print = (unsigned long) -1; - - b = NULL; - if (line_num <= sf->num_lines) - { - b = sf->line[line_num - 1]; - } - if (!b) - { - for (i = 0; i < width; i++) - buf[i] = ' '; - buf[width] = '\0'; - } - else - { - char tmpbuf[NBBS * 30]; - char *p; - unsigned long ncalls; - int ncalls_set; - int len; - - ++num_executable_lines; - - p = tmpbuf; - *p = '\0'; - - ncalls = 0; - ncalls_set = 0; - - /* If this is a function entry point, label the line no matter what. - * Otherwise, we're in the middle of a function, so check to see - * if the first basic-block address is larger than the starting - * address of the line. If so, then this line begins with a - * a portion of the previous basic-block, so print that prior - * execution count (if bb_annotate_all_lines is set). - */ - - if (b->is_func) - { - sprintf (p, "%lu", b->ncalls); - p += strlen (p); - last_count = b->ncalls; - last_print = last_count; - ncalls = b->ncalls; - ncalls_set = 1; - } - else if (bb_annotate_all_lines - && b->bb_addr[0] && b->bb_addr[0] > b->addr) - { - sprintf (p, "%lu", last_count); - p += strlen (p); - last_print = last_count; - ncalls = last_count; - ncalls_set = 1; - } - - /* Loop through all of this line's basic-blocks. For each one, - * update last_count, then compress sequential identical counts - * (if bb_annotate_all_lines) and print the execution count. - */ - - for (i = 0; i < NBBS && b->bb_addr[i]; i++) - { - last_count = b->bb_calls[i]; - if (! ncalls_set) - { - ncalls = 0; - ncalls_set = 1; - } - ncalls += last_count; - - if (bb_annotate_all_lines && last_count == last_print) - { - continue; - } - - if (p > tmpbuf) - *p++ = ','; - sprintf (p, "%lu", last_count); - p += strlen (p); - - last_print = last_count; - } - - /* We're done. If nothing has been printed on this line, - * print the last execution count (bb_annotate_all_lines), - * which could be from either a previous line (if there were - * no BBs on this line), or from this line (if all our BB - * counts were compressed out because they were identical). - */ - - if (bb_annotate_all_lines && p == tmpbuf) - { - sprintf (p, "%lu", last_count); - p += strlen (p); - ncalls = last_count; - ncalls_set = 1; - } - - if (! ncalls_set) - { - int c; - - for (c = 0; c < width; c++) - buf[c] = ' '; - buf[width] = '\0'; - return; - } - - ++num_lines_executed; - - if (ncalls < bb_min_calls) - { - strcpy (tmpbuf, "#####"); - p = tmpbuf + 5; - } - - strcpy (p, " -> "); - p += 4; - - len = p - tmpbuf; - if (len >= width) - { - strncpy (buf, tmpbuf, width); - buf[width] = '\0'; - } - else - { - int c; - - strcpy (buf + width - len, tmpbuf); - for (c = 0; c < width - len; ++c) - buf[c] = ' '; - } - } -} - -/* - * Annotate the files named in SOURCE_FILES with basic-block statistics - * (execution counts). After each source files, a few statistics - * regarding that source file are printed. - */ -void -DEFUN_VOID (print_annotated_source) -{ - Sym *sym, *line_stats, *new_line; - Source_File *sf; - int i, table_len; - FILE *ofp; - - /* - * Find maximum line number for each source file that user is - * interested in: - */ - for (sym = symtab.base; sym < symtab.limit; ++sym) - { - /* - * Accept symbol if it's file is known, its line number is - * bigger than anything we have seen for that file so far and - * if it's in the INCL_ANNO table or there is no INCL_ANNO - * table and it does not appear in the EXCL_ANNO table. - */ - if (sym->file && sym->line_num > sym->file->num_lines - && (sym_lookup (&syms[INCL_ANNO], sym->addr) - || (syms[INCL_ANNO].len == 0 - && !sym_lookup (&syms[EXCL_ANNO], sym->addr)))) - { - sym->file->num_lines = sym->line_num; - } - } - - /* allocate line descriptors: */ - - for (sf = first_src_file; sf; sf = sf->next) - { - if (sf->num_lines > 0) - { - sf->line = (void *) xmalloc (sf->num_lines * sizeof (sf->line[0])); - memset (sf->line, 0, sf->num_lines * sizeof (sf->line[0])); - } - } - - /* count executions per line: */ - - for (sym = symtab.base; sym < symtab.limit; ++sym) - { - if (sym->file && sym->file->num_lines - && (sym_lookup (&syms[INCL_ANNO], sym->addr) - || (syms[INCL_ANNO].len == 0 - && !sym_lookup (&syms[EXCL_ANNO], sym->addr)))) - { - sym->file->ncalls += sym->ncalls; - line_stats = sym->file->line[sym->line_num - 1]; - if (!line_stats) - { - /* common case has at most one basic-block per source line: */ - sym->file->line[sym->line_num - 1] = sym; - } - else if (!line_stats->addr) - { - /* sym is the 3rd .. nth basic block for this line: */ - line_stats->ncalls += sym->ncalls; - } - else - { - /* sym is the second basic block for this line */ - new_line = (Sym *) xmalloc (sizeof (*new_line)); - *new_line = *line_stats; - new_line->addr = 0; - new_line->ncalls += sym->ncalls; - sym->file->line[sym->line_num - 1] = new_line; - } - } - } - - /* plod over source files, annotating them: */ - - for (sf = first_src_file; sf; sf = sf->next) - { - if (!sf->num_lines || (ignore_zeros && sf->ncalls == 0)) - { - continue; - } - - num_executable_lines = num_lines_executed = 0; - ofp = annotate_source (sf, 16, annotate_with_count, sf); - if (!ofp) - { - continue; - } - - if (bb_table_length > 0) - { - fprintf (ofp, _("\n\nTop %d Lines:\n\n Line Count\n\n"), - bb_table_length); - - /* abuse line arrays---it's not needed anymore: */ - qsort (sf->line, sf->num_lines, sizeof (sf->line[0]), cmp_ncalls); - table_len = bb_table_length; - if (table_len > sf->num_lines) - { - table_len = sf->num_lines; - } - for (i = 0; i < table_len; ++i) - { - sym = sf->line[i]; - if (!sym || sym->ncalls == 0) - { - break; - } - fprintf (ofp, "%9d %10lu\n", sym->line_num, sym->ncalls); - } - } - - free (sf->line); - sf->line = 0; - - fprintf (ofp, _("\nExecution Summary:\n\n")); - fprintf (ofp, _("%9ld Executable lines in this file\n"), - num_executable_lines); - fprintf (ofp, _("%9ld Lines executed\n"), num_lines_executed); - fprintf (ofp, _("%9.2f Percent of the file executed\n"), - num_executable_lines - ? 100.0 * num_lines_executed / (double) num_executable_lines - : 100.0); - fprintf (ofp, _("\n%9lu Total number of line executions\n"), - sf->ncalls); - fprintf (ofp, _("%9.2f Average executions per line\n"), - num_executable_lines - ? (double) sf->ncalls / (double) num_executable_lines - : 0.0); - if (ofp != stdout) - { - fclose (ofp); - } - } -} diff --git a/gprof/basic_blocks.h b/gprof/basic_blocks.h deleted file mode 100644 index 923eca1..0000000 --- a/gprof/basic_blocks.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef basic_blocks_h -#define basic_blocks_h - -#include <stdio.h> -#include "gprof.h" -#include "source.h" -#include "symtab.h" - -/* - * Options: - */ -extern bool bb_annotate_all_lines; /* force annotation of all lines? */ -extern int bb_table_length; /* length of most-used bb table */ -extern unsigned long bb_min_calls; /* minimum execution count */ - -extern void bb_read_rec PARAMS ((FILE * ifp, const char *filename)); -extern void bb_write_blocks PARAMS ((FILE * ofp, const char *filename)); -extern void bb_create_syms PARAMS ((void)); - -extern void print_annotated_source PARAMS ((void)); -extern void print_exec_counts PARAMS ((void)); - -#endif /* basic_blocks_h */ diff --git a/gprof/bb_exit_func.c b/gprof/bb_exit_func.c deleted file mode 100644 index 8133215..0000000 --- a/gprof/bb_exit_func.c +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (c) 1994 David Mosberger-Tang. - * - * This is free software; you can redistribute it and/or modify it - * under the terms of the GNU Library General Public License as - * published by the Free Software Foundation; either version 2, or (at - * your option) any later version. - * - * __bb_exit_func() dumps all the basic-block statistics linked into - * the bb_head chain to .d files. - */ -#include <stdio.h> -#include <strings.h> -#include "bfd.h" -#include "gmon_out.h" - -/* structure emitted by -a */ -struct bb { - long zero_word; - const char *filename; - long *counts; - long ncounts; - struct bb *next; - const unsigned long *addresses; -}; - -struct bb *__bb_head = (struct bb *)0; - - -void -__bb_exit_func (void) -{ - const int version = GMON_VERSION; - struct gmon_hdr ghdr; - struct bb *ptr; - FILE *fp; - /* - * GEN_GMON_CNT_FILE should be defined on systems with mcleanup() - * functions that do not write basic-block to gmon.out. In such - * cases profiling with "-pg -a" would result in a gmon.out file - * without basic-block info (because the file written here would - * be overwritten. Thus, a separate file is generated instead. - * The two files can easily be combined by specifying them - * on gprof's command line (and possibly generating a gmon.sum - * file with "gprof -s"). - */ -#ifndef GEN_GMON_CNT_FILE -# define OUT_NAME "gmon.out" -#else -# define OUT_NAME "gmon.cnt" -#endif - fp = fopen(OUT_NAME, "wb"); - if (!fp) { - perror(OUT_NAME); - return; - } /* if */ - memcpy(&ghdr.cookie[0], GMON_MAGIC, 4); - memcpy(&ghdr.version, &version, sizeof(version)); - fwrite(&ghdr, sizeof(ghdr), 1, fp); - - for (ptr = __bb_head; ptr != 0; ptr = ptr->next) { - u_int ncounts = ptr->ncounts; - u_char tag; - u_int i; - - tag = GMON_TAG_BB_COUNT; - fwrite(&tag, sizeof(tag), 1, fp); - fwrite(&ncounts, sizeof(ncounts), 1, fp); - - for (i = 0; i < ncounts; ++i) { - fwrite(&ptr->addresses[i], sizeof(ptr->addresses[0]), 1, fp); - fwrite(&ptr->counts[i], sizeof(ptr->counts[0]), 1, fp); - } /* for */ - } /* for */ - fclose (fp); -} /* __bb_exit_func */ - - /*** end of __bb_exit_func.c ***/ diff --git a/gprof/bbconv.pl b/gprof/bbconv.pl deleted file mode 100755 index 7312f51..0000000 --- a/gprof/bbconv.pl +++ /dev/null @@ -1,36 +0,0 @@ -#! /usr/bin/perl - -# This script converts a "bb.out" file into a format -# suitable for processing by gprof - -# Write a new-style gmon header - -print pack("A4Ix12", "gmon", 1); - - -# The input file format contains header lines and data lines. -# Header lines contain a count of how many data lines follow before -# the next header line. $blockcount is set to the count that -# appears in each header line, then decremented at each data line. -# $blockcount should always be zero at the start of a header line, -# and should never be zero at the start of a data line. - -$blockcount=0; - -while (<>) { - if (/^File .*, ([0-9]+) basic blocks/) { - print STDERR "Miscount: line $.\n" if ($blockcount != 0); - $blockcount = $1; - - print pack("cI", 2, $blockcount); - } - if (/Block.*executed([ 0-9]+) time.* address= 0x([0-9a-fA-F]*)/) { - print STDERR "Miscount: line $.\n" if ($blockcount == 0); - $blockcount-- if ($blockcount > 0); - - $count = $1; - $addr = hex $2; - - print pack("II",$addr,$count); - } -} diff --git a/gprof/bsd_callg_bl.m b/gprof/bsd_callg_bl.m deleted file mode 100644 index 533c96c..0000000 --- a/gprof/bsd_callg_bl.m +++ /dev/null @@ -1,108 +0,0 @@ - - - -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/call_graph.c b/gprof/call_graph.c deleted file mode 100644 index 8f12cbd..0000000 --- a/gprof/call_graph.c +++ /dev/null @@ -1,116 +0,0 @@ -#include "cg_arcs.h" -#include "call_graph.h" -#include "corefile.h" -#include "gmon_io.h" -#include "gmon_out.h" -#include "symtab.h" -#include "sym_ids.h" - -extern void -DEFUN (cg_tally, (from_pc, self_pc, count), - bfd_vma from_pc AND bfd_vma self_pc AND unsigned long count) -{ - Sym *parent; - Sym *child; - - parent = sym_lookup (&symtab, from_pc); - child = sym_lookup (&symtab, self_pc); - - if (child == NULL || parent == NULL) - return; - - /* If we're doing line-by-line profiling, both the parent and the - child will probably point to line symbols instead of function - symbols. For the parent this is fine, since this identifies the - line number in the calling routing, but the child should always - point to a function entry point, so we back up in the symbol - table until we find it. - - For normal profiling, is_func will be set on all symbols, so this - code will do nothing. */ - - while (child >= symtab.base && ! child->is_func) - --child; - - if (child < symtab.base) - return; - - /* - * Keep arc if it is on INCL_ARCS table or if the INCL_ARCS table - * is empty and it is not in the EXCL_ARCS table. - */ - if (sym_id_arc_is_present (&syms[INCL_ARCS], parent, child) - || (syms[INCL_ARCS].len == 0 - && !sym_id_arc_is_present (&syms[EXCL_ARCS], parent, child))) - { - child->ncalls += count; - DBG (TALLYDEBUG, - printf (_("[cg_tally] arc from %s to %s traversed %lu times\n"), - parent->name, child->name, count)); - arc_add (parent, child, count); - } -} - - -/* - * Read a record from file IFP describing an arc in the function - * call-graph and the count of how many times the arc has been - * traversed. FILENAME is the name of file IFP and is provided - * for formatting error-messages only. - */ -void -DEFUN (cg_read_rec, (ifp, filename), FILE * ifp AND CONST char *filename) -{ - bfd_vma from_pc, self_pc; - struct gmon_cg_arc_record arc; - unsigned long count; - - if (fread (&arc, sizeof (arc), 1, ifp) != 1) - { - fprintf (stderr, _("%s: %s: unexpected end of file\n"), - whoami, filename); - done (1); - } - from_pc = get_vma (core_bfd, (bfd_byte *) arc.from_pc); - self_pc = get_vma (core_bfd, (bfd_byte *) arc.self_pc); - count = bfd_get_32 (core_bfd, (bfd_byte *) arc.count); - DBG (SAMPLEDEBUG, - printf ("[cg_read_rec] frompc 0x%lx selfpc 0x%lx count %lu\n", - from_pc, self_pc, count)); - /* add this arc: */ - cg_tally (from_pc, self_pc, count); -} - - -/* - * Write all the arcs in the call-graph to file OFP. FILENAME is - * the name of OFP and is provided for formatting error-messages - * only. - */ -void -DEFUN (cg_write_arcs, (ofp, filename), FILE * ofp AND const char *filename) -{ - const unsigned char tag = GMON_TAG_CG_ARC; - struct gmon_cg_arc_record raw_arc; - Arc *arc; - Sym *sym; - - for (sym = symtab.base; sym < symtab.limit; sym++) - { - for (arc = sym->cg.children; arc; arc = arc->next_child) - { - put_vma (core_bfd, arc->parent->addr, (bfd_byte *) raw_arc.from_pc); - put_vma (core_bfd, arc->child->addr, (bfd_byte *) raw_arc.self_pc); - bfd_put_32 (core_bfd, arc->count, (bfd_byte *) raw_arc.count); - if (fwrite (&tag, sizeof (tag), 1, ofp) != 1 - || fwrite (&raw_arc, sizeof (raw_arc), 1, ofp) != 1) - { - perror (filename); - done (1); - } - DBG (SAMPLEDEBUG, - printf ("[cg_write_arcs] frompc 0x%lx selfpc 0x%lx count %lu\n", - arc->parent->addr, arc->child->addr, arc->count)); - } - } -} diff --git a/gprof/call_graph.h b/gprof/call_graph.h deleted file mode 100644 index be5139b..0000000 --- a/gprof/call_graph.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef call_graph_h -#define call_graph_h - -#include <stdio.h> -#include "gprof.h" -#include "symtab.h" - -extern void cg_tally PARAMS ((bfd_vma from_pc, bfd_vma self_pc, - unsigned long count)); -extern void cg_read_rec PARAMS ((FILE * ifp, const char *filename)); -extern void cg_write_arcs PARAMS ((FILE * ofp, const char *filename)); - -#endif /* call_graph_h */ diff --git a/gprof/cg_arcs.c b/gprof/cg_arcs.c deleted file mode 100644 index 0702317..0000000 --- a/gprof/cg_arcs.c +++ /dev/null @@ -1,685 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include "libiberty.h" -#include "gprof.h" -#include "call_graph.h" -#include "cg_arcs.h" -#include "cg_dfn.h" -#include "cg_print.h" -#include "utils.h" -#include "sym_ids.h" - -Sym *cycle_header; -unsigned int num_cycles; -Arc **arcs; -unsigned int numarcs; - -/* - * Return TRUE iff PARENT has an arc to covers the address - * range covered by CHILD. - */ -Arc * -DEFUN (arc_lookup, (parent, child), Sym * parent AND Sym * child) -{ - Arc *arc; - - if (!parent || !child) - { - printf ("[arc_lookup] parent == 0 || child == 0\n"); - return 0; - } - DBG (LOOKUPDEBUG, printf ("[arc_lookup] parent %s child %s\n", - parent->name, child->name)); - for (arc = parent->cg.children; arc; arc = arc->next_child) - { - DBG (LOOKUPDEBUG, printf ("[arc_lookup]\t parent %s child %s\n", - arc->parent->name, arc->child->name)); - if (child->addr >= arc->child->addr - && child->end_addr <= arc->child->end_addr) - { - return arc; - } - } - return 0; -} - - -/* - * Add (or just increment) an arc: - */ -void -DEFUN (arc_add, (parent, child, count), - Sym * parent AND Sym * child AND unsigned long count) -{ - static unsigned int maxarcs = 0; - Arc *arc, **newarcs; - - DBG (TALLYDEBUG, printf ("[arc_add] %lu arcs from %s to %s\n", - count, parent->name, child->name)); - arc = arc_lookup (parent, child); - if (arc) - { - /* - * A hit: just increment the count. - */ - DBG (TALLYDEBUG, printf ("[tally] hit %lu += %lu\n", - arc->count, count)); - arc->count += count; - return; - } - arc = (Arc *) xmalloc (sizeof (*arc)); - memset (arc, 0, sizeof (*arc)); - arc->parent = parent; - arc->child = child; - arc->count = count; - - /* If this isn't an arc for a recursive call to parent, then add it - to the array of arcs. */ - if (parent != child) - { - /* If we've exhausted space in our current array, get a new one - and copy the contents. We might want to throttle the doubling - factor one day. */ - if (numarcs == maxarcs) - { - /* Determine how much space we want to allocate. */ - if (maxarcs == 0) - maxarcs = 1; - maxarcs *= 2; - - /* Allocate the new array. */ - newarcs = (Arc **)xmalloc(sizeof (Arc *) * maxarcs); - - /* Copy the old array's contents into the new array. */ - memcpy (newarcs, arcs, numarcs * sizeof (Arc *)); - - /* Free up the old array. */ - free (arcs); - - /* And make the new array be the current array. */ - arcs = newarcs; - } - - /* Place this arc in the arc array. */ - arcs[numarcs++] = arc; - } - - /* prepend this child to the children of this parent: */ - arc->next_child = parent->cg.children; - parent->cg.children = arc; - - /* prepend this parent to the parents of this child: */ - arc->next_parent = child->cg.parents; - child->cg.parents = arc; -} - - -static int -DEFUN (cmp_topo, (lp, rp), const PTR lp AND const PTR rp) -{ - const Sym *left = *(const Sym **) lp; - const Sym *right = *(const Sym **) rp; - - return left->cg.top_order - right->cg.top_order; -} - - -static void -DEFUN (propagate_time, (parent), Sym * parent) -{ - Arc *arc; - Sym *child; - double share, prop_share; - - if (parent->cg.prop.fract == 0.0) - { - return; - } - - /* gather time from children of this parent: */ - - for (arc = parent->cg.children; arc; arc = arc->next_child) - { - child = arc->child; - if (arc->count == 0 || child == parent || child->cg.prop.fract == 0) - { - continue; - } - if (child->cg.cyc.head != child) - { - if (parent->cg.cyc.num == child->cg.cyc.num) - { - continue; - } - if (parent->cg.top_order <= child->cg.top_order) - { - fprintf (stderr, "[propagate] toporder botches\n"); - } - child = child->cg.cyc.head; - } - else - { - if (parent->cg.top_order <= child->cg.top_order) - { - fprintf (stderr, "[propagate] toporder botches\n"); - continue; - } - } - if (child->ncalls == 0) - { - continue; - } - - /* distribute time for this arc: */ - arc->time = child->hist.time * (((double) arc->count) - / ((double) child->ncalls)); - arc->child_time = child->cg.child_time - * (((double) arc->count) / ((double) child->ncalls)); - share = arc->time + arc->child_time; - parent->cg.child_time += share; - - /* (1 - cg.prop.fract) gets lost along the way: */ - prop_share = parent->cg.prop.fract * share; - - /* fix things for printing: */ - parent->cg.prop.child += prop_share; - arc->time *= parent->cg.prop.fract; - arc->child_time *= parent->cg.prop.fract; - - /* add this share to the parent's cycle header, if any: */ - if (parent->cg.cyc.head != parent) - { - parent->cg.cyc.head->cg.child_time += share; - parent->cg.cyc.head->cg.prop.child += prop_share; - } - DBG (PROPDEBUG, - printf ("[prop_time] child \t"); - print_name (child); - printf (" with %f %f %lu/%lu\n", child->hist.time, - child->cg.child_time, arc->count, child->ncalls); - printf ("[prop_time] parent\t"); - print_name (parent); - printf ("\n[prop_time] share %f\n", share)); - } -} - - -/* - * Compute the time of a cycle as the sum of the times of all - * its members. - */ -static void -DEFUN_VOID (cycle_time) -{ - Sym *member, *cyc; - - for (cyc = &cycle_header[1]; cyc <= &cycle_header[num_cycles]; ++cyc) - { - for (member = cyc->cg.cyc.next; member; member = member->cg.cyc.next) - { - if (member->cg.prop.fract == 0.0) - { - /* - * All members have the same propfraction except those - * that were excluded with -E. - */ - continue; - } - cyc->hist.time += member->hist.time; - } - cyc->cg.prop.self = cyc->cg.prop.fract * cyc->hist.time; - } -} - - -static void -DEFUN_VOID (cycle_link) -{ - Sym *sym, *cyc, *member; - Arc *arc; - int num; - - /* count the number of cycles, and initialize the cycle lists: */ - - num_cycles = 0; - for (sym = symtab.base; sym < symtab.limit; ++sym) - { - /* this is how you find unattached cycles: */ - if (sym->cg.cyc.head == sym && sym->cg.cyc.next) - { - ++num_cycles; - } - } - - /* - * cycle_header is indexed by cycle number: i.e. it is origin 1, - * not origin 0. - */ - cycle_header = (Sym *) xmalloc ((num_cycles + 1) * sizeof (Sym)); - - /* - * Now link cycles to true cycle-heads, number them, accumulate - * the data for the cycle. - */ - num = 0; - cyc = cycle_header; - for (sym = symtab.base; sym < symtab.limit; ++sym) - { - if (!(sym->cg.cyc.head == sym && sym->cg.cyc.next != 0)) - { - continue; - } - ++num; - ++cyc; - sym_init (cyc); - cyc->cg.print_flag = TRUE; /* should this be printed? */ - cyc->cg.top_order = DFN_NAN; /* graph call chain top-sort order */ - cyc->cg.cyc.num = num; /* internal number of cycle on */ - cyc->cg.cyc.head = cyc; /* pointer to head of cycle */ - cyc->cg.cyc.next = sym; /* pointer to next member of cycle */ - DBG (CYCLEDEBUG, printf ("[cycle_link] "); - print_name (sym); - printf (" is the head of cycle %d\n", num)); - - /* link members to cycle header: */ - for (member = sym; member; member = member->cg.cyc.next) - { - member->cg.cyc.num = num; - member->cg.cyc.head = cyc; - } - - /* - * Count calls from outside the cycle and those among cycle - * members: - */ - for (member = sym; member; member = member->cg.cyc.next) - { - for (arc = member->cg.parents; arc; arc = arc->next_parent) - { - if (arc->parent == member) - { - continue; - } - if (arc->parent->cg.cyc.num == num) - { - cyc->cg.self_calls += arc->count; - } - else - { - cyc->ncalls += arc->count; - } - } - } - } -} - - -/* - * Check if any parent of this child (or outside parents of this - * cycle) have their print flags on and set the print flag of the - * child (cycle) appropriately. Similarly, deal with propagation - * fractions from parents. - */ -static void -DEFUN (inherit_flags, (child), Sym * child) -{ - Sym *head, *parent, *member; - Arc *arc; - - head = child->cg.cyc.head; - if (child == head) - { - /* just a regular child, check its parents: */ - child->cg.print_flag = FALSE; - child->cg.prop.fract = 0.0; - for (arc = child->cg.parents; arc; arc = arc->next_parent) - { - parent = arc->parent; - if (child == parent) - { - continue; - } - child->cg.print_flag |= parent->cg.print_flag; - /* - * If the child was never actually called (e.g., this arc - * is static (and all others are, too)) no time propagates - * along this arc. - */ - if (child->ncalls != 0) - { - child->cg.prop.fract += parent->cg.prop.fract - * (((double) arc->count) / ((double) child->ncalls)); - } - } - } - else - { - /* - * Its a member of a cycle, look at all parents from outside - * the cycle. - */ - head->cg.print_flag = FALSE; - head->cg.prop.fract = 0.0; - for (member = head->cg.cyc.next; member; member = member->cg.cyc.next) - { - for (arc = member->cg.parents; arc; arc = arc->next_parent) - { - if (arc->parent->cg.cyc.head == head) - { - continue; - } - parent = arc->parent; - head->cg.print_flag |= parent->cg.print_flag; - /* - * If the cycle was never actually called (e.g. this - * arc is static (and all others are, too)) no time - * propagates along this arc. - */ - if (head->ncalls != 0) - { - head->cg.prop.fract += parent->cg.prop.fract - * (((double) arc->count) / ((double) head->ncalls)); - } - } - } - for (member = head; member; member = member->cg.cyc.next) - { - member->cg.print_flag = head->cg.print_flag; - member->cg.prop.fract = head->cg.prop.fract; - } - } -} - - -/* - * In one top-to-bottom pass over the topologically sorted symbols - * propagate: - * cg.print_flag as the union of parents' print_flags - * propfraction as the sum of fractional parents' propfractions - * and while we're here, sum time for functions. - */ -static void -DEFUN (propagate_flags, (symbols), Sym ** symbols) -{ - int index; - Sym *old_head, *child; - - old_head = 0; - for (index = symtab.len - 1; index >= 0; --index) - { - child = symbols[index]; - /* - * If we haven't done this function or cycle, inherit things - * from parent. This way, we are linear in the number of arcs - * since we do all members of a cycle (and the cycle itself) - * as we hit the first member of the cycle. - */ - if (child->cg.cyc.head != old_head) - { - old_head = child->cg.cyc.head; - inherit_flags (child); - } - DBG (PROPDEBUG, - printf ("[prop_flags] "); - print_name (child); - printf ("inherits print-flag %d and prop-fract %f\n", - child->cg.print_flag, child->cg.prop.fract)); - if (!child->cg.print_flag) - { - /* - * Printflag is off. It gets turned on by being in the - * INCL_GRAPH table, or there being an empty INCL_GRAPH - * table and not being in the EXCL_GRAPH table. - */ - if (sym_lookup (&syms[INCL_GRAPH], child->addr) - || (syms[INCL_GRAPH].len == 0 - && !sym_lookup (&syms[EXCL_GRAPH], child->addr))) - { - child->cg.print_flag = TRUE; - } - } - else - { - /* - * This function has printing parents: maybe someone wants - * to shut it up by putting it in the EXCL_GRAPH table. - * (But favor INCL_GRAPH over EXCL_GRAPH.) - */ - if (!sym_lookup (&syms[INCL_GRAPH], child->addr) - && sym_lookup (&syms[EXCL_GRAPH], child->addr)) - { - child->cg.print_flag = FALSE; - } - } - if (child->cg.prop.fract == 0.0) - { - /* - * No parents to pass time to. Collect time from children - * if its in the INCL_TIME table, or there is an empty - * INCL_TIME table and its not in the EXCL_TIME table. - */ - if (sym_lookup (&syms[INCL_TIME], child->addr) - || (syms[INCL_TIME].len == 0 - && !sym_lookup (&syms[EXCL_TIME], child->addr))) - { - child->cg.prop.fract = 1.0; - } - } - else - { - /* - * It has parents to pass time to, but maybe someone wants - * to shut it up by puttting it in the EXCL_TIME table. - * (But favor being in INCL_TIME tabe over being in - * EXCL_TIME table.) - */ - if (!sym_lookup (&syms[INCL_TIME], child->addr) - && sym_lookup (&syms[EXCL_TIME], child->addr)) - { - child->cg.prop.fract = 0.0; - } - } - child->cg.prop.self = child->hist.time * child->cg.prop.fract; - print_time += child->cg.prop.self; - DBG (PROPDEBUG, - printf ("[prop_flags] "); - print_name (child); - printf (" ends up with printflag %d and prop-fract %f\n", - child->cg.print_flag, child->cg.prop.fract); - printf ("[prop_flags] time %f propself %f print_time %f\n", - child->hist.time, child->cg.prop.self, print_time)); - } -} - - -/* - * Compare by decreasing propagated time. If times are equal, but one - * is a cycle header, say that's first (e.g. less, i.e. -1). If one's - * name doesn't have an underscore and the other does, say that one is - * first. All else being equal, compare by names. - */ -static int -DEFUN (cmp_total, (lp, rp), const PTR lp AND const PTR rp) -{ - const Sym *left = *(const Sym **) lp; - const Sym *right = *(const Sym **) rp; - double diff; - - diff = (left->cg.prop.self + left->cg.prop.child) - - (right->cg.prop.self + right->cg.prop.child); - if (diff < 0.0) - { - return 1; - } - if (diff > 0.0) - { - return -1; - } - if (!left->name && left->cg.cyc.num != 0) - { - return -1; - } - if (!right->name && right->cg.cyc.num != 0) - { - return 1; - } - if (!left->name) - { - return -1; - } - if (!right->name) - { - return 1; - } - if (left->name[0] != '_' && right->name[0] == '_') - { - return -1; - } - if (left->name[0] == '_' && right->name[0] != '_') - { - return 1; - } - if (left->ncalls > right->ncalls) - { - return -1; - } - if (left->ncalls < right->ncalls) - { - return 1; - } - return strcmp (left->name, right->name); -} - - -/* - * Topologically sort the graph (collapsing cycles), and propagates - * time bottom up and flags top down. - */ -Sym ** -DEFUN_VOID (cg_assemble) -{ - Sym *parent, **time_sorted_syms, **top_sorted_syms; - unsigned int index; - Arc *arc; - - /* - * initialize various things: - * zero out child times. - * count self-recursive calls. - * indicate that nothing is on cycles. - */ - for (parent = symtab.base; parent < symtab.limit; parent++) - { - parent->cg.child_time = 0.0; - arc = arc_lookup (parent, parent); - if (arc && parent == arc->child) - { - parent->ncalls -= arc->count; - parent->cg.self_calls = arc->count; - } - else - { - parent->cg.self_calls = 0; - } - parent->cg.prop.fract = 0.0; - parent->cg.prop.self = 0.0; - parent->cg.prop.child = 0.0; - parent->cg.print_flag = FALSE; - parent->cg.top_order = DFN_NAN; - parent->cg.cyc.num = 0; - parent->cg.cyc.head = parent; - parent->cg.cyc.next = 0; - if (ignore_direct_calls) - { - find_call (parent, parent->addr, (parent + 1)->addr); - } - } - /* - * Topologically order things. If any node is unnumbered, number - * it and any of its descendents. - */ - for (parent = symtab.base; parent < symtab.limit; parent++) - { - if (parent->cg.top_order == DFN_NAN) - { - cg_dfn (parent); - } - } - - /* link together nodes on the same cycle: */ - cycle_link (); - - /* sort the symbol table in reverse topological order: */ - top_sorted_syms = (Sym **) xmalloc (symtab.len * sizeof (Sym *)); - for (index = 0; index < symtab.len; ++index) - { - top_sorted_syms[index] = &symtab.base[index]; - } - qsort (top_sorted_syms, symtab.len, sizeof (Sym *), cmp_topo); - DBG (DFNDEBUG, - printf ("[cg_assemble] topological sort listing\n"); - for (index = 0; index < symtab.len; ++index) - { - printf ("[cg_assemble] "); - printf ("%d:", top_sorted_syms[index]->cg.top_order); - print_name (top_sorted_syms[index]); - printf ("\n"); - } - ); - /* - * Starting from the topological top, propagate print flags to - * children. also, calculate propagation fractions. this happens - * before time propagation since time propagation uses the - * fractions. - */ - propagate_flags (top_sorted_syms); - - /* - * Starting from the topological bottom, propogate children times - * up to parents. - */ - cycle_time (); - for (index = 0; index < symtab.len; ++index) - { - propagate_time (top_sorted_syms[index]); - } - - free (top_sorted_syms); - - /* - * Now, sort by CG.PROP.SELF + CG.PROP.CHILD. Sorting both the regular - * function names and cycle headers. - */ - time_sorted_syms = (Sym **) xmalloc ((symtab.len + num_cycles) * sizeof (Sym *)); - for (index = 0; index < symtab.len; index++) - { - time_sorted_syms[index] = &symtab.base[index]; - } - for (index = 1; index <= num_cycles; index++) - { - time_sorted_syms[symtab.len + index - 1] = &cycle_header[index]; - } - qsort (time_sorted_syms, symtab.len + num_cycles, sizeof (Sym *), - cmp_total); - for (index = 0; index < symtab.len + num_cycles; index++) - { - time_sorted_syms[index]->cg.index = index + 1; - } - return time_sorted_syms; -} diff --git a/gprof/cg_arcs.h b/gprof/cg_arcs.h deleted file mode 100644 index caa0197..0000000 --- a/gprof/cg_arcs.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef cg_arcs_h -#define cg_arcs_h - -#include "gprof.h" -#include "symtab.h" - -/* - * Arc structure for call-graph. - * - * With pointers to the symbols of the parent and the child, a count - * of how many times this arc was traversed, and pointers to the next - * parent of this child and the next child of this parent. - */ -typedef struct arc - { - Sym *parent; /* source vertice of arc */ - Sym *child; /* dest vertice of arc */ - unsigned long count; /* # of calls from parent to child */ - double time; /* time inherited along arc */ - double child_time; /* child-time inherited along arc */ - struct arc *next_parent; /* next parent of CHILD */ - struct arc *next_child; /* next child of PARENT */ - int has_been_placed; /* have this arc's functions been placed? */ - } -Arc; - -extern unsigned int num_cycles; /* number of cycles discovered */ -extern Sym *cycle_header; /* cycle headers */ - -extern void arc_add PARAMS ((Sym * parent, Sym * child, unsigned long count)); -extern Arc *arc_lookup PARAMS ((Sym * parent, Sym * child)); -extern Sym **cg_assemble PARAMS ((void)); -extern Arc **arcs; -extern unsigned int numarcs; - -#endif /* cg_arcs_h */ diff --git a/gprof/cg_dfn.c b/gprof/cg_dfn.c deleted file mode 100644 index c9e37ab..0000000 --- a/gprof/cg_dfn.c +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include <stdio.h> -#include "gprof.h" -#include "cg_arcs.h" -#include "cg_dfn.h" -#include "symtab.h" -#include "utils.h" - -#define DFN_DEPTH 100 - -typedef struct - { - Sym *sym; - int cycle_top; - } -DFN_Stack; - -DFN_Stack dfn_stack[DFN_DEPTH]; -int dfn_depth = 0; -int dfn_counter = DFN_NAN; - - -/* - * Is CHILD already numbered? - */ -static bool -DEFUN (is_numbered, (child), Sym * child) -{ - return child->cg.top_order != DFN_NAN && child->cg.top_order != DFN_BUSY; -} - - -/* - * Is CHILD already busy? - */ -static bool -DEFUN (is_busy, (child), Sym * child) -{ - if (child->cg.top_order == DFN_NAN) - { - return FALSE; - } - return TRUE; -} - - -/* - * CHILD is part of a cycle. Find the top caller into this cycle - * that is not part of the cycle and make all functions in cycle - * members of that cycle (top caller == caller with smallest - * depth-first number). - */ -static void -DEFUN (find_cycle, (child), Sym * child) -{ - Sym *head = 0; - Sym *tail; - int cycle_top; - int index; - - for (cycle_top = dfn_depth; cycle_top > 0; --cycle_top) - { - head = dfn_stack[cycle_top].sym; - if (child == head) - { - break; - } - if (child->cg.cyc.head != child && child->cg.cyc.head == head) - { - break; - } - } - if (cycle_top <= 0) - { - fprintf (stderr, "[find_cycle] couldn't find head of cycle\n"); - done (1); - } -#ifdef DEBUG - if (debug_level & DFNDEBUG) - { - printf ("[find_cycle] dfn_depth %d cycle_top %d ", - dfn_depth, cycle_top); - if (head) - { - print_name (head); - } - else - { - printf ("<unknown>"); - } - printf ("\n"); - } -#endif - if (cycle_top == dfn_depth) - { - /* - * This is previous function, e.g. this calls itself. Sort of - * boring. - * - * Since we are taking out self-cycles elsewhere no need for - * the special case, here. - */ - DBG (DFNDEBUG, - printf ("[find_cycle] "); - print_name (child); - printf ("\n")); - } - else - { - /* - * Glom intervening functions that aren't already glommed into - * this cycle. Things have been glommed when their cyclehead - * field points to the head of the cycle they are glommed - * into. - */ - for (tail = head; tail->cg.cyc.next; tail = tail->cg.cyc.next) - { - /* void: chase down to tail of things already glommed */ - DBG (DFNDEBUG, - printf ("[find_cycle] tail "); - print_name (tail); - printf ("\n")); - } - /* - * If what we think is the top of the cycle has a cyclehead - * field, then it's not really the head of the cycle, which is - * really what we want. - */ - if (head->cg.cyc.head != head) - { - head = head->cg.cyc.head; - DBG (DFNDEBUG, printf ("[find_cycle] new cyclehead "); - print_name (head); - printf ("\n")); - } - for (index = cycle_top + 1; index <= dfn_depth; ++index) - { - child = dfn_stack[index].sym; - if (child->cg.cyc.head == child) - { - /* - * Not yet glommed anywhere, glom it and fix any - * children it has glommed. - */ - tail->cg.cyc.next = child; - child->cg.cyc.head = head; - DBG (DFNDEBUG, printf ("[find_cycle] glomming "); - print_name (child); - printf (" onto "); - print_name (head); - printf ("\n")); - for (tail = child; tail->cg.cyc.next; tail = tail->cg.cyc.next) - { - tail->cg.cyc.next->cg.cyc.head = head; - DBG (DFNDEBUG, printf ("[find_cycle] and its tail "); - print_name (tail->cg.cyc.next); - printf (" onto "); - print_name (head); - printf ("\n")); - } - } - else if (child->cg.cyc.head != head /* firewall */ ) - { - fprintf (stderr, "[find_cycle] glommed, but not to head\n"); - done (1); - } - } - } -} - - -/* - * Prepare for visiting the children of PARENT. Push a parent onto - * the stack and mark it busy. - */ -static void -DEFUN (pre_visit, (parent), Sym * parent) -{ - ++dfn_depth; - if (dfn_depth >= DFN_DEPTH) - { - fprintf (stderr, "[pre_visit] dfn_stack overflow\n"); - done (1); - } - dfn_stack[dfn_depth].sym = parent; - dfn_stack[dfn_depth].cycle_top = dfn_depth; - parent->cg.top_order = DFN_BUSY; - DBG (DFNDEBUG, printf ("[pre_visit]\t\t%d:", dfn_depth); - print_name (parent); - printf ("\n")); -} - - -/* - * Done with visiting node PARENT. Pop PARENT off dfn_stack - * and number functions if PARENT is head of a cycle. - */ -static void -DEFUN (post_visit, (parent), Sym * parent) -{ - Sym *member; - - DBG (DFNDEBUG, printf ("[post_visit]\t%d: ", dfn_depth); - print_name (parent); - printf ("\n")); - /* - * Number functions and things in their cycles unless the function - * is itself part of a cycle: - */ - if (parent->cg.cyc.head == parent) - { - ++dfn_counter; - for (member = parent; member; member = member->cg.cyc.next) - { - member->cg.top_order = dfn_counter; - DBG (DFNDEBUG, printf ("[post_visit]\t\tmember "); - print_name (member); - printf ("-> cg.top_order = %d\n", dfn_counter)); - } - } - else - { - DBG (DFNDEBUG, printf ("[post_visit]\t\tis part of a cycle\n")); - } - --dfn_depth; -} - - -/* - * Given this PARENT, depth first number its children. - */ -void -DEFUN (cg_dfn, (parent), Sym * parent) -{ - Arc *arc; - - DBG (DFNDEBUG, printf ("[dfn] dfn( "); - print_name (parent); - printf (")\n")); - /* - * If we're already numbered, no need to look any further: - */ - if (is_numbered (parent)) - { - return; - } - /* - * If we're already busy, must be a cycle: - */ - if (is_busy (parent)) - { - find_cycle (parent); - return; - } - pre_visit (parent); - /* - * Recursively visit children: - */ - for (arc = parent->cg.children; arc; arc = arc->next_child) - { - cg_dfn (arc->child); - } - post_visit (parent); -} diff --git a/gprof/cg_dfn.h b/gprof/cg_dfn.h deleted file mode 100644 index 4bd3030..0000000 --- a/gprof/cg_dfn.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef cg_dfn_h -#define cg_dfn_h - -/* - * Flags which mark a symbol as topologically ``busy'' or as - * topologically ``not_numbered'': - */ -#define DFN_BUSY -1 -#define DFN_NAN 0 - -/* - * Depth-first numbering of a call-graph. - */ - -extern void cg_dfn PARAMS ((Sym * root)); - -#endif /* cg_dfn_h */ diff --git a/gprof/cg_print.c b/gprof/cg_print.c deleted file mode 100644 index e645bc7..0000000 --- a/gprof/cg_print.c +++ /dev/null @@ -1,1276 +0,0 @@ -#include "libiberty.h" -#include "cg_arcs.h" -#include "cg_print.h" -#include "hist.h" -#include "utils.h" - -/* - * Return value of comparison functions used to sort tables: - */ -#define LESSTHAN -1 -#define EQUALTO 0 -#define GREATERTHAN 1 - -static void order_and_dump_functions_by_arcs PARAMS ((Arc **, unsigned long, - int, Arc **, - unsigned long *)); -/* declarations of automatically generated functions to output blurbs: */ -extern void bsd_callg_blurb PARAMS ((FILE * fp)); -extern void fsf_callg_blurb PARAMS ((FILE * fp)); - -double print_time = 0.0; - - -static void -DEFUN_VOID (print_header) -{ - if (first_output) - { - first_output = FALSE; - } - else - { - printf ("\f\n"); - } - if (!bsd_style_output) - { - if (print_descriptions) - { - printf (_("\t\t Call graph (explanation follows)\n\n")); - } - else - { - printf (_("\t\t\tCall graph\n\n")); - } - } - printf (_("\ngranularity: each sample hit covers %ld byte(s)"), - (long) hist_scale * sizeof (UNIT)); - if (print_time > 0.0) - { - printf (_(" for %.2f%% of %.2f seconds\n\n"), - 100.0 / print_time, print_time / hz); - } - else - { - printf (_(" no time propagated\n\n")); - /* - * This doesn't hurt, since all the numerators will be 0.0: - */ - print_time = 1.0; - } - if (bsd_style_output) - { - printf ("%6.6s %5.5s %7.7s %11.11s %7.7s/%-7.7s %-8.8s\n", - "", "", "", "", _("called"), _("total"), _("parents")); - printf ("%-6.6s %5.5s %7.7s %11.11s %7.7s+%-7.7s %-8.8s\t%5.5s\n", - _("index"), _("%time"), _("self"), _("descendents"), - _("called"), _("self"), _("name"), _("index")); - printf ("%6.6s %5.5s %7.7s %11.11s %7.7s/%-7.7s %-8.8s\n", - "", "", "", "", _("called"), _("total"), _("children")); - printf ("\n"); - } - else - { - printf (_("index %% time self children called name\n")); - } -} - - -/* - * Print a cycle header. - */ -static void -DEFUN (print_cycle, (cyc), Sym * cyc) -{ - char buf[BUFSIZ]; - - sprintf (buf, "[%d]", cyc->cg.index); - printf (bsd_style_output - ? "%-6.6s %5.1f %7.2f %11.2f %7lu" - : "%-6.6s %5.1f %7.2f %7.2f %7lu", buf, - 100 * (cyc->cg.prop.self + cyc->cg.prop.child) / print_time, - cyc->cg.prop.self / hz, cyc->cg.prop.child / hz, cyc->ncalls); - if (cyc->cg.self_calls != 0) - { - printf ("+%-7lu", cyc->cg.self_calls); - } - else - { - printf (" %7.7s", ""); - } - printf (_(" <cycle %d as a whole> [%d]\n"), cyc->cg.cyc.num, cyc->cg.index); -} - - -/* - * Compare LEFT and RIGHT membmer. Major comparison key is - * CG.PROP.SELF+CG.PROP.CHILD, secondary key is NCALLS+CG.SELF_CALLS. - */ -static int -DEFUN (cmp_member, (left, right), Sym * left AND Sym * right) -{ - double left_time = left->cg.prop.self + left->cg.prop.child; - double right_time = right->cg.prop.self + right->cg.prop.child; - unsigned long left_calls = left->ncalls + left->cg.self_calls; - unsigned long right_calls = right->ncalls + right->cg.self_calls; - - if (left_time > right_time) - { - return GREATERTHAN; - } - if (left_time < right_time) - { - return LESSTHAN; - } - - if (left_calls > right_calls) - { - return GREATERTHAN; - } - if (left_calls < right_calls) - { - return LESSTHAN; - } - return EQUALTO; -} - - -/* - * Sort members of a cycle. - */ -static void -DEFUN (sort_members, (cyc), Sym * cyc) -{ - Sym *todo, *doing, *prev; - /* - * Detach cycle members from cyclehead, and insertion sort them - * back on. - */ - todo = cyc->cg.cyc.next; - cyc->cg.cyc.next = 0; - for (doing = todo; doing && doing->cg.cyc.next; doing = todo) - { - todo = doing->cg.cyc.next; - for (prev = cyc; prev->cg.cyc.next; prev = prev->cg.cyc.next) - { - if (cmp_member (doing, prev->cg.cyc.next) == GREATERTHAN) - { - break; - } - } - doing->cg.cyc.next = prev->cg.cyc.next; - prev->cg.cyc.next = doing; - } -} - - -/* - * Print the members of a cycle. - */ -static void -DEFUN (print_members, (cyc), Sym * cyc) -{ - Sym *member; - - sort_members (cyc); - for (member = cyc->cg.cyc.next; member; member = member->cg.cyc.next) - { - printf (bsd_style_output - ? "%6.6s %5.5s %7.2f %11.2f %7lu" - : "%6.6s %5.5s %7.2f %7.2f %7lu", - "", "", member->cg.prop.self / hz, member->cg.prop.child / hz, - member->ncalls); - if (member->cg.self_calls != 0) - { - printf ("+%-7lu", member->cg.self_calls); - } - else - { - printf (" %7.7s", ""); - } - printf (" "); - print_name (member); - printf ("\n"); - } -} - - -/* - * Compare two arcs to/from the same child/parent. - * - if one arc is a self arc, it's least. - * - if one arc is within a cycle, it's less than. - * - if both arcs are within a cycle, compare arc counts. - * - if neither arc is within a cycle, compare with - * time + child_time as major key - * arc count as minor key - */ -static int -DEFUN (cmp_arc, (left, right), Arc * left AND Arc * right) -{ - Sym *left_parent = left->parent; - Sym *left_child = left->child; - Sym *right_parent = right->parent; - Sym *right_child = right->child; - double left_time, right_time; - - DBG (TIMEDEBUG, - printf ("[cmp_arc] "); - print_name (left_parent); - printf (" calls "); - print_name (left_child); - printf (" %f + %f %lu/%lu\n", left->time, left->child_time, - left->count, left_child->ncalls); - printf ("[cmp_arc] "); - print_name (right_parent); - printf (" calls "); - print_name (right_child); - printf (" %f + %f %lu/%lu\n", right->time, right->child_time, - right->count, right_child->ncalls); - printf ("\n"); - ); - if (left_parent == left_child) - { - return LESSTHAN; /* left is a self call */ - } - if (right_parent == right_child) - { - return GREATERTHAN; /* right is a self call */ - } - - if (left_parent->cg.cyc.num != 0 && left_child->cg.cyc.num != 0 - && left_parent->cg.cyc.num == left_child->cg.cyc.num) - { - /* left is a call within a cycle */ - if (right_parent->cg.cyc.num != 0 && right_child->cg.cyc.num != 0 - && right_parent->cg.cyc.num == right_child->cg.cyc.num) - { - /* right is a call within the cycle, too */ - if (left->count < right->count) - { - return LESSTHAN; - } - if (left->count > right->count) - { - return GREATERTHAN; - } - return EQUALTO; - } - else - { - /* right isn't a call within the cycle */ - return LESSTHAN; - } - } - else - { - /* left isn't a call within a cycle */ - if (right_parent->cg.cyc.num != 0 && right_child->cg.cyc.num != 0 - && right_parent->cg.cyc.num == right_child->cg.cyc.num) - { - /* right is a call within a cycle */ - return GREATERTHAN; - } - else - { - /* neither is a call within a cycle */ - left_time = left->time + left->child_time; - right_time = right->time + right->child_time; - if (left_time < right_time) - { - return LESSTHAN; - } - if (left_time > right_time) - { - return GREATERTHAN; - } - if (left->count < right->count) - { - return LESSTHAN; - } - if (left->count > right->count) - { - return GREATERTHAN; - } - return EQUALTO; - } - } -} - - -static void -DEFUN (sort_parents, (child), Sym * child) -{ - Arc *arc, *detached, sorted, *prev; - - /* - * Unlink parents from child, then insertion sort back on to - * sorted's parents. - * *arc the arc you have detached and are inserting. - * *detached the rest of the arcs to be sorted. - * sorted arc list onto which you insertion sort. - * *prev arc before the arc you are comparing. - */ - sorted.next_parent = 0; - for (arc = child->cg.parents; arc; arc = detached) - { - detached = arc->next_parent; - - /* consider *arc as disconnected; insert it into sorted: */ - for (prev = &sorted; prev->next_parent; prev = prev->next_parent) - { - if (cmp_arc (arc, prev->next_parent) != GREATERTHAN) - { - break; - } - } - arc->next_parent = prev->next_parent; - prev->next_parent = arc; - } - - /* reattach sorted arcs to child: */ - child->cg.parents = sorted.next_parent; -} - - -static void -DEFUN (print_parents, (child), Sym * child) -{ - Sym *parent; - Arc *arc; - Sym *cycle_head; - - if (child->cg.cyc.head != 0) - { - cycle_head = child->cg.cyc.head; - } - else - { - cycle_head = child; - } - if (!child->cg.parents) - { - printf (bsd_style_output - ? _("%6.6s %5.5s %7.7s %11.11s %7.7s %7.7s <spontaneous>\n") - : _("%6.6s %5.5s %7.7s %7.7s %7.7s %7.7s <spontaneous>\n"), - "", "", "", "", "", ""); - return; - } - sort_parents (child); - for (arc = child->cg.parents; arc; arc = arc->next_parent) - { - parent = arc->parent; - if (child == parent || (child->cg.cyc.num != 0 - && parent->cg.cyc.num == child->cg.cyc.num)) - { - /* selfcall or call among siblings: */ - printf (bsd_style_output - ? "%6.6s %5.5s %7.7s %11.11s %7lu %7.7s " - : "%6.6s %5.5s %7.7s %7.7s %7lu %7.7s ", - "", "", "", "", - arc->count, ""); - print_name (parent); - printf ("\n"); - } - else - { - /* regular parent of child: */ - printf (bsd_style_output - ? "%6.6s %5.5s %7.2f %11.2f %7lu/%-7lu " - : "%6.6s %5.5s %7.2f %7.2f %7lu/%-7lu ", - "", "", - arc->time / hz, arc->child_time / hz, - arc->count, cycle_head->ncalls); - print_name (parent); - printf ("\n"); - } - } -} - - -static void -DEFUN (sort_children, (parent), Sym * parent) -{ - Arc *arc, *detached, sorted, *prev; - /* - * Unlink children from parent, then insertion sort back on to - * sorted's children. - * *arc the arc you have detached and are inserting. - * *detached the rest of the arcs to be sorted. - * sorted arc list onto which you insertion sort. - * *prev arc before the arc you are comparing. - */ - sorted.next_child = 0; - for (arc = parent->cg.children; arc; arc = detached) - { - detached = arc->next_child; - - /* consider *arc as disconnected; insert it into sorted: */ - for (prev = &sorted; prev->next_child; prev = prev->next_child) - { - if (cmp_arc (arc, prev->next_child) != LESSTHAN) - { - break; - } - } - arc->next_child = prev->next_child; - prev->next_child = arc; - } - - /* reattach sorted children to parent: */ - parent->cg.children = sorted.next_child; -} - - -static void -DEFUN (print_children, (parent), Sym * parent) -{ - Sym *child; - Arc *arc; - - sort_children (parent); - arc = parent->cg.children; - for (arc = parent->cg.children; arc; arc = arc->next_child) - { - child = arc->child; - if (child == parent || (child->cg.cyc.num != 0 - && child->cg.cyc.num == parent->cg.cyc.num)) - { - /* self call or call to sibling: */ - printf (bsd_style_output - ? "%6.6s %5.5s %7.7s %11.11s %7lu %7.7s " - : "%6.6s %5.5s %7.7s %7.7s %7lu %7.7s ", - "", "", "", "", arc->count, ""); - print_name (child); - printf ("\n"); - } - else - { - /* regular child of parent: */ - printf (bsd_style_output - ? "%6.6s %5.5s %7.2f %11.2f %7lu/%-7lu " - : "%6.6s %5.5s %7.2f %7.2f %7lu/%-7lu ", - "", "", - arc->time / hz, arc->child_time / hz, - arc->count, child->cg.cyc.head->ncalls); - print_name (child); - printf ("\n"); - } - } -} - - -static void -DEFUN (print_line, (np), Sym * np) -{ - char buf[BUFSIZ]; - - sprintf (buf, "[%d]", np->cg.index); - printf (bsd_style_output - ? "%-6.6s %5.1f %7.2f %11.2f" - : "%-6.6s %5.1f %7.2f %7.2f", buf, - 100 * (np->cg.prop.self + np->cg.prop.child) / print_time, - np->cg.prop.self / hz, np->cg.prop.child / hz); - if ((np->ncalls + np->cg.self_calls) != 0) - { - printf (" %7lu", np->ncalls); - if (np->cg.self_calls != 0) - { - printf ("+%-7lu ", np->cg.self_calls); - } - else - { - printf (" %7.7s ", ""); - } - } - else - { - printf (" %7.7s %7.7s ", "", ""); - } - print_name (np); - printf ("\n"); -} - - -/* - * Print dynamic call graph. - */ -void -DEFUN (cg_print, (timesortsym), Sym ** timesortsym) -{ - unsigned int index; - Sym *parent; - - if (print_descriptions && bsd_style_output) - { - bsd_callg_blurb (stdout); - } - - print_header (); - - for (index = 0; index < symtab.len + num_cycles; ++index) - { - parent = timesortsym[index]; - if ((ignore_zeros && parent->ncalls == 0 - && parent->cg.self_calls == 0 && parent->cg.prop.self == 0 - && parent->cg.prop.child == 0) - || !parent->cg.print_flag - || (line_granularity && ! parent->is_func)) - { - continue; - } - if (!parent->name && parent->cg.cyc.num != 0) - { - /* cycle header: */ - print_cycle (parent); - print_members (parent); - } - else - { - print_parents (parent); - print_line (parent); - print_children (parent); - } - if (bsd_style_output) - printf ("\n"); - printf ("-----------------------------------------------\n"); - if (bsd_style_output) - printf ("\n"); - } - free (timesortsym); - if (print_descriptions && !bsd_style_output) - { - fsf_callg_blurb (stdout); - } -} - - -static int -DEFUN (cmp_name, (left, right), const PTR left AND const PTR right) -{ - const Sym **npp1 = (const Sym **) left; - const Sym **npp2 = (const Sym **) right; - - return strcmp ((*npp1)->name, (*npp2)->name); -} - - -void -DEFUN_VOID (cg_print_index) -{ - unsigned int index; - unsigned int nnames, todo, i, j; - int col, starting_col; - Sym **name_sorted_syms, *sym; - const char *filename; - char buf[20]; - int column_width = (output_width - 1) / 3; /* don't write in last col! */ - /* - * Now, sort regular function name alphabetically to create an - * index: - */ - name_sorted_syms = (Sym **) xmalloc ((symtab.len + num_cycles) * sizeof (Sym *)); - for (index = 0, nnames = 0; index < symtab.len; index++) - { - if (ignore_zeros && symtab.base[index].ncalls == 0 - && symtab.base[index].hist.time == 0) - { - continue; - } - name_sorted_syms[nnames++] = &symtab.base[index]; - } - qsort (name_sorted_syms, nnames, sizeof (Sym *), cmp_name); - for (index = 1, todo = nnames; index <= num_cycles; index++) - { - name_sorted_syms[todo++] = &cycle_header[index]; - } - printf ("\f\n"); - printf (_("Index by function name\n\n")); - index = (todo + 2) / 3; - for (i = 0; i < index; i++) - { - col = 0; - starting_col = 0; - for (j = i; j < todo; j += index) - { - sym = name_sorted_syms[j]; - if (sym->cg.print_flag) - { - sprintf (buf, "[%d]", sym->cg.index); - } - else - { - sprintf (buf, "(%d)", sym->cg.index); - } - if (j < nnames) - { - if (bsd_style_output) - { - printf ("%6.6s %-19.19s", buf, sym->name); - } - else - { - col += strlen (buf); - for (; col < starting_col + 5; ++col) - { - putchar (' '); - } - printf (" %s ", buf); - col += print_name_only (sym); - if (!line_granularity && sym->is_static && sym->file) - { - filename = sym->file->name; - if (!print_path) - { - filename = strrchr (filename, '/'); - if (filename) - { - ++filename; - } - else - { - filename = sym->file->name; - } - } - printf (" (%s)", filename); - col += strlen (filename) + 3; - } - } - } - else - { - if (bsd_style_output) - { - printf ("%6.6s ", buf); - sprintf (buf, _("<cycle %d>"), sym->cg.cyc.num); - printf ("%-19.19s", buf); - } - else - { - col += strlen (buf); - for (; col < starting_col + 5; ++col) - putchar (' '); - printf (" %s ", buf); - sprintf (buf, _("<cycle %d>"), sym->cg.cyc.num); - printf ("%s", buf); - col += strlen (buf); - } - } - starting_col += column_width; - } - printf ("\n"); - } - free (name_sorted_syms); -} - -/* Compare two arcs based on their usage counts. We want to sort - in descending order. */ -static int -DEFUN (cmp_arc_count, (left, right), const PTR left AND const PTR right) -{ - const Arc **npp1 = (const Arc **) left; - const Arc **npp2 = (const Arc **) right; - - if ((*npp1)->count > (*npp2)->count) - return -1; - else if ((*npp1)->count < (*npp2)->count) - return 1; - else - return 0; -} - -/* Compare two funtions based on their usage counts. We want to sort - in descending order. */ -static int -DEFUN (cmp_fun_nuses, (left, right), const PTR left AND const PTR right) -{ - const Sym **npp1 = (const Sym **) left; - const Sym **npp2 = (const Sym **) right; - - if ((*npp1)->nuses > (*npp2)->nuses) - return -1; - else if ((*npp1)->nuses < (*npp2)->nuses) - return 1; - else - return 0; -} - -/* Print a suggested function ordering based on the profiling data. - - We perform 4 major steps when ordering functions: - - * Group unused functions together and place them at the - end of the function order. - - * Search the highest use arcs (those which account for 90% of - the total arc count) for functions which have several parents. - - Group those with the most call sites together (currently the - top 1.25% which have at least five different call sites). - - These are emitted at the start of the function order. - - * Use a greedy placement algorithm to place functions which - occur in the top 99% of the arcs in the profile. Some provisions - are made to handle high usage arcs where the parent and/or - child has already been placed. - - * Run the same greedy placement algorithm on the remaining - arcs to place the leftover functions. - - - The various "magic numbers" should (one day) be tuneable by command - line options. They were arrived at by benchmarking a few applications - with various values to see which values produced better overall function - orderings. - - Of course, profiling errors, machine limitations (PA long calls), and - poor cutoff values for the placement algorithm may limit the usefullness - of the resulting function order. Improvements would be greatly appreciated. - - Suggestions: - - * Place the functions with many callers near the middle of the - list to reduce long calls. - - * Propagate arc usage changes as functions are placed. Ie if - func1 and func2 are placed together, arcs to/from those arcs - to the same parent/child should be combined, then resort the - arcs to choose the next one. - - * Implement some global positioning algorithm to place the - chains made by the greedy local positioning algorithm. Probably - by examining arcs which haven't been placed yet to tie two - chains together. - - * Take a function's size and time into account in the algorithm; - size in particular is important on the PA (long calls). Placing - many small functions onto their own page may be wise. - - * Use better profiling information; many published algorithms - are based on call sequences through time, rather than just - arc counts. - - * Prodecure cloning could improve performance when a small number - of arcs account for most of the calls to a particular function. - - * Use relocation information to avoid moving unused functions - completely out of the code stream; this would avoid severe lossage - when the profile data bears little resemblance to actual runs. - - * Propagation of arc usages should also improve .o link line - ordering which shares the same arc placement algorithm with - the function ordering code (in fact it is a degenerate case - of function ordering). */ - -void -DEFUN_VOID (cg_print_function_ordering) -{ - unsigned long index, used, unused, scratch_index; - unsigned long unplaced_arc_count, high_arc_count, scratch_arc_count; -#ifdef __GNUC__ - unsigned long long total_arcs, tmp_arcs_count; -#else - unsigned long total_arcs, tmp_arcs_count; -#endif - Sym **unused_syms, **used_syms, **scratch_syms; - Arc **unplaced_arcs, **high_arcs, **scratch_arcs; - - index = 0; - used = 0; - unused = 0; - scratch_index = 0; - unplaced_arc_count = 0; - high_arc_count = 0; - scratch_arc_count = 0; - - /* First group all the unused functions together. */ - unused_syms = (Sym **) xmalloc (symtab.len * sizeof (Sym *)); - used_syms = (Sym **) xmalloc (symtab.len * sizeof (Sym *)); - scratch_syms = (Sym **) xmalloc (symtab.len * sizeof (Sym *)); - high_arcs = (Arc **) xmalloc (numarcs * sizeof (Arc *)); - scratch_arcs = (Arc **) xmalloc (numarcs * sizeof (Arc *)); - unplaced_arcs = (Arc **) xmalloc (numarcs * sizeof (Arc *)); - - /* Walk through all the functions; mark those which are never - called as placed (we'll emit them as a group later). */ - for (index = 0, used = 0, unused = 0; index < symtab.len; index++) - { - if (symtab.base[index].ncalls == 0) - { - /* Filter out gprof generated names. */ - if (strcmp (symtab.base[index].name, "<locore>") - && strcmp (symtab.base[index].name, "<hicore>")) - { - unused_syms[unused++] = &symtab.base[index]; - symtab.base[index].has_been_placed = 1; - } - } - else - { - used_syms[used++] = &symtab.base[index]; - symtab.base[index].has_been_placed = 0; - symtab.base[index].next = 0; - symtab.base[index].prev = 0; - symtab.base[index].nuses = 0; - } - } - - /* Sort the arcs from most used to least used. */ - qsort (arcs, numarcs, sizeof (Arc *), cmp_arc_count); - - /* Compute the total arc count. Also mark arcs as unplaced. - - Note we don't compensate for overflow if that happens! - Overflow is much less likely when this file is compiled - with GCC as it can double-wide integers via long long. */ - total_arcs = 0; - for (index = 0; index < numarcs; index++) - { - total_arcs += arcs[index]->count; - arcs[index]->has_been_placed = 0; - } - - /* We want to pull out those functions which are referenced - by many highly used arcs and emit them as a group. This - could probably use some tuning. */ - tmp_arcs_count = 0; - for (index = 0; index < numarcs; index++) - { - tmp_arcs_count += arcs[index]->count; - - /* Count how many times each parent and child are used up - to our threshhold of arcs (90%). */ - if ((double)tmp_arcs_count / (double)total_arcs > 0.90) - break; - - arcs[index]->child->nuses++; - } - - /* Now sort a temporary symbol table based on the number of - times each function was used in the highest used arcs. */ - memcpy (scratch_syms, used_syms, used * sizeof (Sym *)); - qsort (scratch_syms, used, sizeof (Sym *), cmp_fun_nuses); - - /* Now pick out those symbols we're going to emit as - a group. We take up to 1.25% of the used symbols. */ - for (index = 0; index < used / 80; index++) - { - Sym *sym = scratch_syms[index]; - Arc *arc; - - /* If we hit symbols that aren't used from many call sites, - then we can quit. We choose five as the low limit for - no particular reason. */ - if (sym->nuses == 5) - break; - - /* We're going to need the arcs between these functions. - Unfortunately, we don't know all these functions - until we're done. So we keep track of all the arcs - to the functions we care about, then prune out those - which are uninteresting. - - An interesting variation would be to quit when we found - multi-call site functions which account for some percentage - of the arcs. */ - - arc = sym->cg.children; - while (arc) - { - if (arc->parent != arc->child) - scratch_arcs[scratch_arc_count++] = arc; - arc->has_been_placed = 1; - arc = arc->next_child; - } - - arc = sym->cg.parents; - while (arc) - { - if (arc->parent != arc->child) - scratch_arcs[scratch_arc_count++] = arc; - arc->has_been_placed = 1; - arc = arc->next_parent; - } - - /* Keep track of how many symbols we're going to place. */ - scratch_index = index; - - /* A lie, but it makes identifying these functions easier - later. */ - sym->has_been_placed = 1; - } - - /* Now walk through the temporary arcs and copy those we care about - into the high arcs array. */ - for (index = 0; index < scratch_arc_count; index++) - { - Arc *arc = scratch_arcs[index]; - - /* If this arc refers to highly used functions, then - then we want to keep it. */ - if (arc->child->has_been_placed - && arc->parent->has_been_placed) - { - high_arcs[high_arc_count++] = scratch_arcs[index]; - - /* We need to turn of has_been_placed since we're going to - use the main arc placement algorithm on these arcs. */ - arc->child->has_been_placed = 0; - arc->parent->has_been_placed = 0; - } - } - - /* Dump the multi-site high usage functions which are not going - to be ordered by the main ordering algorithm. */ - for (index = 0; index < scratch_index; index++) - { - if (scratch_syms[index]->has_been_placed) - printf ("%s\n", scratch_syms[index]->name); - } - - /* Now we can order the multi-site high use functions based on the - arcs between them. */ - qsort (high_arcs, high_arc_count, sizeof (Arc *), cmp_arc_count); - order_and_dump_functions_by_arcs (high_arcs, high_arc_count, 1, - unplaced_arcs, &unplaced_arc_count); - - /* Order and dump the high use functions left, these typically - have only a few call sites. */ - order_and_dump_functions_by_arcs (arcs, numarcs, 0, - unplaced_arcs, &unplaced_arc_count); - - /* Now place the rarely used functions. */ - order_and_dump_functions_by_arcs (unplaced_arcs, unplaced_arc_count, 1, - scratch_arcs, &scratch_arc_count); - - /* Output any functions not emitted by the order_and_dump calls. */ - for (index = 0; index < used; index++) - if (used_syms[index]->has_been_placed == 0) - printf("%s\n", used_syms[index]->name); - - /* Output the unused functions. */ - for (index = 0; index < unused; index++) - printf("%s\n", unused_syms[index]->name); - - unused_syms = (Sym **) xmalloc (symtab.len * sizeof (Sym *)); - used_syms = (Sym **) xmalloc (symtab.len * sizeof (Sym *)); - scratch_syms = (Sym **) xmalloc (symtab.len * sizeof (Sym *)); - high_arcs = (Arc **) xmalloc (numarcs * sizeof (Arc *)); - scratch_arcs = (Arc **) xmalloc (numarcs * sizeof (Arc *)); - unplaced_arcs = (Arc **) xmalloc (numarcs * sizeof (Arc *)); - - free (unused_syms); - free (used_syms); - free (scratch_syms); - free (high_arcs); - free (scratch_arcs); - free (unplaced_arcs); -} - -/* Place functions based on the arcs in ARCS with NUMARCS entries; - place unused arcs into UNPLACED_ARCS/UNPLACED_ARC_COUNT. - - If ALL is nonzero, then place all functions referenced by ARCS, - else only place those referenced in the top 99% of the arcs in ARCS. */ - -#define MOST 0.99 -static void -order_and_dump_functions_by_arcs (arcs, numarcs, all, - unplaced_arcs, unplaced_arc_count) - Arc **arcs; - unsigned long numarcs; - int all; - Arc **unplaced_arcs; - unsigned long *unplaced_arc_count; -{ -#ifdef __GNUC__ - unsigned long long tmp_arcs, total_arcs; -#else - unsigned long tmp_arcs, total_arcs; -#endif - unsigned int index; - - /* If needed, compute the total arc count. - - Note we don't compensate for overflow if that happens! */ - if (! all) - { - total_arcs = 0; - for (index = 0; index < numarcs; index++) - total_arcs += arcs[index]->count; - } - else - total_arcs = 0; - - tmp_arcs = 0; - for (index = 0; index < numarcs; index++) - { - Sym *sym1, *sym2; - Sym *child, *parent; - - tmp_arcs += arcs[index]->count; - - /* Ignore this arc if it's already been placed. */ - if (arcs[index]->has_been_placed) - continue; - - child = arcs[index]->child; - parent = arcs[index]->parent; - - /* If we're not using all arcs, and this is a rarely used - arc, then put it on the unplaced_arc list. Similarly - if both the parent and child of this arc have been placed. */ - if ((! all && (double)tmp_arcs / (double)total_arcs > MOST) - || child->has_been_placed || parent->has_been_placed) - { - unplaced_arcs[(*unplaced_arc_count)++] = arcs[index]; - continue; - } - - /* If all slots in the parent and child are full, then there isn't - anything we can do right now. We'll place this arc on the - unplaced arc list in the hope that a global positioning - algorithm can use it to place function chains. */ - if (parent->next && parent->prev && child->next && child->prev) - { - unplaced_arcs[(*unplaced_arc_count)++] = arcs[index]; - continue; - } - - /* If the parent is unattached, then find the closest - place to attach it onto child's chain. Similarly - for the opposite case. */ - if (!parent->next && !parent->prev) - { - int next_count = 0; - int prev_count = 0; - Sym *prev = child; - Sym *next = child; - - /* Walk to the beginning and end of the child's chain. */ - while (next->next) - { - next = next->next; - next_count++; - } - - while (prev->prev) - { - prev = prev->prev; - prev_count++; - } - - /* Choose the closest. */ - child = next_count < prev_count ? next : prev; - } - else if (! child->next && !child->prev) - { - int next_count = 0; - int prev_count = 0; - Sym *prev = parent; - Sym *next = parent; - - while (next->next) - { - next = next->next; - next_count++; - } - - while (prev->prev) - { - prev = prev->prev; - prev_count++; - } - - parent = prev_count < next_count ? prev : next; - } - else - { - /* Couldn't find anywhere to attach the functions, - put the arc on the unplaced arc list. */ - unplaced_arcs[(*unplaced_arc_count)++] = arcs[index]; - continue; - } - - /* Make sure we don't tie two ends together. */ - sym1 = parent; - if (sym1->next) - while (sym1->next) - sym1 = sym1->next; - else - while (sym1->prev) - sym1 = sym1->prev; - - sym2 = child; - if (sym2->next) - while (sym2->next) - sym2 = sym2->next; - else - while (sym2->prev) - sym2 = sym2->prev; - - if (sym1 == child - && sym2 == parent) - { - /* This would tie two ends together. */ - unplaced_arcs[(*unplaced_arc_count)++] = arcs[index]; - continue; - } - - if (parent->next) - { - /* Must attach to the parent's prev field. */ - if (! child->next) - { - /* parent-prev and child-next */ - parent->prev = child; - child->next = parent; - arcs[index]->has_been_placed = 1; - } - } - else if (parent->prev) - { - /* Must attach to the parent's next field. */ - if (! child->prev) - { - /* parent-next and child-prev */ - parent->next = child; - child->prev = parent; - arcs[index]->has_been_placed = 1; - } - } - else - { - /* Can attach to either field in the parent, depends - on where we've got space in the child. */ - if (child->prev) - { - /* parent-prev and child-next */ - parent->prev = child; - child->next = parent; - arcs[index]->has_been_placed = 1; - } - else - { - /* parent-next and child-prev */ - parent->next = child; - child->prev = parent; - arcs[index]->has_been_placed = 1; - } - } - } - - /* Dump the chains of functions we've made. */ - for (index = 0; index < numarcs; index++) - { - Sym *sym; - if (arcs[index]->parent->has_been_placed - || arcs[index]->child->has_been_placed) - continue; - - sym = arcs[index]->parent; - - /* If this symbol isn't attached to any other - symbols, then we've got a rarely used arc. - - Skip it for now, we'll deal with them later. */ - if (sym->next == NULL - && sym->prev == NULL) - continue; - - /* Get to the start of this chain. */ - while (sym->prev) - sym = sym->prev; - - while (sym) - { - /* Mark it as placed. */ - sym->has_been_placed = 1; - printf ("%s\n", sym->name); - sym = sym->next; - } - } - - /* If we want to place all the arcs, then output those which weren't - placed by the main algorithm. */ - if (all) - for (index = 0; index < numarcs; index++) - { - Sym *sym; - if (arcs[index]->parent->has_been_placed - || arcs[index]->child->has_been_placed) - continue; - - sym = arcs[index]->parent; - - sym->has_been_placed = 1; - printf ("%s\n", sym->name); - } -} - -/* Print a suggested .o ordering for files on a link line based - on profiling information. This uses the function placement - code for the bulk of its work. */ - -struct function_map { - char *function_name; - char *file_name; -}; - -void -DEFUN_VOID (cg_print_file_ordering) -{ - unsigned long scratch_arc_count, index; - Arc **scratch_arcs; - extern struct function_map *symbol_map; - extern unsigned int symbol_map_count; - char *last; - - scratch_arc_count = 0; - - scratch_arcs = (Arc **) xmalloc (numarcs * sizeof (Arc *)); - for (index = 0; index < numarcs; index++) - { - if (! arcs[index]->parent->mapped - || ! arcs[index]->child->mapped) - arcs[index]->has_been_placed = 1; - } - - order_and_dump_functions_by_arcs (arcs, numarcs, 0, - scratch_arcs, &scratch_arc_count); - - /* Output .o's not handled by the main placement algorithm. */ - for (index = 0; index < symtab.len; index++) - { - if (symtab.base[index].mapped - && ! symtab.base[index].has_been_placed) - printf ("%s\n", symtab.base[index].name); - } - - /* Now output any .o's that didn't have any text symbols. */ - last = NULL; - for (index = 0; index < symbol_map_count; index++) - { - unsigned int index2; - - /* Don't bother searching if this symbol is the - same as the previous one. */ - if (last && !strcmp (last, symbol_map[index].file_name)) - continue; - - for (index2 = 0; index2 < symtab.len; index2++) - { - if (! symtab.base[index2].mapped) - continue; - - if (!strcmp (symtab.base[index2].name, symbol_map[index].file_name)) - break; - } - - /* If we didn't find it in the symbol table, then it must be a .o - with no text symbols. Output it last. */ - if (index2 == symtab.len) - printf ("%s\n", symbol_map[index].file_name); - last = symbol_map[index].file_name; - } -} diff --git a/gprof/cg_print.h b/gprof/cg_print.h deleted file mode 100644 index 782c4aa..0000000 --- a/gprof/cg_print.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef cg_print_h -#define cg_print_h - -#include "gprof.h" -#include "symtab.h" - -extern double print_time; /* total of time being printed */ - -extern void cg_print PARAMS ((Sym ** cg)); -extern void cg_print_index PARAMS ((void)); -extern void cg_print_file_ordering PARAMS ((void)); -extern void cg_print_function_ordering PARAMS ((void)); - -#endif /* cg_print_h */ diff --git a/gprof/configure b/gprof/configure deleted file mode 100755 index 7ce6a1d..0000000 --- a/gprof/configure +++ /dev/null @@ -1,4405 +0,0 @@ -#! /bin/sh - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Do all the work for Automake. This macro actually does too much -- -# some checks are only needed if your package does certain things. -# But this isn't really a big deal. - -# serial 1 - - - - - -# serial 1 - - - -# -# Check to make sure that the build environment is sane. -# - - - - - - -# serial 25 AM_PROG_LIBTOOL - - -# AM_ENABLE_SHARED - implement the --enable-shared flag -# Usage: AM_ENABLE_SHARED[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. - - -# AM_DISABLE_SHARED - set the default shared flag to --disable-shared - - -# AM_DISABLE_STATIC - set the default static flag to --disable-static - - -# AM_ENABLE_STATIC - implement the --enable-static flag -# Usage: AM_ENABLE_STATIC[(DEFAULT)] -# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to -# `yes'. - - - -# AM_PROG_LD - find the path to the GNU or non-GNU linker - - - - -# AM_PROG_NM - find the path to a BSD-compatible name lister - - -# AM_SYS_LIBTOOL_CYGWIN32 - find tools needed on cygwin32 - - -# Like AC_CONFIG_HEADER, but automatically create stamp file. - - - -# This file is derived from `gettext.m4'. The difference is that the -# included macros assume Cygnus-style source and build trees. - -# Macro to add for using GNU gettext. -# Ulrich Drepper <drepper@cygnus.com>, 1995. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 3 - - - - - -# Search path for a program which passes the given test. -# Ulrich Drepper <drepper@cygnus.com>, 1996. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 1 - - - -# Check whether LC_MESSAGES is available in <locale.h>. -# Ulrich Drepper <drepper@cygnus.com>, 1995. -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -# serial 1 - - - -# Add --enable-maintainer-mode option to configure. -# From Jim Meyering - -# serial 1 - - - -# Check to see if we're running under Cygwin32, without using -# AC_CANONICAL_*. If so, set output variable CYGWIN32 to "yes". -# Otherwise set it to "no". - - - -# Check to see if we're running under Win32, without using -# AC_CANONICAL_*. If so, set output variable EXEEXT to ".exe". -# Otherwise set it to "". - - - -# Check to see if we're running under Mingw, without using -# AC_CANONICAL_*. If so, set output variable MINGW32 to "yes". -# Otherwise set it to "no". - - - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.12.2 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --enable-shared[=PKGS] build shared libraries [default=yes]" -ac_help="$ac_help - --enable-static[=PKGS] build static libraries [default=yes]" -ac_help="$ac_help - --with-gnu-ld assume the C compiler uses GNU ld [default=no]" -ac_help="$ac_help - --disable-nls do not use Native Language Support" -ac_help="$ac_help - --with-included-gettext use the GNU gettext library included here" -ac_help="$ac_help - --enable-maintainer-mode enable make rules and dependencies not useful - (and sometimes confusing) to the casual installer" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.12.2" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=gprof.c - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - - -# Do some error checking and defaulting for the host and target type. -# The inputs are: -# configure --host=HOST --target=TARGET --build=BUILD NONOPT -# -# The rules are: -# 1. You are not allowed to specify --host, --target, and nonopt at the -# same time. -# 2. Host defaults to nonopt. -# 3. If nonopt is not specified, then host defaults to the current host, -# as determined by config.guess. -# 4. Target and build default to nonopt. -# 5. If nonopt is not specified, then target and build default to host. - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -case $host---$target---$nonopt in -NONE---*---* | *---NONE---* | *---*---NONE) ;; -*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;; -esac - - -# Make sure we can run config.sub. -if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : -else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } -fi - -echo $ac_n "checking host system type""... $ac_c" 1>&6 -echo "configure:998: checking host system type" >&5 - -host_alias=$host -case "$host_alias" in -NONE) - case $nonopt in - NONE) - if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then : - else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; } - fi ;; - *) host_alias=$nonopt ;; - esac ;; -esac - -host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias` -host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$host" 1>&6 - -echo $ac_n "checking target system type""... $ac_c" 1>&6 -echo "configure:1019: checking target system type" >&5 - -target_alias=$target -case "$target_alias" in -NONE) - case $nonopt in - NONE) target_alias=$host_alias ;; - *) target_alias=$nonopt ;; - esac ;; -esac - -target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias` -target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$target" 1>&6 - -echo $ac_n "checking build system type""... $ac_c" 1>&6 -echo "configure:1037: checking build system type" >&5 - -build_alias=$build -case "$build_alias" in -NONE) - case $nonopt in - NONE) build_alias=$host_alias ;; - *) build_alias=$nonopt ;; - esac ;; -esac - -build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias` -build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` -echo "$ac_t""$build" 1>&6 - -test "$host_alias" != "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:1072: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:1128: checking whether build environment is sane" >&5 -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "$*" != "X $srcdir/configure conftestfile" \ - && test "$*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { echo "configure: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" 1>&2; exit 1; } - fi - - test "$2" = conftestfile - ) -then - # Ok. - : -else - { echo "configure: error: newly created file is older than distributed files! -Check your system clock" 1>&2; exit 1; } -fi -rm -f conftest* -echo "$ac_t""yes" 1>&6 -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:1185: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - - -PACKAGE=gprof - -VERSION=2.9.4 - -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } -fi -cat >> confdefs.h <<EOF -#define PACKAGE "$PACKAGE" -EOF - -cat >> confdefs.h <<EOF -#define VERSION "$VERSION" -EOF - - - -missing_dir=`cd $ac_aux_dir && pwd` -echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:1231: checking for working aclocal" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (aclocal --version) < /dev/null > /dev/null 2>&1; then - ACLOCAL=aclocal - echo "$ac_t""found" 1>&6 -else - ACLOCAL="$missing_dir/missing aclocal" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:1244: checking for working autoconf" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (autoconf --version) < /dev/null > /dev/null 2>&1; then - AUTOCONF=autoconf - echo "$ac_t""found" 1>&6 -else - AUTOCONF="$missing_dir/missing autoconf" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:1257: checking for working automake" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (automake --version) < /dev/null > /dev/null 2>&1; then - AUTOMAKE=automake - echo "$ac_t""found" 1>&6 -else - AUTOMAKE="$missing_dir/missing automake" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:1270: checking for working autoheader" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (autoheader --version) < /dev/null > /dev/null 2>&1; then - AUTOHEADER=autoheader - echo "$ac_t""found" 1>&6 -else - AUTOHEADER="$missing_dir/missing autoheader" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:1283: checking for working makeinfo" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (makeinfo --version) < /dev/null > /dev/null 2>&1; then - MAKEINFO=makeinfo - echo "$ac_t""found" 1>&6 -else - MAKEINFO="$missing_dir/missing makeinfo" - echo "$ac_t""missing" 1>&6 -fi - - - -# Check whether --enable-shared or --disable-shared was given. -if test "${enable_shared+set}" = set; then - enableval="$enable_shared" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_shared=yes ;; -no) enable_shared=no ;; -*) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_shared=yes -fi - -# Check whether --enable-static or --disable-static was given. -if test "${enable_static+set}" = set; then - enableval="$enable_static" - p=${PACKAGE-default} -case "$enableval" in -yes) enable_static=yes ;; -no) enable_static=no ;; -*) - enable_static=no - # Look at the argument we got. We use all the common list separators. - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," - for pkg in $enableval; do - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$ac_save_ifs" - ;; -esac -else - enable_static=yes -fi - -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1346: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1376: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1406: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1457: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:1489: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 1500 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:1505: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:1531: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:1536: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <<EOF -#ifdef __GNUC__ - yes; -#endif -EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1545: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:1564: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - -# Check whether --with-gnu-ld or --without-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval="$with_gnu_ld" - test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no -fi - - -ac_prog=ld -if test "$ac_cv_prog_gcc" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6 -echo "configure:1608: checking for ld used by GCC" >&5 - ac_prog=`($CC -print-prog-name=ld) 2>&5` - case "$ac_prog" in - # Accept absolute paths. - /* | [A-Za-z]:\\*) - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - echo $ac_n "checking for GNU ld""... $ac_c" 1>&6 -echo "configure:1626: checking for GNU ld" >&5 -else - echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 -echo "configure:1629: checking for non-GNU ld" >&5 -fi -if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -z "$LD"; then - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog"; then - ac_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some GNU ld's only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then - test "$with_gnu_ld" != no && break - else - test "$with_gnu_ld" != yes && break - fi - fi - done - IFS="$ac_save_ifs" -else - ac_cv_path_LD="$LD" # Let the user override the test with a path. -fi -fi - -LD="$ac_cv_path_LD" -if test -n "$LD"; then - echo "$ac_t""$LD" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi -test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; } - -echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6 -echo "configure:1665: checking if the linker ($LD) is GNU ld" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # I'd rather use --version here, but apparently some GNU ld's only accept -v. -if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then - ac_cv_prog_gnu_ld=yes -else - ac_cv_prog_gnu_ld=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6 - - -echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6 -echo "configure:1681: checking for BSD-compatible nm" >&5 -if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$NM"; then - # Let the user override the test. - ac_cv_path_NM="$NM" -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/nm; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -B" - elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then - ac_cv_path_NM="$ac_dir/nm -p" - else - ac_cv_path_NM="$ac_dir/nm" - fi - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm -fi -fi - -NM="$ac_cv_path_NM" -echo "$ac_t""$NM" 1>&6 - - -echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 -echo "configure:1716: checking whether ln -s works" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - rm -f conftestdata -if ln -s X conftestdata 2>/dev/null -then - rm -f conftestdata - ac_cv_prog_LN_S="ln -s" -else - ac_cv_prog_LN_S=ln -fi -fi -LN_S="$ac_cv_prog_LN_S" -if test "$ac_cv_prog_LN_S" = "ln -s"; then - echo "$ac_t""yes" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test $host != $build; then - ac_tool_prefix=${host_alias}- -else - ac_tool_prefix= -fi - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - -# Check for any special flags to pass to ltconfig. -libtool_flags= -test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared" -test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static" -test "$silent" = yes && libtool_flags="$libtool_flags --silent" -test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc" -test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld" - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case "$host" in -*-*-irix6*) - # Find out which ABI we are using. - echo '#line 1758 "configure"' > conftest.$ac_ext - if { (eval echo configure:1759: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - case "`/usr/bin/file conftest.o`" in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - CFLAGS="$CFLAGS -belf" - ;; - -*-*-cygwin32*) - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1784: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -DLLTOOL="$ac_cv_prog_DLLTOOL" -if test -n "$DLLTOOL"; then - echo "$ac_t""$DLLTOOL" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_DLLTOOL"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1816: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_DLLTOOL'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_DLLTOOL="dlltool" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_DLLTOOL" && ac_cv_prog_DLLTOOL="false" -fi -fi -DLLTOOL="$ac_cv_prog_DLLTOOL" -if test -n "$DLLTOOL"; then - echo "$ac_t""$DLLTOOL" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - DLLTOOL="false" -fi -fi - -# Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. -set dummy ${ac_tool_prefix}as; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1851: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AS="${ac_tool_prefix}as" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -AS="$ac_cv_prog_AS" -if test -n "$AS"; then - echo "$ac_t""$AS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - -if test -z "$ac_cv_prog_AS"; then -if test -n "$ac_tool_prefix"; then - # Extract the first word of "as", so it can be a program name with args. -set dummy as; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1883: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$AS"; then - ac_cv_prog_AS="$AS" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_AS="as" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_AS" && ac_cv_prog_AS="false" -fi -fi -AS="$ac_cv_prog_AS" -if test -n "$AS"; then - echo "$ac_t""$AS" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -else - AS="false" -fi -fi - - - ;; - -esac - -# Actually configure libtool. ac_aux_dir is where install-sh is found. -CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \ -LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \ -DLLTOOL="$DLLTOOL" AS="$AS" \ -${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig --no-reexec \ -$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \ -|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; } - -# Redirect the config.log output again, so that the ltconfig log is not -# clobbered by the next message. -exec 5>>./config.log - - - - - - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1940: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1970: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:2021: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:2053: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 2064 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:2069: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:2095: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:2100: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <<EOF -#ifdef __GNUC__ - yes; -#endif -EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2109: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:2128: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - - -echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 -echo "configure:2164: checking for POSIXized ISC" >&5 -if test -d /etc/conf/kconfig.d && - grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 -then - echo "$ac_t""yes" 1>&6 - ISC=yes # If later tests want to check for ISC. - cat >> confdefs.h <<\EOF -#define _POSIX_SOURCE 1 -EOF - - if test "$GCC" = yes; then - CC="$CC -posix" - else - CC="$CC -Xp" - fi -else - echo "$ac_t""no" 1>&6 - ISC= -fi - - -ALL_LINGUAS= -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:2187: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext <<EOF -#line 2202 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2208: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext <<EOF -#line 2219 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2225: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -nologo -E" - cat > conftest.$ac_ext <<EOF -#line 2236 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2242: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:2267: checking for ANSI C header files" >&5 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2272 "configure" -#include "confdefs.h" -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <float.h> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2280: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext <<EOF -#line 2297 "configure" -#include "confdefs.h" -#include <string.h> -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext <<EOF -#line 2315 "configure" -#include "confdefs.h" -#include <stdlib.h> -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat > conftest.$ac_ext <<EOF -#line 2336 "configure" -#include "confdefs.h" -#include <ctype.h> -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -if { (eval echo configure:2347: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* -fi - -fi -fi - -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:2371: checking for working const" >&5 -if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2376 "configure" -#include "confdefs.h" - -int main() { - -/* Ultrix mips cc rejects this. */ -typedef int charset[2]; const charset x; -/* SunOS 4.1.1 cc rejects this. */ -char const *const *ccp; -char **p; -/* NEC SVR4.0.2 mips cc rejects this. */ -struct point {int x, y;}; -static struct point const zero = {0,0}; -/* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in an arm - of an if-expression whose if-part is not a constant expression */ -const char *g = "string"; -ccp = &g + (g ? g-g : 0); -/* HPUX 7.0 cc rejects these. */ -++ccp; -p = (char**) ccp; -ccp = (char const *const *) p; -{ /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; -} -{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; -} -{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; -} -{ /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; -} -{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -} - -; return 0; } -EOF -if { (eval echo configure:2425: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_c_const=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_c_const=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_c_const" 1>&6 -if test $ac_cv_c_const = no; then - cat >> confdefs.h <<\EOF -#define const -EOF - -fi - -echo $ac_n "checking for inline""... $ac_c" 1>&6 -echo "configure:2446: checking for inline" >&5 -if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_cv_c_inline=no -for ac_kw in inline __inline__ __inline; do - cat > conftest.$ac_ext <<EOF -#line 2453 "configure" -#include "confdefs.h" - -int main() { -} $ac_kw foo() { -; return 0; } -EOF -if { (eval echo configure:2460: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_c_inline=$ac_kw; break -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -done - -fi - -echo "$ac_t""$ac_cv_c_inline" 1>&6 -case "$ac_cv_c_inline" in - inline | yes) ;; - no) cat >> confdefs.h <<\EOF -#define inline -EOF - ;; - *) cat >> confdefs.h <<EOF -#define inline $ac_cv_c_inline -EOF - ;; -esac - -echo $ac_n "checking for off_t""... $ac_c" 1>&6 -echo "configure:2486: checking for off_t" >&5 -if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2491 "configure" -#include "confdefs.h" -#include <sys/types.h> -#if STDC_HEADERS -#include <stdlib.h> -#include <stddef.h> -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_off_t=yes -else - rm -rf conftest* - ac_cv_type_off_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_off_t" 1>&6 -if test $ac_cv_type_off_t = no; then - cat >> confdefs.h <<\EOF -#define off_t long -EOF - -fi - -echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:2519: checking for size_t" >&5 -if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2524 "configure" -#include "confdefs.h" -#include <sys/types.h> -#if STDC_HEADERS -#include <stdlib.h> -#include <stddef.h> -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_size_t=yes -else - rm -rf conftest* - ac_cv_type_size_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_size_t" 1>&6 -if test $ac_cv_type_size_t = no; then - cat >> confdefs.h <<\EOF -#define size_t unsigned -EOF - -fi - -# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works -# for constant arguments. Useless! -echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6 -echo "configure:2554: checking for working alloca.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2559 "configure" -#include "confdefs.h" -#include <alloca.h> -int main() { -char *p = alloca(2 * sizeof(int)); -; return 0; } -EOF -if { (eval echo configure:2566: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_header_alloca_h=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_alloca_h=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_header_alloca_h" 1>&6 -if test $ac_cv_header_alloca_h = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA_H 1 -EOF - -fi - -echo $ac_n "checking for alloca""... $ac_c" 1>&6 -echo "configure:2587: checking for alloca" >&5 -if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2592 "configure" -#include "confdefs.h" - -#ifdef __GNUC__ -# define alloca __builtin_alloca -#else -# ifdef _MSC_VER -# include <malloc.h> -# define alloca _alloca -# else -# if HAVE_ALLOCA_H -# include <alloca.h> -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -# endif -#endif - -int main() { -char *p = (char *) alloca(1); -; return 0; } -EOF -if { (eval echo configure:2620: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_func_alloca_works=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_func_alloca_works=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_func_alloca_works" 1>&6 -if test $ac_cv_func_alloca_works = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_ALLOCA 1 -EOF - -fi - -if test $ac_cv_func_alloca_works = no; then - # The SVR3 libPW and SVR4 libucb both contain incompatible functions - # that cause trouble. Some versions do not even contain alloca or - # contain a buggy version. If you still want to use their alloca, - # use ar to extract alloca.o from them instead of compiling alloca.c. - ALLOCA=alloca.${ac_objext} - cat >> confdefs.h <<\EOF -#define C_ALLOCA 1 -EOF - - -echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 -echo "configure:2652: checking whether alloca needs Cray hooks" >&5 -if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2657 "configure" -#include "confdefs.h" -#if defined(CRAY) && ! defined(CRAY2) -webecray -#else -wenotbecray -#endif - -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "webecray" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_os_cray=yes -else - rm -rf conftest* - ac_cv_os_cray=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_os_cray" 1>&6 -if test $ac_cv_os_cray = yes; then -for ac_func in _getb67 GETB67 getb67; do - echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2682: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2687 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2710: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<EOF -#define CRAY_STACKSEG_END $ac_func -EOF - - break -else - echo "$ac_t""no" 1>&6 -fi - -done -fi - -echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 -echo "configure:2737: checking stack direction for C alloca" >&5 -if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_stack_direction=0 -else - cat > conftest.$ac_ext <<EOF -#line 2745 "configure" -#include "confdefs.h" -find_stack_direction () -{ - static char *addr = 0; - auto char dummy; - if (addr == 0) - { - addr = &dummy; - return find_stack_direction (); - } - else - return (&dummy > addr) ? 1 : -1; -} -main () -{ - exit (find_stack_direction() < 0); -} -EOF -if { (eval echo configure:2764: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_c_stack_direction=1 -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_c_stack_direction=-1 -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$ac_cv_c_stack_direction" 1>&6 -cat >> confdefs.h <<EOF -#define STACK_DIRECTION $ac_cv_c_stack_direction -EOF - -fi - -for ac_hdr in unistd.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:2789: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2794 "configure" -#include "confdefs.h" -#include <$ac_hdr> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2799: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <<EOF -#define $ac_tr_hdr 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - -for ac_func in getpagesize -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2828: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2833 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:2856: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $ac_tr_func 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - -echo $ac_n "checking for working mmap""... $ac_c" 1>&6 -echo "configure:2881: checking for working mmap" >&5 -if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_func_mmap_fixed_mapped=no -else - cat > conftest.$ac_ext <<EOF -#line 2889 "configure" -#include "confdefs.h" - -/* Thanks to Mike Haertel and Jim Avera for this test. - Here is a matrix of mmap possibilities: - mmap private not fixed - mmap private fixed at somewhere currently unmapped - mmap private fixed at somewhere already mapped - mmap shared not fixed - mmap shared fixed at somewhere currently unmapped - mmap shared fixed at somewhere already mapped - For private mappings, we should verify that changes cannot be read() - back from the file, nor mmap's back from the file at a different - address. (There have been systems where private was not correctly - implemented like the infamous i386 svr4.0, and systems where the - VM page cache was not coherent with the filesystem buffer cache - like early versions of FreeBSD and possibly contemporary NetBSD.) - For shared mappings, we should conversely verify that changes get - propogated back to all the places they're supposed to be. - - Grep wants private fixed already mapped. - The main things grep needs to know about mmap are: - * does it exist and is it safe to write into the mmap'd area - * how to use it (BSD variants) */ -#include <sys/types.h> -#include <fcntl.h> -#include <sys/mman.h> - -/* This mess was copied from the GNU getpagesize.h. */ -#ifndef HAVE_GETPAGESIZE -# ifdef HAVE_UNISTD_H -# include <unistd.h> -# endif - -/* Assume that all systems that can run configure have sys/param.h. */ -# ifndef HAVE_SYS_PARAM_H -# define HAVE_SYS_PARAM_H 1 -# endif - -# ifdef _SC_PAGESIZE -# define getpagesize() sysconf(_SC_PAGESIZE) -# else /* no _SC_PAGESIZE */ -# ifdef HAVE_SYS_PARAM_H -# include <sys/param.h> -# ifdef EXEC_PAGESIZE -# define getpagesize() EXEC_PAGESIZE -# else /* no EXEC_PAGESIZE */ -# ifdef NBPG -# define getpagesize() NBPG * CLSIZE -# ifndef CLSIZE -# define CLSIZE 1 -# endif /* no CLSIZE */ -# else /* no NBPG */ -# ifdef NBPC -# define getpagesize() NBPC -# else /* no NBPC */ -# ifdef PAGESIZE -# define getpagesize() PAGESIZE -# endif /* PAGESIZE */ -# endif /* no NBPC */ -# endif /* no NBPG */ -# endif /* no EXEC_PAGESIZE */ -# else /* no HAVE_SYS_PARAM_H */ -# define getpagesize() 8192 /* punt totally */ -# endif /* no HAVE_SYS_PARAM_H */ -# endif /* no _SC_PAGESIZE */ - -#endif /* no HAVE_GETPAGESIZE */ - -#ifdef __cplusplus -extern "C" { void *malloc(unsigned); } -#else -char *malloc(); -#endif - -int -main() -{ - char *data, *data2, *data3; - int i, pagesize; - int fd; - - pagesize = getpagesize(); - - /* - * First, make a file with some known garbage in it. - */ - data = malloc(pagesize); - if (!data) - exit(1); - for (i = 0; i < pagesize; ++i) - *(data + i) = rand(); - umask(0); - fd = creat("conftestmmap", 0600); - if (fd < 0) - exit(1); - if (write(fd, data, pagesize) != pagesize) - exit(1); - close(fd); - - /* - * Next, try to mmap the file at a fixed address which - * already has something else allocated at it. If we can, - * also make sure that we see the same garbage. - */ - fd = open("conftestmmap", O_RDWR); - if (fd < 0) - exit(1); - data2 = malloc(2 * pagesize); - if (!data2) - exit(1); - data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1); - if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_FIXED, fd, 0L)) - exit(1); - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data2 + i)) - exit(1); - - /* - * Finally, make sure that changes to the mapped area - * do not percolate back to the file as seen by read(). - * (This is a bug on some variants of i386 svr4.0.) - */ - for (i = 0; i < pagesize; ++i) - *(data2 + i) = *(data2 + i) + 1; - data3 = malloc(pagesize); - if (!data3) - exit(1); - if (read(fd, data3, pagesize) != pagesize) - exit(1); - for (i = 0; i < pagesize; ++i) - if (*(data + i) != *(data3 + i)) - exit(1); - close(fd); - unlink("conftestmmap"); - exit(0); -} - -EOF -if { (eval echo configure:3029: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - ac_cv_func_mmap_fixed_mapped=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_func_mmap_fixed_mapped=no -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6 -if test $ac_cv_func_mmap_fixed_mapped = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_MMAP 1 -EOF - -fi - - - for ac_hdr in argz.h limits.h locale.h nl_types.h malloc.h string.h \ -unistd.h values.h sys/param.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:3057: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3062 "configure" -#include "confdefs.h" -#include <$ac_hdr> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3067: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <<EOF -#define $ac_tr_hdr 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - - for ac_func in getcwd munmap putenv setenv setlocale strchr strcasecmp \ -__argz_count __argz_stringify __argz_next -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3097: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3102 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3125: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $ac_tr_func 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - - - if test "${ac_cv_func_stpcpy+set}" != "set"; then - for ac_func in stpcpy -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3154: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3159 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3182: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $ac_tr_func 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - - fi - if test "${ac_cv_func_stpcpy}" = "yes"; then - cat >> confdefs.h <<\EOF -#define HAVE_STPCPY 1 -EOF - - fi - - if test $ac_cv_header_locale_h = yes; then - echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6 -echo "configure:3216: checking for LC_MESSAGES" >&5 -if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3221 "configure" -#include "confdefs.h" -#include <locale.h> -int main() { -return LC_MESSAGES -; return 0; } -EOF -if { (eval echo configure:3228: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - am_cv_val_LC_MESSAGES=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - am_cv_val_LC_MESSAGES=no -fi -rm -f conftest* -fi - -echo "$ac_t""$am_cv_val_LC_MESSAGES" 1>&6 - if test $am_cv_val_LC_MESSAGES = yes; then - cat >> confdefs.h <<\EOF -#define HAVE_LC_MESSAGES 1 -EOF - - fi - fi - echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6 -echo "configure:3249: checking whether NLS is requested" >&5 - # Check whether --enable-nls or --disable-nls was given. -if test "${enable_nls+set}" = set; then - enableval="$enable_nls" - USE_NLS=$enableval -else - USE_NLS=yes -fi - - echo "$ac_t""$USE_NLS" 1>&6 - - - USE_INCLUDED_LIBINTL=no - - if test "$USE_NLS" = "yes"; then - cat >> confdefs.h <<\EOF -#define ENABLE_NLS 1 -EOF - - echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6 -echo "configure:3269: checking whether included gettext is requested" >&5 - # Check whether --with-included-gettext or --without-included-gettext was given. -if test "${with_included_gettext+set}" = set; then - withval="$with_included_gettext" - nls_cv_force_use_gnu_gettext=$withval -else - nls_cv_force_use_gnu_gettext=no -fi - - echo "$ac_t""$nls_cv_force_use_gnu_gettext" 1>&6 - - nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" - if test "$nls_cv_force_use_gnu_gettext" != "yes"; then - nls_cv_header_intl= - nls_cv_header_libgt= - CATOBJEXT=NONE - - ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for libintl.h""... $ac_c" 1>&6 -echo "configure:3288: checking for libintl.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3293 "configure" -#include "confdefs.h" -#include <libintl.h> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3298: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6 -echo "configure:3315: checking for gettext in libc" >&5 -if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3320 "configure" -#include "confdefs.h" -#include <libintl.h> -int main() { -return (int) gettext ("") -; return 0; } -EOF -if { (eval echo configure:3327: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - gt_cv_func_gettext_libc=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - gt_cv_func_gettext_libc=no -fi -rm -f conftest* -fi - -echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6 - - if test "$gt_cv_func_gettext_libc" != "yes"; then - echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6 -echo "configure:3343: checking for bindtextdomain in -lintl" >&5 -ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lintl $LIBS" -cat > conftest.$ac_ext <<EOF -#line 3351 "configure" -#include "confdefs.h" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char bindtextdomain(); - -int main() { -bindtextdomain() -; return 0; } -EOF -if { (eval echo configure:3362: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6 -echo "configure:3378: checking for gettext in libintl" >&5 -if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3383 "configure" -#include "confdefs.h" - -int main() { -return (int) gettext ("") -; return 0; } -EOF -if { (eval echo configure:3390: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - gt_cv_func_gettext_libintl=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - gt_cv_func_gettext_libintl=no -fi -rm -f conftest* -fi - -echo "$ac_t""$gt_cv_func_gettext_libintl" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - fi - - if test "$gt_cv_func_gettext_libc" = "yes" \ - || test "$gt_cv_func_gettext_libintl" = "yes"; then - cat >> confdefs.h <<\EOF -#define HAVE_GETTEXT 1 -EOF - - # Extract the first word of "msgfmt", so it can be a program name with args. -set dummy msgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3418: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$MSGFMT" in - /*) - ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then - ac_cv_path_MSGFMT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" - ;; -esac -fi -MSGFMT="$ac_cv_path_MSGFMT" -if test -n "$MSGFMT"; then - echo "$ac_t""$MSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - if test "$MSGFMT" != "no"; then - for ac_func in dcgettext -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:3452: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3457 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:3480: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $ac_tr_func 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - - # Extract the first word of "gmsgfmt", so it can be a program name with args. -set dummy gmsgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3507: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$GMSGFMT" in - /*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_GMSGFMT="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" - ;; -esac -fi -GMSGFMT="$ac_cv_path_GMSGFMT" -if test -n "$GMSGFMT"; then - echo "$ac_t""$GMSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - # Extract the first word of "xgettext", so it can be a program name with args. -set dummy xgettext; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3543: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$XGETTEXT" in - /*) - ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then - ac_cv_path_XGETTEXT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" - ;; -esac -fi -XGETTEXT="$ac_cv_path_XGETTEXT" -if test -n "$XGETTEXT"; then - echo "$ac_t""$XGETTEXT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - cat > conftest.$ac_ext <<EOF -#line 3575 "configure" -#include "confdefs.h" - -int main() { -extern int _nl_msg_cat_cntr; - return _nl_msg_cat_cntr -; return 0; } -EOF -if { (eval echo configure:3583: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - CATOBJEXT=.gmo - DATADIRNAME=share -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CATOBJEXT=.mo - DATADIRNAME=lib -fi -rm -f conftest* - INSTOBJEXT=.mo - fi - fi - -else - echo "$ac_t""no" 1>&6 -fi - - - - if test "$CATOBJEXT" = "NONE"; then - nls_cv_use_gnu_gettext=yes - fi - fi - - if test "$nls_cv_use_gnu_gettext" = "yes"; then - INTLOBJS="\$(GETTOBJS)" - # Extract the first word of "msgfmt", so it can be a program name with args. -set dummy msgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3615: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$MSGFMT" in - /*) - ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then - ac_cv_path_MSGFMT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="msgfmt" - ;; -esac -fi -MSGFMT="$ac_cv_path_MSGFMT" -if test -n "$MSGFMT"; then - echo "$ac_t""$MSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - # Extract the first word of "gmsgfmt", so it can be a program name with args. -set dummy gmsgfmt; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3649: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$GMSGFMT" in - /*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. - ;; - ?:/*) - ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a dos path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_path_GMSGFMT="$ac_dir/$ac_word" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" - ;; -esac -fi -GMSGFMT="$ac_cv_path_GMSGFMT" -if test -n "$GMSGFMT"; then - echo "$ac_t""$GMSGFMT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - # Extract the first word of "xgettext", so it can be a program name with args. -set dummy xgettext; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:3685: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - case "$XGETTEXT" in - /*) - ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. - ;; - *) - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" - for ac_dir in $PATH; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then - ac_cv_path_XGETTEXT="$ac_dir/$ac_word" - break - fi - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" - ;; -esac -fi -XGETTEXT="$ac_cv_path_XGETTEXT" -if test -n "$XGETTEXT"; then - echo "$ac_t""$XGETTEXT" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - - USE_INCLUDED_LIBINTL=yes - CATOBJEXT=.gmo - INSTOBJEXT=.mo - DATADIRNAME=share - INTLDEPS='$(top_builddir)/../intl/libintl.a' - INTLLIBS=$INTLDEPS - LIBS=`echo $LIBS | sed -e 's/-lintl//'` - nls_cv_header_intl=libintl.h - nls_cv_header_libgt=libgettext.h - fi - - if test "$XGETTEXT" != ":"; then - if $XGETTEXT --omit-header /dev/null 2> /dev/null; then - : ; - else - echo "$ac_t""found xgettext programs is not GNU xgettext; ignore it" 1>&6 - XGETTEXT=":" - fi - fi - - # We need to process the po/ directory. - POSUB=po - else - DATADIRNAME=share - nls_cv_header_intl=libintl.h - nls_cv_header_libgt=libgettext.h - fi - - # If this is used in GNU gettext we have to set USE_NLS to `yes' - # because some of the sources are only built for this goal. - if test "$PACKAGE" = gettext; then - USE_NLS=yes - USE_INCLUDED_LIBINTL=yes - fi - - for lang in $ALL_LINGUAS; do - GMOFILES="$GMOFILES $lang.gmo" - POFILES="$POFILES $lang.po" - done - - - - - - - - - - - - - - - if test "x$CATOBJEXT" != "x"; then - if test "x$ALL_LINGUAS" = "x"; then - LINGUAS= - else - echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6 -echo "configure:3775: checking for catalogs to be installed" >&5 - NEW_LINGUAS= - for lang in ${LINGUAS=$ALL_LINGUAS}; do - case "$ALL_LINGUAS" in - *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; - esac - done - LINGUAS=$NEW_LINGUAS - echo "$ac_t""$LINGUAS" 1>&6 - fi - - if test -n "$LINGUAS"; then - for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done - fi - fi - - if test $ac_cv_header_locale_h = yes; then - INCLUDE_LOCALE_H="#include <locale.h>" - else - INCLUDE_LOCALE_H="\ -/* The system does not provide the header <locale.h>. Take care yourself. */" - fi - - - if test -f $srcdir/po2tbl.sed.in; then - if test "$CATOBJEXT" = ".cat"; then - ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6 -echo "configure:3803: checking for linux/version.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3808 "configure" -#include "confdefs.h" -#include <linux/version.h> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:3813: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - msgformat=linux -else - echo "$ac_t""no" 1>&6 -msgformat=xopen -fi - - - sed -e '/^#/d' $srcdir/$msgformat-msg.sed > po2msg.sed - fi - sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \ - $srcdir/po2tbl.sed.in > po2tbl.sed - fi - - if test "$PACKAGE" = "gettext"; then - GT_NO="#NO#" - GT_YES= - else - GT_NO= - GT_YES="#YES#" - fi - - - - MKINSTALLDIRS="\$(srcdir)/../../mkinstalldirs" - - - l= - - - if test -d $srcdir/po; then - test -d po || mkdir po - if test "x$srcdir" != "x."; then - if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then - posrcprefix="$srcdir/" - else - posrcprefix="../$srcdir/" - fi - else - posrcprefix="../" - fi - rm -f po/POTFILES - sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ - < $srcdir/po/POTFILES.in > po/POTFILES - fi - - -case "${target}" in -*-*-bsd4.4* | *-*-netbsd* | *-*-freebsd* | *-*-openbsd* \ -| *-*-cygwin* | *-*-mingw32 | *-*-win32 ) - cat >> confdefs.h <<\EOF -#define BSD44_FORMAT 1 -EOF - - ;; -esac - -echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 -echo "configure:3886: checking whether to enable maintainer-specific portions of Makefiles" >&5 - # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. -if test "${enable_maintainer_mode+set}" = set; then - enableval="$enable_maintainer_mode" - USE_MAINTAINER_MODE=$enableval -else - USE_MAINTAINER_MODE=no -fi - - echo "$ac_t""$USE_MAINTAINER_MODE" 1>&6 - if test $USE_MAINTAINER_MODE = yes; then - MAINT= - else - MAINT='#M#' - fi - - -echo $ac_n "checking for Cygwin32 environment""... $ac_c" 1>&6 -echo "configure:3904: checking for Cygwin32 environment" >&5 -if eval "test \"`echo '$''{'am_cv_cygwin32'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3909 "configure" -#include "confdefs.h" - -int main() { -return __CYGWIN32__; -; return 0; } -EOF -if { (eval echo configure:3916: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - am_cv_cygwin32=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - am_cv_cygwin32=no -fi -rm -f conftest* -rm -f conftest* -fi - -echo "$ac_t""$am_cv_cygwin32" 1>&6 -CYGWIN32= -test "$am_cv_cygwin32" = yes && CYGWIN32=yes -echo $ac_n "checking for Mingw32 environment""... $ac_c" 1>&6 -echo "configure:3933: checking for Mingw32 environment" >&5 -if eval "test \"`echo '$''{'am_cv_mingw32'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 3938 "configure" -#include "confdefs.h" - -int main() { -return __MINGW32__; -; return 0; } -EOF -if { (eval echo configure:3945: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - am_cv_mingw32=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - am_cv_mingw32=no -fi -rm -f conftest* -rm -f conftest* -fi - -echo "$ac_t""$am_cv_mingw32" 1>&6 -MINGW32= -test "$am_cv_mingw32" = yes && MINGW32=yes - - -echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 -echo "configure:3964: checking for executable suffix" >&5 -if eval "test \"`echo '$''{'am_cv_exeext'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$CYGWIN32" = yes || test "$MINGW32" = yes; then -am_cv_exeext=.exe -else -cat > am_c_test.c << 'EOF' -int main() { -/* Nothing needed here */ -} -EOF -${CC-cc} -o am_c_test $CFLAGS $CPPFLAGS $LDFLAGS am_c_test.c $LIBS 1>&5 -am_cv_exeext= -for file in am_c_test.*; do - case $file in - *.c) ;; - *.o) ;; - *) am_cv_exeext=`echo $file | sed -e s/am_c_test//` ;; - esac -done -rm -f am_c_test* -fi - -test x"${am_cv_exeext}" = x && am_cv_exeext=no -fi -EXEEXT="" -test x"${am_cv_exeext}" != xno && EXEEXT=${am_cv_exeext} -echo "$ac_t""${am_cv_exeext}" 1>&6 - - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS <<EOF -#! /bin/sh -# Generated automatically by configure. -# Run this file to recreate the current configuration. -# This directory was configured as follows, -# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.12.2" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile po/Makefile.in:po/Make-in gconfig.h:gconfig.in" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS <<EOF - -# Protect against being on the right side of a sed subst in config.status. -sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; - s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@host@%$host%g -s%@host_alias@%$host_alias%g -s%@host_cpu@%$host_cpu%g -s%@host_vendor@%$host_vendor%g -s%@host_os@%$host_os%g -s%@target@%$target%g -s%@target_alias@%$target_alias%g -s%@target_cpu@%$target_cpu%g -s%@target_vendor@%$target_vendor%g -s%@target_os@%$target_os%g -s%@build@%$build%g -s%@build_alias@%$build_alias%g -s%@build_cpu@%$build_cpu%g -s%@build_vendor@%$build_vendor%g -s%@build_os@%$build_os%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@PACKAGE@%$PACKAGE%g -s%@VERSION@%$VERSION%g -s%@ACLOCAL@%$ACLOCAL%g -s%@AUTOCONF@%$AUTOCONF%g -s%@AUTOMAKE@%$AUTOMAKE%g -s%@AUTOHEADER@%$AUTOHEADER%g -s%@MAKEINFO@%$MAKEINFO%g -s%@SET_MAKE@%$SET_MAKE%g -s%@RANLIB@%$RANLIB%g -s%@CC@%$CC%g -s%@LD@%$LD%g -s%@NM@%$NM%g -s%@LN_S@%$LN_S%g -s%@LIBTOOL@%$LIBTOOL%g -s%@DLLTOOL@%$DLLTOOL%g -s%@AS@%$AS%g -s%@CPP@%$CPP%g -s%@ALLOCA@%$ALLOCA%g -s%@USE_NLS@%$USE_NLS%g -s%@MSGFMT@%$MSGFMT%g -s%@GMSGFMT@%$GMSGFMT%g -s%@XGETTEXT@%$XGETTEXT%g -s%@USE_INCLUDED_LIBINTL@%$USE_INCLUDED_LIBINTL%g -s%@CATALOGS@%$CATALOGS%g -s%@CATOBJEXT@%$CATOBJEXT%g -s%@DATADIRNAME@%$DATADIRNAME%g -s%@GMOFILES@%$GMOFILES%g -s%@INSTOBJEXT@%$INSTOBJEXT%g -s%@INTLDEPS@%$INTLDEPS%g -s%@INTLLIBS@%$INTLLIBS%g -s%@INTLOBJS@%$INTLOBJS%g -s%@POFILES@%$POFILES%g -s%@POSUB@%$POSUB%g -s%@INCLUDE_LOCALE_H@%$INCLUDE_LOCALE_H%g -s%@GT_NO@%$GT_NO%g -s%@GT_YES@%$GT_YES%g -s%@MKINSTALLDIRS@%$MKINSTALLDIRS%g -s%@l@%$l%g -s%@MAINT@%$MAINT%g -s%@EXEEXT@%$EXEEXT%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <<EOF - -CONFIG_FILES=\${CONFIG_FILES-"Makefile po/Makefile.in:po/Make-in"} -EOF -cat >> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -if test "${CONFIG_HEADERS+set}" != set; then -EOF -cat >> $CONFIG_STATUS <<EOF - CONFIG_HEADERS="gconfig.h:gconfig.in" -EOF -cat >> $CONFIG_STATUS <<\EOF -fi -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - cat $ac_file_inputs > conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - fi - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - -EOF -cat >> $CONFIG_STATUS <<EOF - - -EOF -cat >> $CONFIG_STATUS <<\EOF -test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h -sed -e '/POTFILES =/r po/POTFILES' po/Makefile.in > po/Makefile -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/gprof/configure.bat b/gprof/configure.bat deleted file mode 100644 index 22ef37e..0000000 --- a/gprof/configure.bat +++ /dev/null @@ -1,18 +0,0 @@ -@echo off
-echo Configuring gprof for go32
-rem This batch file assumes a unix-type "sed" program
-
-echo # Makefile generated by "configure.bat"> Makefile
-
-if exist config.sed del config.sed
-
-echo "/^###$/ i\ ">>config.sed
-echo "MY_MACHINE=i386\ ">>config.sed
-echo "CC=gcc ">>config.sed
-
-echo # >> config.sed
-
-sed -e "s/^\"//" -e "s/\"$//" -e "s/[ ]*$//" config.sed > config2.sed
-sed -f config2.sed Makefile.in >> Makefile
-del config.sed
-del config2.sed
diff --git a/gprof/configure.in b/gprof/configure.in deleted file mode 100644 index 90c53a3..0000000 --- a/gprof/configure.in +++ /dev/null @@ -1,40 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_PREREQ(2.5)dnl -AC_INIT(gprof.c) - -AC_CANONICAL_SYSTEM - -AM_INIT_AUTOMAKE(gprof, 2.9.4) - -AM_PROG_LIBTOOL - -dnl For simplicity, we use the BFD configuration file for most -dnl things. However, we also need our own configuration file for -dnl the automake PACKAGE and VERSION macros. We don't name it -dnl config.h, to avoid any possible confusion with the bfd config.h. -AM_CONFIG_HEADER(gconfig.h:gconfig.in) - -AC_PROG_CC -AM_PROG_INSTALL - -AC_ISC_POSIX - -ALL_LINGUAS= -CY_GNU_GETTEXT - -dnl We need to set BSD44_FORMAT on a host which uses the additional -dnl header fields. This is an attempt to do that. I can't think of a -dnl good feature test for this. -case "${target}" in -*-*-bsd4.4* | *-*-netbsd* | *-*-freebsd* | *-*-openbsd* \ -| *-*-cygwin* | *-*-mingw32 | *-*-win32 ) - AC_DEFINE(BSD44_FORMAT) - ;; -esac - -AM_MAINTAINER_MODE -AM_CYGWIN32 -AM_EXEEXT - -AC_OUTPUT(Makefile po/Makefile.in:po/Make-in, -[sed -e '/POTFILES =/r po/POTFILES' po/Makefile.in > po/Makefile]) diff --git a/gprof/corefile.c b/gprof/corefile.c deleted file mode 100644 index 3f3468b..0000000 --- a/gprof/corefile.c +++ /dev/null @@ -1,737 +0,0 @@ -#include "libiberty.h" -#include "gprof.h" -#include "corefile.h" -#include "symtab.h" - -bfd *core_bfd; -int core_num_syms; -asymbol **core_syms; -asection *core_text_sect; -PTR core_text_space; - -int min_insn_size; -int offset_to_code; - -/* For mapping symbols to specific .o files during file ordering. */ -struct function_map { - char *function_name; - char *file_name; -}; - -struct function_map *symbol_map; -unsigned int symbol_map_count; - -extern void i386_find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); -extern void alpha_find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); -extern void vax_find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); -extern void tahoe_find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); -extern void sparc_find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); - -static void -DEFUN (read_function_mappings, (filename), const char *filename) -{ - FILE *file = fopen (filename, "r"); - char dummy[1024]; - int count = 0; - - if (!file) - { - fprintf (stderr, _("%s: could not open %s.\n"), whoami, filename); - done (1); - } - - /* First parse the mapping file so we know how big we need to - make our tables. We also do some sanity checks at this - time. */ - while (!feof (file)) - { - int matches; - - matches = fscanf (file, "%[^\n:]", dummy); - if (!matches) - { - fprintf (stderr, _("%s: unable to parse mapping file %s.\n"), - whoami, filename); - done (1); - } - - /* Just skip messages about files with no symbols. */ - if (!strncmp (dummy, "No symbols in ", 14)) - { - fscanf (file, "\n"); - continue; - } - - /* Don't care what else is on this line at this point. */ - fscanf (file, "%[^\n]\n", dummy); - count++; - } - - /* Now we know how big we need to make our table. */ - symbol_map = ((struct function_map *) - xmalloc (count * sizeof (struct function_map))); - - /* Rewind the input file so we can read it again. */ - rewind (file); - - /* Read each entry and put it into the table. */ - count = 0; - while (!feof (file)) - { - int matches; - char *tmp; - - matches = fscanf (file, "%[^\n:]", dummy); - if (!matches) - { - fprintf (stderr, _("%s: unable to parse mapping file %s.\n"), - whoami, filename); - done (1); - } - - /* Just skip messages about files with no symbols. */ - if (!strncmp (dummy, "No symbols in ", 14)) - { - fscanf (file, "\n"); - continue; - } - - /* dummy has the filename, go ahead and copy it. */ - symbol_map[count].file_name = xmalloc (strlen (dummy) + 1); - strcpy (symbol_map[count].file_name, dummy); - - /* Now we need the function name. */ - fscanf (file, "%[^\n]\n", dummy); - tmp = strrchr (dummy, ' ') + 1; - symbol_map[count].function_name = xmalloc (strlen (tmp) + 1); - strcpy (symbol_map[count].function_name, tmp); - count++; - } - - /* Record the size of the map table for future reference. */ - symbol_map_count = count; -} - -void -DEFUN (core_init, (a_out_name), const char *a_out_name) -{ - core_bfd = bfd_openr (a_out_name, 0); - - if (!core_bfd) - { - perror (a_out_name); - done (1); - } - - if (!bfd_check_format (core_bfd, bfd_object)) - { - fprintf (stderr, _("%s: %s: not in a.out format\n"), whoami, a_out_name); - done (1); - } - - /* get core's text section: */ - core_text_sect = bfd_get_section_by_name (core_bfd, ".text"); - if (!core_text_sect) - { - core_text_sect = bfd_get_section_by_name (core_bfd, "$CODE$"); - if (!core_text_sect) - { - fprintf (stderr, _("%s: can't find .text section in %s\n"), - whoami, a_out_name); - done (1); - } - } - - /* read core's symbol table: */ - - /* this will probably give us more than we need, but that's ok: */ - core_num_syms = bfd_get_symtab_upper_bound (core_bfd); - if (core_num_syms < 0) - { - fprintf (stderr, "%s: %s: %s\n", whoami, a_out_name, - bfd_errmsg (bfd_get_error ())); - done (1); - } - - core_syms = (asymbol **) xmalloc (core_num_syms); - core_num_syms = bfd_canonicalize_symtab (core_bfd, core_syms); - if (core_num_syms < 0) - { - fprintf (stderr, "%s: %s: %s\n", whoami, a_out_name, - bfd_errmsg (bfd_get_error ())); - done (1); - } - - min_insn_size = 1; - offset_to_code = 0; - - switch (bfd_get_arch (core_bfd)) - { - case bfd_arch_vax: - case bfd_arch_tahoe: - offset_to_code = 2; - break; - - case bfd_arch_alpha: - min_insn_size = 4; - break; - - default: - break; - } - - if (function_mapping_file) - read_function_mappings (function_mapping_file); -} - - -/* - * Read in the text space of an a.out file - */ -void -DEFUN (core_get_text_space, (core_bfd), bfd * core_bfd) -{ - core_text_space = (PTR) malloc (core_text_sect->_raw_size); - - if (!core_text_space) - { - fprintf (stderr, _("%s: ran out room for %ld bytes of text space\n"), - whoami, core_text_sect->_raw_size); - done (1); - } - if (!bfd_get_section_contents (core_bfd, core_text_sect, core_text_space, - 0, core_text_sect->_raw_size)) - { - bfd_perror ("bfd_get_section_contents"); - free (core_text_space); - core_text_space = 0; - } - if (!core_text_space) - { - fprintf (stderr, _("%s: can't do -c\n"), whoami); - } -} - - -void -DEFUN (find_call, (parent, p_lowpc, p_highpc), - Sym * parent AND bfd_vma p_lowpc AND bfd_vma p_highpc) -{ - switch (bfd_get_arch (core_bfd)) - { - case bfd_arch_i386: - i386_find_call (parent, p_lowpc, p_highpc); - break; - - case bfd_arch_alpha: - alpha_find_call (parent, p_lowpc, p_highpc); - break; - - case bfd_arch_vax: - vax_find_call (parent, p_lowpc, p_highpc); - break; - - case bfd_arch_sparc: - sparc_find_call (parent, p_lowpc, p_highpc); - break; - - case bfd_arch_tahoe: - tahoe_find_call (parent, p_lowpc, p_highpc); - break; - - default: - fprintf (stderr, _("%s: -c not supported on architecture %s\n"), - whoami, bfd_printable_name(core_bfd)); - - /* Don't give the error more than once. */ - ignore_direct_calls = FALSE; - } -} - -/* - * Return class of symbol SYM. The returned class can be any of: - * 0 -> symbol is not interesting to us - * 'T' -> symbol is a global name - * 't' -> symbol is a local (static) name - */ -static int -DEFUN (core_sym_class, (sym), asymbol * sym) -{ - symbol_info syminfo; - const char *name; - char sym_prefix; - int i; - - if (sym->section == NULL || (sym->flags & BSF_DEBUGGING) != 0) - { - return 0; - } - - /* - * Must be a text symbol, and static text symbols don't qualify if - * ignore_static_funcs set. - */ - if (ignore_static_funcs && (sym->flags & BSF_LOCAL)) - { - DBG (AOUTDEBUG, printf ("[core_sym_class] %s: not a function\n", - sym->name)); - return 0; - } - - bfd_get_symbol_info (core_bfd, sym, &syminfo); - i = syminfo.type; - - if (i == 'T') - { - return i; /* it's a global symbol */ - } - - if (i == 'W') - { - /* Treat weak symbols as text symbols. FIXME: a weak symbol may - also be a data symbol. */ - return 'T'; - } - - if (i != 't') - { - /* not a static text symbol */ - DBG (AOUTDEBUG, printf ("[core_sym_class] %s is of class %c\n", - sym->name, i)); - return 0; - } - - /* do some more filtering on static function-names: */ - - if (ignore_static_funcs) - { - return 0; - } - /* - * Can't zero-length name or funny characters in name, where - * `funny' includes: `.' (.o file names) and `$' (Pascal labels). - */ - if (!sym->name || sym->name[0] == '\0') - { - return 0; - } - - for (name = sym->name; *name; ++name) - { - if (*name == '.' || *name == '$') - { - return 0; - } - } - /* - * On systems where the C compiler adds an underscore to all - * names, static names without underscores seem usually to be - * labels in hand written assembler in the library. We don't want - * these names. This is certainly necessary on a Sparc running - * SunOS 4.1 (try profiling a program that does a lot of - * division). I don't know whether it has harmful side effects on - * other systems. Perhaps it should be made configurable. - */ - sym_prefix = bfd_get_symbol_leading_char (core_bfd); - if ((sym_prefix && sym_prefix != sym->name[0]) - /* - * GCC may add special symbols to help gdb figure out the file - * language. We want to ignore these, since sometimes they mask - * the real function. (dj@ctron) - */ - || !strncmp (sym->name, "__gnu_compiled", 14) - || !strncmp (sym->name, "___gnu_compiled", 15)) - { - return 0; - } - - /* If the object file supports marking of function symbols, then we can - zap anything that doesn't have BSF_FUNCTION set. */ - if (ignore_non_functions && (sym->flags & BSF_FUNCTION) == 0) - return 0; - - return 't'; /* it's a static text symbol */ -} - - -/* - * Get whatever source info we can get regarding address ADDR: - */ -static bool -DEFUN (get_src_info, (addr, filename, name, line_num), - bfd_vma addr AND const char **filename AND const char **name - AND int *line_num) -{ - const char *fname = 0, *func_name = 0; - int l = 0; - - if (bfd_find_nearest_line (core_bfd, core_text_sect, core_syms, - addr - core_text_sect->vma, - &fname, &func_name, (unsigned int *) &l) - && fname && func_name && l) - { - DBG (AOUTDEBUG, printf ("[get_src_info] 0x%lx -> %s:%d (%s)\n", - addr, fname, l, func_name)); - *filename = fname; - *name = func_name; - *line_num = l; - return TRUE; - } - else - { - DBG (AOUTDEBUG, printf ("[get_src_info] no info for 0x%lx (%s:%d,%s)\n", - (long) addr, fname ? fname : "<unknown>", l, - func_name ? func_name : "<unknown>")); - return FALSE; - } -} - - -/* - * Read in symbol table from core. One symbol per function is - * entered. - */ -void -DEFUN (core_create_function_syms, (core_bfd), bfd * core_bfd) -{ - bfd_vma min_vma = ~0, max_vma = 0; - int class; - long i, found, skip; - unsigned int j; - - /* pass 1 - determine upper bound on number of function names: */ - symtab.len = 0; - for (i = 0; i < core_num_syms; ++i) - { - if (!core_sym_class (core_syms[i])) - { - continue; - } - - /* This should be replaced with a binary search or hashed - search. Gross. - - Don't create a symtab entry for a function that has - a mapping to a file, unless it's the first function - in the file. */ - skip = 0; - for (j = 0; j < symbol_map_count; j++) - if (!strcmp (core_syms[i]->name, symbol_map[j].function_name)) - { - if (j > 0 && ! strcmp (symbol_map [j].file_name, - symbol_map [j - 1].file_name)) - skip = 1; - break; - } - if (!skip) - ++symtab.len; - } - - if (symtab.len == 0) - { - fprintf (stderr, _("%s: file `%s' has no symbols\n"), whoami, a_out_name); - done (1); - } - - /* the "+ 2" is for the sentinels: */ - symtab.base = (Sym *) xmalloc ((symtab.len + 2) * sizeof (Sym)); - - /* pass 2 - create symbols: */ - - symtab.limit = symtab.base; - for (i = 0; i < core_num_syms; ++i) - { - class = core_sym_class (core_syms[i]); - if (!class) - { - DBG (AOUTDEBUG, - printf ("[core_create_function_syms] rejecting: 0x%lx %s\n", - core_syms[i]->value, core_syms[i]->name)); - continue; - } - /* This should be replaced with a binary search or hashed - search. Gross. */ - - skip = 0; - found = 0; - for (j = 0; j < symbol_map_count; j++) - if (!strcmp (core_syms[i]->name, symbol_map[j].function_name)) - { - if (j > 0 && ! strcmp (symbol_map [j].file_name, - symbol_map [j - 1].file_name)) - skip = 1; - else - found = j; - break; - } - - if (skip) - continue; - - sym_init (symtab.limit); - - /* symbol offsets are always section-relative: */ - - symtab.limit->addr = core_syms[i]->value + core_syms[i]->section->vma; - if (symbol_map_count - && !strcmp (core_syms[i]->name, symbol_map[found].function_name)) - { - symtab.limit->name = symbol_map[found].file_name; - symtab.limit->mapped = 1; - } - else - { - symtab.limit->name = core_syms[i]->name; - symtab.limit->mapped = 0; - } - - /* Lookup filename and line number, if we can */ - - { - const char *filename, *func_name; - - if (get_src_info (symtab.limit->addr, &filename, &func_name, - &symtab.limit->line_num)) - { - symtab.limit->file = source_file_lookup_path (filename); - - /* FIXME: Checking __osf__ here does not work with a cross - gprof. */ -#ifdef __osf__ - /* - * Suppress symbols that are not function names. This is - * useful to suppress code-labels and aliases. - * - * This is known to be useful under DEC's OSF/1. Under SunOS 4.x, - * labels do not appear in the symbol table info, so this isn't - * necessary. - */ - - if (strcmp (symtab.limit->name, func_name) != 0) - { - /* - * The symbol's address maps to a different name, so - * it can't be a function-entry point. This happens - * for labels, for example. - */ - DBG (AOUTDEBUG, - printf ("[core_create_function_syms: rej %s (maps to %s)\n", - symtab.limit->name, func_name)); - continue; - } -#endif - } - } - - symtab.limit->is_func = TRUE; - symtab.limit->is_bb_head = TRUE; - if (class == 't') - { - symtab.limit->is_static = TRUE; - } - - min_vma = MIN (symtab.limit->addr, min_vma); - max_vma = MAX (symtab.limit->addr, max_vma); - - /* - * If we see "main" without an initial '_', we assume names - * are *not* prefixed by '_'. - */ - if (symtab.limit->name[0] == 'm' && discard_underscores - && strcmp (symtab.limit->name, "main") == 0) - { - discard_underscores = 0; - } - - DBG (AOUTDEBUG, printf ("[core_create_function_syms] %ld %s 0x%lx\n", - (long) (symtab.limit - symtab.base), - symtab.limit->name, symtab.limit->addr)); - ++symtab.limit; - } - - /* create sentinels: */ - - sym_init (symtab.limit); - symtab.limit->name = "<locore>"; - symtab.limit->addr = 0; - symtab.limit->end_addr = min_vma - 1; - ++symtab.limit; - - sym_init (symtab.limit); - symtab.limit->name = "<hicore>"; - symtab.limit->addr = max_vma + 1; - symtab.limit->end_addr = ~0; - ++symtab.limit; - - symtab.len = symtab.limit - symtab.base; - symtab_finalize (&symtab); -} - - -/* - * Read in symbol table from core. One symbol per line of source code - * is entered. - */ -void -DEFUN (core_create_line_syms, (core_bfd), bfd * core_bfd) -{ - char prev_name[PATH_MAX], prev_filename[PATH_MAX]; - bfd_vma vma, min_vma = ~0, max_vma = 0; - bfd_vma offset; - Sym *prev, dummy, *sentinel, *sym; - const char *filename; - int prev_line_num; - Sym_Table ltab; - /* - * Create symbols for functions as usual. This is necessary in - * cases where parts of a program were not compiled with -g. For - * those parts we still want to get info at the function level: - */ - core_create_function_syms (core_bfd); - - /* pass 1 - counter number of symbols: */ - - /* - * To find all line information, walk through all possible - * text-space addresses (one by one!) and get the debugging - * info for each address. When the debugging info changes, - * it is time to create a new symbol. - * - * Of course, this is rather slow and it would be better if - * bfd would provide an iterator for enumerating all line infos - */ - prev_name[0] = '\0'; - ltab.len = 0; - prev_filename[0] = '\0'; - prev_line_num = 0; - for (offset = 0; offset < core_text_sect->_raw_size; offset += min_insn_size) - { - vma = core_text_sect->vma + offset; - if (!get_src_info (vma, &filename, &dummy.name, &dummy.line_num) - || (prev_line_num == dummy.line_num && - strcmp (prev_name, dummy.name) == 0 - && strcmp (prev_filename, filename) == 0)) - { - continue; - } - - ++ltab.len; - prev_line_num = dummy.line_num; - strcpy (prev_name, dummy.name); - strcpy (prev_filename, filename); - - min_vma = MIN (vma, min_vma); - max_vma = MAX (vma, max_vma); - } - - /* make room for function symbols, too: */ - ltab.len += symtab.len; - ltab.base = (Sym *) xmalloc (ltab.len * sizeof (Sym)); - ltab.limit = ltab.base; - - /* pass 2 - create symbols: */ - - /* We now set is_static as we go along, rather than by running - through the symbol table at the end. - - The old way called symtab_finalize before the is_static pass, - causing a problem since symtab_finalize uses is_static as part of - its address conflict resolution algorithm. Since global symbols - were prefered over static symbols, and all line symbols were - global at that point, static function names that conflicted with - their own line numbers (static, but labeled as global) were - rejected in favor of the line num. - - This was not the desired functionality. We always want to keep - our function symbols and discard any conflicting line symbols. - Perhaps symtab_finalize should be modified to make this - distinction as well, but the current fix works and the code is a - lot cleaner now. */ - - prev = 0; - for (offset = 0; offset < core_text_sect->_raw_size; offset += min_insn_size) - { - sym_init (ltab.limit); - if (!get_src_info (core_text_sect->vma + offset, &filename, - <ab.limit->name, <ab.limit->line_num) - || (prev && prev->line_num == ltab.limit->line_num - && strcmp (prev->name, ltab.limit->name) == 0 - && strcmp (prev->file->name, filename) == 0)) - { - continue; - } - - /* make name pointer a malloc'ed string: */ - ltab.limit->name = xstrdup (ltab.limit->name); - ltab.limit->file = source_file_lookup_path (filename); - - ltab.limit->addr = core_text_sect->vma + offset; - - /* Set is_static based on the enclosing function, using either: - * 1) the previous symbol, if it's from the same function, or - * 2) a symtab lookup - */ - - if (prev && ltab.limit->file == prev->file && - strcmp (ltab.limit->name, prev->name) == 0) - { - ltab.limit->is_static = prev->is_static; - } - else - { - sym = sym_lookup(&symtab, ltab.limit->addr); - ltab.limit->is_static = sym->is_static; - } - - prev = ltab.limit; - - /* - * If we see "main" without an initial '_', we assume names - * are *not* prefixed by '_'. - */ - if (ltab.limit->name[0] == 'm' && discard_underscores - && strcmp (ltab.limit->name, "main") == 0) - { - discard_underscores = 0; - } - - DBG (AOUTDEBUG, printf ("[core_create_line_syms] %d %s 0x%lx\n", - ltab.limit - ltab.base, ltab.limit->name, - ltab.limit->addr)); - ++ltab.limit; - } - - /* update sentinels: */ - - sentinel = sym_lookup (&symtab, 0); - if (strcmp (sentinel->name, "<locore>") == 0 - && min_vma <= sentinel->end_addr) - { - sentinel->end_addr = min_vma - 1; - } - - sentinel = sym_lookup (&symtab, ~0); - if (strcmp (sentinel->name, "<hicore>") == 0 && max_vma >= sentinel->addr) - { - sentinel->addr = max_vma + 1; - } - - /* copy in function symbols: */ - memcpy (ltab.limit, symtab.base, symtab.len * sizeof (Sym)); - ltab.limit += symtab.len; - - if ((unsigned int) (ltab.limit - ltab.base) != ltab.len) - { - fprintf (stderr, - _("%s: somebody miscounted: ltab.len=%d instead of %ld\n"), - whoami, ltab.len, (long) (ltab.limit - ltab.base)); - done (1); - } - - /* finalize ltab and make it symbol table: */ - - symtab_finalize (<ab); - free (symtab.base); - symtab = ltab; - -} diff --git a/gprof/corefile.h b/gprof/corefile.h deleted file mode 100644 index b396f85..0000000 --- a/gprof/corefile.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef corefile_h -#define corefile_h - -#include "bfd.h" - -extern bfd *core_bfd; /* bfd for core-file */ -extern int core_num_syms; /* # of entries in symbol-table */ -extern asymbol **core_syms; /* symbol table in a.out */ -extern asection *core_text_sect; /* core text section */ -extern PTR core_text_space; /* text space of a.out in core */ - -extern int min_insn_size; /* size of smallest instruction, in bytes */ -extern int offset_to_code; /* offset (in bytes) of code from entry - address of routine */ - -extern void core_init PARAMS ((const char *a_out_name)); -extern void core_get_text_space PARAMS ((bfd * core_bfd)); -extern void core_create_function_syms PARAMS ((bfd * core_bfd)); -extern void core_create_line_syms PARAMS ((bfd * core_bfd)); - -#endif /* corefile_h */ diff --git a/gprof/flat_bl.m b/gprof/flat_bl.m deleted file mode 100644 index db2871a..0000000 --- a/gprof/flat_bl.m +++ /dev/null @@ -1,27 +0,0 @@ - - % 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 deleted file mode 100644 index 7e16821..0000000 --- a/gprof/fsf_callg_bl.m +++ /dev/null @@ -1,83 +0,0 @@ - - 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 - `<spontaneous>' 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/gconfig.in b/gprof/gconfig.in deleted file mode 100644 index 44cc1a70..0000000 --- a/gprof/gconfig.in +++ /dev/null @@ -1,131 +0,0 @@ -/* gconfig.in. Generated automatically from configure.in by autoheader. */ - -/* Define if using alloca.c. */ -#undef C_ALLOCA - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. - This function is required for alloca.c support on those systems. */ -#undef CRAY_STACKSEG_END - -/* Define if you have alloca, as a function or macro. */ -#undef HAVE_ALLOCA - -/* Define if you have <alloca.h> and it should be used (not on Ultrix). */ -#undef HAVE_ALLOCA_H - -/* Define if you have a working `mmap' system call. */ -#undef HAVE_MMAP - -/* Define as __inline if that's what the C compiler calls it. */ -#undef inline - -/* Define to `long' if <sys/types.h> doesn't define. */ -#undef off_t - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - -/* Define to `unsigned' if <sys/types.h> doesn't define. */ -#undef size_t - -/* If using the C implementation of alloca, define if you know the - direction of stack growth for your system; otherwise it will be - automatically deduced at run-time. - STACK_DIRECTION > 0 => grows toward higher addresses - STACK_DIRECTION < 0 => grows toward lower addresses - STACK_DIRECTION = 0 => direction of growth unknown - */ -#undef STACK_DIRECTION - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Name of package. */ -#undef PACKAGE - -/* Version of package. */ -#undef VERSION - -/* Whether this system uses the BSD 4.4 gmon.out format. */ -#undef BSD44_FORMAT - -/* Define to 1 if NLS is requested. */ -#undef ENABLE_NLS - -/* Define as 1 if you have gettext and don't want to use GNU gettext. */ -#undef HAVE_GETTEXT - -/* Define as 1 if you have the stpcpy function. */ -#undef HAVE_STPCPY - -/* Define if your locale.h file contains LC_MESSAGES. */ -#undef HAVE_LC_MESSAGES - -/* Define if you have the __argz_count function. */ -#undef HAVE___ARGZ_COUNT - -/* Define if you have the __argz_next function. */ -#undef HAVE___ARGZ_NEXT - -/* Define if you have the __argz_stringify function. */ -#undef HAVE___ARGZ_STRINGIFY - -/* Define if you have the dcgettext function. */ -#undef HAVE_DCGETTEXT - -/* Define if you have the getcwd function. */ -#undef HAVE_GETCWD - -/* Define if you have the getpagesize function. */ -#undef HAVE_GETPAGESIZE - -/* Define if you have the munmap function. */ -#undef HAVE_MUNMAP - -/* Define if you have the putenv function. */ -#undef HAVE_PUTENV - -/* Define if you have the setenv function. */ -#undef HAVE_SETENV - -/* Define if you have the setlocale function. */ -#undef HAVE_SETLOCALE - -/* Define if you have the stpcpy function. */ -#undef HAVE_STPCPY - -/* Define if you have the strcasecmp function. */ -#undef HAVE_STRCASECMP - -/* Define if you have the strchr function. */ -#undef HAVE_STRCHR - -/* Define if you have the <argz.h> header file. */ -#undef HAVE_ARGZ_H - -/* Define if you have the <limits.h> header file. */ -#undef HAVE_LIMITS_H - -/* Define if you have the <locale.h> header file. */ -#undef HAVE_LOCALE_H - -/* Define if you have the <malloc.h> header file. */ -#undef HAVE_MALLOC_H - -/* Define if you have the <nl_types.h> header file. */ -#undef HAVE_NL_TYPES_H - -/* Define if you have the <string.h> header file. */ -#undef HAVE_STRING_H - -/* Define if you have the <sys/param.h> header file. */ -#undef HAVE_SYS_PARAM_H - -/* Define if you have the <unistd.h> header file. */ -#undef HAVE_UNISTD_H - -/* Define if you have the <values.h> header file. */ -#undef HAVE_VALUES_H diff --git a/gprof/gen-c-prog.awk b/gprof/gen-c-prog.awk deleted file mode 100644 index b59c1f8..0000000 --- a/gprof/gen-c-prog.awk +++ /dev/null @@ -1,26 +0,0 @@ -NR == 1 { - FS="\""; - print "/* ==> Do not modify this file!! It is created automatically" - printf " from %s using the gen-c-prog.awk script. <== */\n\n", FILE - print "#include <stdio.h>" -} - - { - 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/gmon.h b/gprof/gmon.h deleted file mode 100644 index 6d0f743..0000000 --- a/gprof/gmon.h +++ /dev/null @@ -1,142 +0,0 @@ -/*- - * Copyright (c) 1991 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)gmon.h 5.2 (Berkeley) 5/6/91 - */ -#ifndef gmon_h -#define gmon_h - -struct raw_phdr - { - /* FIXME: Checking a host compiler define means that we can't use - a cross gprof to the alpha. */ -#ifdef __alpha__ - char low_pc[8]; /* base pc address of sample buffer */ - char high_pc[8]; /* max pc address of sampled buffer */ -#else - char low_pc[4]; /* base pc address of sample buffer */ - char high_pc[4]; /* max pc address of sampled buffer */ -#endif - char ncnt[4]; /* size of sample buffer (plus this header) */ - - /* FIXME: Checking host compiler defines here means that we can't - use a cross gprof alpha OSF. */ -#if defined (__alpha__) && defined (__osf__) - /* - * DEC's OSF v3.0 uses 4 bytes of padding to bring the header to - * a size that is a multiple of 8. - */ - char pad[4]; -#else -#ifdef BSD44_FORMAT - char version[4]; /* version number */ - char profrate[4]; /* profiling clock rate */ - char spare[3*4]; /* reserved */ -#endif -#endif - }; - -/* - * Histogram counters are unsigned shorts: - */ -#define HISTCOUNTER unsigned short - -/* - * Fraction of text space to allocate for histogram counters here, 1/2: - */ -#define HISTFRACTION 2 - -/* - * Fraction of text space to allocate for from hash buckets. The - * value of HASHFRACTION is based on the minimum number of bytes of - * separation between two subroutine call points in the object code. - * Given MIN_SUBR_SEPARATION bytes of separation the value of - * HASHFRACTION is calculated as: - * - * HASHFRACTION = MIN_SUBR_SEPARATION / (2 * sizeof(short) - 1); - * - * For the VAX, the shortest two call sequence is: - * - * calls $0,(r0) - * calls $0,(r0) - * - * which is separated by only three bytes, thus HASHFRACTION is - * calculated as: - * - * HASHFRACTION = 3 / (2 * 2 - 1) = 1 - * - * Note that the division above rounds down, thus if MIN_SUBR_FRACTION - * is less than three, this algorithm will not work! - */ -#define HASHFRACTION 1 - -/* - * Percent of text space to allocate for tostructs with a minimum: - */ -#define ARCDENSITY 2 -#define MINARCS 50 - -struct tostruct - { - char *selfpc; - int count; - unsigned short link; - }; - -/* - * A raw arc, with pointers to the calling site and the called site - * and a count. Everything is defined in terms of characters so - * as to get a packed representation (otherwise, different compilers - * might introduce different padding): - */ -struct raw_arc - { - /* FIXME: Checking a host compiler define means that we can't use - a cross gprof to the alpha. */ -#ifdef __alpha__ - char from_pc[8]; - char self_pc[8]; - char count[8]; -#else - char from_pc[4]; - char self_pc[4]; - char count[4]; -#endif - }; - -/* - * General rounding functions: - */ -#define ROUNDDOWN(x,y) (((x)/(y))*(y)) -#define ROUNDUP(x,y) ((((x)+(y)-1)/(y))*(y)) - -#endif /* gmon_h */ diff --git a/gprof/gmon_io.c b/gprof/gmon_io.c deleted file mode 100644 index 6cf9167..0000000 --- a/gprof/gmon_io.c +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Input and output from/to gmon.out files. - */ -#include "cg_arcs.h" -#include "basic_blocks.h" -#include "bfd.h" -#include "corefile.h" -#include "call_graph.h" -#include "gmon_io.h" -#include "gmon_out.h" -#include "gmon.h" /* fetch header for old format */ -#include "gprof.h" -#include "hertz.h" -#include "hist.h" -#include "libiberty.h" - -int gmon_input = 0; -int gmon_file_version = 0; /* 0 == old (non-versioned) file format */ - -/* - * This probably ought to be in libbfd. - */ -bfd_vma -DEFUN (get_vma, (abfd, addr), bfd * abfd AND bfd_byte * addr) -{ - switch (sizeof (char*)) - { - case 4: - return bfd_get_32 (abfd, addr); - case 8: - return bfd_get_64 (abfd, addr); - default: - fprintf (stderr, _("%s: bfd_vma has unexpected size of %ld bytes\n"), - whoami, (long) sizeof (char*)); - done (1); - } -} - - -/* - * This probably ought to be in libbfd. - */ -void -DEFUN (put_vma, (abfd, val, addr), bfd * abfd AND bfd_vma val AND bfd_byte * addr) -{ - switch (sizeof (char*)) - { - case 4: - bfd_put_32 (abfd, val, addr); - break; - case 8: - bfd_put_64 (abfd, val, addr); - break; - default: - fprintf (stderr, _("%s: bfd_vma has unexpected size of %ld bytes\n"), - whoami, (long) sizeof (char*)); - done (1); - } -} - - -void -DEFUN (gmon_out_read, (filename), const char *filename) -{ - FILE *ifp; - struct gmon_hdr ghdr; - unsigned char tag; - int nhist = 0, narcs = 0, nbbs = 0; - - /* open gmon.out file: */ - - if (strcmp (filename, "-") == 0) - { - ifp = stdin; - } - else - { - ifp = fopen (filename, FOPEN_RB); - if (!ifp) - { - perror (filename); - done (1); - } - } - if (fread (&ghdr, sizeof (struct gmon_hdr), 1, ifp) != 1) - { - fprintf (stderr, _("%s: file too short to be a gmon file\n"), - filename); - done (1); - } - - if ((file_format == FF_MAGIC) || - (file_format == FF_AUTO && !strncmp (&ghdr.cookie[0], GMON_MAGIC, 4))) - { - if (file_format == FF_MAGIC && strncmp (&ghdr.cookie[0], GMON_MAGIC, 4)) - { - fprintf (stderr, _("%s: file `%s' has bad magic cookie\n"), - whoami, filename); - done (1); - } - - /* right magic, so it's probably really a new gmon.out file */ - - gmon_file_version = bfd_get_32 (core_bfd, (bfd_byte *) ghdr.version); - if (gmon_file_version != GMON_VERSION && gmon_file_version != 0) - { - fprintf (stderr, - _("%s: file `%s' has unsupported version %d\n"), - whoami, filename, gmon_file_version); - done (1); - } - - /* read in all the records: */ - while (fread (&tag, sizeof (tag), 1, ifp) == 1) - { - switch (tag) - { - case GMON_TAG_TIME_HIST: - ++nhist; - gmon_input |= INPUT_HISTOGRAM; - hist_read_rec (ifp, filename); - break; - - case GMON_TAG_CG_ARC: - ++narcs; - gmon_input |= INPUT_CALL_GRAPH; - cg_read_rec (ifp, filename); - break; - - case GMON_TAG_BB_COUNT: - ++nbbs; - gmon_input |= INPUT_BB_COUNTS; - bb_read_rec (ifp, filename); - break; - - default: - fprintf (stderr, - _("%s: %s: found bad tag %d (file corrupted?)\n"), - whoami, filename, tag); - done (1); - } - } - } - else if (file_format == FF_AUTO || file_format == FF_BSD) - { - struct hdr - { - bfd_vma low_pc; - bfd_vma high_pc; - int ncnt; - }; - int i, samp_bytes; - unsigned long count; - bfd_vma from_pc, self_pc; - struct raw_arc raw_arc; - struct raw_phdr raw; - static struct hdr h; - UNIT raw_bin_count; - struct hdr tmp; - - /* - * Information from a gmon.out file is in two parts: an array of - * sampling hits within pc ranges, and the arcs. - */ - gmon_input = INPUT_HISTOGRAM | INPUT_CALL_GRAPH; - - /* - * This fseek() ought to work even on stdin as long as it's - * not an interactive device (heck, is there anybody who would - * want to type in a gmon.out at the terminal?). - */ - if (fseek (ifp, 0, SEEK_SET) < 0) - { - perror (filename); - done (1); - } - if (fread (&raw, 1, sizeof (struct raw_phdr), ifp) - != sizeof (struct raw_phdr)) - { - fprintf (stderr, _("%s: file too short to be a gmon file\n"), - filename); - done (1); - } - tmp.low_pc = get_vma (core_bfd, (bfd_byte *) &raw.low_pc[0]); - tmp.high_pc = get_vma (core_bfd, (bfd_byte *) &raw.high_pc[0]); - tmp.ncnt = bfd_get_32 (core_bfd, (bfd_byte *) &raw.ncnt[0]); - -#ifdef BSD44_FORMAT - { - int profrate; - - profrate = bfd_get_32 (core_bfd, (bfd_byte *) &raw.profrate[0]); - if (!s_highpc) - hz = profrate; - else if (hz != profrate) - { - fprintf (stderr, - _("%s: profiling rate incompatible with first gmon file\n"), - filename); - done (1); - } - } -#endif - - if (s_highpc && (tmp.low_pc != h.low_pc || - tmp.high_pc != h.high_pc || tmp.ncnt != h.ncnt)) - { - fprintf (stderr, _("%s: incompatible with first gmon file\n"), - filename); - done (1); - } - h = tmp; - s_lowpc = (bfd_vma) h.low_pc; - s_highpc = (bfd_vma) h.high_pc; - lowpc = (bfd_vma) h.low_pc / sizeof (UNIT); - highpc = (bfd_vma) h.high_pc / sizeof (UNIT); - samp_bytes = h.ncnt - sizeof (struct raw_phdr); - hist_num_bins = samp_bytes / sizeof (UNIT); - DBG (SAMPLEDEBUG, - printf ("[gmon_out_read] lowpc 0x%lx highpc 0x%lx ncnt %d\n", - h.low_pc, h.high_pc, h.ncnt); - printf ("[gmon_out_read] s_lowpc 0x%lx s_highpc 0x%lx\n", - s_lowpc, s_highpc); - printf ("[gmon_out_read] lowpc 0x%lx highpc 0x%lx\n", - lowpc, highpc); - printf ("[gmon_out_read] samp_bytes %d hist_num_bins %d\n", - samp_bytes, hist_num_bins)); - - if (hist_num_bins) - { - ++nhist; - } - - if (!hist_sample) - { - hist_sample = - (int *) xmalloc (hist_num_bins * sizeof (hist_sample[0])); - memset (hist_sample, 0, hist_num_bins * sizeof (hist_sample[0])); - } - - for (i = 0; i < hist_num_bins; ++i) - { - if (fread (raw_bin_count, sizeof (raw_bin_count), 1, ifp) != 1) - { - fprintf (stderr, - _("%s: unexpected EOF after reading %d/%d bins\n"), - whoami, --i, hist_num_bins); - done (1); - } - hist_sample[i] += bfd_get_16 (core_bfd, (bfd_byte *) raw_bin_count); - } - - /* - * The rest of the file consists of a bunch of <from,self,count> - * tuples: - */ - while (fread (&raw_arc, sizeof (raw_arc), 1, ifp) == 1) - { - ++narcs; - from_pc = get_vma (core_bfd, (bfd_byte *) raw_arc.from_pc); - self_pc = get_vma (core_bfd, (bfd_byte *) raw_arc.self_pc); - count = bfd_get_32 (core_bfd, (bfd_byte *) raw_arc.count); - DBG (SAMPLEDEBUG, - printf ("[gmon_out_read] frompc 0x%lx selfpc 0x%lx count %lu\n", - from_pc, self_pc, count)); - /* add this arc: */ - cg_tally (from_pc, self_pc, count); - } - fclose (ifp); - - if (hz == HZ_WRONG) - { - /* - * How many ticks per second? If we can't tell, report - * time in ticks. - */ - hz = hertz (); - if (hz == HZ_WRONG) - { - hz = 1; - fprintf (stderr, _("time is in ticks, not seconds\n")); - } - } - } - else - { - fprintf (stderr, _("%s: don't know how to deal with file format %d\n"), - whoami, file_format); - done (1); - } - - if (output_style & STYLE_GMON_INFO) - { - printf (_("File `%s' (version %d) contains:\n"), - filename, gmon_file_version); - printf (_("\t%d histogram record%s\n"), - nhist, nhist == 1 ? "" : "s"); - printf (_("\t%d call-graph record%s\n"), - narcs, narcs == 1 ? "" : "s"); - printf (_("\t%d basic-block count record%s\n"), - nbbs, nbbs == 1 ? "" : "s"); - first_output = FALSE; - } -} - - -void -DEFUN (gmon_out_write, (filename), const char *filename) -{ - FILE *ofp; - struct gmon_hdr ghdr; - - ofp = fopen (filename, FOPEN_WB); - if (!ofp) - { - perror (filename); - done (1); - } - - if (file_format == FF_AUTO || file_format == FF_MAGIC) - { - /* write gmon header: */ - - memcpy (&ghdr.cookie[0], GMON_MAGIC, 4); - bfd_put_32 (core_bfd, GMON_VERSION, (bfd_byte *) ghdr.version); - if (fwrite (&ghdr, sizeof (ghdr), 1, ofp) != 1) - { - perror (filename); - done (1); - } - - /* write execution time histogram if we have one: */ - if (gmon_input & INPUT_HISTOGRAM) - { - hist_write_hist (ofp, filename); - } - - /* write call graph arcs if we have any: */ - if (gmon_input & INPUT_CALL_GRAPH) - { - cg_write_arcs (ofp, filename); - } - - /* write basic-block info if we have it: */ - if (gmon_input & INPUT_BB_COUNTS) - { - bb_write_blocks (ofp, filename); - } - } - else if (file_format == FF_BSD) - { - struct raw_arc raw_arc; - UNIT raw_bin_count; - bfd_vma lpc, hpc; - int i, ncnt; - Arc *arc; - Sym *sym; - - put_vma (core_bfd, s_lowpc, (bfd_byte *) & lpc); - put_vma (core_bfd, s_highpc, (bfd_byte *) & hpc); - bfd_put_32 (core_bfd, - hist_num_bins * sizeof (UNIT) + sizeof (struct raw_phdr), - (bfd_byte *) & ncnt); - - /* write header: */ - if (fwrite (&lpc, sizeof (lpc), 1, ofp) != 1 - || fwrite (&hpc, sizeof (hpc), 1, ofp) != 1 - || fwrite (&ncnt, sizeof (ncnt), 1, ofp) != 1) - { - perror (filename); - done (1); - } - - /* dump the samples: */ - - for (i = 0; i < hist_num_bins; ++i) - { - bfd_put_16 (core_bfd, hist_sample[i], (bfd_byte *) & raw_bin_count[0]); - if (fwrite (&raw_bin_count[0], sizeof (raw_bin_count), 1, ofp) != 1) - { - perror (filename); - done (1); - } - } - - /* dump the normalized raw arc information: */ - - for (sym = symtab.base; sym < symtab.limit; ++sym) - { - for (arc = sym->cg.children; arc; arc = arc->next_child) - { - put_vma (core_bfd, arc->parent->addr, - (bfd_byte *) raw_arc.from_pc); - put_vma (core_bfd, arc->child->addr, - (bfd_byte *) raw_arc.self_pc); - bfd_put_32 (core_bfd, arc->count, (bfd_byte *) raw_arc.count); - if (fwrite (&raw_arc, sizeof (raw_arc), 1, ofp) != 1) - { - perror (filename); - done (1); - } - DBG (SAMPLEDEBUG, - printf ("[dumpsum] frompc 0x%lx selfpc 0x%lx count %lu\n", - arc->parent->addr, arc->child->addr, arc->count)); - } - } - fclose (ofp); - } - else - { - fprintf (stderr, _("%s: don't know how to deal with file format %d\n"), - whoami, file_format); - done (1); - } -} diff --git a/gprof/gmon_io.h b/gprof/gmon_io.h deleted file mode 100644 index bf257a4..0000000 --- a/gprof/gmon_io.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef gmon_io_h -#define gmon_io_h - -#include "bfd.h" -#include "gmon.h" - -#define INPUT_HISTOGRAM (1<<0) -#define INPUT_CALL_GRAPH (1<<1) -#define INPUT_BB_COUNTS (1<<2) - -extern int gmon_input; /* what input did we see? */ -extern int gmon_file_version; /* file version are we dealing with */ - -extern bfd_vma get_vma PARAMS ((bfd * abfd, bfd_byte * addr)); -extern void put_vma PARAMS ((bfd * abfd, bfd_vma val, bfd_byte * addr)); - -extern void gmon_out_read PARAMS ((const char *filename)); -extern void gmon_out_write PARAMS ((const char *filename)); - -#endif /* gmon_io_h */ diff --git a/gprof/gmon_out.h b/gprof/gmon_out.h deleted file mode 100644 index 2144fb5..0000000 --- a/gprof/gmon_out.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * This file specifies the format of gmon.out files. It should have - * as few external dependencies as possible as it is going to be - * included in many different programs. That is, minimize the - * number of #include's. - * - * A gmon.out file consists of a header (defined by gmon_hdr) followed - * by a sequence of records. Each record starts with a one-byte tag - * identifying the type of records, followed by records specific data. - */ -#ifndef gmon_out_h -#define gmon_out_h - -#define GMON_MAGIC "gmon" /* magic cookie */ -#define GMON_VERSION 1 /* version number */ - -/* - * Raw header as it appears on file (without padding): - */ -struct gmon_hdr - { - char cookie[4]; - char version[4]; - char spare[3 * 4]; - }; - -/* types of records in this file: */ -typedef enum - { - GMON_TAG_TIME_HIST = 0, GMON_TAG_CG_ARC = 1, GMON_TAG_BB_COUNT = 2 - } -GMON_Record_Tag; - -struct gmon_hist_hdr - { - char low_pc[sizeof (char*)]; /* base pc address of sample buffer */ - char high_pc[sizeof (char*)]; /* max pc address of sampled buffer */ - char hist_size[4]; /* size of sample buffer */ - char prof_rate[4]; /* profiling clock rate */ - char dimen[15]; /* phys. dim., usually "seconds" */ - char dimen_abbrev; /* usually 's' for "seconds" */ - }; - -struct gmon_cg_arc_record - { - char from_pc[sizeof (char*)]; /* address within caller's body */ - char self_pc[sizeof (char*)]; /* address within callee's body */ - char count[4]; /* number of arc traversals */ - }; - -#endif /* gmon_out_h */ diff --git a/gprof/gprof.1 b/gprof/gprof.1 deleted file mode 100644 index 5a734da..0000000 --- a/gprof/gprof.1 +++ /dev/null @@ -1,252 +0,0 @@ -.\" Copyright (c) 1983, 1990 The Regents of the University of California. -.\" All rights reserved. -.\" -.\" Redistribution and use in source and binary forms are permitted provided -.\" that: (1) source distributions retain this entire copyright notice and -.\" comment, and (2) distributions including binaries display the following -.\" acknowledgement: ``This product includes software developed by the -.\" University of California, Berkeley and its contributors'' in the -.\" documentation or other materials provided with the distribution and in -.\" all advertising materials mentioning features or use of this software. -.\" Neither the name of the University nor the names of its contributors may -.\" be used to endorse or promote products derived from this software without -.\" specific prior written permission. -.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED -.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF -.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -.\" -.\" @(#)gprof.1 6.6 (Berkeley) 7/24/90 -.\" -.TH GPROF 1 "January 29, 1993" -.SH NAME -gprof \- display call graph profile data -.SH SYNOPSIS -.B gprof [ \-abcsz ] [ \-e|\-E -.I name -.B ] [ \-f|\-F -.I name -.B ] -.B [ \-k -.I fromname toname -.B ] [ -.I objfile -.B [ -.I gmon.out -.B ] -.B ] -.SH DESCRIPTION -.B gprof -produces an execution profile of C, Pascal, or Fortran77 programs. -The effect of called routines is incorporated in the profile of each caller. -The profile data is taken from the call graph profile file -\&(`gmon.out' default) which is created by programs -that are compiled with the -.B \-pg -option of -.BR cc ( 1 ) , -.BR pc ( 1 ) , -and -.BR f77 ( 1 ) . -The -.B \-pg -option also links in versions of the library routines -that are compiled for profiling. -.B Gprof -reads the given object file (the default is `a.out') -and establishes the relation between its symbol table -and the call graph profile from `gmon.out'. -If more than one profile file is specified, -the -.B gprof -output shows the sum of the profile information in the given profile files. -.PP -.B Gprof -calculates the amount of time spent in each routine. -Next, these times are propagated along the edges of the call graph. -Cycles are discovered, and calls into a cycle are made to share the time -of the cycle. -The first listing shows the functions -sorted according to the time they represent -including the time of their call graph descendants. -Below each function entry is shown its (direct) call graph children, -and how their times are propagated to this function. -A similar display above the function shows how this function's time and the -time of its descendants is propagated to its (direct) call graph parents. -.PP -Cycles are also shown, with an entry for the cycle as a whole and -a listing of the members of the cycle and their contributions to the -time and call counts of the cycle. -.PP -Second, a flat profile is given, -similar to that provided by -.BR prof ( 1 ) . -This listing gives the total execution times, the call counts, -the time in milliseconds the call spent in the routine itself, and -the time in milliseconds the call spent in the routine itself including -its descendants. -.PP -Finally, an index of the function names is provided. -.SH OPTIONS -The following options are available: -.TP -.B \-a -suppresses the printing of statically declared functions. -If this option is given, all relevant information about the static function -(e.g., time samples, calls to other functions, calls from other functions) -belongs to the function loaded just before the static function in the -\&`objfile' file. -.TP -.B \-b -suppresses the printing of a description of each field in the profile. -.TP -.B \-c -the static call graph of the program is discovered by a heuristic -that examines the text space of the object file. -Static-only parents or children are shown -with call counts of 0. -.TP -.BI "\-e " name -suppresses the printing of the graph profile entry for routine -.I name -and all its descendants -(unless they have other ancestors that aren't suppressed). -More than one -.B \-e -option may be given. -Only one -.I name -may be given with each -.B \-e -option. -.TP -.BI "\-E " name -suppresses the printing of the graph profile entry for routine -.I name -(and its descendants) as -.B \-e , -above, and also excludes the time spent in -.I name -(and its descendants) from the total and percentage time computations. -(For example, -.BI "\-E " mcount -.BI "\-E " mcleanup -is the default.) -.TP -.BI "\-f " name -prints the graph profile entry of only the specified routine -.I name -and its descendants. -More than one -.B \-f -option may be given. -Only one -.I name -may be given with each -.B \-f -option. -.TP -.BI "\-F " name -prints the graph profile entry of only the routine -.I name -and its descendants (as -.B \-f , -above) and also uses only the times of the printed routines -in total time and percentage computations. -More than one -.B \-F -option may be given. -Only one -.I name -may be given with each -.B \-F -option. -The -.B \-F -option -overrides -the -.B \-E -option. -.TP -.BI "\-k " "fromname toname" -will delete any arcs from routine -.I fromname -to routine -.IR toname . -This can be used to break undesired cycles. -More than one -.B \-k -option may be given. -Only one pair of routine names may be given with each -.B \-k -option. -.TP -.B \-s -a profile file `gmon.sum' is produced that represents -the sum of the profile information in all the specified profile files. -This summary profile file may be given to later -executions of gprof (probably also with a -.BR \-s ) -to accumulate profile data across several runs of an `objfile' file. -.TP -.B -v -prints the version number for gprof, and then exits. -.TP -.B -z -displays routines that have zero usage (as shown by call counts -and accumulated time). -This is useful with the -.B \-c -option for discovering which routines were never called. -.PP -.SH FILES -.ta \w'gmon.sum 'u -a.out the namelist and text space. -.br -gmon.out dynamic call graph and profile. -.br -gmon.sum summarized dynamic call graph and profile. -.SH SEE ALSO -.BR monitor ( 3 ) , -.BR profil ( 2 ) , -.BR cc ( 1 ) , -.BR prof ( 1 ) -.sp -``An Execution Profiler for Modular Programs'', -by S. Graham, P. Kessler, M. McKusick; -.I -Software \- Practice and Experience, -Vol. 13, pp. 671-685, 1983. -.sp -``gprof: A Call Graph Execution Profiler'', -by S. Graham, P. Kessler, M. McKusick; -.I -Proceedings of the SIGPLAN '82 Symposium on Compiler Construction, -SIGPLAN Notices, Vol. 17, No 6, pp. 120-126, June 1982. -.SH HISTORY -.B Gprof -appeared in 4.2 BSD. -.SH BUGS -The granularity of the sampling is shown, but remains -statistical at best. -We assume that the time for each execution of a function -can be expressed by the total time for the function divided -by the number of times the function is called. -Thus the time propagated along the call graph arcs to the function's -parents is directly proportional to the number of times that -arc is traversed. -.PP -Parents that are not themselves profiled will have the time of -their profiled children propagated to them, but they will appear -to be spontaneously invoked in the call graph listing, and will -not have their time propagated further. -Similarly, signal catchers, even though profiled, will appear -to be spontaneous (although for more obscure reasons). -Any profiled children of signal catchers should have their times -propagated properly, unless the signal catcher was invoked during -the execution of the profiling routine, in which case all is lost. -.PP -The profiled program must call -.BR exit ( 2 ) -or return normally for the profiling information to be saved -in the `gmon.out' file. diff --git a/gprof/gprof.c b/gprof/gprof.c deleted file mode 100644 index efb16b3..0000000 --- a/gprof/gprof.c +++ /dev/null @@ -1,656 +0,0 @@ -/* - * Copyright (c) 1983, 1998 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include "getopt.h" -#include "libiberty.h" -#include "gprof.h" -#include "basic_blocks.h" -#include "call_graph.h" -#include "cg_arcs.h" -#include "cg_print.h" -#include "corefile.h" -#include "gmon_io.h" -#include "hertz.h" -#include "hist.h" -#include "source.h" -#include "sym_ids.h" - -const char *whoami; -const char *function_mapping_file; -const char *a_out_name = A_OUTNAME; -long hz = HZ_WRONG; - -/* - * Default options values: - */ -int debug_level = 0; -int output_style = 0; -int output_width = 80; -bool bsd_style_output = FALSE; -bool demangle = TRUE; -bool discard_underscores = TRUE; -bool ignore_direct_calls = FALSE; -bool ignore_static_funcs = FALSE; -bool ignore_zeros = TRUE; -bool line_granularity = FALSE; -bool print_descriptions = TRUE; -bool print_path = FALSE; -bool ignore_non_functions = FALSE; -File_Format file_format = FF_AUTO; - -bool first_output = TRUE; - -char copyright[] = - N_("@(#) Copyright (c) 1983 Regents of the University of California.\n\ - All rights reserved.\n"); - -static char *gmon_name = GMONNAME; /* profile filename */ - -bfd *abfd; - -/* - * Functions that get excluded by default: - */ -static char *default_excluded_list[] = -{ - "_gprof_mcount", "mcount", "_mcount", "__mcount", "__mcount_internal", - "__mcleanup", - "<locore>", "<hicore>", - 0 -}; - -/* Codes used for the long options with no short synonyms. 150 isn't - special; it's just an arbitrary non-ASCII char value. */ - -#define OPTION_DEMANGLE (150) -#define OPTION_NO_DEMANGLE (OPTION_DEMANGLE + 1) - -static struct option long_options[] = -{ - {"line", no_argument, 0, 'l'}, - {"no-static", no_argument, 0, 'a'}, - {"ignore-non-functions", no_argument, 0, 'D'}, - - /* output styles: */ - - {"annotated-source", optional_argument, 0, 'A'}, - {"no-annotated-source", optional_argument, 0, 'J'}, - {"flat-profile", optional_argument, 0, 'p'}, - {"no-flat-profile", optional_argument, 0, 'P'}, - {"graph", optional_argument, 0, 'q'}, - {"no-graph", optional_argument, 0, 'Q'}, - {"exec-counts", optional_argument, 0, 'C'}, - {"no-exec-counts", optional_argument, 0, 'Z'}, - {"function-ordering", no_argument, 0, 'r'}, - {"file-ordering", required_argument, 0, 'R'}, - {"file-info", no_argument, 0, 'i'}, - {"sum", no_argument, 0, 's'}, - - /* various options to affect output: */ - - {"all-lines", no_argument, 0, 'x'}, - {"demangle", no_argument, 0, OPTION_DEMANGLE}, - {"no-demangle", no_argument, 0, OPTION_NO_DEMANGLE}, - {"directory-path", required_argument, 0, 'I'}, - {"display-unused-functions", no_argument, 0, 'z'}, - {"min-count", required_argument, 0, 'm'}, - {"print-path", no_argument, 0, 'L'}, - {"separate-files", no_argument, 0, 'y'}, - {"static-call-graph", no_argument, 0, 'c'}, - {"table-length", required_argument, 0, 't'}, - {"time", required_argument, 0, 'n'}, - {"no-time", required_argument, 0, 'N'}, - {"width", required_argument, 0, 'w'}, - /* - * These are for backwards-compatibility only. Their functionality - * is provided by the output style options already: - */ - {"", required_argument, 0, 'e'}, - {"", required_argument, 0, 'E'}, - {"", required_argument, 0, 'f'}, - {"", required_argument, 0, 'F'}, - {"", required_argument, 0, 'k'}, - - /* miscellaneous: */ - - {"brief", no_argument, 0, 'b'}, - {"debug", optional_argument, 0, 'd'}, - {"help", no_argument, 0, 'h'}, - {"file-format", required_argument, 0, 'O'}, - {"traditional", no_argument, 0, 'T'}, - {"version", no_argument, 0, 'v'}, - {0, no_argument, 0, 0} -}; - - -static void -DEFUN (usage, (stream, status), FILE * stream AND int status) -{ - fprintf (stream, _("\ -Usage: %s [-[abcDhilLsTvwxyz]] [-[ACeEfFJnNOpPqQZ][name]] [-I dirs]\n\ - [-d[num]] [-k from/to] [-m min-count] [-t table-length]\n\ - [--[no-]annotated-source[=name]] [--[no-]exec-counts[=name]]\n\ - [--[no-]flat-profile[=name]] [--[no-]graph[=name]]\n\ - [--[no-]time=name] [--all-lines] [--brief] [--debug[=level]]\n\ - [--function-ordering] [--file-ordering]\n\ - [--directory-path=dirs] [--display-unused-functions]\n\ - [--file-format=name] [--file-info] [--help] [--line] [--min-count=n]\n\ - [--no-static] [--print-path] [--separate-files]\n\ - [--static-call-graph] [--sum] [--table-length=len] [--traditional]\n\ - [--version] [--width=n] [--ignore-non-functions]\n\ - [--demangle] [--no-demangle]\n\ - [image-file] [profile-file...]\n"), - whoami); - if (status == 0) - fprintf (stream, _("Report bugs to bug-gnu-utils@gnu.org\n")); - done (status); -} - - -int -DEFUN (main, (argc, argv), int argc AND char **argv) -{ - char **sp, *str; - Sym **cg = 0; - int ch, user_specified = 0; - -#ifdef HAVE_SETLOCALE - setlocale (LC_MESSAGES, ""); -#endif - bindtextdomain (PACKAGE, LOCALEDIR); - textdomain (PACKAGE); - - whoami = argv[0]; - xmalloc_set_program_name (whoami); - - while ((ch = getopt_long (argc, argv, - "aA::bBcCdD::e:E:f:F:hiI:J::k:lLm:n::N::O:p::P::q::Q::st:Tvw:xyzZ::", - long_options, 0)) - != EOF) - { - switch (ch) - { - case 'a': - ignore_static_funcs = TRUE; - break; - case 'A': - if (optarg) - { - sym_id_add (optarg, INCL_ANNO); - } - output_style |= STYLE_ANNOTATED_SOURCE; - user_specified |= STYLE_ANNOTATED_SOURCE; - break; - case 'b': - print_descriptions = FALSE; - break; - case 'B': - output_style |= STYLE_CALL_GRAPH; - user_specified |= STYLE_CALL_GRAPH; - break; - case 'c': - ignore_direct_calls = TRUE; - break; - case 'C': - if (optarg) - { - sym_id_add (optarg, INCL_EXEC); - } - output_style |= STYLE_EXEC_COUNTS; - user_specified |= STYLE_EXEC_COUNTS; - break; - case 'd': - if (optarg) - { - debug_level |= atoi (optarg); - debug_level |= ANYDEBUG; - } - else - { - debug_level = ~0; - } - DBG (ANYDEBUG, printf ("[main] debug-level=0x%x\n", debug_level)); -#ifndef DEBUG - printf (_("%s: debugging not supported; -d ignored\n"), whoami); -#endif /* DEBUG */ - break; - case 'D': - ignore_non_functions = TRUE; - break; - case 'E': - sym_id_add (optarg, EXCL_TIME); - case 'e': - sym_id_add (optarg, EXCL_GRAPH); - break; - case 'F': - sym_id_add (optarg, INCL_TIME); - case 'f': - sym_id_add (optarg, INCL_GRAPH); - break; - case 'g': - sym_id_add (optarg, EXCL_FLAT); - break; - case 'G': - sym_id_add (optarg, INCL_FLAT); - break; - case 'h': - usage (stdout, 0); - case 'i': - output_style |= STYLE_GMON_INFO; - user_specified |= STYLE_GMON_INFO; - break; - case 'I': - search_list_append (&src_search_list, optarg); - break; - case 'J': - if (optarg) - { - sym_id_add (optarg, EXCL_ANNO); - output_style |= STYLE_ANNOTATED_SOURCE; - } - else - { - output_style &= ~STYLE_ANNOTATED_SOURCE; - } - user_specified |= STYLE_ANNOTATED_SOURCE; - break; - case 'k': - sym_id_add (optarg, EXCL_ARCS); - break; - case 'l': - line_granularity = TRUE; - break; - case 'L': - print_path = TRUE; - break; - case 'm': - bb_min_calls = (unsigned long) strtoul (optarg, (char **) NULL, 10); - break; - case 'n': - sym_id_add (optarg, INCL_TIME); - break; - case 'N': - sym_id_add (optarg, EXCL_TIME); - break; - case 'O': - switch (optarg[0]) - { - case 'a': - file_format = FF_AUTO; - break; - case 'm': - file_format = FF_MAGIC; - break; - case 'b': - file_format = FF_BSD; - break; - case 'p': - file_format = FF_PROF; - break; - default: - fprintf (stderr, _("%s: unknown file format %s\n"), - optarg, whoami); - done (1); - } - break; - case 'p': - if (optarg) - { - sym_id_add (optarg, INCL_FLAT); - } - output_style |= STYLE_FLAT_PROFILE; - user_specified |= STYLE_FLAT_PROFILE; - break; - case 'P': - if (optarg) - { - sym_id_add (optarg, EXCL_FLAT); - output_style |= STYLE_FLAT_PROFILE; - } - else - { - output_style &= ~STYLE_FLAT_PROFILE; - } - user_specified |= STYLE_FLAT_PROFILE; - break; - case 'q': - if (optarg) - { - if (strchr (optarg, '/')) - { - sym_id_add (optarg, INCL_ARCS); - } - else - { - sym_id_add (optarg, INCL_GRAPH); - } - } - output_style |= STYLE_CALL_GRAPH; - user_specified |= STYLE_CALL_GRAPH; - break; - case 'r': - output_style |= STYLE_FUNCTION_ORDER; - user_specified |= STYLE_FUNCTION_ORDER; - break; - case 'R': - output_style |= STYLE_FILE_ORDER; - user_specified |= STYLE_FILE_ORDER; - function_mapping_file = optarg; - break; - case 'Q': - if (optarg) - { - if (strchr (optarg, '/')) - { - sym_id_add (optarg, EXCL_ARCS); - } - else - { - sym_id_add (optarg, EXCL_GRAPH); - } - output_style |= STYLE_CALL_GRAPH; - } - else - { - output_style &= ~STYLE_CALL_GRAPH; - } - user_specified |= STYLE_CALL_GRAPH; - break; - case 's': - output_style |= STYLE_SUMMARY_FILE; - user_specified |= STYLE_SUMMARY_FILE; - break; - case 't': - bb_table_length = atoi (optarg); - if (bb_table_length < 0) - { - bb_table_length = 0; - } - break; - case 'T': - bsd_style_output = TRUE; - break; - case 'v': - /* This output is intended to follow the GNU standards document. */ - printf (_("GNU gprof %s\n"), VERSION); - printf (_("Based on BSD gprof, copyright 1983 Regents of the University of California.\n")); - printf (_("\ -This program is free software. This program has absolutely no warranty.\n")); - done (0); - case 'w': - output_width = atoi (optarg); - if (output_width < 1) - { - output_width = 1; - } - break; - case 'x': - bb_annotate_all_lines = TRUE; - break; - case 'y': - create_annotation_files = TRUE; - break; - case 'z': - ignore_zeros = FALSE; - break; - case 'Z': - if (optarg) - { - sym_id_add (optarg, EXCL_EXEC); - output_style |= STYLE_EXEC_COUNTS; - } - else - { - output_style &= ~STYLE_EXEC_COUNTS; - } - user_specified |= STYLE_ANNOTATED_SOURCE; - break; - case OPTION_DEMANGLE: - demangle = TRUE; - break; - case OPTION_NO_DEMANGLE: - demangle = FALSE; - break; - default: - usage (stderr, 1); - } - } - - /* Don't allow both ordering options, they modify the arc data in-place. */ - if ((user_specified & STYLE_FUNCTION_ORDER) - && (user_specified & STYLE_FILE_ORDER)) - { - fprintf (stderr,_("\ -%s: Only one of --function-ordering and --file-ordering may be specified.\n"), - whoami); - done (1); - } - - /* --sum implies --line, otherwise we'd lose b-b counts in gmon.sum */ - if (output_style & STYLE_SUMMARY_FILE) - { - line_granularity = 1; - } - - /* append value of GPROF_PATH to source search list if set: */ - str = (char *) getenv ("GPROF_PATH"); - if (str) - { - search_list_append (&src_search_list, str); - } - - if (optind < argc) - { - a_out_name = argv[optind++]; - } - if (optind < argc) - { - gmon_name = argv[optind++]; - } - - /* - * Turn off default functions: - */ - for (sp = &default_excluded_list[0]; *sp; sp++) - { - sym_id_add (*sp, EXCL_TIME); - sym_id_add (*sp, EXCL_GRAPH); -#ifdef __alpha__ - sym_id_add (*sp, EXCL_FLAT); -#endif - } - - /* - * For line-by-line profiling, also want to keep those - * functions off the flat profile: - */ - if (line_granularity) - { - for (sp = &default_excluded_list[0]; *sp; sp++) - { - sym_id_add (*sp, EXCL_FLAT); - } - } - - /* - * Read symbol table from core file: - */ - core_init (a_out_name); - - /* - * If we should ignore direct function calls, we need to load - * to core's text-space: - */ - if (ignore_direct_calls) - { - core_get_text_space (core_bfd); - } - - /* - * Create symbols from core image: - */ - if (line_granularity) - { - core_create_line_syms (core_bfd); - } - else - { - core_create_function_syms (core_bfd); - } - - /* - * Translate sym specs into syms: - */ - sym_id_parse (); - - if (file_format == FF_PROF) - { -#ifdef PROF_SUPPORT_IMPLEMENTED - /* - * Get information about mon.out file(s): - */ - do - { - mon_out_read (gmon_name); - if (optind < argc) - { - gmon_name = argv[optind]; - } - } - while (optind++ < argc); -#else - fprintf (stderr, - _("%s: sorry, file format `prof' is not yet supported\n"), - whoami); - done (1); -#endif - } - else - { - /* - * Get information about gmon.out file(s): - */ - do - { - gmon_out_read (gmon_name); - if (optind < argc) - { - gmon_name = argv[optind]; - } - } - while (optind++ < argc); - } - - /* - * If user did not specify output style, try to guess something - * reasonable: - */ - if (output_style == 0) - { - if (gmon_input & (INPUT_HISTOGRAM | INPUT_CALL_GRAPH)) - { - output_style = STYLE_FLAT_PROFILE | STYLE_CALL_GRAPH; - } - else - { - output_style = STYLE_EXEC_COUNTS; - } - output_style &= ~user_specified; - } - - /* - * Dump a gmon.sum file if requested (before any other processing!): - */ - if (output_style & STYLE_SUMMARY_FILE) - { - gmon_out_write (GMONSUM); - } - - if (gmon_input & INPUT_HISTOGRAM) - { - hist_assign_samples (); - } - - if (gmon_input & INPUT_CALL_GRAPH) - { - cg = cg_assemble (); - } - - /* do some simple sanity checks: */ - - if ((output_style & STYLE_FLAT_PROFILE) - && !(gmon_input & INPUT_HISTOGRAM)) - { - fprintf (stderr, _("%s: gmon.out file is missing histogram\n"), whoami); - done (1); - } - - if ((output_style & STYLE_CALL_GRAPH) && !(gmon_input & INPUT_CALL_GRAPH)) - { - fprintf (stderr, - _("%s: gmon.out file is missing call-graph data\n"), whoami); - done (1); - } - - /* output whatever user whishes to see: */ - - if (cg && (output_style & STYLE_CALL_GRAPH) && bsd_style_output) - { - cg_print (cg); /* print the dynamic profile */ - } - - if (output_style & STYLE_FLAT_PROFILE) - { - hist_print (); /* print the flat profile */ - } - - if (cg && (output_style & STYLE_CALL_GRAPH)) - { - if (!bsd_style_output) - { - cg_print (cg); /* print the dynamic profile */ - } - cg_print_index (); - } - - if (output_style & STYLE_EXEC_COUNTS) - { - print_exec_counts (); - } - - if (output_style & STYLE_ANNOTATED_SOURCE) - { - print_annotated_source (); - } - if (output_style & STYLE_FUNCTION_ORDER) - { - cg_print_function_ordering (); - } - if (output_style & STYLE_FILE_ORDER) - { - cg_print_file_ordering (); - } - return 0; -} - -void -done (status) - int status; -{ - exit (status); -} diff --git a/gprof/gprof.h b/gprof/gprof.h deleted file mode 100644 index cb3230e..0000000 --- a/gprof/gprof.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - * - * @(#)gprof.h 5.9 (Berkeley) 6/1/90 - */ -#ifndef gprof_h -#define gprof_h - -#include <ansidecl.h> - -/* Include the BFD sysdep.h file. */ -#include "sysdep.h" - -/* Undefine the BFD PACKAGE and VERSION macros before including the - gprof config.h file. */ -#undef PACKAGE -#undef VERSION -/* Also undefine BFD's `_' macro; we have our own definition. */ -#undef _ - -#include "gconfig.h" - -#ifndef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#endif -#ifndef MAX -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#endif - -/* AIX defines hz as a macro. */ -#undef hz - -#ifndef PATH_MAX -#define PATH_MAX 1024 -#endif - -#define A_OUTNAME "a.out" /* default core filename */ -#define GMONNAME "gmon.out" /* default profile filename */ -#define GMONSUM "gmon.sum" /* profile summary filename */ - -#ifdef HAVE_LOCALE_H -# include <locale.h> -#endif - -#ifdef ENABLE_NLS -# include <libintl.h> -# define _(String) gettext (String) -# ifdef gettext_noop -# define N_(String) gettext_noop (String) -# else -# define N_(String) (String) -# endif -#else -/* Stubs that do something close enough. */ -# define textdomain(String) (String) -# define gettext(String) (String) -# define dgettext(Domain,Message) (Message) -# define dcgettext(Domain,Message,Type) (Message) -# define bindtextdomain(Domain,Directory) (Domain) -# define _(String) (String) -# define N_(String) (String) -#endif - -#ifndef LC_MESSAGES -# define LC_MESSAGES 0 -#endif - - -/* - * These may already be defined on some systems. We could probably - * just use the BFD versions of these, since BFD has already dealt - * with this problem. - */ -#undef FALSE -#define FALSE 0 -#undef TRUE -#define TRUE 1 - -#define STYLE_FLAT_PROFILE (1<<0) -#define STYLE_CALL_GRAPH (1<<1) -#define STYLE_SUMMARY_FILE (1<<2) -#define STYLE_EXEC_COUNTS (1<<3) -#define STYLE_ANNOTATED_SOURCE (1<<4) -#define STYLE_GMON_INFO (1<<5) -#define STYLE_FUNCTION_ORDER (1<<6) -#define STYLE_FILE_ORDER (1<<7) - -#define ANYDEBUG (1<<0) /* 1 */ -#define DFNDEBUG (1<<1) /* 2 */ -#define CYCLEDEBUG (1<<2) /* 4 */ -#define ARCDEBUG (1<<3) /* 8 */ -#define TALLYDEBUG (1<<4) /* 16 */ -#define TIMEDEBUG (1<<5) /* 32 */ -#define SAMPLEDEBUG (1<<6) /* 64 */ -#define AOUTDEBUG (1<<7) /* 128 */ -#define CALLDEBUG (1<<8) /* 256 */ -#define LOOKUPDEBUG (1<<9) /* 512 */ -#define PROPDEBUG (1<<10) /* 1024 */ -#define BBDEBUG (1<<11) /* 2048 */ -#define IDDEBUG (1<<12) /* 4096 */ -#define SRCDEBUG (1<<13) /* 8192 */ - -#ifdef DEBUG -#define DBG(l,s) if (debug_level & (l)) {s;} -#else -#define DBG(l,s) -#endif - -typedef enum - { - FF_AUTO = 0, FF_MAGIC, FF_BSD, FF_PROF - } -File_Format; - -typedef int bool; -typedef unsigned char UNIT[2]; /* unit of profiling */ - -extern const char *whoami; /* command-name, for error messages */ -extern const char *function_mapping_file; /* file mapping functions to files */ -extern const char *a_out_name; /* core filename */ -extern long hz; /* ticks per second */ - -/* - * Command-line options: - */ -extern int debug_level; /* debug level */ -extern int output_style; -extern int output_width; /* controls column width in index */ -extern bool bsd_style_output; /* as opposed to FSF style output */ -extern bool demangle; /* demangle symbol names? */ -extern bool discard_underscores; /* discard leading underscores? */ -extern bool ignore_direct_calls; /* don't count direct calls */ -extern bool ignore_static_funcs; /* suppress static functions */ -extern bool ignore_zeros; /* ignore unused symbols/files */ -extern bool line_granularity; /* function or line granularity? */ -extern bool print_descriptions; /* output profile description */ -extern bool print_path; /* print path or just filename? */ -extern bool ignore_non_functions;/* Ignore non-function symbols. */ - -extern File_Format file_format; /* requested file format */ - -extern bool first_output; /* no output so far? */ - -extern void done PARAMS ((int status)); - -#endif /* gprof_h */ diff --git a/gprof/gprof.texi b/gprof/gprof.texi deleted file mode 100644 index 96bc806..0000000 --- a/gprof/gprof.texi +++ /dev/null @@ -1,2028 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@setfilename gprof.info -@settitle GNU gprof -@setchapternewpage odd - -@ifinfo -@c This is a dir.info fragment to support semi-automated addition of -@c manuals to an info tree. zoo@cygnus.com is developing this facility. -@format -START-INFO-DIR-ENTRY -* gprof: (gprof). Profiling your program's execution -END-INFO-DIR-ENTRY -@end format -@end ifinfo - -@ifinfo -This file documents the gprof profiler of the GNU system. - -Copyright (C) 1988, 1992, 1997, 1998 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through Tex and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ifinfo - -@finalout -@smallbook - -@titlepage -@title GNU gprof -@subtitle The @sc{gnu} Profiler -@author Jay Fenlason and Richard Stallman - -@page - -This manual describes the @sc{gnu} profiler, @code{gprof}, and how you -can use it to determine which parts of a program are taking most of the -execution time. We assume that you know how to write, compile, and -execute programs. @sc{gnu} @code{gprof} was written by Jay Fenlason. - -This manual was edited January 1993 by Jeffrey Osier -and updated September 1997 by Brent Baccala. - -@vskip 0pt plus 1filll -Copyright @copyright{} 1988, 1992, 1997, 1998 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the same conditions as for modified versions. - -@end titlepage - -@ifinfo -@node Top -@top Profiling a Program: Where Does It Spend Its Time? - -This manual describes the @sc{gnu} profiler, @code{gprof}, and how you -can use it to determine which parts of a program are taking most of the -execution time. We assume that you know how to write, compile, and -execute programs. @sc{gnu} @code{gprof} was written by Jay Fenlason. - -This manual was updated August 1997 by Brent Baccala. - -@menu -* Introduction:: What profiling means, and why it is useful. - -* Compiling:: How to compile your program for profiling. -* Executing:: Executing your program to generate profile data -* Invoking:: How to run @code{gprof}, and its options - -* Output:: Interpreting @code{gprof}'s output - -* Inaccuracy:: Potential problems you should be aware of -* How do I?:: Answers to common questions -* Incompatibilities:: (between @sc{gnu} @code{gprof} and Unix @code{gprof}.) -* Details:: Details of how profiling is done -@end menu -@end ifinfo - -@node Introduction -@chapter Introduction to Profiling - -Profiling allows you to learn where your program spent its time and which -functions called which other functions while it was executing. This -information can show you which pieces of your program are slower than you -expected, and might be candidates for rewriting to make your program -execute faster. It can also tell you which functions are being called more -or less often than you expected. This may help you spot bugs that had -otherwise been unnoticed. - -Since the profiler uses information collected during the actual execution -of your program, it can be used on programs that are too large or too -complex to analyze by reading the source. However, how your program is run -will affect the information that shows up in the profile data. If you -don't use some feature of your program while it is being profiled, no -profile information will be generated for that feature. - -Profiling has several steps: - -@itemize @bullet -@item -You must compile and link your program with profiling enabled. -@xref{Compiling}. - -@item -You must execute your program to generate a profile data file. -@xref{Executing}. - -@item -You must run @code{gprof} to analyze the profile data. -@xref{Invoking}. -@end itemize - -The next three chapters explain these steps in greater detail. - -Several forms of output are available from the analysis. - -The @dfn{flat profile} shows how much time your program spent in each function, -and how many times that function was called. If you simply want to know -which functions burn most of the cycles, it is stated concisely here. -@xref{Flat Profile}. - -The @dfn{call graph} shows, for each function, which functions called it, which -other functions it called, and how many times. There is also an estimate -of how much time was spent in the subroutines of each function. This can -suggest places where you might try to eliminate function calls that use a -lot of time. @xref{Call Graph}. - -The @dfn{annotated source} listing is a copy of the program's -source code, labeled with the number of times each line of the -program was executed. @xref{Annotated Source}. - -To better understand how profiling works, you may wish to read -a description of its implementation. -@xref{Implementation}. - -@node Compiling -@chapter Compiling a Program for Profiling - -The first step in generating profile information for your program is -to compile and link it with profiling enabled. - -To compile a source file for profiling, specify the @samp{-pg} option when -you run the compiler. (This is in addition to the options you normally -use.) - -To link the program for profiling, if you use a compiler such as @code{cc} -to do the linking, simply specify @samp{-pg} in addition to your usual -options. The same option, @samp{-pg}, alters either compilation or linking -to do what is necessary for profiling. Here are examples: - -@example -cc -g -c myprog.c utils.c -pg -cc -o myprog myprog.o utils.o -pg -@end example - -The @samp{-pg} option also works with a command that both compiles and links: - -@example -cc -o myprog myprog.c utils.c -g -pg -@end example - -If you run the linker @code{ld} directly instead of through a compiler -such as @code{cc}, you may have to specify a profiling startup file -@file{gcrt0.o} as the first input file instead of the usual startup -file @file{crt0.o}. In addition, you would probably want to -specify the profiling C library, @file{libc_p.a}, by writing -@samp{-lc_p} instead of the usual @samp{-lc}. This is not absolutely -necessary, but doing this gives you number-of-calls information for -standard library functions such as @code{read} and @code{open}. For -example: - -@example -ld -o myprog /lib/gcrt0.o myprog.o utils.o -lc_p -@end example - -If you compile only some of the modules of the program with @samp{-pg}, you -can still profile the program, but you won't get complete information about -the modules that were compiled without @samp{-pg}. The only information -you get for the functions in those modules is the total time spent in them; -there is no record of how many times they were called, or from where. This -will not affect the flat profile (except that the @code{calls} field for -the functions will be blank), but will greatly reduce the usefulness of the -call graph. - -If you wish to perform line-by-line profiling, -you will also need to specify the @samp{-g} option, -instructing the compiler to insert debugging symbols into the program -that match program addresses to source code lines. -@xref{Line-by-line}. - -In addition to the @samp{-pg} and @samp{-g} options, -you may also wish to specify the @samp{-a} option when compiling. -This will instrument -the program to perform basic-block counting. As the program runs, -it will count how many times it executed each branch of each @samp{if} -statement, each iteration of each @samp{do} loop, etc. This will -enable @code{gprof} to construct an annotated source code -listing showing how many times each line of code was executed. - -@node Executing -@chapter Executing the Program - -Once the program is compiled for profiling, you must run it in order to -generate the information that @code{gprof} needs. Simply run the program -as usual, using the normal arguments, file names, etc. The program should -run normally, producing the same output as usual. It will, however, run -somewhat slower than normal because of the time spent collecting and the -writing the profile data. - -The way you run the program---the arguments and input that you give -it---may have a dramatic effect on what the profile information shows. The -profile data will describe the parts of the program that were activated for -the particular input you use. For example, if the first command you give -to your program is to quit, the profile data will show the time used in -initialization and in cleanup, but not much else. - -Your program will write the profile data into a file called @file{gmon.out} -just before exiting. If there is already a file called @file{gmon.out}, -its contents are overwritten. There is currently no way to tell the -program to write the profile data under a different name, but you can rename -the file afterward if you are concerned that it may be overwritten. - -In order to write the @file{gmon.out} file properly, your program must exit -normally: by returning from @code{main} or by calling @code{exit}. Calling -the low-level function @code{_exit} does not write the profile data, and -neither does abnormal termination due to an unhandled signal. - -The @file{gmon.out} file is written in the program's @emph{current working -directory} at the time it exits. This means that if your program calls -@code{chdir}, the @file{gmon.out} file will be left in the last directory -your program @code{chdir}'d to. If you don't have permission to write in -this directory, the file is not written, and you will get an error message. - -Older versions of the @sc{gnu} profiling library may also write a file -called @file{bb.out}. This file, if present, contains an human-readable -listing of the basic-block execution counts. Unfortunately, the -appearance of a human-readable @file{bb.out} means the basic-block -counts didn't get written into @file{gmon.out}. -The Perl script @code{bbconv.pl}, included with the @code{gprof} -source distribution, will convert a @file{bb.out} file into -a format readable by @code{gprof}. - -@node Invoking -@chapter @code{gprof} Command Summary - -After you have a profile data file @file{gmon.out}, you can run @code{gprof} -to interpret the information in it. The @code{gprof} program prints a -flat profile and a call graph on standard output. Typically you would -redirect the output of @code{gprof} into a file with @samp{>}. - -You run @code{gprof} like this: - -@smallexample -gprof @var{options} [@var{executable-file} [@var{profile-data-files}@dots{}]] [> @var{outfile}] -@end smallexample - -@noindent -Here square-brackets indicate optional arguments. - -If you omit the executable file name, the file @file{a.out} is used. If -you give no profile data file name, the file @file{gmon.out} is used. If -any file is not in the proper format, or if the profile data file does not -appear to belong to the executable file, an error message is printed. - -You can give more than one profile data file by entering all their names -after the executable file name; then the statistics in all the data files -are summed together. - -The order of these options does not matter. - -@menu -* Output Options:: Controlling @code{gprof}'s output style -* Analysis Options:: Controlling how @code{gprof} analyses its data -* Miscellaneous Options:: -* Depricated Options:: Options you no longer need to use, but which - have been retained for compatibility -* Symspecs:: Specifying functions to include or exclude -@end menu - -@node Output Options,Analysis Options,,Invoking -@section Output Options - -These options specify which of several output formats -@code{gprof} should produce. - -Many of these options take an optional @dfn{symspec} to specify -functions to be included or excluded. These options can be -specified multiple times, with different symspecs, to include -or exclude sets of symbols. @xref{Symspecs}. - -Specifying any of these options overrides the default (@samp{-p -q}), -which prints a flat profile and call graph analysis -for all functions. - -@table @code - -@item -A[@var{symspec}] -@itemx --annotated-source[=@var{symspec}] -The @samp{-A} option causes @code{gprof} to print annotated source code. -If @var{symspec} is specified, print output only for matching symbols. -@xref{Annotated Source}. - -@item -b -@itemx --brief -If the @samp{-b} option is given, @code{gprof} doesn't print the -verbose blurbs that try to explain the meaning of all of the fields in -the tables. This is useful if you intend to print out the output, or -are tired of seeing the blurbs. - -@item -C[@var{symspec}] -@itemx --exec-counts[=@var{symspec}] -The @samp{-C} option causes @code{gprof} to -print a tally of functions and the number of times each was called. -If @var{symspec} is specified, print tally only for matching symbols. - -If the profile data file contains basic-block count records, specifing -the @samp{-l} option, along with @samp{-C}, will cause basic-block -execution counts to be tallied and displayed. - -@item -i -@itemx --file-info -The @samp{-i} option causes @code{gprof} to display summary information -about the profile data file(s) and then exit. The number of histogram, -call graph, and basic-block count records is displayed. - -@item -I @var{dirs} -@itemx --directory-path=@var{dirs} -The @samp{-I} option specifies a list of search directories in -which to find source files. Environment variable @var{GPROF_PATH} -can also be used to convery this information. -Used mostly for annotated source output. - -@item -J[@var{symspec}] -@itemx --no-annotated-source[=@var{symspec}] -The @samp{-J} option causes @code{gprof} not to -print annotated source code. -If @var{symspec} is specified, @code{gprof} prints annotated source, -but excludes matching symbols. - -@item -L -@itemx --print-path -Normally, source filenames are printed with the path -component suppressed. The @samp{-L} option causes @code{gprof} -to print the full pathname of -source filenames, which is determined -from symbolic debugging information in the image file -and is relative to the directory in which the compiler -was invoked. - -@item -p[@var{symspec}] -@itemx --flat-profile[=@var{symspec}] -The @samp{-p} option causes @code{gprof} to print a flat profile. -If @var{symspec} is specified, print flat profile only for matching symbols. -@xref{Flat Profile}. - -@item -P[@var{symspec}] -@itemx --no-flat-profile[=@var{symspec}] -The @samp{-P} option causes @code{gprof} to suppress printing a flat profile. -If @var{symspec} is specified, @code{gprof} prints a flat profile, -but excludes matching symbols. - -@item -q[@var{symspec}] -@itemx --graph[=@var{symspec}] -The @samp{-q} option causes @code{gprof} to print the call graph analysis. -If @var{symspec} is specified, print call graph only for matching symbols -and their children. -@xref{Call Graph}. - -@item -Q[@var{symspec}] -@itemx --no-graph[=@var{symspec}] -The @samp{-Q} option causes @code{gprof} to suppress printing the -call graph. -If @var{symspec} is specified, @code{gprof} prints a call graph, -but excludes matching symbols. - -@item -y -@itemx --separate-files -This option affects annotated source output only. -Normally, gprof prints annotated source files -to standard-output. If this option is specified, -annotated source for a file named @file{path/filename} -is generated in the file @file{filename-ann}. - -@item -Z[@var{symspec}] -@itemx --no-exec-counts[=@var{symspec}] -The @samp{-Z} option causes @code{gprof} not to -print a tally of functions and the number of times each was called. -If @var{symspec} is specified, print tally, but exclude matching symbols. - -@item --function-ordering -The @samp{--function-ordering} option causes @code{gprof} to print a -suggested function ordering for the program based on profiling data. -This option suggests an ordering which may improve paging, tlb and -cache behavior for the program on systems which support arbitrary -ordering of functions in an executable. - -The exact details of how to force the linker to place functions -in a particular order is system dependent and out of the scope of this -manual. - -@item --file-ordering @var{map_file} -The @samp{--file-ordering} option causes @code{gprof} to print a -suggested .o link line ordering for the program based on profiling data. -This option suggests an ordering which may improve paging, tlb and -cache behavior for the program on systems which do not support arbitrary -ordering of functions in an executable. - -Use of the @samp{-a} argument is highly recommended with this option. - -The @var{map_file} argument is a pathname to a file which provides -function name to object file mappings. The format of the file is similar to -the output of the program @code{nm}. - -@smallexample -@group -c-parse.o:00000000 T yyparse -c-parse.o:00000004 C yyerrflag -c-lang.o:00000000 T maybe_objc_method_name -c-lang.o:00000000 T print_lang_statistics -c-lang.o:00000000 T recognize_objc_keyword -c-decl.o:00000000 T print_lang_identifier -c-decl.o:00000000 T print_lang_type -@dots{} - -@end group -@end smallexample - -GNU @code{nm} @samp{--extern-only} @samp{--defined-only} @samp{-v} @samp{--print-file-name} can be used to create @var{map_file}. - -@item -T -@itemx --traditional -The @samp{-T} option causes @code{gprof} to print its output in -``traditional'' BSD style. - -@item -w @var{width} -@itemx --width=@var{width} -Sets width of output lines to @var{width}. -Currently only used when printing the function index at the bottom -of the call graph. - -@item -x -@itemx --all-lines -This option affects annotated source output only. -By default, only the lines at the beginning of a basic-block -are annotated. If this option is specified, every line in -a basic-block is annotated by repeating the annotation for the -first line. This behavior is similar to @code{tcov}'s @samp{-a}. - -@item --demangle -@itemx --no-demangle -These options control whether C++ symbol names should be demangled when -printing output. The default is to demangle symbols. The -@code{--no-demangle} option may be used to turn off demangling. - -@end table - -@node Analysis Options,Miscellaneous Options,Output Options,Invoking -@section Analysis Options - -@table @code - -@item -a -@itemx --no-static -The @samp{-a} option causes @code{gprof} to suppress the printing of -statically declared (private) functions. (These are functions whose -names are not listed as global, and which are not visible outside the -file/function/block where they were defined.) Time spent in these -functions, calls to/from them, etc, will all be attributed to the -function that was loaded directly before it in the executable file. -@c This is compatible with Unix @code{gprof}, but a bad idea. -This option affects both the flat profile and the call graph. - -@item -c -@itemx --static-call-graph -The @samp{-c} option causes the call graph of the program to be -augmented by a heuristic which examines the text space of the object -file and identifies function calls in the binary machine code. -Since normal call graph records are only generated when functions are -entered, this option identifies children that could have been called, -but never were. Calls to functions that were not compiled with -profiling enabled are also identified, but only if symbol table -entries are present for them. -Calls to dynamic library routines are typically @emph{not} found -by this option. -Parents or children identified via this heuristic -are indicated in the call graph with call counts of @samp{0}. - -@item -D -@itemx --ignore-non-functions -The @samp{-D} option causes @code{gprof} to ignore symbols which -are not known to be functions. This option will give more accurate -profile data on systems where it is supported (Solaris and HPUX for -example). - -@item -k @var{from}/@var{to} -The @samp{-k} option allows you to delete from the call graph any arcs from -symbols matching symspec @var{from} to those matching symspec @var{to}. - -@item -l -@itemx --line -The @samp{-l} option enables line-by-line profiling, which causes -histogram hits to be charged to individual source code lines, -instead of functions. -If the program was compiled with basic-block counting enabled, -this option will also identify how many times each line of -code was executed. -While line-by-line profiling can help isolate where in a large function -a program is spending its time, it also significantly increases -the running time of @code{gprof}, and magnifies statistical -inaccuracies. -@xref{Sampling Error}. - -@item -m @var{num} -@itemx --min-count=@var{num} -This option affects execution count output only. -Symbols that are executed less than @var{num} times are suppressed. - -@item -n[@var{symspec}] -@itemx --time[=@var{symspec}] -The @samp{-n} option causes @code{gprof}, in its call graph analysis, -to only propagate times for symbols matching @var{symspec}. - -@item -N[@var{symspec}] -@itemx --no-time[=@var{symspec}] -The @samp{-n} option causes @code{gprof}, in its call graph analysis, -not to propagate times for symbols matching @var{symspec}. - -@item -z -@itemx --display-unused-functions -If you give the @samp{-z} option, @code{gprof} will mention all -functions in the flat profile, even those that were never called, and -that had no time spent in them. This is useful in conjunction with the -@samp{-c} option for discovering which routines were never called. - -@end table - -@node Miscellaneous Options,Depricated Options,Analysis Options,Invoking -@section Miscellaneous Options - -@table @code - -@item -d[@var{num}] -@itemx --debug[=@var{num}] -The @samp{-d @var{num}} option specifies debugging options. -If @var{num} is not specified, enable all debugging. -@xref{Debugging}. - -@item -O@var{name} -@itemx --file-format=@var{name} -Selects the format of the profile data files. -Recognized formats are @samp{auto} (the default), @samp{bsd}, @samp{magic}, -and @samp{prof} (not yet supported). - -@item -s -@itemx --sum -The @samp{-s} option causes @code{gprof} to summarize the information -in the profile data files it read in, and write out a profile data -file called @file{gmon.sum}, which contains all the information from -the profile data files that @code{gprof} read in. The file @file{gmon.sum} -may be one of the specified input files; the effect of this is to -merge the data in the other input files into @file{gmon.sum}. - -Eventually you can run @code{gprof} again without @samp{-s} to analyze the -cumulative data in the file @file{gmon.sum}. - -@item -v -@itemx --version -The @samp{-v} flag causes @code{gprof} to print the current version -number, and then exit. - -@end table - -@node Depricated Options,Symspecs,Miscellaneous Options,Invoking -@section Depricated Options - -@table @code - -These options have been replaced with newer versions that use symspecs. - -@item -e @var{function_name} -The @samp{-e @var{function}} option tells @code{gprof} to not print -information about the function @var{function_name} (and its -children@dots{}) in the call graph. The function will still be listed -as a child of any functions that call it, but its index number will be -shown as @samp{[not printed]}. More than one @samp{-e} option may be -given; only one @var{function_name} may be indicated with each @samp{-e} -option. - -@item -E @var{function_name} -The @code{-E @var{function}} option works like the @code{-e} option, but -time spent in the function (and children who were not called from -anywhere else), will not be used to compute the percentages-of-time for -the call graph. More than one @samp{-E} option may be given; only one -@var{function_name} may be indicated with each @samp{-E} option. - -@item -f @var{function_name} -The @samp{-f @var{function}} option causes @code{gprof} to limit the -call graph to the function @var{function_name} and its children (and -their children@dots{}). More than one @samp{-f} option may be given; -only one @var{function_name} may be indicated with each @samp{-f} -option. - -@item -F @var{function_name} -The @samp{-F @var{function}} option works like the @code{-f} option, but -only time spent in the function and its children (and their -children@dots{}) will be used to determine total-time and -percentages-of-time for the call graph. More than one @samp{-F} option -may be given; only one @var{function_name} may be indicated with each -@samp{-F} option. The @samp{-F} option overrides the @samp{-E} option. - -@end table - -Note that only one function can be specified with each @code{-e}, -@code{-E}, @code{-f} or @code{-F} option. To specify more than one -function, use multiple options. For example, this command: - -@example -gprof -e boring -f foo -f bar myprogram > gprof.output -@end example - -@noindent -lists in the call graph all functions that were reached from either -@code{foo} or @code{bar} and were not reachable from @code{boring}. - -@node Symspecs,,Depricated Options,Invoking -@section Symspecs - -Many of the output options allow functions to be included or excluded -using @dfn{symspecs} (symbol specifications), which observe the -following syntax: - -@example - filename_containing_a_dot -| funcname_not_containing_a_dot -| linenumber -| ( [ any_filename ] `:' ( any_funcname | linenumber ) ) -@end example - -Here are some sample symspecs: - -@table @samp -@item main.c -Selects everything in file @file{main.c}---the -dot in the string tells gprof to interpret -the string as a filename, rather than as -a function name. To select a file whose -name does not contain a dot, a trailing colon -should be specified. For example, @samp{odd:} is -interpreted as the file named @file{odd}. - -@item main -Selects all functions named @samp{main}. - -Note that there may be multiple instances of the same function name -because some of the definitions may be local (i.e., static). Unless a -function name is unique in a program, you must use the colon notation -explained below to specify a function from a specific source file. - -Sometimes, function names contain dots. In such cases, it is necessar -to add a leading colon to the name. For example, @samp{:.mul} selects -function @samp{.mul}. - -In some object file formats, symbols have a leading underscore. gprof -will normally not print these underscores. However, you must use the -underscore when you name a symbol in a symspec. You can use the -@code{nm} program to see whether symbols have underscores for the object -file format you are using. - -@item main.c:main -Selects function @samp{main} in file @file{main.c}. - -@item main.c:134 -Selects line 134 in file @file{main.c}. -@end table - -@node Output -@chapter Interpreting @code{gprof}'s Output - -@code{gprof} can produce several different output styles, the -most important of which are described below. The simplest output -styles (file information, execution count, and function and file ordering) -are not described here, but are documented with the respective options -that trigger them. -@xref{Output Options}. - -@menu -* Flat Profile:: The flat profile shows how much time was spent - executing directly in each function. -* Call Graph:: The call graph shows which functions called which - others, and how much time each function used - when its subroutine calls are included. -* Line-by-line:: @code{gprof} can analyze individual source code lines -* Annotated Source:: The annotated source listing displays source code - labeled with execution counts -@end menu - - -@node Flat Profile,Call Graph,,Output -@section The Flat Profile -@cindex flat profile - -The @dfn{flat profile} shows the total amount of time your program -spent executing each function. Unless the @samp{-z} option is given, -functions with no apparent time spent in them, and no apparent calls -to them, are not mentioned. Note that if a function was not compiled -for profiling, and didn't run long enough to show up on the program -counter histogram, it will be indistinguishable from a function that -was never called. - -This is part of a flat profile for a small program: - -@smallexample -@group -Flat profile: - -Each sample counts as 0.01 seconds. - % cumulative self self total - time seconds seconds calls ms/call ms/call name - 33.34 0.02 0.02 7208 0.00 0.00 open - 16.67 0.03 0.01 244 0.04 0.12 offtime - 16.67 0.04 0.01 8 1.25 1.25 memccpy - 16.67 0.05 0.01 7 1.43 1.43 write - 16.67 0.06 0.01 mcount - 0.00 0.06 0.00 236 0.00 0.00 tzset - 0.00 0.06 0.00 192 0.00 0.00 tolower - 0.00 0.06 0.00 47 0.00 0.00 strlen - 0.00 0.06 0.00 45 0.00 0.00 strchr - 0.00 0.06 0.00 1 0.00 50.00 main - 0.00 0.06 0.00 1 0.00 0.00 memcpy - 0.00 0.06 0.00 1 0.00 10.11 print - 0.00 0.06 0.00 1 0.00 0.00 profil - 0.00 0.06 0.00 1 0.00 50.00 report -@dots{} -@end group -@end smallexample - -@noindent -The functions are sorted by first by decreasing run-time spent in them, -then by decreasing number of calls, then alphabetically by name. The -functions @samp{mcount} and @samp{profil} are part of the profiling -aparatus and appear in every flat profile; their time gives a measure of -the amount of overhead due to profiling. - -Just before the column headers, a statement appears indicating -how much time each sample counted as. -This @dfn{sampling period} estimates the margin of error in each of the time -figures. A time figure that is not much larger than this is not -reliable. In this example, each sample counted as 0.01 seconds, -suggesting a 100 Hz sampling rate. -The program's total execution time was 0.06 -seconds, as indicated by the @samp{cumulative seconds} field. Since -each sample counted for 0.01 seconds, this means only six samples -were taken during the run. Two of the samples occured while the -program was in the @samp{open} function, as indicated by the -@samp{self seconds} field. Each of the other four samples -occured one each in @samp{offtime}, @samp{memccpy}, @samp{write}, -and @samp{mcount}. -Since only six samples were taken, none of these values can -be regarded as particularly reliable. -In another run, -the @samp{self seconds} field for -@samp{mcount} might well be @samp{0.00} or @samp{0.02}. -@xref{Sampling Error}, for a complete discussion. - -The remaining functions in the listing (those whose -@samp{self seconds} field is @samp{0.00}) didn't appear -in the histogram samples at all. However, the call graph -indicated that they were called, so therefore they are listed, -sorted in decreasing order by the @samp{calls} field. -Clearly some time was spent executing these functions, -but the paucity of histogram samples prevents any -determination of how much time each took. - -Here is what the fields in each line mean: - -@table @code -@item % time -This is the percentage of the total execution time your program spent -in this function. These should all add up to 100%. - -@item cumulative seconds -This is the cumulative total number of seconds the computer spent -executing this functions, plus the time spent in all the functions -above this one in this table. - -@item self seconds -This is the number of seconds accounted for by this function alone. -The flat profile listing is sorted first by this number. - -@item calls -This is the total number of times the function was called. If the -function was never called, or the number of times it was called cannot -be determined (probably because the function was not compiled with -profiling enabled), the @dfn{calls} field is blank. - -@item self ms/call -This represents the average number of milliseconds spent in this -function per call, if this function is profiled. Otherwise, this field -is blank for this function. - -@item total ms/call -This represents the average number of milliseconds spent in this -function and its descendants per call, if this function is profiled. -Otherwise, this field is blank for this function. -This is the only field in the flat profile that uses call graph analysis. - -@item name -This is the name of the function. The flat profile is sorted by this -field alphabetically after the @dfn{self seconds} and @dfn{calls} -fields are sorted. -@end table - -@node Call Graph,Line-by-line,Flat Profile,Output -@section The Call Graph -@cindex call graph - -The @dfn{call graph} shows how much time was spent in each function -and its children. From this information, you can find functions that, -while they themselves may not have used much time, called other -functions that did use unusual amounts of time. - -Here is a sample call from a small program. This call came from the -same @code{gprof} run as the flat profile example in the previous -chapter. - -@smallexample -@group -granularity: each sample hit covers 2 byte(s) for 20.00% of 0.05 seconds - -index % time self children called name - <spontaneous> -[1] 100.0 0.00 0.05 start [1] - 0.00 0.05 1/1 main [2] - 0.00 0.00 1/2 on_exit [28] - 0.00 0.00 1/1 exit [59] ------------------------------------------------ - 0.00 0.05 1/1 start [1] -[2] 100.0 0.00 0.05 1 main [2] - 0.00 0.05 1/1 report [3] ------------------------------------------------ - 0.00 0.05 1/1 main [2] -[3] 100.0 0.00 0.05 1 report [3] - 0.00 0.03 8/8 timelocal [6] - 0.00 0.01 1/1 print [9] - 0.00 0.01 9/9 fgets [12] - 0.00 0.00 12/34 strncmp <cycle 1> [40] - 0.00 0.00 8/8 lookup [20] - 0.00 0.00 1/1 fopen [21] - 0.00 0.00 8/8 chewtime [24] - 0.00 0.00 8/16 skipspace [44] ------------------------------------------------ -[4] 59.8 0.01 0.02 8+472 <cycle 2 as a whole> [4] - 0.01 0.02 244+260 offtime <cycle 2> [7] - 0.00 0.00 236+1 tzset <cycle 2> [26] ------------------------------------------------ -@end group -@end smallexample - -The lines full of dashes divide this table into @dfn{entries}, one for each -function. Each entry has one or more lines. - -In each entry, the primary line is the one that starts with an index number -in square brackets. The end of this line says which function the entry is -for. The preceding lines in the entry describe the callers of this -function and the following lines describe its subroutines (also called -@dfn{children} when we speak of the call graph). - -The entries are sorted by time spent in the function and its subroutines. - -The internal profiling function @code{mcount} (@pxref{Flat Profile}) -is never mentioned in the call graph. - -@menu -* Primary:: Details of the primary line's contents. -* Callers:: Details of caller-lines' contents. -* Subroutines:: Details of subroutine-lines' contents. -* Cycles:: When there are cycles of recursion, - such as @code{a} calls @code{b} calls @code{a}@dots{} -@end menu - -@node Primary -@subsection The Primary Line - -The @dfn{primary line} in a call graph entry is the line that -describes the function which the entry is about and gives the overall -statistics for this function. - -For reference, we repeat the primary line from the entry for function -@code{report} in our main example, together with the heading line that -shows the names of the fields: - -@smallexample -@group -index % time self children called name -@dots{} -[3] 100.0 0.00 0.05 1 report [3] -@end group -@end smallexample - -Here is what the fields in the primary line mean: - -@table @code -@item index -Entries are numbered with consecutive integers. Each function -therefore has an index number, which appears at the beginning of its -primary line. - -Each cross-reference to a function, as a caller or subroutine of -another, gives its index number as well as its name. The index number -guides you if you wish to look for the entry for that function. - -@item % time -This is the percentage of the total time that was spent in this -function, including time spent in subroutines called from this -function. - -The time spent in this function is counted again for the callers of -this function. Therefore, adding up these percentages is meaningless. - -@item self -This is the total amount of time spent in this function. This -should be identical to the number printed in the @code{seconds} field -for this function in the flat profile. - -@item children -This is the total amount of time spent in the subroutine calls made by -this function. This should be equal to the sum of all the @code{self} -and @code{children} entries of the children listed directly below this -function. - -@item called -This is the number of times the function was called. - -If the function called itself recursively, there are two numbers, -separated by a @samp{+}. The first number counts non-recursive calls, -and the second counts recursive calls. - -In the example above, the function @code{report} was called once from -@code{main}. - -@item name -This is the name of the current function. The index number is -repeated after it. - -If the function is part of a cycle of recursion, the cycle number is -printed between the function's name and the index number -(@pxref{Cycles}). For example, if function @code{gnurr} is part of -cycle number one, and has index number twelve, its primary line would -be end like this: - -@example -gnurr <cycle 1> [12] -@end example -@end table - -@node Callers, Subroutines, Primary, Call Graph -@subsection Lines for a Function's Callers - -A function's entry has a line for each function it was called by. -These lines' fields correspond to the fields of the primary line, but -their meanings are different because of the difference in context. - -For reference, we repeat two lines from the entry for the function -@code{report}, the primary line and one caller-line preceding it, together -with the heading line that shows the names of the fields: - -@smallexample -index % time self children called name -@dots{} - 0.00 0.05 1/1 main [2] -[3] 100.0 0.00 0.05 1 report [3] -@end smallexample - -Here are the meanings of the fields in the caller-line for @code{report} -called from @code{main}: - -@table @code -@item self -An estimate of the amount of time spent in @code{report} itself when it was -called from @code{main}. - -@item children -An estimate of the amount of time spent in subroutines of @code{report} -when @code{report} was called from @code{main}. - -The sum of the @code{self} and @code{children} fields is an estimate -of the amount of time spent within calls to @code{report} from @code{main}. - -@item called -Two numbers: the number of times @code{report} was called from @code{main}, -followed by the total number of nonrecursive calls to @code{report} from -all its callers. - -@item name and index number -The name of the caller of @code{report} to which this line applies, -followed by the caller's index number. - -Not all functions have entries in the call graph; some -options to @code{gprof} request the omission of certain functions. -When a caller has no entry of its own, it still has caller-lines -in the entries of the functions it calls. - -If the caller is part of a recursion cycle, the cycle number is -printed between the name and the index number. -@end table - -If the identity of the callers of a function cannot be determined, a -dummy caller-line is printed which has @samp{<spontaneous>} as the -``caller's name'' and all other fields blank. This can happen for -signal handlers. -@c What if some calls have determinable callers' names but not all? -@c FIXME - still relevant? - -@node Subroutines, Cycles, Callers, Call Graph -@subsection Lines for a Function's Subroutines - -A function's entry has a line for each of its subroutines---in other -words, a line for each other function that it called. These lines' -fields correspond to the fields of the primary line, but their meanings -are different because of the difference in context. - -For reference, we repeat two lines from the entry for the function -@code{main}, the primary line and a line for a subroutine, together -with the heading line that shows the names of the fields: - -@smallexample -index % time self children called name -@dots{} -[2] 100.0 0.00 0.05 1 main [2] - 0.00 0.05 1/1 report [3] -@end smallexample - -Here are the meanings of the fields in the subroutine-line for @code{main} -calling @code{report}: - -@table @code -@item self -An estimate of the amount of time spent directly within @code{report} -when @code{report} was called from @code{main}. - -@item children -An estimate of the amount of time spent in subroutines of @code{report} -when @code{report} was called from @code{main}. - -The sum of the @code{self} and @code{children} fields is an estimate -of the total time spent in calls to @code{report} from @code{main}. - -@item called -Two numbers, the number of calls to @code{report} from @code{main} -followed by the total number of nonrecursive calls to @code{report}. -This ratio is used to determine how much of @code{report}'s @code{self} -and @code{children} time gets credited to @code{main}. -@xref{Assumptions}. - -@item name -The name of the subroutine of @code{main} to which this line applies, -followed by the subroutine's index number. - -If the caller is part of a recursion cycle, the cycle number is -printed between the name and the index number. -@end table - -@node Cycles,, Subroutines, Call Graph -@subsection How Mutually Recursive Functions Are Described -@cindex cycle -@cindex recursion cycle - -The graph may be complicated by the presence of @dfn{cycles of -recursion} in the call graph. A cycle exists if a function calls -another function that (directly or indirectly) calls (or appears to -call) the original function. For example: if @code{a} calls @code{b}, -and @code{b} calls @code{a}, then @code{a} and @code{b} form a cycle. - -Whenever there are call paths both ways between a pair of functions, they -belong to the same cycle. If @code{a} and @code{b} call each other and -@code{b} and @code{c} call each other, all three make one cycle. Note that -even if @code{b} only calls @code{a} if it was not called from @code{a}, -@code{gprof} cannot determine this, so @code{a} and @code{b} are still -considered a cycle. - -The cycles are numbered with consecutive integers. When a function -belongs to a cycle, each time the function name appears in the call graph -it is followed by @samp{<cycle @var{number}>}. - -The reason cycles matter is that they make the time values in the call -graph paradoxical. The ``time spent in children'' of @code{a} should -include the time spent in its subroutine @code{b} and in @code{b}'s -subroutines---but one of @code{b}'s subroutines is @code{a}! How much of -@code{a}'s time should be included in the children of @code{a}, when -@code{a} is indirectly recursive? - -The way @code{gprof} resolves this paradox is by creating a single entry -for the cycle as a whole. The primary line of this entry describes the -total time spent directly in the functions of the cycle. The -``subroutines'' of the cycle are the individual functions of the cycle, and -all other functions that were called directly by them. The ``callers'' of -the cycle are the functions, outside the cycle, that called functions in -the cycle. - -Here is an example portion of a call graph which shows a cycle containing -functions @code{a} and @code{b}. The cycle was entered by a call to -@code{a} from @code{main}; both @code{a} and @code{b} called @code{c}. - -@smallexample -index % time self children called name ----------------------------------------- - 1.77 0 1/1 main [2] -[3] 91.71 1.77 0 1+5 <cycle 1 as a whole> [3] - 1.02 0 3 b <cycle 1> [4] - 0.75 0 2 a <cycle 1> [5] ----------------------------------------- - 3 a <cycle 1> [5] -[4] 52.85 1.02 0 0 b <cycle 1> [4] - 2 a <cycle 1> [5] - 0 0 3/6 c [6] ----------------------------------------- - 1.77 0 1/1 main [2] - 2 b <cycle 1> [4] -[5] 38.86 0.75 0 1 a <cycle 1> [5] - 3 b <cycle 1> [4] - 0 0 3/6 c [6] ----------------------------------------- -@end smallexample - -@noindent -(The entire call graph for this program contains in addition an entry for -@code{main}, which calls @code{a}, and an entry for @code{c}, with callers -@code{a} and @code{b}.) - -@smallexample -index % time self children called name - <spontaneous> -[1] 100.00 0 1.93 0 start [1] - 0.16 1.77 1/1 main [2] ----------------------------------------- - 0.16 1.77 1/1 start [1] -[2] 100.00 0.16 1.77 1 main [2] - 1.77 0 1/1 a <cycle 1> [5] ----------------------------------------- - 1.77 0 1/1 main [2] -[3] 91.71 1.77 0 1+5 <cycle 1 as a whole> [3] - 1.02 0 3 b <cycle 1> [4] - 0.75 0 2 a <cycle 1> [5] - 0 0 6/6 c [6] ----------------------------------------- - 3 a <cycle 1> [5] -[4] 52.85 1.02 0 0 b <cycle 1> [4] - 2 a <cycle 1> [5] - 0 0 3/6 c [6] ----------------------------------------- - 1.77 0 1/1 main [2] - 2 b <cycle 1> [4] -[5] 38.86 0.75 0 1 a <cycle 1> [5] - 3 b <cycle 1> [4] - 0 0 3/6 c [6] ----------------------------------------- - 0 0 3/6 b <cycle 1> [4] - 0 0 3/6 a <cycle 1> [5] -[6] 0.00 0 0 6 c [6] ----------------------------------------- -@end smallexample - -The @code{self} field of the cycle's primary line is the total time -spent in all the functions of the cycle. It equals the sum of the -@code{self} fields for the individual functions in the cycle, found -in the entry in the subroutine lines for these functions. - -The @code{children} fields of the cycle's primary line and subroutine lines -count only subroutines outside the cycle. Even though @code{a} calls -@code{b}, the time spent in those calls to @code{b} is not counted in -@code{a}'s @code{children} time. Thus, we do not encounter the problem of -what to do when the time in those calls to @code{b} includes indirect -recursive calls back to @code{a}. - -The @code{children} field of a caller-line in the cycle's entry estimates -the amount of time spent @emph{in the whole cycle}, and its other -subroutines, on the times when that caller called a function in the cycle. - -The @code{calls} field in the primary line for the cycle has two numbers: -first, the number of times functions in the cycle were called by functions -outside the cycle; second, the number of times they were called by -functions in the cycle (including times when a function in the cycle calls -itself). This is a generalization of the usual split into nonrecursive and -recursive calls. - -The @code{calls} field of a subroutine-line for a cycle member in the -cycle's entry says how many time that function was called from functions in -the cycle. The total of all these is the second number in the primary line's -@code{calls} field. - -In the individual entry for a function in a cycle, the other functions in -the same cycle can appear as subroutines and as callers. These lines show -how many times each function in the cycle called or was called from each other -function in the cycle. The @code{self} and @code{children} fields in these -lines are blank because of the difficulty of defining meanings for them -when recursion is going on. - -@node Line-by-line,Annotated Source,Call Graph,Output -@section Line-by-line Profiling - -@code{gprof}'s @samp{-l} option causes the program to perform -@dfn{line-by-line} profiling. In this mode, histogram -samples are assigned not to functions, but to individual -lines of source code. The program usually must be compiled -with a @samp{-g} option, in addition to @samp{-pg}, in order -to generate debugging symbols for tracking source code lines. - -The flat profile is the most useful output table -in line-by-line mode. -The call graph isn't as useful as normal, since -the current version of @code{gprof} does not propagate -call graph arcs from source code lines to the enclosing function. -The call graph does, however, show each line of code -that called each function, along with a count. - -Here is a section of @code{gprof}'s output, without line-by-line profiling. -Note that @code{ct_init} accounted for four histogram hits, and -13327 calls to @code{init_block}. - -@smallexample -Flat profile: - -Each sample counts as 0.01 seconds. - % cumulative self self total - time seconds seconds calls us/call us/call name - 30.77 0.13 0.04 6335 6.31 6.31 ct_init - - - Call graph (explanation follows) - - -granularity: each sample hit covers 4 byte(s) for 7.69% of 0.13 seconds - -index % time self children called name - - 0.00 0.00 1/13496 name_too_long - 0.00 0.00 40/13496 deflate - 0.00 0.00 128/13496 deflate_fast - 0.00 0.00 13327/13496 ct_init -[7] 0.0 0.00 0.00 13496 init_block - -@end smallexample - -Now let's look at some of @code{gprof}'s output from the same program run, -this time with line-by-line profiling enabled. Note that @code{ct_init}'s -four histogram hits are broken down into four lines of source code - one hit -occured on each of lines 349, 351, 382 and 385. In the call graph, -note how -@code{ct_init}'s 13327 calls to @code{init_block} are broken down -into one call from line 396, 3071 calls from line 384, 3730 calls -from line 385, and 6525 calls from 387. - -@smallexample -Flat profile: - -Each sample counts as 0.01 seconds. - % cumulative self - time seconds seconds calls name - 7.69 0.10 0.01 ct_init (trees.c:349) - 7.69 0.11 0.01 ct_init (trees.c:351) - 7.69 0.12 0.01 ct_init (trees.c:382) - 7.69 0.13 0.01 ct_init (trees.c:385) - - - Call graph (explanation follows) - - -granularity: each sample hit covers 4 byte(s) for 7.69% of 0.13 seconds - - % time self children called name - - 0.00 0.00 1/13496 name_too_long (gzip.c:1440) - 0.00 0.00 1/13496 deflate (deflate.c:763) - 0.00 0.00 1/13496 ct_init (trees.c:396) - 0.00 0.00 2/13496 deflate (deflate.c:727) - 0.00 0.00 4/13496 deflate (deflate.c:686) - 0.00 0.00 5/13496 deflate (deflate.c:675) - 0.00 0.00 12/13496 deflate (deflate.c:679) - 0.00 0.00 16/13496 deflate (deflate.c:730) - 0.00 0.00 128/13496 deflate_fast (deflate.c:654) - 0.00 0.00 3071/13496 ct_init (trees.c:384) - 0.00 0.00 3730/13496 ct_init (trees.c:385) - 0.00 0.00 6525/13496 ct_init (trees.c:387) -[6] 0.0 0.00 0.00 13496 init_block (trees.c:408) - -@end smallexample - - -@node Annotated Source,,Line-by-line,Output -@section The Annotated Source Listing - -@code{gprof}'s @samp{-A} option triggers an annotated source listing, -which lists the program's source code, each function labeled with the -number of times it was called. You may also need to specify the -@samp{-I} option, if @code{gprof} can't find the source code files. - -Compiling with @samp{gcc @dots{} -g -pg -a} augments your program -with basic-block counting code, in addition to function counting code. -This enables @code{gprof} to determine how many times each line -of code was exeucted. -For example, consider the following function, taken from gzip, -with line numbers added: - -@smallexample - 1 ulg updcrc(s, n) - 2 uch *s; - 3 unsigned n; - 4 @{ - 5 register ulg c; - 6 - 7 static ulg crc = (ulg)0xffffffffL; - 8 - 9 if (s == NULL) @{ -10 c = 0xffffffffL; -11 @} else @{ -12 c = crc; -13 if (n) do @{ -14 c = crc_32_tab[...]; -15 @} while (--n); -16 @} -17 crc = c; -18 return c ^ 0xffffffffL; -19 @} - -@end smallexample - -@code{updcrc} has at least five basic-blocks. -One is the function itself. The -@code{if} statement on line 9 generates two more basic-blocks, one -for each branch of the @code{if}. A fourth basic-block results from -the @code{if} on line 13, and the contents of the @code{do} loop form -the fifth basic-block. The compiler may also generate additional -basic-blocks to handle various special cases. - -A program augmented for basic-block counting can be analyzed with -@code{gprof -l -A}. I also suggest use of the @samp{-x} option, -which ensures that each line of code is labeled at least once. -Here is @code{updcrc}'s -annotated source listing for a sample @code{gzip} run: - -@smallexample - ulg updcrc(s, n) - uch *s; - unsigned n; - 2 ->@{ - register ulg c; - - static ulg crc = (ulg)0xffffffffL; - - 2 -> if (s == NULL) @{ - 1 -> c = 0xffffffffL; - 1 -> @} else @{ - 1 -> c = crc; - 1 -> if (n) do @{ - 26312 -> c = crc_32_tab[...]; -26312,1,26311 -> @} while (--n); - @} - 2 -> crc = c; - 2 -> return c ^ 0xffffffffL; - 2 ->@} -@end smallexample - -In this example, the function was called twice, passing once through -each branch of the @code{if} statement. The body of the @code{do} -loop was executed a total of 26312 times. Note how the @code{while} -statement is annotated. It began execution 26312 times, once for -each iteration through the loop. One of those times (the last time) -it exited, while it branched back to the beginning of the loop 26311 times. - -@node Inaccuracy -@chapter Inaccuracy of @code{gprof} Output - -@menu -* Sampling Error:: Statistical margins of error -* Assumptions:: Estimating children times -@end menu - -@node Sampling Error,Assumptions,,Inaccuracy -@section Statistical Sampling Error - -The run-time figures that @code{gprof} gives you are based on a sampling -process, so they are subject to statistical inaccuracy. If a function runs -only a small amount of time, so that on the average the sampling process -ought to catch that function in the act only once, there is a pretty good -chance it will actually find that function zero times, or twice. - -By contrast, the number-of-calls and basic-block figures -are derived by counting, not -sampling. They are completely accurate and will not vary from run to run -if your program is deterministic. - -The @dfn{sampling period} that is printed at the beginning of the flat -profile says how often samples are taken. The rule of thumb is that a -run-time figure is accurate if it is considerably bigger than the sampling -period. - -The actual amount of error can be predicted. -For @var{n} samples, the @emph{expected} error -is the square-root of @var{n}. For example, -if the sampling period is 0.01 seconds and @code{foo}'s run-time is 1 second, -@var{n} is 100 samples (1 second/0.01 seconds), sqrt(@var{n}) is 10 samples, so -the expected error in @code{foo}'s run-time is 0.1 seconds (10*0.01 seconds), -or ten percent of the observed value. -Again, if the sampling period is 0.01 seconds and @code{bar}'s run-time is -100 seconds, @var{n} is 10000 samples, sqrt(@var{n}) is 100 samples, so -the expected error in @code{bar}'s run-time is 1 second, -or one percent of the observed value. -It is likely to -vary this much @emph{on the average} from one profiling run to the next. -(@emph{Sometimes} it will vary more.) - -This does not mean that a small run-time figure is devoid of information. -If the program's @emph{total} run-time is large, a small run-time for one -function does tell you that that function used an insignificant fraction of -the whole program's time. Usually this means it is not worth optimizing. - -One way to get more accuracy is to give your program more (but similar) -input data so it will take longer. Another way is to combine the data from -several runs, using the @samp{-s} option of @code{gprof}. Here is how: - -@enumerate -@item -Run your program once. - -@item -Issue the command @samp{mv gmon.out gmon.sum}. - -@item -Run your program again, the same as before. - -@item -Merge the new data in @file{gmon.out} into @file{gmon.sum} with this command: - -@example -gprof -s @var{executable-file} gmon.out gmon.sum -@end example - -@item -Repeat the last two steps as often as you wish. - -@item -Analyze the cumulative data using this command: - -@example -gprof @var{executable-file} gmon.sum > @var{output-file} -@end example -@end enumerate - -@node Assumptions,,Sampling Error,Inaccuracy -@section Estimating @code{children} Times - -Some of the figures in the call graph are estimates---for example, the -@code{children} time values and all the the time figures in caller and -subroutine lines. - -There is no direct information about these measurements in the profile -data itself. Instead, @code{gprof} estimates them by making an assumption -about your program that might or might not be true. - -The assumption made is that the average time spent in each call to any -function @code{foo} is not correlated with who called @code{foo}. If -@code{foo} used 5 seconds in all, and 2/5 of the calls to @code{foo} came -from @code{a}, then @code{foo} contributes 2 seconds to @code{a}'s -@code{children} time, by assumption. - -This assumption is usually true enough, but for some programs it is far -from true. Suppose that @code{foo} returns very quickly when its argument -is zero; suppose that @code{a} always passes zero as an argument, while -other callers of @code{foo} pass other arguments. In this program, all the -time spent in @code{foo} is in the calls from callers other than @code{a}. -But @code{gprof} has no way of knowing this; it will blindly and -incorrectly charge 2 seconds of time in @code{foo} to the children of -@code{a}. - -@c FIXME - has this been fixed? -We hope some day to put more complete data into @file{gmon.out}, so that -this assumption is no longer needed, if we can figure out how. For the -nonce, the estimated figures are usually more useful than misleading. - -@node How do I? -@chapter Answers to Common Questions - -@table @asis -@item How do I find which lines in my program were executed the most times? - -Compile your program with basic-block counting enabled, run it, then -use the following pipeline: - -@example -gprof -l -C @var{objfile} | sort -k 3 -n -r -@end example - -This listing will show you the lines in your code executed most often, -but not necessarily those that consumed the most time. - -@item How do I find which lines in my program called a particular function? - -Use @code{gprof -l} and lookup the function in the call graph. -The callers will be broken down by function and line number. - -@item How do I analyze a program that runs for less than a second? - -Try using a shell script like this one: - -@example -for i in `seq 1 100`; do - fastprog - mv gmon.out gmon.out.$i -done - -gprof -s fastprog gmon.out.* - -gprof fastprog gmon.sum -@end example - -If your program is completely deterministic, all the call counts -will be simple multiples of 100 (i.e. a function called once in -each run will appear with a call count of 100). - -@end table - -@node Incompatibilities -@chapter Incompatibilities with Unix @code{gprof} - -@sc{gnu} @code{gprof} and Berkeley Unix @code{gprof} use the same data -file @file{gmon.out}, and provide essentially the same information. But -there are a few differences. - -@itemize @bullet -@item -@sc{gnu} @code{gprof} uses a new, generalized file format with support -for basic-block execution counts and non-realtime histograms. A magic -cookie and version number allows @code{gprof} to easily identify -new style files. Old BSD-style files can still be read. -@xref{File Format}. - -@item -For a recursive function, Unix @code{gprof} lists the function as a -parent and as a child, with a @code{calls} field that lists the number -of recursive calls. @sc{gnu} @code{gprof} omits these lines and puts -the number of recursive calls in the primary line. - -@item -When a function is suppressed from the call graph with @samp{-e}, @sc{gnu} -@code{gprof} still lists it as a subroutine of functions that call it. - -@item -@sc{gnu} @code{gprof} accepts the @samp{-k} with its argument -in the form @samp{from/to}, instead of @samp{from to}. - -@item -In the annotated source listing, -if there are multiple basic blocks on the same line, -@sc{gnu} @code{gprof} prints all of their counts, seperated by commas. - -@ignore - it does this now -@item -The function names printed in @sc{gnu} @code{gprof} output do not include -the leading underscores that are added internally to the front of all -C identifiers on many operating systems. -@end ignore - -@item -The blurbs, field widths, and output formats are different. @sc{gnu} -@code{gprof} prints blurbs after the tables, so that you can see the -tables without skipping the blurbs. -@end itemize - -@node Details -@chapter Details of Profiling - -@menu -* Implementation:: How a program collets profiling information -* File Format:: Format of @samp{gmon.out} files -* Internals:: @code{gprof}'s internal operation -* Debugging:: Using @code{gprof}'s @samp{-d} option -@end menu - -@node Implementation,File Format,,Details -@section Implementation of Profiling - -Profiling works by changing how every function in your program is compiled -so that when it is called, it will stash away some information about where -it was called from. From this, the profiler can figure out what function -called it, and can count how many times it was called. This change is made -by the compiler when your program is compiled with the @samp{-pg} option, -which causes every function to call @code{mcount} -(or @code{_mcount}, or @code{__mcount}, depending on the OS and compiler) -as one of its first operations. - -The @code{mcount} routine, included in the profiling library, -is responsible for recording in an in-memory call graph table -both its parent routine (the child) and its parent's parent. This is -typically done by examining the stack frame to find both -the address of the child, and the return address in the original parent. -Since this is a very machine-dependant operation, @code{mcount} -itself is typically a short assembly-language stub routine -that extracts the required -information, and then calls @code{__mcount_internal} -(a normal C function) with two arguments - @code{frompc} and @code{selfpc}. -@code{__mcount_internal} is responsible for maintaining -the in-memory call graph, which records @code{frompc}, @code{selfpc}, -and the number of times each of these call arcs was transversed. - -GCC Version 2 provides a magical function (@code{__builtin_return_address}), -which allows a generic @code{mcount} function to extract the -required information from the stack frame. However, on some -architectures, most notably the SPARC, using this builtin can be -very computationally expensive, and an assembly language version -of @code{mcount} is used for performance reasons. - -Number-of-calls information for library routines is collected by using a -special version of the C library. The programs in it are the same as in -the usual C library, but they were compiled with @samp{-pg}. If you -link your program with @samp{gcc @dots{} -pg}, it automatically uses the -profiling version of the library. - -Profiling also involves watching your program as it runs, and keeping a -histogram of where the program counter happens to be every now and then. -Typically the program counter is looked at around 100 times per second of -run time, but the exact frequency may vary from system to system. - -This is done is one of two ways. Most UNIX-like operating systems -provide a @code{profil()} system call, which registers a memory -array with the kernel, along with a scale -factor that determines how the program's address space maps -into the array. -Typical scaling values cause every 2 to 8 bytes of address space -to map into a single array slot. -On every tick of the system clock -(assuming the profiled program is running), the value of the -program counter is examined and the corresponding slot in -the memory array is incremented. Since this is done in the kernel, -which had to interrupt the process anyway to handle the clock -interrupt, very little additional system overhead is required. - -However, some operating systems, most notably Linux 2.0 (and earlier), -do not provide a @code{profil()} system call. On such a system, -arrangements are made for the kernel to periodically deliver -a signal to the process (typically via @code{setitimer()}), -which then performs the same operation of examining the -program counter and incrementing a slot in the memory array. -Since this method requires a signal to be delivered to -user space every time a sample is taken, it uses considerably -more overhead than kernel-based profiling. Also, due to the -added delay required to deliver the signal, this method is -less accurate as well. - -A special startup routine allocates memory for the histogram and -either calls @code{profil()} or sets up -a clock signal handler. -This routine (@code{monstartup}) can be invoked in several ways. -On Linux systems, a special profiling startup file @code{gcrt0.o}, -which invokes @code{monstartup} before @code{main}, -is used instead of the default @code{crt0.o}. -Use of this special startup file is one of the effects -of using @samp{gcc @dots{} -pg} to link. -On SPARC systems, no special startup files are used. -Rather, the @code{mcount} routine, when it is invoked for -the first time (typically when @code{main} is called), -calls @code{monstartup}. - -If the compiler's @samp{-a} option was used, basic-block counting -is also enabled. Each object file is then compiled with a static array -of counts, initially zero. -In the executable code, every time a new basic-block begins -(i.e. when an @code{if} statement appears), an extra instruction -is inserted to increment the corresponding count in the array. -At compile time, a paired array was constructed that recorded -the starting address of each basic-block. Taken together, -the two arrays record the starting address of every basic-block, -along with the number of times it was executed. - -The profiling library also includes a function (@code{mcleanup}) which is -typically registered using @code{atexit()} to be called as the -program exits, and is responsible for writing the file @file{gmon.out}. -Profiling is turned off, various headers are output, and the histogram -is written, followed by the call-graph arcs and the basic-block counts. - -The output from @code{gprof} gives no indication of parts of your program that -are limited by I/O or swapping bandwidth. This is because samples of the -program counter are taken at fixed intervals of the program's run time. -Therefore, the -time measurements in @code{gprof} output say nothing about time that your -program was not running. For example, a part of the program that creates -so much data that it cannot all fit in physical memory at once may run very -slowly due to thrashing, but @code{gprof} will say it uses little time. On -the other hand, sampling by run time has the advantage that the amount of -load due to other users won't directly affect the output you get. - -@node File Format,Internals,Implementation,Details -@section Profiling Data File Format - -The old BSD-derived file format used for profile data does not contain a -magic cookie that allows to check whether a data file really is a -gprof file. Furthermore, it does not provide a version number, thus -rendering changes to the file format almost impossible. @sc{gnu} @code{gprof} -uses a new file format that provides these features. For backward -compatibility, @sc{gnu} @code{gprof} continues to support the old BSD-derived -format, but not all features are supported with it. For example, -basic-block execution counts cannot be accommodated by the old file -format. - -The new file format is defined in header file @file{gmon_out.h}. It -consists of a header containing the magic cookie and a version number, -as well as some spare bytes available for future extensions. All data -in a profile data file is in the native format of the host on which -the profile was collected. @sc{gnu} @code{gprof} adapts automatically to the -byte-order in use. - -In the new file format, the header is followed by a sequence of -records. Currently, there are three different record types: histogram -records, call-graph arc records, and basic-block execution count -records. Each file can contain any number of each record type. When -reading a file, @sc{gnu} @code{gprof} will ensure records of the same type are -compatible with each other and compute the union of all records. For -example, for basic-block execution counts, the union is simply the sum -of all execution counts for each basic-block. - -@subsection Histogram Records - -Histogram records consist of a header that is followed by an array of -bins. The header contains the text-segment range that the histogram -spans, the size of the histogram in bytes (unlike in the old BSD -format, this does not include the size of the header), the rate of the -profiling clock, and the physical dimension that the bin counts -represent after being scaled by the profiling clock rate. The -physical dimension is specified in two parts: a long name of up to 15 -characters and a single character abbreviation. For example, a -histogram representing real-time would specify the long name as -"seconds" and the abbreviation as "s". This feature is useful for -architectures that support performance monitor hardware (which, -fortunately, is becoming increasingly common). For example, under DEC -OSF/1, the "uprofile" command can be used to produce a histogram of, -say, instruction cache misses. In this case, the dimension in the -histogram header could be set to "i-cache misses" and the abbreviation -could be set to "1" (because it is simply a count, not a physical -dimension). Also, the profiling rate would have to be set to 1 in -this case. - -Histogram bins are 16-bit numbers and each bin represent an equal -amount of text-space. For example, if the text-segment is one -thousand bytes long and if there are ten bins in the histogram, each -bin represents one hundred bytes. - - -@subsection Call-Graph Records - -Call-graph records have a format that is identical to the one used in -the BSD-derived file format. It consists of an arc in the call graph -and a count indicating the number of times the arc was traversed -during program execution. Arcs are specified by a pair of addresses: -the first must be within caller's function and the second must be -within the callee's function. When performing profiling at the -function level, these addresses can point anywhere within the -respective function. However, when profiling at the line-level, it is -better if the addresses are as close to the call-site/entry-point as -possible. This will ensure that the line-level call-graph is able to -identify exactly which line of source code performed calls to a -function. - -@subsection Basic-Block Execution Count Records - -Basic-block execution count records consist of a header followed by a -sequence of address/count pairs. The header simply specifies the -length of the sequence. In an address/count pair, the address -identifies a basic-block and the count specifies the number of times -that basic-block was executed. Any address within the basic-address can -be used. - -@node Internals,Debugging,File Format,Details -@section @code{gprof}'s Internal Operation - -Like most programs, @code{gprof} begins by processing its options. -During this stage, it may building its symspec list -(@code{sym_ids.c:sym_id_add}), if -options are specified which use symspecs. -@code{gprof} maintains a single linked list of symspecs, -which will eventually get turned into 12 symbol tables, -organized into six include/exclude pairs - one -pair each for the flat profile (INCL_FLAT/EXCL_FLAT), -the call graph arcs (INCL_ARCS/EXCL_ARCS), -printing in the call graph (INCL_GRAPH/EXCL_GRAPH), -timing propagation in the call graph (INCL_TIME/EXCL_TIME), -the annotated source listing (INCL_ANNO/EXCL_ANNO), -and the execution count listing (INCL_EXEC/EXCL_EXEC). - -After option processing, @code{gprof} finishes -building the symspec list by adding all the symspecs in -@code{default_excluded_list} to the exclude lists -EXCL_TIME and EXCL_GRAPH, and if line-by-line profiling is specified, -EXCL_FLAT as well. -These default excludes are not added to EXCL_ANNO, EXCL_ARCS, and EXCL_EXEC. - -Next, the BFD library is called to open the object file, -verify that it is an object file, -and read its symbol table (@code{core.c:core_init}), -using @code{bfd_canonicalize_symtab} after mallocing -an appropiate sized array of asymbols. At this point, -function mappings are read (if the @samp{--file-ordering} option -has been specified), and the core text space is read into -memory (if the @samp{-c} option was given). - -@code{gprof}'s own symbol table, an array of Sym structures, -is now built. -This is done in one of two ways, by one of two routines, depending -on whether line-by-line profiling (@samp{-l} option) has been -enabled. -For normal profiling, the BFD canonical symbol table is scanned. -For line-by-line profiling, every -text space address is examined, and a new symbol table entry -gets created every time the line number changes. -In either case, two passes are made through the symbol -table - one to count the size of the symbol table required, -and the other to actually read the symbols. In between the -two passes, a single array of type @code{Sym} is created of -the appropiate length. -Finally, @code{symtab.c:symtab_finalize} -is called to sort the symbol table and remove duplicate entries -(entries with the same memory address). - -The symbol table must be a contiguous array for two reasons. -First, the @code{qsort} library function (which sorts an array) -will be used to sort the symbol table. -Also, the symbol lookup routine (@code{symtab.c:sym_lookup}), -which finds symbols -based on memory address, uses a binary search algorithm -which requires the symbol table to be a sorted array. -Function symbols are indicated with an @code{is_func} flag. -Line number symbols have no special flags set. -Additionally, a symbol can have an @code{is_static} flag -to indicate that it is a local symbol. - -With the symbol table read, the symspecs can now be translated -into Syms (@code{sym_ids.c:sym_id_parse}). Remember that a single -symspec can match multiple symbols. -An array of symbol tables -(@code{syms}) is created, each entry of which is a symbol table -of Syms to be included or excluded from a particular listing. -The master symbol table and the symspecs are examined by nested -loops, and every symbol that matches a symspec is inserted -into the appropriate syms table. This is done twice, once to -count the size of each required symbol table, and again to build -the tables, which have been malloced between passes. -From now on, to determine whether a symbol is on an include -or exclude symspec list, @code{gprof} simply uses its -standard symbol lookup routine on the appropriate table -in the @code{syms} array. - -Now the profile data file(s) themselves are read -(@code{gmon_io.c:gmon_out_read}), -first by checking for a new-style @samp{gmon.out} header, -then assuming this is an old-style BSD @samp{gmon.out} -if the magic number test failed. - -New-style histogram records are read by @code{hist.c:hist_read_rec}. -For the first histogram record, allocate a memory array to hold -all the bins, and read them in. -When multiple profile data files (or files with multiple histogram -records) are read, the starting address, ending address, number -of bins and sampling rate must match between the various histograms, -or a fatal error will result. -If everything matches, just sum the additional histograms into -the existing in-memory array. - -As each call graph record is read (@code{call_graph.c:cg_read_rec}), -the parent and child addresses -are matched to symbol table entries, and a call graph arc is -created by @code{cg_arcs.c:arc_add}, unless the arc fails a symspec -check against INCL_ARCS/EXCL_ARCS. As each arc is added, -a linked list is maintained of the parent's child arcs, and of the child's -parent arcs. -Both the child's call count and the arc's call count are -incremented by the record's call count. - -Basic-block records are read (@code{basic_blocks.c:bb_read_rec}), -but only if line-by-line profiling has been selected. -Each basic-block address is matched to a corresponding line -symbol in the symbol table, and an entry made in the symbol's -bb_addr and bb_calls arrays. Again, if multiple basic-block -records are present for the same address, the call counts -are cumulative. - -A gmon.sum file is dumped, if requested (@code{gmon_io.c:gmon_out_write}). - -If histograms were present in the data files, assign them to symbols -(@code{hist.c:hist_assign_samples}) by iterating over all the sample -bins and assigning them to symbols. Since the symbol table -is sorted in order of ascending memory addresses, we can -simple follow along in the symbol table as we make our pass -over the sample bins. -This step includes a symspec check against INCL_FLAT/EXCL_FLAT. -Depending on the histogram -scale factor, a sample bin may span multiple symbols, -in which case a fraction of the sample count is allocated -to each symbol, proportional to the degree of overlap. -This effect is rare for normal profiling, but overlaps -are more common during line-by-line profiling, and can -cause each of two adjacent lines to be credited with half -a hit, for example. - -If call graph data is present, @code{cg_arcs.c:cg_assemble} is called. -First, if @samp{-c} was specified, a machine-dependant -routine (@code{find_call}) scans through each symbol's machine code, -looking for subroutine call instructions, and adding them -to the call graph with a zero call count. -A topological sort is performed by depth-first numbering -all the symbols (@code{cg_dfn.c:cg_dfn}), so that -children are always numbered less than their parents, -then making a array of pointers into the symbol table and sorting it into -numerical order, which is reverse topological -order (children appear before parents). -Cycles are also detected at this point, all members -of which are assigned the same topological number. -Two passes are now made through this sorted array of symbol pointers. -The first pass, from end to beginning (parents to children), -computes the fraction of child time to propogate to each parent -and a print flag. -The print flag reflects symspec handling of INCL_GRAPH/EXCL_GRAPH, -with a parent's include or exclude (print or no print) property -being propagated to its children, unless they themselves explicitly appear -in INCL_GRAPH or EXCL_GRAPH. -A second pass, from beginning to end (children to parents) actually -propogates the timings along the call graph, subject -to a check against INCL_TIME/EXCL_TIME. -With the print flag, fractions, and timings now stored in the symbol -structures, the topological sort array is now discarded, and a -new array of pointers is assembled, this time sorted by propagated time. - -Finally, print the various outputs the user requested, which is now fairly -straightforward. The call graph (@code{cg_print.c:cg_print}) and -flat profile (@code{hist.c:hist_print}) are regurgitations of values -already computed. The annotated source listing -(@code{basic_blocks.c:print_annotated_source}) uses basic-block -information, if present, to label each line of code with call counts, -otherwise only the function call counts are presented. - -The function ordering code is marginally well documented -in the source code itself (@code{cg_print.c}). Basically, -the functions with the most use and the most parents are -placed first, followed by other functions with the most use, -followed by lower use functions, followed by unused functions -at the end. - -@node Debugging,,Internals,Details -@subsection Debugging @code{gprof} - -If @code{gprof} was compiled with debugging enabled, -the @samp{-d} option triggers debugging output -(to stdout) which can be helpful in understanding its operation. -The debugging number specified is interpreted as a sum of the following -options: - -@table @asis -@item 2 - Topological sort -Monitor depth-first numbering of symbols during call graph analysis -@item 4 - Cycles -Shows symbols as they are identified as cycle heads -@item 16 - Tallying -As the call graph arcs are read, show each arc and how -the total calls to each function are tallied -@item 32 - Call graph arc sorting -Details sorting individual parents/children within each call graph entry -@item 64 - Reading histogram and call graph records -Shows address ranges of histograms as they are read, and each -call graph arc -@item 128 - Symbol table -Reading, classifying, and sorting the symbol table from the object file. -For line-by-line profiling (@samp{-l} option), also shows line numbers -being assigned to memory addresses. -@item 256 - Static call graph -Trace operation of @samp{-c} option -@item 512 - Symbol table and arc table lookups -Detail operation of lookup routines -@item 1024 - Call graph propagation -Shows how function times are propagated along the call graph -@item 2048 - Basic-blocks -Shows basic-block records as they are read from profile data -(only meaningful with @samp{-l} option) -@item 4096 - Symspecs -Shows symspec-to-symbol pattern matching operation -@item 8192 - Annotate source -Tracks operation of @samp{-A} option -@end table - -@contents -@bye - -NEEDS AN INDEX - --T - "traditional BSD style": How is it different? Should the -differences be documented? - -example flat file adds up to 100.01%... - -note: time estimates now only go out to one decimal place (0.0), where -they used to extend two (78.67). diff --git a/gprof/hertz.c b/gprof/hertz.c deleted file mode 100644 index 75314ac..0000000 --- a/gprof/hertz.c +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include "hertz.h" - - -#ifdef __MSDOS__ -#define HERTZ 18 -#endif - -int -hertz () -{ -#ifdef HERTZ - return HERTZ; -#else /* ! defined (HERTZ) */ -#ifdef HAVE_SETITIMER - struct itimerval tim; - - tim.it_interval.tv_sec = 0; - tim.it_interval.tv_usec = 1; - tim.it_value.tv_sec = 0; - tim.it_value.tv_usec = 0; - setitimer (ITIMER_REAL, &tim, 0); - setitimer (ITIMER_REAL, 0, &tim); - if (tim.it_interval.tv_usec < 2) - { - return HZ_WRONG; - } - return 1000000 / tim.it_interval.tv_usec; -#else /* ! defined (HAVE_SETITIMER) */ -#if defined (HAVE_SYSCONF) && defined (_SC_CLK_TCK) - return sysconf (_SC_CLK_TCK); -#else /* ! defined (HAVE_SYSCONF) || ! defined (_SC_CLK_TCK) */ - return HZ_WRONG; -#endif /* ! defined (HAVE_SYSCONF) || ! defined (_SC_CLK_TCK) */ -#endif /* ! defined (HAVE_SETITIMER) */ -#endif /* ! defined (HERTZ) */ -} diff --git a/gprof/hertz.h b/gprof/hertz.h deleted file mode 100644 index 2ea01ba..0000000 --- a/gprof/hertz.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef hertz_h -#define hertz_h - -#include "gprof.h" - -#define HZ_WRONG 0 /* impossible clock frequency */ - -/* - * Discover the tick frequency of the machine if something goes wrong, - * we return HZ_WRONG, an impossible sampling frequency. - */ - -/* FIXME: Checking for MACH here makes no sense when for a cross - gprof. */ -#ifdef MACH -#include <machine/mach_param.h> -#define hertz() (HZ) -#else -extern int hertz PARAMS ((void)); -#endif - -#endif /* hertz_h */ diff --git a/gprof/hist.c b/gprof/hist.c deleted file mode 100644 index 5cdbbbb..0000000 --- a/gprof/hist.c +++ /dev/null @@ -1,596 +0,0 @@ -/* - * Histogram related operations. - */ -#include <stdio.h> -#include "libiberty.h" -#include "gprof.h" -#include "corefile.h" -#include "gmon_io.h" -#include "gmon_out.h" -#include "hist.h" -#include "symtab.h" -#include "sym_ids.h" -#include "utils.h" - -#define UNITS_TO_CODE (offset_to_code / sizeof(UNIT)) - -static void scale_and_align_entries PARAMS ((void)); - -/* declarations of automatically generated functions to output blurbs: */ -extern void flat_blurb PARAMS ((FILE * fp)); - -bfd_vma s_lowpc; /* lowest address in .text */ -bfd_vma s_highpc = 0; /* highest address in .text */ -bfd_vma lowpc, highpc; /* same, but expressed in UNITs */ -int hist_num_bins = 0; /* number of histogram samples */ -int *hist_sample = 0; /* histogram samples (shorts in the file!) */ -double hist_scale; -char hist_dimension[sizeof (((struct gmon_hist_hdr *) 0)->dimen) + 1] = - "seconds"; -char hist_dimension_abbrev = 's'; - -static double accum_time; /* accumulated time so far for print_line() */ -static double total_time; /* total time for all routines */ -/* - * Table of SI prefixes for powers of 10 (used to automatically - * scale some of the values in the flat profile). - */ -const struct - { - char prefix; - double scale; - } -SItab[] = -{ - { - 'T', 1e-12 - } - , /* tera */ - { - 'G', 1e-09 - } - , /* giga */ - { - 'M', 1e-06 - } - , /* mega */ - { - 'K', 1e-03 - } - , /* kilo */ - { - ' ', 1e-00 - } - , - { - 'm', 1e+03 - } - , /* milli */ - { - 'u', 1e+06 - } - , /* micro */ - { - 'n', 1e+09 - } - , /* nano */ - { - 'p', 1e+12 - } - , /* pico */ - { - 'f', 1e+15 - } - , /* femto */ - { - 'a', 1e+18 - } - , /* ato */ -}; - -/* - * Read the histogram from file IFP. FILENAME is the name of IFP and - * is provided for formatting error messages only. - */ -void -DEFUN (hist_read_rec, (ifp, filename), FILE * ifp AND const char *filename) -{ - struct gmon_hist_hdr hdr; - bfd_vma n_lowpc, n_highpc; - int i, ncnt, profrate; - UNIT count; - - if (fread (&hdr, sizeof (hdr), 1, ifp) != 1) - { - fprintf (stderr, _("%s: %s: unexpected end of file\n"), - whoami, filename); - done (1); - } - - n_lowpc = (bfd_vma) get_vma (core_bfd, (bfd_byte *) hdr.low_pc); - n_highpc = (bfd_vma) get_vma (core_bfd, (bfd_byte *) hdr.high_pc); - ncnt = bfd_get_32 (core_bfd, (bfd_byte *) hdr.hist_size); - profrate = bfd_get_32 (core_bfd, (bfd_byte *) hdr.prof_rate); - strncpy (hist_dimension, hdr.dimen, sizeof (hdr.dimen)); - hist_dimension[sizeof (hdr.dimen)] = '\0'; - hist_dimension_abbrev = hdr.dimen_abbrev; - - if (!s_highpc) - { - - /* this is the first histogram record: */ - - s_lowpc = n_lowpc; - s_highpc = n_highpc; - lowpc = (bfd_vma) n_lowpc / sizeof (UNIT); - highpc = (bfd_vma) n_highpc / sizeof (UNIT); - hist_num_bins = ncnt; - hz = profrate; - } - - DBG (SAMPLEDEBUG, - printf ("[hist_read_rec] n_lowpc 0x%lx n_highpc 0x%lx ncnt %d\n", - n_lowpc, n_highpc, ncnt); - printf ("[hist_read_rec] s_lowpc 0x%lx s_highpc 0x%lx nsamples %d\n", - s_lowpc, s_highpc, hist_num_bins); - printf ("[hist_read_rec] lowpc 0x%lx highpc 0x%lx\n", - lowpc, highpc)); - - if (n_lowpc != s_lowpc || n_highpc != s_highpc - || ncnt != hist_num_bins || hz != profrate) - { - fprintf (stderr, _("%s: `%s' is incompatible with first gmon file\n"), - whoami, filename); - done (1); - } - - if (!hist_sample) - { - hist_sample = (int *) xmalloc (hist_num_bins * sizeof (hist_sample[0])); - memset (hist_sample, 0, hist_num_bins * sizeof (hist_sample[0])); - } - - for (i = 0; i < hist_num_bins; ++i) - { - if (fread (&count[0], sizeof (count), 1, ifp) != 1) - { - fprintf (stderr, - _("%s: %s: unexpected EOF after reading %d of %d samples\n"), - whoami, filename, i, hist_num_bins); - done (1); - } - hist_sample[i] += bfd_get_16 (core_bfd, (bfd_byte *) & count[0]); - } -} - - -/* - * Write execution histogram to file OFP. FILENAME is the name - * of OFP and is provided for formatting error-messages only. - */ -void -DEFUN (hist_write_hist, (ofp, filename), FILE * ofp AND const char *filename) -{ - struct gmon_hist_hdr hdr; - unsigned char tag; - UNIT count; - int i; - - /* write header: */ - - tag = GMON_TAG_TIME_HIST; - put_vma (core_bfd, s_lowpc, (bfd_byte *) hdr.low_pc); - put_vma (core_bfd, s_highpc, (bfd_byte *) hdr.high_pc); - bfd_put_32 (core_bfd, hist_num_bins, (bfd_byte *) hdr.hist_size); - bfd_put_32 (core_bfd, hz, (bfd_byte *) hdr.prof_rate); - strncpy (hdr.dimen, hist_dimension, sizeof (hdr.dimen)); - hdr.dimen_abbrev = hist_dimension_abbrev; - - if (fwrite (&tag, sizeof (tag), 1, ofp) != 1 - || fwrite (&hdr, sizeof (hdr), 1, ofp) != 1) - { - perror (filename); - done (1); - } - - for (i = 0; i < hist_num_bins; ++i) - { - bfd_put_16 (core_bfd, hist_sample[i], (bfd_byte *) & count[0]); - if (fwrite (&count[0], sizeof (count), 1, ofp) != 1) - { - perror (filename); - done (1); - } - } -} - - -/* - * Calculate scaled entry point addresses (to save time in - * hist_assign_samples), and, on architectures that have procedure - * entry masks at the start of a function, possibly push the scaled - * entry points over the procedure entry mask, if it turns out that - * the entry point is in one bin and the code for a routine is in the - * next bin. - */ -static void -scale_and_align_entries () -{ - Sym *sym; - bfd_vma bin_of_entry; - bfd_vma bin_of_code; - - for (sym = symtab.base; sym < symtab.limit; sym++) - { - sym->hist.scaled_addr = sym->addr / sizeof (UNIT); - bin_of_entry = (sym->hist.scaled_addr - lowpc) / hist_scale; - bin_of_code = (sym->hist.scaled_addr + UNITS_TO_CODE - lowpc) / hist_scale; - if (bin_of_entry < bin_of_code) - { - DBG (SAMPLEDEBUG, - printf ("[scale_and_align_entries] pushing 0x%lx to 0x%lx\n", - sym->hist.scaled_addr, - sym->hist.scaled_addr + UNITS_TO_CODE)); - sym->hist.scaled_addr += UNITS_TO_CODE; - } - } -} - - -/* - * Assign samples to the symbol to which they belong. - * - * Histogram bin I covers some address range [BIN_LOWPC,BIN_HIGH_PC) - * which may overlap one more symbol address ranges. If a symbol - * overlaps with the bin's address range by O percent, then O percent - * of the bin's count is credited to that symbol. - * - * There are three cases as to where BIN_LOW_PC and BIN_HIGH_PC can be - * with respect to the symbol's address range [SYM_LOW_PC, - * SYM_HIGH_PC) as shown in the following diagram. OVERLAP computes - * the distance (in UNITs) between the arrows, the fraction of the - * sample that is to be credited to the symbol which starts at - * SYM_LOW_PC. - * - * sym_low_pc sym_high_pc - * | | - * v v - * - * +-----------------------------------------------+ - * | | - * | ->| |<- ->| |<- ->| |<- | - * | | | | | | - * +---------+ +---------+ +---------+ - * - * ^ ^ ^ ^ ^ ^ - * | | | | | | - * bin_low_pc bin_high_pc bin_low_pc bin_high_pc bin_low_pc bin_high_pc - * - * For the VAX we assert that samples will never fall in the first two - * bytes of any routine, since that is the entry mask, thus we call - * scale_and_align_entries() to adjust the entry points if the entry - * mask falls in one bin but the code for the routine doesn't start - * until the next bin. In conjunction with the alignment of routine - * addresses, this should allow us to have only one sample for every - * four bytes of text space and never have any overlap (the two end - * cases, above). - */ -void -DEFUN_VOID (hist_assign_samples) -{ - bfd_vma bin_low_pc, bin_high_pc; - bfd_vma sym_low_pc, sym_high_pc; - bfd_vma overlap, addr; - int bin_count, i; - unsigned int j; - double time, credit; - - /* read samples and assign to symbols: */ - hist_scale = highpc - lowpc; - hist_scale /= hist_num_bins; - scale_and_align_entries (); - - /* iterate over all sample bins: */ - - for (i = 0, j = 1; i < hist_num_bins; ++i) - { - bin_count = hist_sample[i]; - if (!bin_count) - { - continue; - } - bin_low_pc = lowpc + (bfd_vma) (hist_scale * i); - bin_high_pc = lowpc + (bfd_vma) (hist_scale * (i + 1)); - time = bin_count; - DBG (SAMPLEDEBUG, - printf ( - "[assign_samples] bin_low_pc=0x%lx, bin_high_pc=0x%lx, bin_count=%d\n", - sizeof (UNIT) * bin_low_pc, sizeof (UNIT) * bin_high_pc, - bin_count)); - total_time += time; - - /* credit all symbols that are covered by bin I: */ - - for (j = j - 1; j < symtab.len; ++j) - { - sym_low_pc = symtab.base[j].hist.scaled_addr; - sym_high_pc = symtab.base[j + 1].hist.scaled_addr; - /* - * If high end of bin is below entry address, go for next - * bin: - */ - if (bin_high_pc < sym_low_pc) - { - break; - } - /* - * If low end of bin is above high end of symbol, go for - * next symbol. - */ - if (bin_low_pc >= sym_high_pc) - { - continue; - } - overlap = - MIN (bin_high_pc, sym_high_pc) - MAX (bin_low_pc, sym_low_pc); - if (overlap > 0) - { - DBG (SAMPLEDEBUG, - printf ( - "[assign_samples] [0x%lx,0x%lx) %s gets %f ticks %ld overlap\n", - symtab.base[j].addr, sizeof (UNIT) * sym_high_pc, - symtab.base[j].name, overlap * time / hist_scale, - overlap)); - addr = symtab.base[j].addr; - credit = overlap * time / hist_scale; - /* - * Credit symbol if it appears in INCL_FLAT or that - * table is empty and it does not appear it in - * EXCL_FLAT. - */ - if (sym_lookup (&syms[INCL_FLAT], addr) - || (syms[INCL_FLAT].len == 0 - && !sym_lookup (&syms[EXCL_FLAT], addr))) - { - symtab.base[j].hist.time += credit; - } - else - { - total_time -= credit; - } - } - } - } - DBG (SAMPLEDEBUG, printf ("[assign_samples] total_time %f\n", - total_time)); -} - - -/* - * Print header for flag histogram profile: - */ -static void -DEFUN (print_header, (prefix), const char prefix) -{ - char unit[64]; - - sprintf (unit, _("%c%c/call"), prefix, hist_dimension_abbrev); - - if (bsd_style_output) - { - printf (_("\ngranularity: each sample hit covers %ld byte(s)"), - (long) hist_scale * sizeof (UNIT)); - if (total_time > 0.0) - { - printf (_(" for %.2f%% of %.2f %s\n\n"), - 100.0 / total_time, total_time / hz, hist_dimension); - } - } - else - { - printf (_("\nEach sample counts as %g %s.\n"), 1.0 / hz, hist_dimension); - } - - if (total_time <= 0.0) - { - printf (_(" no time accumulated\n\n")); - /* this doesn't hurt since all the numerators will be zero: */ - total_time = 1.0; - } - - printf ("%5.5s %10.10s %8.8s %8.8s %8.8s %8.8s %-8.8s\n", - "% ", _("cumulative"), _("self "), "", _("self "), _("total "), ""); - printf ("%5.5s %9.9s %8.8s %8.8s %8.8s %8.8s %-8.8s\n", - _("time"), hist_dimension, hist_dimension, _("calls"), unit, unit, - _("name")); -} - - -static void -DEFUN (print_line, (sym, scale), Sym * sym AND double scale) -{ - if (ignore_zeros && sym->ncalls == 0 && sym->hist.time == 0) - { - return; - } - - accum_time += sym->hist.time; - if (bsd_style_output) - { - printf ("%5.1f %10.2f %8.2f", - total_time > 0.0 ? 100 * sym->hist.time / total_time : 0.0, - accum_time / hz, sym->hist.time / hz); - } - else - { - printf ("%6.2f %9.2f %8.2f", - total_time > 0.0 ? 100 * sym->hist.time / total_time : 0.0, - accum_time / hz, sym->hist.time / hz); - } - if (sym->ncalls != 0) - { - printf (" %8lu %8.2f %8.2f ", - sym->ncalls, scale * sym->hist.time / hz / sym->ncalls, - scale * (sym->hist.time + sym->cg.child_time) / hz / sym->ncalls); - } - else - { - printf (" %8.8s %8.8s %8.8s ", "", "", ""); - } - if (bsd_style_output) - { - print_name (sym); - } - else - { - print_name_only (sym); - } - printf ("\n"); -} - - -/* - * Compare LP and RP. The primary comparison key is execution time, - * the secondary is number of invocation, and the tertiary is the - * lexicographic order of the function names. - */ -static int -DEFUN (cmp_time, (lp, rp), const PTR lp AND const PTR rp) -{ - const Sym *left = *(const Sym **) lp; - const Sym *right = *(const Sym **) rp; - double time_diff; - - time_diff = right->hist.time - left->hist.time; - if (time_diff > 0.0) - { - return 1; - } - if (time_diff < 0.0) - { - return -1; - } - - if (right->ncalls > left->ncalls) - { - return 1; - } - if (right->ncalls < left->ncalls) - { - return -1; - } - - return strcmp (left->name, right->name); -} - - -/* - * Print the flat histogram profile. - */ -void -DEFUN_VOID (hist_print) -{ - Sym **time_sorted_syms, *top_dog, *sym; - unsigned int index; - int log_scale; - double top_time, time; - bfd_vma addr; - - if (first_output) - { - first_output = FALSE; - } - else - { - printf ("\f\n"); - } - - accum_time = 0.0; - if (bsd_style_output) - { - if (print_descriptions) - { - printf (_("\n\n\nflat profile:\n")); - flat_blurb (stdout); - } - } - else - { - printf (_("Flat profile:\n")); - } - /* - * Sort the symbol table by time (call-count and name as secondary - * and tertiary keys): - */ - time_sorted_syms = (Sym **) xmalloc (symtab.len * sizeof (Sym *)); - for (index = 0; index < symtab.len; ++index) - { - time_sorted_syms[index] = &symtab.base[index]; - } - qsort (time_sorted_syms, symtab.len, sizeof (Sym *), cmp_time); - - if (bsd_style_output) - { - log_scale = 5; /* milli-seconds is BSD-default */ - } - else - { - /* - * Search for symbol with highest per-call execution time and - * scale accordingly: - */ - log_scale = 0; - top_dog = 0; - top_time = 0.0; - for (index = 0; index < symtab.len; ++index) - { - sym = time_sorted_syms[index]; - if (sym->ncalls != 0) - { - time = (sym->hist.time + sym->cg.child_time) / sym->ncalls; - if (time > top_time) - { - top_dog = sym; - top_time = time; - } - } - } - if (top_dog && top_dog->ncalls != 0 && top_time > 0.0) - { - top_time /= hz; - while (SItab[log_scale].scale * top_time < 1000.0 - && ((size_t) log_scale - < sizeof (SItab) / sizeof (SItab[0]) - 1)) - { - ++log_scale; - } - } - } - - /* - * For now, the dimension is always seconds. In the future, we - * may also want to support other (pseudo-)dimensions (such as - * I-cache misses etc.). - */ - print_header (SItab[log_scale].prefix); - for (index = 0; index < symtab.len; ++index) - { - addr = time_sorted_syms[index]->addr; - /* - * Print symbol if its in INCL_FLAT table or that table - * is empty and the symbol is not in EXCL_FLAT. - */ - if (sym_lookup (&syms[INCL_FLAT], addr) - || (syms[INCL_FLAT].len == 0 - && !sym_lookup (&syms[EXCL_FLAT], addr))) - { - print_line (time_sorted_syms[index], SItab[log_scale].scale); - } - } - free (time_sorted_syms); - - if (print_descriptions && !bsd_style_output) - { - flat_blurb (stdout); - } -} diff --git a/gprof/hist.h b/gprof/hist.h deleted file mode 100644 index df62ef7..0000000 --- a/gprof/hist.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef hist_h -#define hist_h - -#include "bfd.h" - -extern bfd_vma s_lowpc; /* lowpc from the profile file */ -extern bfd_vma s_highpc; /* highpc from the profile file */ -extern bfd_vma lowpc, highpc; /* range profiled, in UNIT's */ -extern int hist_num_bins; /* number of histogram bins */ -extern int *hist_sample; /* code histogram */ -/* - * Scale factor converting samples to pc values: each sample covers - * HIST_SCALE bytes: - */ -extern double hist_scale; - - -extern void hist_read_rec PARAMS ((FILE * ifp, const char *filename)); -extern void hist_write_hist PARAMS ((FILE * ofp, const char *filename)); -extern void hist_assign_samples PARAMS ((void)); -extern void hist_print PARAMS ((void)); - -#endif /* hist_h */ diff --git a/gprof/i386.c b/gprof/i386.c deleted file mode 100644 index 18aad1c..0000000 --- a/gprof/i386.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include "gprof.h" -#include "cg_arcs.h" -#include "corefile.h" -#include "hist.h" -#include "symtab.h" - - -int -DEFUN (i386_iscall, (ip), unsigned char *ip) -{ - if (*ip == 0xe8) - return 1; - return 0; -} - - -void -i386_find_call (parent, p_lowpc, p_highpc) - Sym *parent; - bfd_vma p_lowpc; - bfd_vma p_highpc; -{ - unsigned char *instructp; - Sym *child; - bfd_vma destpc, delta; - - if (core_text_space == 0) - { - return; - } - if (p_lowpc < s_lowpc) - { - p_lowpc = s_lowpc; - } - if (p_highpc > s_highpc) - { - p_highpc = s_highpc; - } - DBG (CALLDEBUG, printf ("[findcall] %s: 0x%lx to 0x%lx\n", - parent->name, p_lowpc, p_highpc)); - - delta = (bfd_vma) core_text_space - core_text_sect->vma; - - for (instructp = (unsigned char *) (p_lowpc + delta); - instructp < (unsigned char *) (p_highpc + delta); - instructp ++) - { - if (i386_iscall (instructp)) - { - DBG (CALLDEBUG, - printf ("[findcall]\t0x%x:call", - instructp - (unsigned char *) delta)); - /* - * regular pc relative addressing - * check that this is the address of - * a function. - */ - - destpc = ((bfd_vma) bfd_get_32 (core_bfd, instructp + 1) - + (bfd_vma) instructp - (bfd_vma) delta + 5); - if (destpc >= s_lowpc && destpc <= s_highpc) - { - child = sym_lookup (&symtab, destpc); - if (child && child->addr == destpc) - { - /* - * a hit - */ - DBG (CALLDEBUG, - printf ("\tdestpc 0x%lx (%s)\n", destpc, child->name)); - arc_add (parent, child, (unsigned long) 0); - instructp += 4; /* call is a 5 byte instruction */ - continue; - } - } - /* - * else: - * it looked like a callf, but it: - * a) wasn't actually a callf, or - * b) didn't point to a known function in the symtab, or - * c) something funny is going on. - */ - DBG (CALLDEBUG, printf ("\tbut it's a botch\n")); - } - } -} diff --git a/gprof/make_hp_order_obj b/gprof/make_hp_order_obj deleted file mode 100755 index ad9df2e..0000000 --- a/gprof/make_hp_order_obj +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/csh -f -# $1 is the file containing the function ordering -# $2 is the output file - -echo ' .SPACE $TEXT$' > /tmp/$$.s -foreach func (`cat $1`) - echo " .NSUBSPA $func,QUAD=0,ALIGN=8,ACCESS=44,CODE_ONLY" >> /tmp/$$.s -end - -gcc -c /tmp/$$.s -o $2 -rm -f /tmp/$$.s diff --git a/gprof/make_solaris_order_map b/gprof/make_solaris_order_map deleted file mode 100755 index 6167709..0000000 --- a/gprof/make_solaris_order_map +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/csh -f -# $1 is the file containing the function ordering -# $2 is the output file (a linker map file for the solaris native linker) - -echo 'text = LOAD ?RXO;' > $2 -foreach func (`cat $1`) - echo "text: .text%$func;" >> $2 -end diff --git a/gprof/po/.Sanitize b/gprof/po/.Sanitize deleted file mode 100644 index e011369..0000000 --- a/gprof/po/.Sanitize +++ /dev/null @@ -1,41 +0,0 @@ -# .Sanitize for devo/gprof/po - -# Each directory to survive its way into a release will need a file -# like this one called "./.Sanitize". All keyword lines must exist, -# and must exist in the order specified by this file. Each directory -# in the tree will be processed, top down, in the following order. - -# Hash started lines like this one are comments and will be deleted -# before anything else is done. Blank lines will also be squashed -# out. - -# The lines between the "Do-first:" line and the "Things-to-keep:" -# line are executed as a /bin/sh shell script before anything else is -# done in this directory. - -Do-first: - - -# All files listed between the "Things-to-keep:" line and the -# "Do-last:" line will be kept. All other files will be removed. -# Directories listed in this section will have their own Sanitize -# called. Directories not listed will be removed in their entirety -# with rm -rf. - -Things-to-keep: - -Make-in -POTFILES.in -gprof.pot - -Things-to-lose: - - - -# The lines between the "Do-last:" line and the end of the file -# are executed as a /bin/sh shell script after everything else is -# done. - -Do-last: - -# eof diff --git a/gprof/po/Make-in b/gprof/po/Make-in deleted file mode 100644 index 0552db1..0000000 --- a/gprof/po/Make-in +++ /dev/null @@ -1,251 +0,0 @@ -# Makefile for program source directory in GNU NLS utilities package. -# Copyright (C) 1995, 1996, 1997 by Ulrich Drepper <drepper@gnu.ai.mit.edu> -# -# This file file be copied and used freely without restrictions. It can -# be used in projects which are not available under the GNU Public License -# but which still want to provide support for the GNU gettext functionality. -# Please note that the actual code is *not* freely available. - -PACKAGE = @PACKAGE@ -VERSION = @VERSION@ - -SHELL = /bin/sh -@SET_MAKE@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ - -prefix = @prefix@ -exec_prefix = @exec_prefix@ -datadir = $(prefix)/@DATADIRNAME@ -localedir = $(datadir)/locale -gnulocaledir = $(prefix)/share/locale -gettextsrcdir = $(prefix)/share/gettext/po -subdir = po - -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -MKINSTALLDIRS = @MKINSTALLDIRS@ - -CC = @CC@ -GENCAT = @GENCAT@ -GMSGFMT = PATH=../src:$$PATH @GMSGFMT@ -MSGFMT = @MSGFMT@ -XGETTEXT = PATH=../src:$$PATH @XGETTEXT@ -MSGMERGE = PATH=../src:$$PATH msgmerge - -DEFS = @DEFS@ -CFLAGS = @CFLAGS@ -CPPFLAGS = @CPPFLAGS@ - -INCLUDES = -I.. -I$(top_srcdir)/intl - -COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) - -SOURCES = cat-id-tbl.c -POFILES = @POFILES@ -GMOFILES = @GMOFILES@ -DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot \ -stamp-cat-id $(POFILES) $(GMOFILES) $(SOURCES) - -POTFILES = \ - -CATALOGS = @CATALOGS@ -CATOBJEXT = @CATOBJEXT@ -INSTOBJEXT = @INSTOBJEXT@ - -.SUFFIXES: -.SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat - -.c.o: - $(COMPILE) $< - -.po.pox: - $(MAKE) $(PACKAGE).pot - $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox - -.po.mo: - $(MSGFMT) -o $@ $< - -.po.gmo: - file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ - && rm -f $$file && $(GMSGFMT) -o $$file $< - -.po.cat: - sed -f ../intl/po2msg.sed < $< > $*.msg \ - && rm -f $@ && $(GENCAT) $@ $*.msg - - -all: all-@USE_NLS@ - -all-yes: $(CATALOGS) @MAINT@ $(PACKAGE).pot -all-no: - -$(srcdir)/$(PACKAGE).pot: $(POTFILES) - $(XGETTEXT) --default-domain=$(PACKAGE) --directory=$(top_srcdir) \ - --add-comments --keyword=_ --keyword=N_ \ - --files-from=$(srcdir)/POTFILES.in - rm -f $(srcdir)/$(PACKAGE).pot - mv $(PACKAGE).po $(srcdir)/$(PACKAGE).pot - -$(srcdir)/cat-id-tbl.c: stamp-cat-id; @: -$(srcdir)/stamp-cat-id: $(PACKAGE).pot - rm -f cat-id-tbl.tmp - sed -f ../intl/po2tbl.sed $(srcdir)/$(PACKAGE).pot \ - | sed -e "s/@PACKAGE NAME@/$(PACKAGE)/" > cat-id-tbl.tmp - if cmp -s cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; then \ - rm cat-id-tbl.tmp; \ - else \ - echo cat-id-tbl.c changed; \ - rm -f $(srcdir)/cat-id-tbl.c; \ - mv cat-id-tbl.tmp $(srcdir)/cat-id-tbl.c; \ - fi - cd $(srcdir) && rm -f stamp-cat-id && echo timestamp > stamp-cat-id - - -install: install-exec install-data -install-exec: -install-info: -install-data: install-data-@USE_NLS@ -install-data-no: all -install-data-yes: all - if test -r $(MKINSTALLDIRS); then \ - $(MKINSTALLDIRS) $(datadir); \ - else \ - $(top_srcdir)/mkinstalldirs $(datadir); \ - fi - @catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - case "$$cat" in \ - *.gmo) destdir=$(gnulocaledir);; \ - *) destdir=$(localedir);; \ - esac; \ - lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ - dir=$$destdir/$$lang/LC_MESSAGES; \ - if test -r $(MKINSTALLDIRS); then \ - $(MKINSTALLDIRS) $$dir; \ - else \ - $(top_srcdir)/mkinstalldirs $$dir; \ - fi; \ - if test -r $$cat; then \ - $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ - echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \ - else \ - $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \ - echo "installing $(srcdir)/$$cat as" \ - "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \ - fi; \ - if test -r $$cat.m; then \ - $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ - echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ - else \ - if test -r $(srcdir)/$$cat.m ; then \ - $(INSTALL_DATA) $(srcdir)/$$cat.m \ - $$dir/$(PACKAGE)$(INSTOBJEXT).m; \ - echo "installing $(srcdir)/$$cat as" \ - "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \ - else \ - true; \ - fi; \ - fi; \ - done - if test "$(PACKAGE)" = "gettext"; then \ - if test -r $(MKINSTALLDIRS); then \ - $(MKINSTALLDIRS) $(gettextsrcdir); \ - else \ - $(top_srcdir)/mkinstalldirs $(gettextsrcdir); \ - fi; \ - $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ - $(gettextsrcdir)/Makefile.in.in; \ - else \ - : ; \ - fi - -# Define this as empty until I found a useful application. -installcheck: - -uninstall: - catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ - rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ - rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ - rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \ - rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \ - done - rm -f $(gettextsrcdir)/po-Makefile.in.in - -check: all - -cat-id-tbl.o: ../intl/libgettext.h - -dvi info tags TAGS ID: - -mostlyclean: - rm -f core core.* *.pox $(PACKAGE).po *.old.po cat-id-tbl.tmp - rm -fr *.o - -clean: mostlyclean - -distclean: clean - rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m - -maintainer-clean: distclean - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - rm -f $(GMOFILES) - -distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) -dist distdir: update-po $(DISTFILES) - dists="$(DISTFILES)"; \ - for file in $$dists; do \ - ln $(srcdir)/$$file $(distdir) 2> /dev/null \ - || cp -p $(srcdir)/$$file $(distdir); \ - done - -update-po: Makefile - $(MAKE) $(PACKAGE).pot - PATH=`pwd`/../src:$$PATH; \ - cd $(srcdir); \ - catalogs='$(CATALOGS)'; \ - for cat in $$catalogs; do \ - cat=`basename $$cat`; \ - lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ - mv $$lang.po $$lang.old.po; \ - echo "$$lang:"; \ - if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \ - rm -f $$lang.old.po; \ - else \ - echo "msgmerge for $$cat failed!"; \ - rm -f $$lang.po; \ - mv $$lang.old.po $$lang.po; \ - fi; \ - done - -POTFILES: POTFILES.in - ( if test 'x$(srcdir)' != 'x.'; then \ - posrcprefix='$(top_srcdir)/'; \ - else \ - posrcprefix="../"; \ - fi; \ - rm -f $@-t $@ \ - && (sed -e '/^#/d' -e '/^[ ]*$$/d' \ - -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ - | sed -e '$$s/\\$$//') > $@-t \ - && chmod a-w $@-t \ - && mv $@-t $@ ) - -POTFILES.in: @MAINT@ ../Makefile - cd .. && $(MAKE) po/POTFILES.in - -Makefile: Make-in ../config.status POTFILES - cd .. \ - && CONFIG_FILES=$(subdir)/Makefile.in:$(subdir)/Make-in \ - CONFIG_HEADERS= $(SHELL) ./config.status - -# Tell versions [3.59,3.63) of GNU make not to export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/gprof/po/POTFILES.in b/gprof/po/POTFILES.in deleted file mode 100644 index 5ae8116..0000000 --- a/gprof/po/POTFILES.in +++ /dev/null @@ -1,37 +0,0 @@ -alpha.c -basic_blocks.c -basic_blocks.h -call_graph.c -call_graph.h -cg_arcs.c -cg_arcs.h -cg_dfn.c -cg_dfn.h -cg_print.c -cg_print.h -corefile.c -corefile.h -gmon.h -gmon_io.c -gmon_io.h -gmon_out.h -gprof.c -gprof.h -hertz.c -hertz.h -hist.c -hist.h -i386.c -search_list.c -search_list.h -source.c -source.h -sparc.c -sym_ids.c -sym_ids.h -symtab.c -symtab.h -tahoe.c -utils.c -utils.h -vax.c diff --git a/gprof/po/gprof.pot b/gprof/po/gprof.pot deleted file mode 100644 index 36bf787..0000000 --- a/gprof/po/gprof.pot +++ /dev/null @@ -1,470 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR Free Software Foundation, Inc. -# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 1998-06-12 19:33-0400\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language-Team: LANGUAGE <LL@li.org>\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: ENCODING\n" - -#: alpha.c:89 -msgid "<indirect child>" -msgstr "" - -#: alpha.c:106 -#, c-format -msgid "[find_call] %s: 0x%lx to 0x%lx\n" -msgstr "" - -#: alpha.c:127 -#, c-format -msgid "[find_call] 0x%lx: jsr%s <indirect_child>\n" -msgstr "" - -#: alpha.c:136 -#, c-format -msgid "[find_call] 0x%lx: bsr" -msgstr "" - -#: basic_blocks.c:134 call_graph.c:70 hist.c:105 -#, c-format -msgid "%s: %s: unexpected end of file\n" -msgstr "" - -#: basic_blocks.c:214 -#, c-format -msgid "%s: warning: ignoring basic-block exec counts (use -l or --line)\n" -msgstr "" - -#: basic_blocks.c:322 basic_blocks.c:330 -#, c-format -msgid "%s:%d: (%s:0x%lx) %d executions\n" -msgstr "" - -#: basic_blocks.c:323 basic_blocks.c:331 -msgid "<unknown>" -msgstr "" - -#: basic_blocks.c:584 -#, c-format -msgid "" -"\n" -"\n" -"Top %d Lines:\n" -"\n" -" Line Count\n" -"\n" -msgstr "" - -#: basic_blocks.c:608 -msgid "" -"\n" -"Execution Summary:\n" -"\n" -msgstr "" - -#: basic_blocks.c:609 -#, c-format -msgid "%9ld Executable lines in this file\n" -msgstr "" - -#: basic_blocks.c:611 -#, c-format -msgid "%9ld Lines executed\n" -msgstr "" - -#: basic_blocks.c:612 -#, c-format -msgid "%9.2f Percent of the file executed\n" -msgstr "" - -#: basic_blocks.c:616 -#, c-format -msgid "" -"\n" -"%9d Total number of line executions\n" -msgstr "" - -#: basic_blocks.c:617 -#, c-format -msgid "%9.2f Average executions per line\n" -msgstr "" - -#: call_graph.c:48 -#, c-format -msgid "[cg_tally] arc from %s to %s traversed %d times\n" -msgstr "" - -#: cg_print.c:39 -msgid "" -"\t\t Call graph (explanation follows)\n" -"\n" -msgstr "" - -#: cg_print.c:43 -msgid "" -"\t\t\tCall graph\n" -"\n" -msgstr "" - -#: cg_print.c:46 hist.c:381 -#, c-format -msgid "" -"\n" -"granularity: each sample hit covers %ld byte(s)" -msgstr "" - -#: cg_print.c:50 -msgid "" -" for %.2f%% of %.2f seconds\n" -"\n" -msgstr "" - -#: cg_print.c:55 -msgid "" -" no time propagated\n" -"\n" -msgstr "" - -#: cg_print.c:64 cg_print.c:67 cg_print.c:69 -msgid "called" -msgstr "" - -#: cg_print.c:64 cg_print.c:69 -msgid "total" -msgstr "" - -#: cg_print.c:64 -msgid "parents" -msgstr "" - -#: cg_print.c:66 cg_print.c:67 -msgid "index" -msgstr "" - -#: cg_print.c:66 -msgid "%time" -msgstr "" - -#: cg_print.c:66 cg_print.c:67 -msgid "self" -msgstr "" - -#: cg_print.c:66 -msgid "descendents" -msgstr "" - -#: cg_print.c:67 hist.c:405 -msgid "name" -msgstr "" - -#: cg_print.c:69 -msgid "children" -msgstr "" - -#: cg_print.c:74 -msgid "index %% time self children called name\n" -msgstr "" - -#: cg_print.c:101 -#, c-format -msgid " <cycle %d as a whole> [%d]\n" -msgstr "" - -#: cg_print.c:353 -#, c-format -msgid "%6.6s %5.5s %7.7s %11.11s %7.7s %7.7s <spontaneous>\n" -msgstr "" - -#: cg_print.c:354 -#, c-format -msgid "%6.6s %5.5s %7.7s %7.7s %7.7s %7.7s <spontaneous>\n" -msgstr "" - -#: cg_print.c:587 -msgid "" -"Index by function name\n" -"\n" -msgstr "" - -#: cg_print.c:644 cg_print.c:653 -#, c-format -msgid "<cycle %d>" -msgstr "" - -#: corefile.c:39 -#, c-format -msgid "%s: could not open %s.\n" -msgstr "" - -#: corefile.c:53 corefile.c:87 -#, c-format -msgid "%s: unable to parse mapping file %s.\n" -msgstr "" - -#: corefile.c:128 -#, c-format -msgid "%s: %s: not in a.out format\n" -msgstr "" - -#: corefile.c:139 -#, c-format -msgid "%s: can't find .text section in %s\n" -msgstr "" - -#: corefile.c:198 -#, c-format -msgid "%s: ran out room for %ld bytes of text space\n" -msgstr "" - -#: corefile.c:211 -#, c-format -msgid "%s: can't do -c\n" -msgstr "" - -#: corefile.c:243 -#, c-format -msgid "%s: -c not supported on architecture %s\n" -msgstr "" - -#: corefile.c:432 -#, c-format -msgid "%s: file `%s' has no symbols\n" -msgstr "" - -#: corefile.c:726 -#, c-format -msgid "%s: somebody miscounted: ltab.len=%d instead of %ld\n" -msgstr "" - -#: gmon_io.c:33 gmon_io.c:55 -#, c-format -msgid "%s: bfd_vma has unexpected size of %ld bytes\n" -msgstr "" - -#: gmon_io.c:87 gmon_io.c:179 -#, c-format -msgid "%s: file too short to be a gmon file\n" -msgstr "" - -#: gmon_io.c:97 -#, c-format -msgid "%s: file `%s' has bad magic cookie\n" -msgstr "" - -#: gmon_io.c:108 -#, c-format -msgid "%s: file `%s' has unsupported version %d\n" -msgstr "" - -#: gmon_io.c:138 -#, c-format -msgid "%s: %s: found bad tag %d (file corrupted?)\n" -msgstr "" - -#: gmon_io.c:197 -#, c-format -msgid "%s: profiling rate incompatible with first gmon file\n" -msgstr "" - -#: gmon_io.c:207 -#, c-format -msgid "%s: incompatible with first gmon file\n" -msgstr "" - -#: gmon_io.c:245 -#, c-format -msgid "%s: unexpected EOF after reading %d/%d bins\n" -msgstr "" - -#: gmon_io.c:280 -msgid "time is in ticks, not seconds\n" -msgstr "" - -#: gmon_io.c:286 gmon_io.c:410 -#, c-format -msgid "%s: don't know how to deal with file format %d\n" -msgstr "" - -#: gmon_io.c:293 -#, c-format -msgid "File `%s' (version %d) contains:\n" -msgstr "" - -#: gmon_io.c:295 -#, c-format -msgid "\t%d histogram record%s\n" -msgstr "" - -#: gmon_io.c:297 -#, c-format -msgid "\t%d call-graph record%s\n" -msgstr "" - -#: gmon_io.c:299 -#, c-format -msgid "\t%d basic-block count record%s\n" -msgstr "" - -#: gprof.c:59 -msgid "" -"@(#) Copyright (c) 1983 Regents of the University of California.\n" -" All rights reserved.\n" -msgstr "" - -#: gprof.c:144 -#, c-format -msgid "" -"Usage: %s [-[abcDhilLsTvwxyz]] [-[ACeEfFJnNOpPqQZ][name]] [-I dirs]\n" -"\t[-d[num]] [-k from/to] [-m min-count] [-t table-length]\n" -"\t[--[no-]annotated-source[=name]] [--[no-]exec-counts[=name]]\n" -"\t[--[no-]flat-profile[=name]] [--[no-]graph[=name]]\n" -"\t[--[no-]time=name] [--all-lines] [--brief] [--debug[=level]]\n" -"\t[--function-ordering] [--file-ordering]\n" -"\t[--directory-path=dirs] [--display-unused-functions]\n" -"\t[--file-format=name] [--file-info] [--help] [--line] [--min-count=n]\n" -"\t[--no-static] [--print-path] [--separate-files]\n" -"\t[--static-call-graph] [--sum] [--table-length=len] [--traditional]\n" -"\t[--version] [--width=n] [--ignore-non-functions]\n" -"\t[--demangle] [--no-demangle]\n" -"\t[image-file] [profile-file...]\n" -msgstr "" - -#: gprof.c:160 -msgid "Report bugs to bug-gnu-utils@gnu.org\n" -msgstr "" - -#: gprof.c:229 -#, c-format -msgid "%s: debugging not supported; -d ignored\n" -msgstr "" - -#: gprof.c:306 -#, c-format -msgid "%s: unknown file format %s\n" -msgstr "" - -#. This output is intended to follow the GNU standards document. -#: gprof.c:390 -#, c-format -msgid "GNU gprof %s\n" -msgstr "" - -#: gprof.c:391 -msgid "" -"Based on BSD gprof, copyright 1983 Regents of the University of California.\n" -msgstr "" - -#: gprof.c:392 -msgid "" -"This program is free software. This program has absolutely no warranty.\n" -msgstr "" - -#: gprof.c:438 -#, c-format -msgid "" -"%s: Only one of --function-ordering and --file-ordering may be specified.\n" -msgstr "" - -#: gprof.c:538 -#, c-format -msgid "%s: sorry, file format `prof' is not yet supported\n" -msgstr "" - -#: gprof.c:599 -#, c-format -msgid "%s: gmon.out file is missing histogram\n" -msgstr "" - -#: gprof.c:606 -#, c-format -msgid "%s: gmon.out file is missing call-graph data\n" -msgstr "" - -#: hist.c:142 -#, c-format -msgid "%s: `%s' is incompatible with first gmon file\n" -msgstr "" - -#: hist.c:158 -#, c-format -msgid "%s: %s: unexpected EOF after reading %d of %d samples\n" -msgstr "" - -#: hist.c:377 -#, c-format -msgid "%c%c/call" -msgstr "" - -#: hist.c:385 -msgid "" -" for %.2f%% of %.2f %s\n" -"\n" -msgstr "" - -#: hist.c:391 -#, c-format -msgid "" -"\n" -"Each sample counts as %g %s.\n" -msgstr "" - -#: hist.c:396 -msgid "" -" no time accumulated\n" -"\n" -msgstr "" - -#: hist.c:402 -msgid "cumulative" -msgstr "" - -#: hist.c:402 -msgid "self " -msgstr "" - -#: hist.c:402 -msgid "total " -msgstr "" - -#: hist.c:404 -msgid "time" -msgstr "" - -#: hist.c:404 -msgid "calls" -msgstr "" - -#: hist.c:515 -msgid "" -"\n" -"\n" -"\n" -"flat profile:\n" -msgstr "" - -#: hist.c:521 -msgid "Flat profile:\n" -msgstr "" - -#: source.c:140 -#, c-format -msgid "%s: could not locate `%s'\n" -msgstr "" - -#: source.c:200 -#, c-format -msgid "*** File %s:\n" -msgstr "" - -#: utils.c:93 -#, c-format -msgid " <cycle %d>" -msgstr "" diff --git a/gprof/search_list.c b/gprof/search_list.c deleted file mode 100644 index d475dbf..0000000 --- a/gprof/search_list.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "libiberty.h" -#include "gprof.h" -#include "search_list.h" - - -void -DEFUN (search_list_append, (list, paths), - Search_List * list AND const char *paths) -{ - Search_List_Elem *new_el; - const char *beg, *colon; - int len; - - colon = paths - 1; - do - { - beg = colon + 1; - colon = strchr (beg, ':'); - if (colon) - { - len = colon - beg; - } - else - { - len = strlen (beg); - } - new_el = (Search_List_Elem *) xmalloc (sizeof (*new_el) + len); - memcpy (new_el->path, beg, len); - new_el->path[len] = '\0'; - - /* append new path at end of list: */ - new_el->next = 0; - if (list->tail) - { - list->tail->next = new_el; - } - else - { - list->head = new_el; - } - list->tail = new_el; - } - while (colon); -} diff --git a/gprof/search_list.h b/gprof/search_list.h deleted file mode 100644 index 54dfe35..0000000 --- a/gprof/search_list.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef search_list_h -#define search_list_h - -typedef struct search_list_elem - { - struct search_list_elem *next; - char path[1]; - } -Search_List_Elem; - -typedef struct - { - struct search_list_elem *head; - struct search_list_elem *tail; - } -Search_List; - -extern void search_list_append PARAMS ((Search_List * list, const char *paths)); - -#endif /* search_list_h */ diff --git a/gprof/source.c b/gprof/source.c deleted file mode 100644 index 4901a04..0000000 --- a/gprof/source.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Keeps track of source files. - */ -#include "gprof.h" -#include "libiberty.h" -#include "search_list.h" -#include "source.h" - -#define EXT_ANNO "-ann" /* postfix of annotated files */ - -/* - * Default option values: - */ -bool create_annotation_files = FALSE; - -Search_List src_search_list = -{0, 0}; -Source_File *first_src_file = 0; - - -Source_File * -DEFUN (source_file_lookup_path, (path), const char *path) -{ - Source_File *sf; - - for (sf = first_src_file; sf; sf = sf->next) - { - if (strcmp (path, sf->name) == 0) - { - break; - } - } - if (!sf) - { - /* create a new source file descriptor: */ - - sf = (Source_File *) xmalloc (sizeof (*sf)); - memset (sf, 0, sizeof (*sf)); - sf->name = xstrdup (path); - sf->next = first_src_file; - first_src_file = sf; - } - return sf; -} - - -Source_File * -DEFUN (source_file_lookup_name, (filename), const char *filename) -{ - const char *fname; - Source_File *sf; - /* - * The user cannot know exactly how a filename will be stored in - * the debugging info (e.g., ../include/foo.h - * vs. /usr/include/foo.h). So we simply compare the filename - * component of a path only: - */ - for (sf = first_src_file; sf; sf = sf->next) - { - fname = strrchr (sf->name, '/'); - if (fname) - { - ++fname; - } - else - { - fname = sf->name; - } - if (strcmp (filename, fname) == 0) - { - break; - } - } - return sf; -} - - -FILE * -DEFUN (annotate_source, (sf, max_width, annote, arg), - Source_File * sf AND int max_width - AND void (*annote) PARAMS ((char *buf, int w, int l, void *arg)) - AND void *arg) -{ - static bool first_file = TRUE; - int i, line_num, nread; - bool new_line; - char buf[8192]; - char fname[PATH_MAX]; - char *annotation, *name_only; - FILE *ifp, *ofp; - Search_List_Elem *sle = src_search_list.head; - - /* - * Open input file. If open fails, walk along search-list until - * open succeeds or reaching end of list: - */ - strcpy (fname, sf->name); - if (sf->name[0] == '/') - { - sle = 0; /* don't use search list for absolute paths */ - } - name_only = 0; - while (TRUE) - { - DBG (SRCDEBUG, printf ("[annotate_source]: looking for %s, trying %s\n", - sf->name, fname)); - ifp = fopen (fname, FOPEN_RB); - if (ifp) - { - break; - } - if (!sle && !name_only) - { - name_only = strrchr (sf->name, '/'); - if (name_only) - { - /* try search-list again, but this time with name only: */ - ++name_only; - sle = src_search_list.head; - } - } - if (sle) - { - strcpy (fname, sle->path); - strcat (fname, "/"); - if (name_only) - { - strcat (fname, name_only); - } - else - { - strcat (fname, sf->name); - } - sle = sle->next; - } - else - { - if (errno == ENOENT) - { - fprintf (stderr, _("%s: could not locate `%s'\n"), - whoami, sf->name); - } - else - { - perror (sf->name); - } - return 0; - } - } - - ofp = stdout; - if (create_annotation_files) - { - /* try to create annotated source file: */ - const char *filename; - - /* create annotation files in the current working directory: */ - filename = strrchr (sf->name, '/'); - if (filename) - { - ++filename; - } - else - { - filename = sf->name; - } - - strcpy (fname, filename); - strcat (fname, EXT_ANNO); - ofp = fopen (fname, "w"); - if (!ofp) - { - perror (fname); - return 0; - } - } - - /* - * Print file names if output goes to stdout and there are - * more than one source file: - */ - if (ofp == stdout) - { - if (first_file) - { - first_file = FALSE; - } - else - { - fputc ('\n', ofp); - } - if (first_output) - { - first_output = FALSE; - } - else - { - fprintf (ofp, "\f\n"); - } - fprintf (ofp, _("*** File %s:\n"), sf->name); - } - - annotation = xmalloc (max_width + 1); - line_num = 1; - new_line = TRUE; - while ((nread = fread (buf, 1, sizeof (buf), ifp)) > 0) - { - for (i = 0; i < nread; ++i) - { - if (new_line) - { - (*annote) (annotation, max_width, line_num, arg); - fputs (annotation, ofp); - ++line_num; - new_line = FALSE; - } - new_line = (buf[i] == '\n'); - fputc (buf[i], ofp); - } - } - free (annotation); - return ofp; -} diff --git a/gprof/source.h b/gprof/source.h deleted file mode 100644 index b33bad3..0000000 --- a/gprof/source.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef source_h -#define source_h - -#include <stdio.h> -#include "gprof.h" -#include "search_list.h" - -typedef struct source_file - { - struct source_file *next; - const char *name; /* name of source file */ - unsigned long ncalls; /* # of "calls" to this file */ - int num_lines; /* # of lines in file */ - int nalloced; /* number of lines allocated */ - void **line; /* usage-dependent per-line data */ - } -Source_File; - -/* - * Options: - */ -extern bool create_annotation_files; /* create annotated output files? */ - -/* - * List of directories to search for source files: - */ -extern Search_List src_search_list; - -/* - * Chain of source-file descriptors: - */ -extern Source_File *first_src_file; - -/* - * Returns pointer to source file descriptor for PATH/FILENAME. - */ -extern Source_File *source_file_lookup_path PARAMS ((const char *path)); -extern Source_File *source_file_lookup_name PARAMS ((const char *filename)); - -/* - * Read source file SF output annotated source. The annotation is at - * MAX_WIDTH characters wide and for each source-line an annotation is - * obtained by invoking function ANNOTE. ARG is an argument passed to - * ANNOTE that is left uninterpreted by annotate_source(). - * - * Returns a pointer to the output file (which maybe stdout) such - * that summary statistics can be printed. If the returned file - * is not stdout, it should be closed when done with it. - */ -extern FILE *annotate_source PARAMS ((Source_File * sf, int max_width, - void (*annote) (char *b, int w, int l, - void *arg), - void *arg)); - -#endif /* source_h */ diff --git a/gprof/sparc.c b/gprof/sparc.c deleted file mode 100644 index ad702b1..0000000 --- a/gprof/sparc.c +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include "gprof.h" -#include "cg_arcs.h" -#include "corefile.h" -#include "hist.h" -#include "symtab.h" - - /* - * opcode of the `callf' instruction - */ -#define CALL (0xc0000000) - -void -sparc_find_call (parent, p_lowpc, p_highpc) - Sym *parent; - bfd_vma p_lowpc; - bfd_vma p_highpc; -{ - bfd_vma dest_pc, delta; - unsigned int *instr; - Sym *child; - - delta = (bfd_vma) core_text_space - core_text_sect->vma; - - if (core_text_space == 0) - { - return; - } - if (p_lowpc < s_lowpc) - { - p_lowpc = s_lowpc; - } - if (p_highpc > s_highpc) - { - p_highpc = s_highpc; - } - DBG (CALLDEBUG, printf ("[find_call] %s: 0x%lx to 0x%lx\n", - parent->name, p_lowpc, p_highpc)); - for (instr = (unsigned int *) (((p_lowpc + delta) + 3) &~ 3); - instr < (unsigned int *) (p_highpc + delta); - ++instr) - { - if ((*instr & CALL)) - { - DBG (CALLDEBUG, - printf ("[find_call] 0x%lx: callf", (bfd_vma) instr - delta)); - /* - * Regular pc relative addressing check that this is the - * address of a function. - */ - dest_pc = ((bfd_vma) (instr + (*instr & ~CALL))) - delta; - if (dest_pc >= s_lowpc && dest_pc <= s_highpc) - { - child = sym_lookup (&symtab, dest_pc); - DBG (CALLDEBUG, - printf ("\tdest_pc=0x%lx, (name=%s, addr=0x%lx)\n", - dest_pc, child->name, child->addr)); - if (child->addr == dest_pc) - { - /* a hit: */ - arc_add (parent, child, (unsigned long) 0); - continue; - } - } - /* - * Something funny going on. - */ - DBG (CALLDEBUG, printf ("\tbut it's a botch\n")); - } - } -} diff --git a/gprof/stamp-h.in b/gprof/stamp-h.in deleted file mode 100644 index 9788f70..0000000 --- a/gprof/stamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp diff --git a/gprof/sym_ids.c b/gprof/sym_ids.c deleted file mode 100644 index ba3ca28..0000000 --- a/gprof/sym_ids.c +++ /dev/null @@ -1,372 +0,0 @@ -#include <ctype.h> - -#include "libiberty.h" -#include "cg_arcs.h" -#include "sym_ids.h" - -struct sym_id - { - struct sym_id *next; - char *spec; /* parsing modifies this */ - Table_Id which_table; - bool has_right; - struct match - { - int prev_index; /* index of prev match */ - Sym *prev_match; /* previous match */ - Sym *first_match; /* chain of all matches */ - Sym sym; - } - left, right; - } - *id_list; - -Sym_Table syms[NUM_TABLES]; - -#ifdef DEBUG -const char *table_name[] = -{ - "INCL_GRAPH", "EXCL_GRAPH", - "INCL_ARCS", "EXCL_ARCS", - "INCL_FLAT", "EXCL_FLAT", - "INCL_TIME", "EXCL_TIME", - "INCL_ANNO", "EXCL_ANNO", - "INCL_EXEC", "EXCL_EXEC" -}; -#endif /* DEBUG */ - -/* - * This is the table in which we keep all the syms that match - * the right half of an arc id. It is NOT sorted according - * to the addresses, because it is accessed only through - * the left half's CHILDREN pointers (so it's crucial not - * to reorder this table once pointers into it exist). - */ -static Sym_Table right_ids; - -static Source_File non_existent_file = -{ - 0, "<non-existent-file>" -}; - - -void -DEFUN (sym_id_add, (spec, which_table), - const char *spec AND Table_Id which_table) -{ - struct sym_id *id; - int len = strlen (spec); - - id = (struct sym_id *) xmalloc (sizeof (*id) + len + 1); - memset (id, 0, sizeof (*id)); - - id->spec = (char *) id + sizeof (*id); - strcpy (id->spec, spec); - id->which_table = which_table; - - id->next = id_list; - id_list = id; -} - - -/* - * A spec has the syntax FILENAME:(FUNCNAME|LINENUM). As a convenience - * to the user, a spec without a colon is interpreted as: - * - * (i) a FILENAME if it contains a dot - * (ii) a FUNCNAME if it starts with a non-digit character - * (iii) a LINENUM if it starts with a digit - * - * A FUNCNAME containing a dot can be specified by :FUNCNAME, a - * FILENAME not containing a dot can be specified by FILENAME:. - */ -static void -DEFUN (parse_spec, (spec, sym), char *spec AND Sym * sym) -{ - char *colon; - - sym_init (sym); - colon = strrchr (spec, ':'); - if (colon) - { - *colon = '\0'; - if (colon > spec) - { - sym->file = source_file_lookup_name (spec); - if (!sym->file) - { - sym->file = &non_existent_file; - } - } - spec = colon + 1; - if (strlen (spec)) - { - if (isdigit ((unsigned char) spec[0])) - { - sym->line_num = atoi (spec); - } - else - { - sym->name = spec; - } - } - } - else if (strlen (spec)) - { - /* no colon: spec is a filename if it contains a dot: */ - if (strchr (spec, '.')) - { - sym->file = source_file_lookup_name (spec); - if (!sym->file) - { - sym->file = &non_existent_file; - } - } - else if (isdigit ((unsigned char) *spec)) - { - sym->line_num = atoi (spec); - } - else if (strlen (spec)) - { - sym->name = spec; - } - } -} - - -/* - * A symbol id has the syntax SPEC[/SPEC], where SPEC is is defined - * by parse_spec(). - */ -static void -DEFUN (parse_id, (id), struct sym_id *id) -{ - char *slash; - - DBG (IDDEBUG, printf ("[parse_id] %s -> ", id->spec)); - - slash = strchr (id->spec, '/'); - if (slash) - { - parse_spec (slash + 1, &id->right.sym); - *slash = '\0'; - id->has_right = TRUE; - } - parse_spec (id->spec, &id->left.sym); - -#ifdef DEBUG - if (debug_level & IDDEBUG) - { - printf ("%s:", id->left.sym.file ? id->left.sym.file->name : "*"); - if (id->left.sym.name) - { - printf ("%s", id->left.sym.name); - } - else if (id->left.sym.line_num) - { - printf ("%d", id->left.sym.line_num); - } - else - { - printf ("*"); - } - if (id->has_right) - { - printf ("/%s:", - id->right.sym.file ? id->right.sym.file->name : "*"); - if (id->right.sym.name) - { - printf ("%s", id->right.sym.name); - } - else if (id->right.sym.line_num) - { - printf ("%d", id->right.sym.line_num); - } - else - { - printf ("*"); - } - } - printf ("\n"); - } -#endif -} - - -/* - * Return TRUE iff PATTERN matches SYM. - */ -static bool -DEFUN (match, (pattern, sym), Sym * pattern AND Sym * sym) -{ - return (pattern->file ? pattern->file == sym->file : TRUE) - && (pattern->line_num ? pattern->line_num == sym->line_num : TRUE) - && (pattern->name ? strcmp (pattern->name, sym->name) == 0 : TRUE); -} - - -static void -DEFUN (extend_match, (m, sym, tab, second_pass), - struct match *m AND Sym * sym AND Sym_Table * tab AND bool second_pass) -{ - if (m->prev_match != sym - 1) - { - /* discontinuity: add new match to table: */ - if (second_pass) - { - tab->base[tab->len] = *sym; - m->prev_index = tab->len; - - /* link match into match's chain: */ - tab->base[tab->len].next = m->first_match; - m->first_match = &tab->base[tab->len]; - } - ++tab->len; - } - - /* extend match to include this symbol: */ - if (second_pass) - { - tab->base[m->prev_index].end_addr = sym->end_addr; - } - m->prev_match = sym; -} - - -/* - * Go through sym_id list produced by option processing and fill - * in the various symbol tables indicating what symbols should - * be displayed or suppressed for the various kinds of outputs. - * - * This can potentially produce huge tables and in particulars - * tons of arcs, but this happens only if the user makes silly - * requests---you get what you ask for! - */ -void -DEFUN_VOID (sym_id_parse) -{ - Sym *sym, *left, *right; - struct sym_id *id; - Sym_Table *tab; - - /* - * Convert symbol ids into Syms, so we can deal with them more easily: - */ - for (id = id_list; id; id = id->next) - { - parse_id (id); - } - - /* first determine size of each table: */ - - for (sym = symtab.base; sym < symtab.limit; ++sym) - { - for (id = id_list; id; id = id->next) - { - if (match (&id->left.sym, sym)) - { - extend_match (&id->left, sym, &syms[id->which_table], FALSE); - } - if (id->has_right && match (&id->right.sym, sym)) - { - extend_match (&id->right, sym, &right_ids, FALSE); - } - } - } - - /* create tables of appropriate size and reset lengths: */ - - for (tab = syms; tab < &syms[NUM_TABLES]; ++tab) - { - if (tab->len) - { - tab->base = (Sym *) xmalloc (tab->len * sizeof (Sym)); - tab->limit = tab->base + tab->len; - tab->len = 0; - } - } - if (right_ids.len) - { - right_ids.base = (Sym *) xmalloc (right_ids.len * sizeof (Sym)); - right_ids.limit = right_ids.base + right_ids.len; - right_ids.len = 0; - } - - /* make a second pass through symtab, creating syms as necessary: */ - - for (sym = symtab.base; sym < symtab.limit; ++sym) - { - for (id = id_list; id; id = id->next) - { - if (match (&id->left.sym, sym)) - { - extend_match (&id->left, sym, &syms[id->which_table], TRUE); - } - if (id->has_right && match (&id->right.sym, sym)) - { - extend_match (&id->right, sym, &right_ids, TRUE); - } - } - } - - /* go through ids creating arcs as needed: */ - - for (id = id_list; id; id = id->next) - { - if (id->has_right) - { - for (left = id->left.first_match; left; left = left->next) - { - for (right = id->right.first_match; right; right = right->next) - { - DBG (IDDEBUG, - printf ( - "[sym_id_parse]: arc %s:%s(%lx-%lx) -> %s:%s(%lx-%lx) to %s\n", - left->file ? left->file->name : "*", - left->name ? left->name : "*", left->addr, - left->end_addr, - right->file ? right->file->name : "*", - right->name ? right->name : "*", right->addr, - right->end_addr, - table_name[id->which_table])); - arc_add (left, right, (unsigned long) 0); - } - } - } - } - - /* finally, we can sort the tables and we're done: */ - - for (tab = &syms[0]; tab < &syms[NUM_TABLES]; ++tab) - { - DBG (IDDEBUG, printf ("[sym_id_parse] syms[%s]:\n", - table_name[tab - &syms[0]])); - symtab_finalize (tab); - } -} - - -/* - * Symbol tables storing the FROM symbols of arcs do not necessarily - * have distinct address ranges. For example, somebody might request - * -k /_mcount to suppress any arcs into _mcount, while at the same - * time requesting -k a/b. Fortunately, those symbol tables don't get - * very big (the user has to type them!), so a linear search is probably - * tolerable. - */ -bool -DEFUN (sym_id_arc_is_present, (symtab, from, to), - Sym_Table * symtab AND Sym * from AND Sym * to) -{ - Sym *sym; - - for (sym = symtab->base; sym < symtab->limit; ++sym) - { - if (from->addr >= sym->addr && from->addr <= sym->end_addr - && arc_lookup (sym, to)) - { - return TRUE; - } - } - return FALSE; -} diff --git a/gprof/sym_ids.h b/gprof/sym_ids.h deleted file mode 100644 index 9096338..0000000 --- a/gprof/sym_ids.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef sym_ids_h -#define sym_ids_h - -#include "symtab.h" - -typedef enum - { - INCL_GRAPH = 0, EXCL_GRAPH, - INCL_ARCS, EXCL_ARCS, - INCL_FLAT, EXCL_FLAT, - INCL_TIME, EXCL_TIME, - INCL_ANNO, EXCL_ANNO, - INCL_EXEC, EXCL_EXEC, - NUM_TABLES - } -Table_Id; - -extern Sym_Table syms[NUM_TABLES]; - -extern void sym_id_add PARAMS ((const char *spec, Table_Id which_table)); -extern void sym_id_parse PARAMS ((void)); -extern bool sym_id_arc_is_present PARAMS ((Sym_Table * symtab, - Sym * from, Sym * to)); - -#endif /* sym_ids_h */ diff --git a/gprof/symtab.c b/gprof/symtab.c deleted file mode 100644 index 182c657..0000000 --- a/gprof/symtab.c +++ /dev/null @@ -1,269 +0,0 @@ -#include "gprof.h" -#include "cg_arcs.h" -#include "corefile.h" -#include "symtab.h" - -Sym_Table symtab; - - -/* - * Initialize a symbol (so it's empty). - */ -void -DEFUN (sym_init, (sym), Sym * sym) -{ - memset (sym, 0, sizeof (*sym)); - /* - * It is not safe to assume that a binary zero corresponds to - * a floating-point 0.0, so initialize floats explicitly: - */ - sym->hist.time = 0.0; - sym->cg.child_time = 0.0; - sym->cg.prop.fract = 0.0; - sym->cg.prop.self = 0.0; - sym->cg.prop.child = 0.0; -} - - -/* - * Compare the function entry-point of two symbols and return <0, =0, - * or >0 depending on whether the left value is smaller than, equal - * to, or greater than the right value. If two symbols are equal - * but one has is_func set and the other doesn't, we make the - * non-function symbol one "bigger" so that the function symbol will - * survive duplicate removal. Finally, if both symbols have the - * same is_func value, we discriminate against is_static such that - * the global symbol survives. - */ -static int -DEFUN (cmp_addr, (lp, rp), const PTR lp AND const PTR rp) -{ - Sym *left = (Sym *) lp; - Sym *right = (Sym *) rp; - - if (left->addr > right->addr) - { - return 1; - } - else if (left->addr < right->addr) - { - return -1; - } - - if (left->is_func != right->is_func) - { - return right->is_func - left->is_func; - } - - return left->is_static - right->is_static; -} - - -void -DEFUN (symtab_finalize, (tab), Sym_Table * tab) -{ - Sym *src, *dst; - bfd_vma prev_addr; - - if (!tab->len) - { - return; - } - - /* - * Sort symbol table in order of increasing function addresses: - */ - qsort (tab->base, tab->len, sizeof (Sym), cmp_addr); - - /* - * Remove duplicate entries to speed-up later processing and - * set end_addr if its not set yet: - */ - prev_addr = tab->base[0].addr + 1; - for (src = dst = tab->base; src < tab->limit; ++src) - { - if (src->addr == prev_addr) - { - /* - * If same address, favor global symbol over static one, - * then function over line number. If both symbols are - * either static or global and either function or line, check - * whether one has name beginning with underscore while - * the other doesn't. In such cases, keep sym without - * underscore. This takes cares of compiler generated - * symbols (such as __gnu_compiled, __c89_used, etc.). - */ - if ((!src->is_static && dst[-1].is_static) - || ((src->is_static == dst[-1].is_static) - && ((src->is_func && !dst[-1].is_func) - || ((src->is_func == dst[-1].is_func) - && ((src->name[0] != '_' && dst[-1].name[0] == '_') - || (src->name[0] - && src->name[1] != '_' - && dst[-1].name[1] == '_')))))) - { - DBG (AOUTDEBUG | IDDEBUG, - printf ("[symtab_finalize] favor %s@%c%c over %s@%c%c", - src->name, src->is_static ? 't' : 'T', - src->is_func ? 'F' : 'f', - dst[-1].name, dst[-1].is_static ? 't' : 'T', - dst[-1].is_func ? 'F' : 'f'); - printf (" (addr=%lx)\n", src->addr)); - dst[-1] = *src; - } - else - { - DBG (AOUTDEBUG | IDDEBUG, - printf ("[symtab_finalize] favor %s@%c%c over %s@%c%c", - dst[-1].name, dst[-1].is_static ? 't' : 'T', - dst[-1].is_func ? 'F' : 'f', - src->name, src->is_static ? 't' : 'T', - src->is_func ? 'F' : 'f'); - printf (" (addr=%lx)\n", src->addr)); - } - } - else - { - if (dst > tab->base && dst[-1].end_addr == 0) - { - dst[-1].end_addr = src->addr - 1; - } - - /* retain sym only if it has a non-empty address range: */ - if (!src->end_addr || src->addr <= src->end_addr) - { - *dst++ = *src; - prev_addr = src->addr; - } - } - } - if (tab->len > 0 && dst[-1].end_addr == 0) - { - dst[-1].end_addr = core_text_sect->vma + core_text_sect->_raw_size - 1; - } - - DBG (AOUTDEBUG | IDDEBUG, - printf ("[symtab_finalize]: removed %d duplicate entries\n", - tab->len - (int) (dst - tab->base))); - - tab->limit = dst; - tab->len = tab->limit - tab->base; - - DBG (AOUTDEBUG | IDDEBUG, - unsigned int j; - - for (j = 0; j < tab->len; ++j) - { - printf ("[symtab_finalize] 0x%lx-0x%lx\t%s\n", - (long) tab->base[j].addr, (long) tab->base[j].end_addr, - tab->base[j].name); - } - ); -} - - -#ifdef DEBUG - -Sym * -DEFUN (dbg_sym_lookup, (symtab, address), Sym_Table * symtab AND bfd_vma address) -{ - long low, mid, high; - Sym *sym; - - fprintf (stderr, "[dbg_sym_lookup] address 0x%lx\n", address); - - sym = symtab->base; - for (low = 0, high = symtab->len - 1; low != high;) - { - mid = (high + low) >> 1; - fprintf (stderr, "[dbg_sym_lookup] low=0x%lx, mid=0x%lx, high=0x%lx\n", - low, mid, high); - fprintf (stderr, "[dbg_sym_lookup] sym[m]=0x%lx sym[m + 1]=0x%lx\n", - sym[mid].addr, sym[mid + 1].addr); - if (sym[mid].addr <= address && sym[mid + 1].addr > address) - { - return &sym[mid]; - } - if (sym[mid].addr > address) - { - high = mid; - } - else - { - low = mid + 1; - } - } - fprintf (stderr, "[dbg_sym_lookup] binary search fails???\n"); - return 0; -} - -#endif /* DEBUG */ - - -/* - * Look up an address in the symbol-table that is sorted by address. - * If address does not hit any symbol, 0 is returned. - */ -Sym * -DEFUN (sym_lookup, (symtab, address), Sym_Table * symtab AND bfd_vma address) -{ - long low, high; - long mid = -1; - Sym *sym; -#ifdef DEBUG - int probes = 0; -#endif /* DEBUG */ - - if (!symtab->len) - { - return 0; - } - - sym = symtab->base; - for (low = 0, high = symtab->len - 1; low != high;) - { - DBG (LOOKUPDEBUG, ++probes); - mid = (high + low) / 2; - if (sym[mid].addr <= address && sym[mid + 1].addr > address) - { - if (address > sym[mid].end_addr) - { - /* - * Address falls into gap between sym[mid] and - * sym[mid + 1]: - */ - return 0; - } - else - { - DBG (LOOKUPDEBUG, - printf ("[sym_lookup] %d probes (symtab->len=%u)\n", - probes, symtab->len - 1)); - return &sym[mid]; - } - } - if (sym[mid].addr > address) - { - high = mid; - } - else - { - low = mid + 1; - } - } - if (sym[mid + 1].addr <= address) - { - if (address > sym[mid + 1].end_addr) - { - /* address is beyond end of sym[mid + 1]: */ - return 0; - } - else - { - DBG (LOOKUPDEBUG, printf ("[sym_lookup] %d (%u) probes, fall off\n", - probes, symtab->len - 1)); - return &sym[mid + 1]; - } - } - return 0; -} diff --git a/gprof/symtab.h b/gprof/symtab.h deleted file mode 100644 index a6a450e..0000000 --- a/gprof/symtab.h +++ /dev/null @@ -1,111 +0,0 @@ -#ifndef symtab_h -#define symtab_h - -#include "bfd.h" -#include "gprof.h" - -/* - * For a profile to be intelligible to a human user, it is necessary - * to map code-addresses into source-code information. Source-code - * information can be any combination of: (i) function-name, (ii) - * source file-name, and (iii) source line number. - * - * The symbol table is used to map addresses into source-code - * information. - */ - -#include "source.h" - -#define NBBS 10 - -/* - * Symbol-entry. For each external in the specified file we gather - * its address, the number of calls and compute its share of cpu time. - */ -typedef struct sym - { - /* - * Common information: - * - * In the symbol-table, fields ADDR and FUNC_NAME are guaranteed - * to contain valid information. FILE may be 0, if unknown and - * LINE_NUM maybe 0 if unknown. - */ - bfd_vma addr; /* address of entry point */ - bfd_vma end_addr; /* end-address */ - const char *name; /* name of function this sym is from */ - Source_File *file; /* source file symbol comes from */ - int line_num; /* source line number */ - unsigned int is_func:1, /* is this a function entry point? */ - is_static:1, /* is this a local (static) symbol? */ - is_bb_head:1, /* is this the head of a basic-blk? */ - mapped:1, /* this symbol was mapped to another name */ - has_been_placed:1; /* have we placed this symbol? */ - unsigned long ncalls; /* how many times executed */ - int nuses; /* how many times this symbol appears in - a particular context */ - bfd_vma bb_addr[NBBS]; /* address of basic-block start */ - unsigned long bb_calls[NBBS]; /* how many times basic-block was called */ - struct sym *next; /* for building chains of syms */ - struct sym *prev; /* for building chains of syms */ - - /* profile-specific information: */ - - /* histogram specific info: */ - struct - { - double time; /* (weighted) ticks in this routine */ - bfd_vma scaled_addr; /* scaled entry point */ - } - hist; - - /* call-graph specific info: */ - struct - { - unsigned long self_calls; /* how many calls to self */ - double child_time; /* cumulative ticks in children */ - int index; /* index in the graph list */ - int top_order; /* graph call chain top-sort order */ - bool print_flag; /* should this be printed? */ - struct - { - double fract; /* what % of time propagates */ - double self; /* how much self time propagates */ - double child; /* how much child time propagates */ - } - prop; - struct - { - int num; /* internal number of cycle on */ - struct sym *head; /* head of cycle */ - struct sym *next; /* next member of cycle */ - } - cyc; - struct arc *parents; /* list of caller arcs */ - struct arc *children; /* list of callee arcs */ - } - cg; - } -Sym; - -/* - * Symbol-tables are always assumed to be sorted in increasing order - * of addresses: - */ -typedef struct - { - unsigned int len; /* # of symbols in this table */ - Sym *base; /* first element in symbol table */ - Sym *limit; /* limit = base + len */ - } -Sym_Table; - -extern Sym_Table symtab; /* the symbol table */ - -extern void sym_init PARAMS ((Sym * sym)); -extern void symtab_finalize PARAMS ((Sym_Table * symtab)); -extern Sym *sym_lookup PARAMS ((Sym_Table * symtab, bfd_vma address)); - -extern void find_call PARAMS ((Sym *, bfd_vma, bfd_vma)); - -#endif /* symtab_h */ diff --git a/gprof/tahoe.c b/gprof/tahoe.c deleted file mode 100644 index d133c17..0000000 --- a/gprof/tahoe.c +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include "gprof.h" -#include "cg_arcs.h" -#include "corefile.h" -#include "hist.h" -#include "symtab.h" - - /* - * opcode of the `callf' instruction - */ -#define CALLF 0xfe - - /* - * register for pc relative addressing - */ -#define PC 0xf - -enum tahoe_opermodes - { - literal, indexed, reg, regdef, autodec, autoinc, autoincdef, - bytedisp, bytedispdef, worddisp, worddispdef, longdisp, longdispdef, - immediate, absolute, byterel, bytereldef, wordrel, wordreldef, - longrel, longreldef - }; -typedef enum tahoe_opermodes tahoe_operandenum; - -/* - * A symbol to be the child of indirect callf: - */ -Sym indirectchild; - - -tahoe_operandenum -tahoe_operandmode (modep) - unsigned char *modep; -{ - long usesreg = ((long) *modep) & 0xf; - - switch (((long) *modep) >> 4) - { - case 0: - case 1: - case 2: - case 3: - return literal; - case 4: - return indexed; - case 5: - return reg; - case 6: - return regdef; - case 7: - return autodec; - case 8: - return usesreg != 0xe ? autoinc : immediate; - case 9: - return usesreg != PC ? autoincdef : absolute; - case 10: - return usesreg != PC ? bytedisp : byterel; - case 11: - return usesreg != PC ? bytedispdef : bytereldef; - case 12: - return usesreg != PC ? worddisp : wordrel; - case 13: - return usesreg != PC ? worddispdef : wordreldef; - case 14: - return usesreg != PC ? longdisp : longrel; - case 15: - return usesreg != PC ? longdispdef : longreldef; - } - /* NOTREACHED */ - abort (); -} - -char * -tahoe_operandname (mode) - tahoe_operandenum mode; -{ - - switch (mode) - { - case literal: - return "literal"; - case indexed: - return "indexed"; - case reg: - return "register"; - case regdef: - return "register deferred"; - case autodec: - return "autodecrement"; - case autoinc: - return "autoincrement"; - case autoincdef: - return "autoincrement deferred"; - case bytedisp: - return "byte displacement"; - case bytedispdef: - return "byte displacement deferred"; - case byterel: - return "byte relative"; - case bytereldef: - return "byte relative deferred"; - case worddisp: - return "word displacement"; - case worddispdef: - return "word displacement deferred"; - case wordrel: - return "word relative"; - case wordreldef: - return "word relative deferred"; - case immediate: - return "immediate"; - case absolute: - return "absolute"; - case longdisp: - return "long displacement"; - case longdispdef: - return "long displacement deferred"; - case longrel: - return "long relative"; - case longreldef: - return "long relative deferred"; - } - /* NOTREACHED */ - abort (); -} - -long -tahoe_operandlength (modep) - unsigned char *modep; -{ - - switch (tahoe_operandmode (modep)) - { - case literal: - case reg: - case regdef: - case autodec: - case autoinc: - case autoincdef: - return 1; - case bytedisp: - case bytedispdef: - case byterel: - case bytereldef: - return 2; - case worddisp: - case worddispdef: - case wordrel: - case wordreldef: - return 3; - case immediate: - case absolute: - case longdisp: - case longdispdef: - case longrel: - case longreldef: - return 5; - case indexed: - return 1 + tahoe_operandlength (modep + 1); - } - /* NOTREACHED */ - abort (); -} - -bfd_vma -tahoe_reladdr (modep) - char *modep; -{ - tahoe_operandenum mode = tahoe_operandmode (modep); - char *cp; - short *sp; - long *lp; - int i; - long value = 0; - - cp = modep; - ++cp; /* skip over the mode */ - switch (mode) - { - default: - fprintf (stderr, "[reladdr] not relative address\n"); - return (bfd_vma) modep; - case byterel: - return (bfd_vma) (cp + sizeof *cp + *cp); - case wordrel: - for (i = 0; (size_t) i < sizeof *sp; i++) - value = (value << 8) + (cp[i] & 0xff); - return (bfd_vma) (cp + sizeof *sp + value); - case longrel: - for (i = 0; (size_t) i < sizeof *lp; i++) - value = (value << 8) + (cp[i] & 0xff); - return (bfd_vma) (cp + sizeof *lp + value); - } -} - -void -tahoe_find_call (parent, p_lowpc, p_highpc) - Sym *parent; - bfd_vma p_lowpc; - bfd_vma p_highpc; -{ - unsigned char *instructp; - long length; - Sym *child; - tahoe_operandenum mode; - tahoe_operandenum firstmode; - bfd_vma destpc; - static bool inited = FALSE; - - if (!inited) - { - inited = TRUE; - sym_init (&indirectchild); - indirectchild.cg.prop.fract = 1.0; - indirectchild.cg.cyc.head = &indirectchild; - } - - if (core_text_space == 0) - { - return; - } - if (p_lowpc < s_lowpc) - { - p_lowpc = s_lowpc; - } - if (p_highpc > s_highpc) - { - p_highpc = s_highpc; - } - DBG (CALLDEBUG, printf ("[findcall] %s: 0x%lx to 0x%lx\n", - parent->name, p_lowpc, p_highpc)); - for (instructp = (unsigned char *) core_text_space + p_lowpc; - instructp < (unsigned char *) core_text_space + p_highpc; - instructp += length) - { - length = 1; - if (*instructp == CALLF) - { - /* - * maybe a callf, better check it out. - * skip the count of the number of arguments. - */ - DBG (CALLDEBUG, printf ("[findcall]\t0x%x:callf", - instructp - (unsigned char *) core_text_space)); - firstmode = tahoe_operandmode (instructp + length); - switch (firstmode) - { - case literal: - case immediate: - break; - default: - goto botched; - } - length += tahoe_operandlength (instructp + length); - mode = tahoe_operandmode (instructp + length); - DBG (CALLDEBUG, - printf ("\tfirst operand is %s", tahoe_operandname (firstmode)); - printf ("\tsecond operand is %s\n", tahoe_operandname (mode)); - ); - switch (mode) - { - case regdef: - case bytedispdef: - case worddispdef: - case longdispdef: - case bytereldef: - case wordreldef: - case longreldef: - /* - * indirect call: call through pointer - * either *d(r) as a parameter or local - * (r) as a return value - * *f as a global pointer - * [are there others that we miss?, - * e.g. arrays of pointers to functions???] - */ - arc_add (parent, &indirectchild, (unsigned long) 0); - length += tahoe_operandlength (instructp + length); - continue; - case byterel: - case wordrel: - case longrel: - /* - * regular pc relative addressing - * check that this is the address of - * a function. - */ - destpc = tahoe_reladdr (instructp + length) - - (bfd_vma) core_text_space; - if (destpc >= s_lowpc && destpc <= s_highpc) - { - child = sym_lookup (&symtab, destpc); - DBG (CALLDEBUG, - printf ("[findcall]\tdestpc 0x%lx", destpc); - printf (" child->name %s", child->name); - printf (" child->addr 0x%lx\n", child->addr); - ); - if (child->addr == destpc) - { - /* - * a hit - */ - arc_add (parent, child, (unsigned long) 0); - length += tahoe_operandlength (instructp + length); - continue; - } - goto botched; - } - /* - * else: - * it looked like a callf, - * but it wasn't to anywhere. - */ - goto botched; - default: - botched: - /* - * something funny going on. - */ - DBG (CALLDEBUG, printf ("[findcall]\tbut it's a botch\n")); - length = 1; - continue; - } - } - } -} diff --git a/gprof/utils.c b/gprof/utils.c deleted file mode 100644 index e1f031d..0000000 --- a/gprof/utils.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 1983, 1998 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include <demangle.h> -#include "gprof.h" -#include "cg_arcs.h" -#include "symtab.h" - - -/* - * Print name of symbol. Return number of characters printed. - */ -int -DEFUN (print_name_only, (self), Sym * self) -{ - const char *name = self->name; - const char *filename; - char *demangled = 0; - char buf[PATH_MAX]; - int size = 0; - - if (name) - { - if (!bsd_style_output) - { - if (name[0] == '_' && name[1] && discard_underscores) - { - name++; - } - if (demangle) - { - demangled = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS); - if (demangled) - { - name = demangled; - } - } - } - printf ("%s", name); - size = strlen (name); - if (line_granularity && self->file) - { - filename = self->file->name; - if (!print_path) - { - filename = strrchr (filename, '/'); - if (filename) - { - ++filename; - } - else - { - filename = self->file->name; - } - } - sprintf (buf, " (%s:%d)", filename, self->line_num); - printf (buf); - size += strlen (buf); - } - if (demangled) - { - free (demangled); - } - DBG (DFNDEBUG, printf ("{%d} ", self->cg.top_order)); - DBG (PROPDEBUG, printf ("%4.0f%% ", 100.0 * self->cg.prop.fract)); - } - return size; -} - - -void -DEFUN (print_name, (self), Sym * self) -{ - print_name_only (self); - - if (self->cg.cyc.num != 0) - { - printf (_(" <cycle %d>"), self->cg.cyc.num); - } - if (self->cg.index != 0) - { - if (self->cg.print_flag) - { - printf (" [%d]", self->cg.index); - } - else - { - printf (" (%d)", self->cg.index); - } - } -} diff --git a/gprof/utils.h b/gprof/utils.h deleted file mode 100644 index 27fb9c6..0000000 --- a/gprof/utils.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef utils_h -#define utils_h - -extern int print_name_only PARAMS ((Sym * self)); -extern void print_name PARAMS ((Sym * self)); - -#endif /* utils_h */ diff --git a/gprof/vax.c b/gprof/vax.c deleted file mode 100644 index 1a7bd8d..0000000 --- a/gprof/vax.c +++ /dev/null @@ -1,350 +0,0 @@ -/* - * Copyright (c) 1983 Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that: (1) source distributions retain this entire copyright - * notice and comment, and (2) distributions including binaries display - * the following acknowledgement: ``This product includes software - * developed by the University of California, Berkeley and its contributors'' - * in the documentation or other materials provided with the distribution - * and in all advertising materials mentioning features or use of this - * software. Neither the name of the University nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ -#include "gprof.h" -#include "cg_arcs.h" -#include "corefile.h" -#include "hist.h" -#include "symtab.h" - - /* - * opcode of the `calls' instruction - */ -#define CALLS 0xfb - - /* - * register for pc relative addressing - */ -#define PC 0xf - -enum opermodes - { - literal, indexed, reg, regdef, autodec, autoinc, autoincdef, - bytedisp, bytedispdef, worddisp, worddispdef, longdisp, longdispdef, - immediate, absolute, byterel, bytereldef, wordrel, wordreldef, - longrel, longreldef - }; -typedef enum opermodes operandenum; - -struct modebyte - { - unsigned int regfield:4; - unsigned int modefield:4; - }; - -/* - * A symbol to be the child of indirect calls: - */ -Sym indirectchild; - - -static operandenum -vax_operandmode (modep) - struct modebyte *modep; -{ - long usesreg = modep->regfield; - - switch (modep->modefield) - { - case 0: - case 1: - case 2: - case 3: - return literal; - case 4: - return indexed; - case 5: - return reg; - case 6: - return regdef; - case 7: - return autodec; - case 8: - return usesreg != PC ? autoinc : immediate; - case 9: - return usesreg != PC ? autoincdef : absolute; - case 10: - return usesreg != PC ? bytedisp : byterel; - case 11: - return usesreg != PC ? bytedispdef : bytereldef; - case 12: - return usesreg != PC ? worddisp : wordrel; - case 13: - return usesreg != PC ? worddispdef : wordreldef; - case 14: - return usesreg != PC ? longdisp : longrel; - case 15: - return usesreg != PC ? longdispdef : longreldef; - } - /* NOTREACHED */ - abort (); -} - -static char * -vax_operandname (mode) - operandenum mode; -{ - - switch (mode) - { - case literal: - return "literal"; - case indexed: - return "indexed"; - case reg: - return "register"; - case regdef: - return "register deferred"; - case autodec: - return "autodecrement"; - case autoinc: - return "autoincrement"; - case autoincdef: - return "autoincrement deferred"; - case bytedisp: - return "byte displacement"; - case bytedispdef: - return "byte displacement deferred"; - case byterel: - return "byte relative"; - case bytereldef: - return "byte relative deferred"; - case worddisp: - return "word displacement"; - case worddispdef: - return "word displacement deferred"; - case wordrel: - return "word relative"; - case wordreldef: - return "word relative deferred"; - case immediate: - return "immediate"; - case absolute: - return "absolute"; - case longdisp: - return "long displacement"; - case longdispdef: - return "long displacement deferred"; - case longrel: - return "long relative"; - case longreldef: - return "long relative deferred"; - } - /* NOTREACHED */ - abort (); -} - -static long -vax_operandlength (modep) - struct modebyte *modep; -{ - - switch (vax_operandmode (modep)) - { - case literal: - case reg: - case regdef: - case autodec: - case autoinc: - case autoincdef: - return 1; - case bytedisp: - case bytedispdef: - case byterel: - case bytereldef: - return 2; - case worddisp: - case worddispdef: - case wordrel: - case wordreldef: - return 3; - case immediate: - case absolute: - case longdisp: - case longdispdef: - case longrel: - case longreldef: - return 5; - case indexed: - return 1 + vax_operandlength ((struct modebyte *) ((char *) modep) + 1); - } - /* NOTREACHED */ - abort (); -} - -static bfd_vma -vax_reladdr (modep) - struct modebyte *modep; -{ - operandenum mode = vax_operandmode (modep); - char *cp; - short *sp; - long *lp; - - cp = (char *) modep; - ++cp; /* skip over the mode */ - switch (mode) - { - default: - fprintf (stderr, "[reladdr] not relative address\n"); - return (bfd_vma) modep; - case byterel: - return (bfd_vma) (cp + sizeof *cp + *cp); - case wordrel: - sp = (short *) cp; - return (bfd_vma) (cp + sizeof *sp + *sp); - case longrel: - lp = (long *) cp; - return (bfd_vma) (cp + sizeof *lp + *lp); - } -} - - -void -vax_find_call (parent, p_lowpc, p_highpc) - Sym *parent; - bfd_vma p_lowpc; - bfd_vma p_highpc; -{ - unsigned char *instructp; - long length; - Sym *child; - operandenum mode; - operandenum firstmode; - bfd_vma destpc; - static bool inited = FALSE; - - if (!inited) - { - inited = TRUE; - sym_init (&indirectchild); - indirectchild.cg.prop.fract = 1.0; - indirectchild.cg.cyc.head = &indirectchild; - } - - if (core_text_space == 0) - { - return; - } - if (p_lowpc < s_lowpc) - { - p_lowpc = s_lowpc; - } - if (p_highpc > s_highpc) - { - p_highpc = s_highpc; - } - DBG (CALLDEBUG, printf ("[findcall] %s: 0x%lx to 0x%lx\n", - parent->name, p_lowpc, p_highpc)); - for (instructp = (unsigned char *) core_text_space + p_lowpc; - instructp < (unsigned char *) core_text_space + p_highpc; - instructp += length) - { - length = 1; - if (*instructp == CALLS) - { - /* - * maybe a calls, better check it out. - * skip the count of the number of arguments. - */ - DBG (CALLDEBUG, - printf ("[findcall]\t0x%x:calls", - instructp - (unsigned char *) core_text_space)); - firstmode = vax_operandmode ((struct modebyte *) (instructp + length)); - switch (firstmode) - { - case literal: - case immediate: - break; - default: - goto botched; - } - length += vax_operandlength ((struct modebyte *) (instructp + length)); - mode = vax_operandmode ((struct modebyte *) (instructp + length)); - DBG (CALLDEBUG, - printf ("\tfirst operand is %s", vax_operandname (firstmode)); - printf ("\tsecond operand is %s\n", vax_operandname (mode))); - switch (mode) - { - case regdef: - case bytedispdef: - case worddispdef: - case longdispdef: - case bytereldef: - case wordreldef: - case longreldef: - /* - * indirect call: call through pointer - * either *d(r) as a parameter or local - * (r) as a return value - * *f as a global pointer - * [are there others that we miss?, - * e.g. arrays of pointers to functions???] - */ - arc_add (parent, &indirectchild, (unsigned long) 0); - length += vax_operandlength ( - (struct modebyte *) (instructp + length)); - continue; - case byterel: - case wordrel: - case longrel: - /* - * regular pc relative addressing - * check that this is the address of - * a function. - */ - destpc = vax_reladdr ((struct modebyte *) (instructp + length)) - - (bfd_vma) core_text_space; - if (destpc >= s_lowpc && destpc <= s_highpc) - { - child = sym_lookup (&symtab, destpc); - DBG (CALLDEBUG, - printf ("[findcall]\tdestpc 0x%lx", destpc); - printf (" child->name %s", child->name); - printf (" child->addr 0x%lx\n", child->addr); - ); - if (child->addr == destpc) - { - /* - * a hit - */ - arc_add (parent, child, (unsigned long) 0); - length += vax_operandlength ((struct modebyte *) - (instructp + length)); - continue; - } - goto botched; - } - /* - * else: - * it looked like a calls, - * but it wasn't to anywhere. - */ - goto botched; - default: - botched: - /* - * something funny going on. - */ - DBG (CALLDEBUG, printf ("[findcall]\tbut it's a botch\n")); - length = 1; - continue; - } - } - } -} |