1e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm/* libunwind - a platform-independent unwind library
2e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm   Copyright (C) 2003-2004 Hewlett-Packard Co
3e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
4e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm
5e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmPermission is hereby granted, free of charge, to any person obtaining
6e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidma copy of this software and associated documentation files (the
7e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm"Software"), to deal in the Software without restriction, including
8e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmwithout limitation the rights to use, copy, modify, merge, publish,
9e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmdistribute, sublicense, and/or sell copies of the Software, and to
10e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmpermit persons to whom the Software is furnished to do so, subject to
11e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmthe following conditions:
12e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm
13e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmThe above copyright notice and this permission notice shall be
14e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmincluded in all copies or substantial portions of the Software.
15e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm
16e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
23e1da71810155740b4cffe9b9e009fe5273802214mostang.com!davidm
24ded94b98ff3534a3c394591f4b254b1af6f0711cTommi Rantala#include <string.h>
2512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm#include <stdio.h>
2612876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm#include <stdlib.h>
273be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm#include <unistd.h>
2812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
2912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm#include <libunwind.h>
30e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantala#include "compiler.h"
3112876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
323be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm#include <sys/resource.h>
3350c2be0ca322727d5a4f53fbf70fa579c853bc70mostang.com!davidm#include <sys/time.h>
343be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm
3512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm#define panic(args...)							  \
3612876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm	do { fprintf (stderr, args); exit (-1); } while (0)
3712876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
3896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidmlong dummy;
3996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
40c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidmstatic long iterations = 10000;
415e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidmstatic int maxlevel = 100;
425e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm
433be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm#define KB	1024
4496c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm#define MB	(1024*1024)
4596c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
463be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidmstatic char big[64*MB];	/* should be >> max. cache size */
4796c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
4812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidmstatic inline double
4912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidmgettime (void)
5012876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm{
51e3eae746986c627103b8709130f439a24663eaebmostang.com!davidm  struct timeval tv;
5212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
53e3eae746986c627103b8709130f439a24663eaebmostang.com!davidm  gettimeofday (&tv, NULL);
54e3eae746986c627103b8709130f439a24663eaebmostang.com!davidm  return tv.tv_sec + 1e-6*tv.tv_usec;
5512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm}
5612876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
57e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalastatic int NOINLINE
5896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidmmeasure_unwind (int maxlevel, double *step)
5912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm{
6096c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  double stop, start;
6112876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  unw_cursor_t cursor;
6212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  unw_context_t uc;
6312876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  int ret, level = 0;
6412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
6512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  unw_getcontext (&uc);
6612876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  if (unw_init_local (&cursor, &uc) < 0)
6712876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm    panic ("unw_init_local() failed\n");
6812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
6996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  start = gettime ();
7012876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
7112876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  do
7212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm    {
7312876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm      ret = unw_step (&cursor);
7412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm      if (ret < 0)
7512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm	panic ("unw_step() failed\n");
7612876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm      ++level;
7712876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm    }
7812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  while (ret > 0);
7912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
8012876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  stop = gettime ();
8112876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
8212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  if (level <= maxlevel)
8302c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm    panic ("Unwound only %d levels, expected at least %d levels\n",
8412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm	   level, maxlevel);
8512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
8696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  *step = (stop - start) / (double) level;
8729f2f89a8fc3cd7f103fb7ed7e1c9f79adfd59b8hp.com!davidm  return 0;
8812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm}
8912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
9002c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidmstatic int f1 (int, int, double *);
9102c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm
92e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalastatic int NOINLINE
9302c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidmg1 (int level, int maxlevel, double *step)
9412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm{
9512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  if (level == maxlevel)
9696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm    return measure_unwind (maxlevel, step);
9712876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  else
9812876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm    /* defeat last-call/sibcall optimization */
9996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm    return f1 (level + 1, maxlevel, step) + level;
1005e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm}
1015e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm
102e3e49dc28aee0dc78f0243d932a5c950aaec7e3eTommi Rantalastatic int NOINLINE
10302c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidmf1 (int level, int maxlevel, double *step)
10402c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm{
10502c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm  if (level == maxlevel)
10602c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm    return measure_unwind (maxlevel, step);
10702c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm  else
10802c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm    /* defeat last-call/sibcall optimization */
10902c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm    return g1 (level + 1, maxlevel, step) + level;
11002c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm}
11102c9034eb214248646be46cb344b7a6e7b67f661hp.com!davidm
1125e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidmstatic void
1135e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidmdoit (const char *label)
1145e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm{
11596c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  double step, min_step, first_step, sum_step;
1165e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm  int i;
1175e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm
11896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  sum_step = first_step = 0.0;
11996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  min_step = 1e99;
120c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm  for (i = 0; i < iterations; ++i)
1215e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm    {
12296c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm      f1 (0, maxlevel, &step);
1235e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm
1245e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm      sum_step += step;
1255e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm
1265e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm      if (step < min_step)
1275e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm	min_step = step;
1285e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm
1295e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm      if (i == 0)
13096c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm	first_step = step;
1315e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm    }
13296c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  printf ("%s: unw_step : 1st=%9.3f min=%9.3f avg=%9.3f nsec\n", label,
133c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm	  1e9*first_step, 1e9*min_step, 1e9*sum_step/iterations);
13412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm}
13512876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
13696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidmstatic long
137fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidmsum (void *buf, size_t size)
13896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm{
13996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  long s = 0;
140fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  char *cp = buf;
14196c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  size_t i;
14296c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
1433be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm  for (i = 0; i < size; i += 8)
1443be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm    s += cp[i];
14596c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  return s;
14696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm}
14796c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
14896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidmstatic void
14996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidmmeasure_init (void)
15096c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm{
1513be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm# define N	100
15250c2be0ca322727d5a4f53fbf70fa579c853bc70mostang.com!davidm# define M	10	/* must be at least 2 to get steady-state */
153fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  double stop, start, get_cold, get_warm, init_cold, init_warm, delta;
1543be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm  struct
1553be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm    {
1563be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm      unw_cursor_t c;
1573be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm      char padding[1024];	/* should be > 2 * max. cacheline size */
1583be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm    }
1593be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm  cursor[N];
1603be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm  struct
1613be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm    {
1623be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm      unw_context_t uc;
1633be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm      char padding[1024];	/* should be > 2 * max. cacheline size */
1643be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm    }
1653be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm  uc[N];
166fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  int i, j;
16796c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
168fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  /* Run each test M times and take the minimum to filter out noise
169fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm     such dynamic linker resolving overhead, context-switches,
170fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm     page-in, cache, and TLB effects.  */
17196c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
172fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  get_cold = 1e99;
173fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  for (j = 0; j < M; ++j)
174fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm    {
1753be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm      dummy += sum (big, sizeof (big));			/* flush the cache */
1763be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm      for (i = 0; i < N; ++i)
1773be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm	uc[i].padding[511] = i;		/* warm up the TLB */
178fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      start = gettime ();
179fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      for (i = 0; i < N; ++i)
1803be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm	unw_getcontext (&uc[i].uc);
181fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      stop = gettime ();
182fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      delta = (stop - start) / N;
183fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      if (delta < get_cold)
184fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm	get_cold = delta;
185fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm    }
1863be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm
187fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  init_cold = 1e99;
188fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  for (j = 0; j < M; ++j)
189fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm    {
190fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      dummy += sum (big, sizeof (big));	/* flush cache */
1913be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm      for (i = 0; i < N; ++i)
1923be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm	uc[i].padding[511] = i;		/* warm up the TLB */
193fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      start = gettime ();
194fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      for (i = 0; i < N; ++i)
1953be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm	unw_init_local (&cursor[i].c, &uc[i].uc);
196fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      stop = gettime ();
197fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      delta = (stop - start) / N;
198fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      if (delta < init_cold)
199fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm	init_cold = delta;
200fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm    }
20196c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
202fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  get_warm = 1e99;
203fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  for (j = 0; j < M; ++j)
204fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm    {
205fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      start = gettime ();
206fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      for (i = 0; i < N; ++i)
2073be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm	unw_getcontext (&uc[0].uc);
208fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      stop = gettime ();
209fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      delta = (stop - start) / N;
210fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      if (delta < get_warm)
211fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm	get_warm = delta;
212fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm    }
21396c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
214fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  init_warm = 1e99;
215fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm  for (j = 0; j < M; ++j)
216fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm    {
217fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      start = gettime ();
218fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      for (i = 0; i < N; ++i)
2193be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm	unw_init_local (&cursor[0].c, &uc[0].uc);
220fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      stop = gettime ();
221fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      delta = (stop - start) / N;
222fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm      if (delta < init_warm)
223fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm	init_warm = delta;
224fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm    }
22596c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
22696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  printf ("unw_getcontext : cold avg=%9.3f nsec, warm avg=%9.3f nsec\n",
227fc7b49b9837b84727da4c25ba0905b8d2a1920e8mostang.com!davidm	  1e9 * get_cold, 1e9 * get_warm);
22896c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  printf ("unw_init_local : cold avg=%9.3f nsec, warm avg=%9.3f nsec\n",
22996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm	  1e9 * init_cold, 1e9 * init_warm);
23096c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm}
23196c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
23212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidmint
23312876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidmmain (int argc, char **argv)
23412876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm{
2353be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm  struct rlimit rlim;
2363be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm
2373be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm  rlim.rlim_cur = RLIM_INFINITY;
2383be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm  rlim.rlim_max = RLIM_INFINITY;
2393be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm  setrlimit (RLIMIT_STACK, &rlim);
2403be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm
2413be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm  memset (big, 0xaa, sizeof (big));
2423be31f5dcb65ec1a37de234f127f7e69c9352a92hp.com!davidm
24312876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  if (argc > 1)
244c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm    {
245c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm      maxlevel = atol (argv[1]);
246c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm      if (argc > 2)
247c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm	iterations = atol (argv[2]);
248c7fdc72fd6c462b87afb1af5390ffa3724a16f18mostang.com!davidm    }
24912876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm
25096c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  measure_init ();
25196c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm
2527a346fbf8ce35978524e85dd2c19768640f20c89mostang.com!davidm  unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_NONE);
25396c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  doit ("no cache        ");
2547a346fbf8ce35978524e85dd2c19768640f20c89mostang.com!davidm
2557a346fbf8ce35978524e85dd2c19768640f20c89mostang.com!davidm  unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_GLOBAL);
25696c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  doit ("global cache    ");
2577a346fbf8ce35978524e85dd2c19768640f20c89mostang.com!davidm
2587a346fbf8ce35978524e85dd2c19768640f20c89mostang.com!davidm  unw_set_caching_policy (unw_local_addr_space, UNW_CACHE_PER_THREAD);
25996c62506269ed6b7de3531816e9ad4a62fb50d92mostang.com!davidm  doit ("per-thread cache");
2605e446b24d7e2a107d5988db49f00b3e7de0295a7hp.com!davidm
26112876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm  return 0;
26212876ef7815e26325a187fd5dbc0fda417011d7bmostang.com!davidm}
263