4 #include <sys/resource.h>
6 #define TVTIME(tv) ((tv).tv_sec + (tv).tv_usec / 1e6)
9 extern char *anal_usage, *anal_version,
10 *shade_bench_path, *shade_ego, *shade_version,
16 extern void exit(), initialize(), terminate();
19 FILE *statsfp; /* output stats file */
20 double nina; /* # non-annulled instructions executed */
23 static double usr, sys, real;
26 static void main_stats_start(),
31 shade_main (argc, argv, envp)
35 int aargc, ec, i, j, pid = getpid();
36 char **aargv, *cmd = 0, *x;
38 argc = shade_splitargs (argv, &aargv, &aargc);
40 for (i = j = 1; i < argc; i++)
41 if (argv[i][0] == '-' ||
42 argv[i][0] == '+' && argv[i][1] == 't')
46 usage ("too many -c options");
48 usage ("-c not allowed with --");
49 if (argv[i][2] || ++i >= argc)
51 ("-c: missing/misplaced command");
56 shade_fatal ("too many -o's");
57 if (argv[i][2] || ++i >= argc)
59 ("-o: missing/misplaced file name");
60 statsfp = fopen (argv[i], "w");
62 usage ("%s: can't open", argv[i]);
66 (void) shade_argtrange (argv[i][0] ==
68 if (x = shade_argtrange (argv[i]))
69 usage ("%s: %s", argv[i], x);
70 /* should print tranges */
76 fprintf (stderr, "%s: version: %s\n",
77 argv[0], anal_version);
78 fprintf (stderr, "shade version: %s\n",
85 else argv[j++] = argv[i];
91 initialize (argc, argv, envp);
96 ec = shade_sshell (cmd, main_stats_analyze);
98 ec = shade_shell (main_stats_analyze);
99 else if (0 > shade_loadp (*aargv, aargv, envp))
101 else ec = main_stats_analyze (aargc, aargv, envp, (char **) 0);
103 if (pid == getpid()) {
118 fmt = va_arg (ap, char *);
120 fprintf (stderr, "%s: ", shade_ego);
121 vfprintf (stderr, fmt, ap);
122 fprintf (stderr, "\n\n");
126 fprintf (stderr, "usage: %s [-U] [-V] [-o outfile] [+/-t[from],[to]] ",
128 if (anal_usage && *anal_usage)
129 fprintf (stderr, "\\\n\t%s ", anal_usage);
130 fprintf (stderr, "\\\n\t[-c \"command\" | -- bench benchargs]\n");
137 getcputime (usr, sys)
142 if (-1 == getrusage (RUSAGE_SELF, &ru))
145 *usr = TVTIME (ru.ru_utime) - *usr;
146 *sys = TVTIME (ru.ru_stime) - *sys;
158 tz.tz_dsttime = DST_NONE;
159 tz.tz_minuteswest = 0;
161 (void) gettimeofday (&tv, &tz);
163 *real = TVTIME (tv) - *real;
175 fprintf (statsfp, "Analyzer: %s\n", shade_ego);
176 fprintf (statsfp, "Version: %s (shade version: %s)\n",
177 anal_version, shade_version);
182 if (-1 != gethostname (host, sizeof host))
183 fprintf (statsfp, "Hostname: %s\n", host);
186 (void) time (&start);
188 getcputime (&usr, &sys);
190 fprintf (statsfp, "Start: %s", ctime (&start));
196 main_stats_analyze (argc, argv, envp, iov)
198 char **argv, **envp, **iov;
202 /* BUG: if t_flag, shouldn't change application program */
205 fprintf (statsfp, "Application: %s", shade_bench_path);
206 for (i = 1; i < argc; i++)
207 fprintf (statsfp, " %s", argv[i]);
209 for (i = 0; iov[i]; i += 2) {
210 fprintf (statsfp, " %s", iov[i]);
212 fprintf (statsfp, " %s", iov[i+1]);
214 fprintf (statsfp, "\n");
231 getcputime (&usr, &sys);
234 fprintf (statsfp, "Stop: %s", ctime (&stop));
236 fprintf (statsfp, "Instructions: %.0f\n", nina);
237 fprintf (statsfp, "Time: %.3f usr %.3f sys %.3f real %.3f%%\n",
239 real > 0 ? 100. * (usr + sys) / real : 100.);
240 if (usr + sys > 0 && nina > 0)
241 fprintf (statsfp, "Speed: %.3f KIPS\n",
242 nina / (usr + sys) / 1000.);