gprof.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 676 行 · 第 1/2 页

C
676
字号
/* * Copyright (c) 1983, 1998, 2001 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"#include "demangle.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[] = "@(#) 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", optional_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 voidDEFUN (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[=STYLE]] [--no-demangle]\n\	[image-file] [profile-file...]\n"),	   whoami);  if (status == 0)    fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);  done (status);}intDEFUN (main, (argc, argv), int argc AND char **argv){  char **sp, *str;  Sym **cg = 0;  int ch, user_specified = 0;#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)  setlocale (LC_MESSAGES, "");#endif  bindtextdomain (PACKAGE, LOCALEDIR);  textdomain (PACKAGE);  whoami = argv[0];  xmalloc_set_program_name (whoami);  while ((ch = getopt_long (argc, argv,	"aA::bBcCd::De: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 '4':	      file_format = FF_BSD44;	      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, '/'))

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?