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