
- 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

Copyright (C) 2012-2021 Free Software Foundation, Inc.

Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved.
