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 + -
显示快捷键?