1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Timing variables for measuring compiler performance.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Copyright (C) 2000, 2002, 2004, 2006, 2009-2012 Free Software
405436638acc7c010349a69c3395f1a57c642dc62Ying Wang   Foundation, Inc.
505436638acc7c010349a69c3395f1a57c642dc62Ying Wang
6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   Contributed by Alex Samuel <samuel@codesourcery.com>
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
805436638acc7c010349a69c3395f1a57c642dc62Ying Wang   This program is free software: you can redistribute it and/or modify
9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   it under the terms of the GNU General Public License as published by
1005436638acc7c010349a69c3395f1a57c642dc62Ying Wang   the Free Software Foundation, either version 3 of the License, or
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   (at your option) any later version.
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   This program is distributed in the hope that it will be useful,
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   GNU General Public License for more details.
17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   You should have received a copy of the GNU General Public License
1905436638acc7c010349a69c3395f1a57c642dc62Ying Wang   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
2105436638acc7c010349a69c3395f1a57c642dc62Ying Wang#include <config.h>
22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if IN_GCC
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "system.h"
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "intl.h"
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "rtl.h"
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This source file is taken from the GCC source code, with slight
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   modifications that are under control of the IN_GCC preprocessor
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   variable.  The !IN_GCC part of this file is specific to Bison.  */
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include "../src/system.h"
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# if HAVE_SYS_TIME_H
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  include <sys/time.h>
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectint timevar_report = 0;
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_SYS_TIMES_H
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <sys/times.h>
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_SYS_RESOURCE_H
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <sys/resource.h>
49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef HAVE_CLOCK_T
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttypedef int clock_t;
53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef HAVE_STRUCT_TMS
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct tms
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  clock_t tms_utime;
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  clock_t tms_stime;
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  clock_t tms_cutime;
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  clock_t tms_cstime;
62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined HAVE_DECL_GETRUSAGE && !HAVE_DECL_GETRUSAGE
66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern int getrusage (int, struct rusage *);
67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined HAVE_DECL_TIMES && !HAVE_DECL_TIMES
69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern clock_t times (struct tms *);
70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined HAVE_DECL_CLOCK && !HAVE_DECL_CLOCK
72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectextern clock_t clock (void);
73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef RUSAGE_SELF
76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define RUSAGE_SELF 0
77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Calculation of scale factor to convert ticks to microseconds.
80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   We mustn't use CLOCKS_PER_SEC except with clock().  */
81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if HAVE_SYSCONF && defined _SC_CLK_TCK
82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define TICKS_PER_SECOND sysconf (_SC_CLK_TCK) /* POSIX 1003.1-1996 */
83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# ifdef CLK_TCK
85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  define TICKS_PER_SECOND CLK_TCK /* POSIX 1003.1-1988; obsolescent */
86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# else
87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  ifdef HZ
88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   define TICKS_PER_SECOND HZ  /* traditional UNIX */
89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  else
90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#   define TICKS_PER_SECOND 100 /* often the correct value */
91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#  endif
92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# endif
93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Prefer times to getrusage to clock (each gives successively less
96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   information).  */
97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_TIMES
98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define USE_TIMES
99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define HAVE_USER_TIME
100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define HAVE_SYS_TIME
101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define HAVE_WALL_TIME
102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_GETRUSAGE
104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define USE_GETRUSAGE
105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define HAVE_USER_TIME
106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define HAVE_SYS_TIME
107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_CLOCK
109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define USE_CLOCK
110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define HAVE_USER_TIME
111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* libc is very likely to have snuck a call to sysconf() into one of
116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   the underlying constants, and that can be very slow, so we have to
117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   precompute them.  Whose wonderful idea was it to make all those
118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   _constants_ variable at run time, anyway?  */
119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_TIMES
120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic float ticks_to_msec;
121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define TICKS_TO_MSEC (1.0 / TICKS_PER_SECOND)
122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_CLOCK
125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic float clocks_to_msec;
126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define CLOCKS_TO_MSEC (1.0 / CLOCKS_PER_SEC)
127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if IN_GCC
130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "flags.h"
131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "timevar.h"
133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* See timevar.h for an explanation of timing variables.  */
135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* This macro evaluates to nonzero if timing variables are enabled.  */
137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define TIMEVAR_ENABLE (timevar_report)
138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* A timing variable.  */
140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct timevar_def
142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Elapsed time for this variable.  */
144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_time_def elapsed;
145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* If this variable is timed independently of the timing stack,
147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     using timevar_start, this contains the start time.  */
148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_time_def start_time;
149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* The name of this timing variable.  */
151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  const char *name;
152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Non-zero if this timing variable is running as a standalone
154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     timer.  */
155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned standalone : 1;
156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Non-zero if this timing variable was ever started or pushed onto
158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     the timing stack.  */
159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned used : 1;
160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* An element on the timing stack.  Elapsed time is attributed to the
163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   topmost timing variable on the stack.  */
164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstruct timevar_stack_def
166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* The timing variable at this stack level.  */
168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_def *timevar;
169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* The next lower timing variable context in the stack.  */
171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_stack_def *next;
172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Declared timing variables.  Constructed from the contents of
175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   timevar.def.  */
176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic struct timevar_def timevars[TIMEVAR_LAST];
177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The top of the timing stack.  */
179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic struct timevar_stack_def *stack;
180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* A list of unused (i.e. allocated and subsequently popped)
182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   timevar_stack_def instances.  */
183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic struct timevar_stack_def *unused_stack_instances;
184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* The time at which the topmost element on the timing stack was
186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   pushed.  Time elapsed since then is attributed to the topmost
187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   element.  */
188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic struct timevar_time_def start_time;
189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void get_time (struct timevar_time_def *);
191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void timevar_accumulate (struct timevar_time_def *,
192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				struct timevar_time_def *,
193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project				struct timevar_time_def *);
194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Fill the current times into TIME.  The definition of this function
196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   also defines any or all of the HAVE_USER_TIME, HAVE_SYS_TIME, and
197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   HAVE_WALL_TIME macros.  */
198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectget_time (now)
201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     struct timevar_time_def *now;
202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  now->user = 0;
204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  now->sys  = 0;
205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  now->wall = 0;
206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!TIMEVAR_ENABLE)
208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  {
211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_TIMES
212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    struct tms tms;
213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    now->wall = times (&tms)  * ticks_to_msec;
214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if IN_GCC
215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    now->user = tms.tms_utime * ticks_to_msec;
216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    now->sys  = tms.tms_stime * ticks_to_msec;
217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    now->user = (tms.tms_utime + tms.tms_cutime) * ticks_to_msec;
219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    now->sys  = (tms.tms_stime + tms.tms_cstime) * ticks_to_msec;
220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_GETRUSAGE
223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    struct rusage rusage;
224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if IN_GCC
225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    getrusage (RUSAGE_SELF, &rusage);
226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else
227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    getrusage (RUSAGE_CHILDREN, &rusage);
228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    now->user = rusage.ru_utime.tv_sec + rusage.ru_utime.tv_usec * 1e-6;
230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    now->sys  = rusage.ru_stime.tv_sec + rusage.ru_stime.tv_usec * 1e-6;
231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_CLOCK
233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    now->user = clock () * clocks_to_msec;
234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  }
236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Add the difference between STOP and START to TIMER.  */
239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic void
241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttimevar_accumulate (timer, start, stop)
242cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     struct timevar_time_def *timer;
243cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     struct timevar_time_def *start;
244cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     struct timevar_time_def *stop;
245cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
246cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  timer->user += stop->user - start->user;
247cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  timer->sys += stop->sys - start->sys;
248cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  timer->wall += stop->wall - start->wall;
249cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
250cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
251cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Initialize timing variables.  */
252cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
253cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
254cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectinit_timevar ()
255cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
256cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!TIMEVAR_ENABLE)
257cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
258cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
259cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Zero all elapsed times.  */
260cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  memset ((void *) timevars, 0, sizeof (timevars));
261cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
262cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Initialize the names of timing variables.  */
263cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#define DEFTIMEVAR(identifier__, name__) \
264cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  timevars[identifier__].name = name__;
265cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "timevar.def"
266cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#undef DEFTIMEVAR
267cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
268cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_TIMES
269cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  ticks_to_msec = TICKS_TO_MSEC;
270cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
271cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef USE_CLOCK
272cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  clocks_to_msec = CLOCKS_TO_MSEC;
273cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
274cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
275cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
276cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Push TIMEVAR onto the timing stack.  No further elapsed time is
277cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   attributed to the previous topmost timing variable on the stack;
278cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   subsequent elapsed time is attributed to TIMEVAR, until it is
279cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   popped or another element is pushed on top.
280cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
281cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   TIMEVAR cannot be running as a standalone timer.  */
282cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
283cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
284cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttimevar_push (timevar)
285cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     timevar_id_t timevar;
286cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
287cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_def *tv = &timevars[timevar];
288cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_stack_def *context;
289cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_time_def now;
290cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
291cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!TIMEVAR_ENABLE)
292cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
293cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
294cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Mark this timing variable as used.  */
295cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  tv->used = 1;
296cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
297cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Can't push a standalone timer.  */
298cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (tv->standalone)
299cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    abort ();
300cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
301cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* What time is it?  */
302cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  get_time (&now);
303cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
304cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* If the stack isn't empty, attribute the current elapsed time to
305cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     the old topmost element.  */
306cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (stack)
307cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    timevar_accumulate (&stack->timevar->elapsed, &start_time, &now);
308cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
309cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Reset the start time; from now on, time is attributed to
310cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     TIMEVAR.  */
311cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  start_time = now;
312cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
313cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* See if we have a previously-allocated stack instance.  If so,
314cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     take it off the list.  If not, malloc a new one.  */
315cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (unused_stack_instances != NULL)
316cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
317cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      context = unused_stack_instances;
318cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      unused_stack_instances = unused_stack_instances->next;
319cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
320cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else
321cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    context = (struct timevar_stack_def *)
322cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      xmalloc (sizeof (struct timevar_stack_def));
323cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
324cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Fill it in and put it on the stack.  */
325cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  context->timevar = tv;
326cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  context->next = stack;
327cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  stack = context;
328cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
329cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
330cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Pop the topmost timing variable element off the timing stack.  The
331cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   popped variable must be TIMEVAR.  Elapsed time since the that
332cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   element was pushed on, or since it was last exposed on top of the
333cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   stack when the element above it was popped off, is credited to that
334cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   timing variable.  */
335cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
336cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
337cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttimevar_pop (timevar)
338cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     timevar_id_t timevar;
339cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
340cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_time_def now;
341cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_stack_def *popped = stack;
342cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
343cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!TIMEVAR_ENABLE)
344cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
345cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
346cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (&timevars[timevar] != stack->timevar)
347cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    abort ();
348cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
349cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* What time is it?  */
350cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  get_time (&now);
351cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
352cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Attribute the elapsed time to the element we're popping.  */
353cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  timevar_accumulate (&popped->timevar->elapsed, &start_time, &now);
354cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
355cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Reset the start time; from now on, time is attributed to the
356cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     element just exposed on the stack.  */
357cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  start_time = now;
358cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
359cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Take the item off the stack.  */
360cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  stack = stack->next;
361cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
362cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Don't delete the stack element; instead, add it to the list of
363cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     unused elements for later use.  */
364cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  popped->next = unused_stack_instances;
365cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unused_stack_instances = popped;
366cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
367cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
368cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Start timing TIMEVAR independently of the timing stack.  Elapsed
369cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   time until timevar_stop is called for the same timing variable is
370cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   attributed to TIMEVAR.  */
371cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
372cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
373cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttimevar_start (timevar)
374cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     timevar_id_t timevar;
375cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
376cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_def *tv = &timevars[timevar];
377cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
378cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!TIMEVAR_ENABLE)
379cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
380cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
381cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Mark this timing variable as used.  */
382cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  tv->used = 1;
383cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
384cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Don't allow the same timing variable to be started more than
385cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     once.  */
386cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (tv->standalone)
387cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    abort ();
388cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  tv->standalone = 1;
389cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
390cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  get_time (&tv->start_time);
391cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
392cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
393cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Stop timing TIMEVAR.  Time elapsed since timevar_start was called
394cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   is attributed to it.  */
395cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
396cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
397cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttimevar_stop (timevar)
398cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     timevar_id_t timevar;
399cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
400cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_def *tv = &timevars[timevar];
401cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_time_def now;
402cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
403cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!TIMEVAR_ENABLE)
404cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
405cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
406cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* TIMEVAR must have been started via timevar_start.  */
407cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!tv->standalone)
408cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    abort ();
409cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
410cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  get_time (&now);
411cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  timevar_accumulate (&tv->elapsed, &tv->start_time, &now);
412cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
413cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
414cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Fill the elapsed time for TIMEVAR into ELAPSED.  Returns
415cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   update-to-date information even if TIMEVAR is currently running.  */
416cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
417cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
418cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttimevar_get (timevar, elapsed)
419cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     timevar_id_t timevar;
420cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     struct timevar_time_def *elapsed;
421cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
422cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_def *tv = &timevars[timevar];
423cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_time_def now;
424cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
425cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  *elapsed = tv->elapsed;
426cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
427cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Is TIMEVAR currently running as a standalone timer?  */
428cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (tv->standalone)
429cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
430cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      get_time (&now);
431cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      timevar_accumulate (elapsed, &tv->start_time, &now);
432cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
433cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Or is TIMEVAR at the top of the timer stack?  */
434cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  else if (stack->timevar == tv)
435cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
436cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      get_time (&now);
437cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      timevar_accumulate (elapsed, &start_time, &now);
438cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
439cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
440cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
441cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Summarize timing variables to FP.  The timing variable TV_TOTAL has
442cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   a special meaning -- it's considered to be the total elapsed time,
443cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   for normalizing the others, and is displayed last.  */
444cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
445cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
446cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projecttimevar_print (fp)
447cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     FILE *fp;
448cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
449cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Only print stuff if we have some sort of time information.  */
450cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined HAVE_USER_TIME || defined HAVE_SYS_TIME || defined HAVE_WALL_TIME
451cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  unsigned int /* timevar_id_t */ id;
452cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_time_def *total = &timevars[TV_TOTAL].elapsed;
453cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_time_def now;
454cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
455cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (!TIMEVAR_ENABLE)
456cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    return;
457cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
458cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Update timing information in case we're calling this from GDB.  */
459cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
460cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (fp == 0)
461cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    fp = stderr;
462cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
463cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* What time is it?  */
464cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  get_time (&now);
465cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
466cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* If the stack isn't empty, attribute the current elapsed time to
467cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     the old topmost element.  */
468cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  if (stack)
469cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    timevar_accumulate (&stack->timevar->elapsed, &start_time, &now);
470cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
471cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Reset the start time; from now on, time is attributed to
472cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     TIMEVAR.  */
473cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  start_time = now;
474cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
475cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs (_("\nExecution times (seconds)\n"), fp);
476cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  for (id = 0; id < (unsigned int) TIMEVAR_LAST; ++id)
477cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    {
478cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      struct timevar_def *tv = &timevars[(timevar_id_t) id];
479cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      const float tiny = 5e-3;
480cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
481cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Don't print the total execution time here; that goes at the
482cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 end.  */
483cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if ((timevar_id_t) id == TV_TOTAL)
484cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	continue;
485cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
486cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Don't print timing variables that were never used.  */
487cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (!tv->used)
488cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	continue;
489cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
490cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Don't print timing variables if we're going to get a row of
491cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	 zeroes.  */
492cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      if (tv->elapsed.user < tiny
493cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  && tv->elapsed.sys < tiny
494cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  && tv->elapsed.wall < tiny)
495cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	continue;
496cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
497cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* The timing variable name.  */
498cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (fp, " %-22s:", tv->name);
499cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
500cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_USER_TIME
501cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Print user-mode time for this process.  */
502cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (fp, "%7.2f (%2.0f%%) usr",
503cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	       tv->elapsed.user,
504cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	       (total->user == 0 ? 0 : tv->elapsed.user / total->user) * 100);
505cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* HAVE_USER_TIME */
506cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
507cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_SYS_TIME
508cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Print system-mode time for this process.  */
509cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (fp, "%7.2f (%2.0f%%) sys",
510cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	       tv->elapsed.sys,
511cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	       (total->sys == 0 ? 0 : tv->elapsed.sys / total->sys) * 100);
512cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* HAVE_SYS_TIME */
513cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
514cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_WALL_TIME
515cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      /* Print wall clock time elapsed.  */
516cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      fprintf (fp, "%7.2f (%2.0f%%) wall",
517cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	       tv->elapsed.wall,
518cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	       (total->wall == 0 ? 0 : tv->elapsed.wall / total->wall) * 100);
519cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* HAVE_WALL_TIME */
520cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
521cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project      putc ('\n', fp);
522cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project    }
523cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
524cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  /* Print total time.  */
525cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fputs (_(" TOTAL                 :"), fp);
526cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_USER_TIME
527cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (fp, "%7.2f          ", total->user);
528cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
529cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_SYS_TIME
530cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (fp, "%7.2f          ", total->sys);
531cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
532cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_WALL_TIME
533cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (fp, "%7.2f\n", total->wall);
534cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif
535cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
536cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif /* defined (HAVE_USER_TIME) || defined (HAVE_SYS_TIME)
537cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	  || defined (HAVE_WALL_TIME) */
538cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
539cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
540cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Returns time (user + system) used so far by the compiler process,
541cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   in microseconds.  */
542cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
543cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectlong
544cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectget_run_time ()
545cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
546cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  struct timevar_time_def total_elapsed;
547cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  timevar_get (TV_TOTAL, &total_elapsed);
548cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  return total_elapsed.user + total_elapsed.sys;
549cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
550cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
551cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Prints a message to stderr stating that time elapsed in STR is
552cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project   TOTAL (given in microseconds).  */
553cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
554cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid
555cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectprint_time (str, total)
556cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     const char *str;
557cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project     long total;
558cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{
559cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  long all_time = get_run_time ();
560cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  fprintf (stderr,
561cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   _("time in %s: %ld.%06ld (%ld%%)\n"),
562cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   str, total / 1000000, total % 1000000,
563cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   all_time == 0 ? 0
564cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project	   : (long) (((100.0 * (double) total) / (double) all_time) + .5));
565cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project}
566