1/* Copyright (C) 2021-2024 Free Software Foundation, Inc.
2   Contributed by Oracle.
3
4   This file is part of GNU Binutils.
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 3, or (at your option)
9   any later version.
10
11   This program is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, 51 Franklin Street - Fifth Floor, Boston,
19   MA 02110-1301, USA.  */
20
21#include "config.h"
22#include <stdio.h>
23#include <strings.h>
24#include <limits.h>
25#include <sys/param.h>
26
27#include "util.h"
28#include "DbeSession.h"
29#include "Experiment.h"
30#include "Expression.h"
31#include "Metric.h"
32
33Metric::Metric (BaseMetric *item, SubType st) : BaseMetric (*item)
34{
35  name = NULL;
36  abbr = NULL;
37  abbr_unit = NULL;
38  baseMetric = item;
39  set_subtype (st);
40  visbits = VAL_NA;
41  if (item->get_type () == DERIVED)
42    visbits = VAL_VALUE;
43}
44
45Metric::Metric (const Metric& item) : BaseMetric (item)
46{
47  baseMetric = item.baseMetric;
48  subtype = item.subtype;
49  name = dbe_strdup (item.name);
50  abbr = dbe_strdup (item.abbr);
51  abbr_unit = dbe_strdup (item.abbr_unit);
52  visbits = item.visbits;
53}
54
55Metric::~Metric ()
56{
57  free (name);
58  free (abbr);
59  free (abbr_unit);
60}
61
62// Note that BaseMetric::get_vtype() has the base value type.
63// Here, we get the value type for the displayed metric,
64// which may be different if comparison is used.
65
66ValueTag
67Metric::get_vtype2 ()
68{
69  ValueTag vtype = get_vtype ();
70  if (visbits & VAL_DELTA)
71    {
72      switch (vtype)
73	{
74	case VT_ULLONG: return VT_LLONG;
75	default: return vtype;
76	}
77    }
78  if (visbits & VAL_RATIO)
79    {
80      switch (vtype)
81	{
82	case VT_INT:
83	case VT_LLONG:
84	case VT_ULLONG:
85	case VT_FLOAT:
86	case VT_DOUBLE: return VT_DOUBLE;
87	default: return vtype;
88	}
89    }
90  return vtype;
91}
92
93void
94Metric::set_subtype (SubType st)
95{
96  subtype = st;
97  free (name);
98  free (abbr);
99  free (abbr_unit);
100  name = NULL;
101  abbr = NULL;
102  abbr_unit = NULL;
103
104  switch (get_type ())
105    {
106    case CP_LMS_USER:
107      abbr_unit = dbe_strdup (GTXT ("sec."));
108      if (st == EXCLUSIVE)
109	{
110	  name = dbe_strdup (GTXT ("Exclusive User CPU Time"));
111	  abbr = dbe_strdup (GTXT ("Excl. User CPU"));
112	}
113      else if (st == INCLUSIVE)
114	{
115	  name = dbe_strdup (GTXT ("Inclusive User CPU Time"));
116	  abbr = dbe_strdup (GTXT ("Incl. User CPU"));
117	}
118      else if (st == ATTRIBUTED)
119	{
120	  name = dbe_strdup (GTXT ("Attributed User CPU Time"));
121	  abbr = dbe_strdup (GTXT ("Attr. User CPU"));
122	}
123      else
124	{
125	  name = dbe_sprintf (GTXT ("Unexpected CP_LMS_USER metric subtype %d"),
126			      st);
127	  abbr = dbe_strdup (NTXT ("??"));
128	  abort ();
129	}
130      break;
131
132    case CP_LMS_WAIT_CPU:
133      abbr_unit = dbe_strdup (GTXT ("sec."));
134      if (st == EXCLUSIVE)
135	{
136	  name = dbe_strdup (GTXT ("Exclusive Wait CPU Time"));
137	  abbr = dbe_strdup (GTXT ("Excl. Wait CPU"));
138	}
139      else if (st == INCLUSIVE)
140	{
141	  name = dbe_strdup (GTXT ("Inclusive Wait CPU Time"));
142	  abbr = dbe_strdup (GTXT ("Incl. Wait CPU"));
143	}
144      else if (st == ATTRIBUTED)
145	{
146	  name = dbe_strdup (GTXT ("Attributed Wait CPU Time"));
147	  abbr = dbe_strdup (GTXT ("Attr. Wait CPU"));
148	}
149      else
150	{
151	  name = dbe_sprintf (GTXT ("Unexpected CP_LMS_WAIT_CPU metric subtype %d"),
152			      st);
153	  abbr = dbe_strdup (NTXT ("??"));
154	}
155      break;
156
157    case CP_LMS_USER_LOCK:
158      abbr_unit = dbe_strdup (GTXT ("sec."));
159      if (st == EXCLUSIVE)
160	{
161	  name = dbe_strdup (GTXT ("Exclusive User Lock Time"));
162	  abbr = dbe_strdup (GTXT ("Excl. User Lock"));
163	}
164      else if (st == INCLUSIVE)
165	{
166	  name = dbe_strdup (GTXT ("Inclusive User Lock Time"));
167	  abbr = dbe_strdup (GTXT ("Incl. User Lock"));
168	}
169      else if (st == ATTRIBUTED)
170	{
171	  name = dbe_strdup (GTXT ("Attributed User Lock Time"));
172	  abbr = dbe_strdup (GTXT ("Attr. User Lock"));
173	}
174      else
175	{
176	  name = dbe_sprintf (GTXT ("Unexpected CP_LMS_USER_LOCK metric subtype %d"),
177			      st);
178	  abbr = dbe_strdup (NTXT ("??"));
179	}
180      break;
181
182    case CP_LMS_SYSTEM:
183      abbr_unit = dbe_strdup (GTXT ("sec."));
184      if (st == EXCLUSIVE)
185	{
186	  name = dbe_strdup (GTXT ("Exclusive System CPU Time"));
187	  abbr = dbe_strdup (GTXT ("Excl. Sys. CPU"));
188	}
189      else if (st == INCLUSIVE)
190	{
191	  name = dbe_strdup (GTXT ("Inclusive System CPU Time"));
192	  abbr = dbe_strdup (GTXT ("Incl. Sys. CPU"));
193	}
194      else if (st == ATTRIBUTED)
195	{
196	  name = dbe_strdup (GTXT ("Attributed System CPU Time"));
197	  abbr = dbe_strdup (GTXT ("Attr. Sys. CPU"));
198	}
199      else
200	{
201	  name = dbe_sprintf (GTXT ("Unexpected CP_LMS_SYSTEM metric subtype %d"),
202			      st);
203	  abbr = dbe_strdup (NTXT ("??"));
204	}
205      break;
206
207    case SYNC_WAIT_TIME:
208      abbr_unit = dbe_strdup (GTXT ("sec."));
209      if (st == EXCLUSIVE)
210	{
211	  name = dbe_strdup (GTXT ("Exclusive Sync Wait Time"));
212	  abbr = dbe_strdup (GTXT ("Excl. Sync Wait"));
213	}
214      else if (st == INCLUSIVE)
215	{
216	  name = dbe_strdup (GTXT ("Inclusive Sync Wait Time"));
217	  abbr = dbe_strdup (GTXT ("Incl. Sync Wait"));
218	}
219      else if (st == ATTRIBUTED)
220	{
221	  name = dbe_strdup (GTXT ("Attributed Sync Wait Time"));
222	  abbr = dbe_strdup (GTXT ("Attr. Sync Wait"));
223	}
224      else
225	{
226	  name = dbe_sprintf (GTXT ("Unexpected LWT metric subtype %d"), st);
227	  abbr = dbe_strdup (NTXT ("??"));
228	}
229      break;
230
231    case CP_LMS_TFAULT:
232      abbr_unit = dbe_strdup (GTXT ("sec."));
233      if (st == EXCLUSIVE)
234	{
235	  name = dbe_strdup (GTXT ("Exclusive Text Page Fault Time"));
236	  abbr = dbe_strdup (GTXT ("Excl. Text Fault"));
237	}
238      else if (st == INCLUSIVE)
239	{
240	  name = dbe_strdup (GTXT ("Inclusive Text Page Fault Time"));
241	  abbr = dbe_strdup (GTXT ("Incl. Text Fault"));
242	}
243      else if (st == ATTRIBUTED)
244	{
245	  name = dbe_strdup (GTXT ("Attributed Text Page Fault Time"));
246	  abbr = dbe_strdup (GTXT ("Attr. Text Fault"));
247	}
248      else
249	{
250	  name = dbe_sprintf (GTXT ("Unexpected CP_LMS_TFAULT metric subtype %d"),
251			      st);
252	  abbr = dbe_strdup (NTXT ("??"));
253	}
254      break;
255
256    case CP_LMS_DFAULT:
257      abbr_unit = dbe_strdup (GTXT ("sec."));
258      if (st == EXCLUSIVE)
259	{
260	  name = dbe_strdup (GTXT ("Exclusive Data Page Fault Time"));
261	  abbr = dbe_strdup (GTXT ("Excl. Data Fault"));
262	}
263      else if (st == INCLUSIVE)
264	{
265	  name = dbe_strdup (GTXT ("Inclusive Data Page Fault Time"));
266	  abbr = dbe_strdup (GTXT ("Incl. Data Fault"));
267	}
268      else if (st == ATTRIBUTED)
269	{
270	  name = dbe_strdup (GTXT ("Attributed Data Page Fault Time"));
271	  abbr = dbe_strdup (GTXT ("Attr. Data Fault"));
272	}
273      else
274	{
275	  name = dbe_sprintf (GTXT ("Unexpected CP_LMS_DFAULT metric subtype %d"),
276			      st);
277	  abbr = dbe_strdup (NTXT ("??"));
278	}
279      break;
280
281    case CP_KERNEL_CPU:
282      abbr_unit = dbe_strdup (GTXT ("sec."));
283      if (st == EXCLUSIVE)
284	{
285	  name = dbe_strdup (GTXT ("Exclusive Kernel CPU Time"));
286	  abbr = dbe_strdup (GTXT ("Excl. Kernel CPU"));
287	}
288      else if (st == INCLUSIVE)
289	{
290	  name = dbe_strdup (GTXT ("Inclusive Kernel CPU Time"));
291	  abbr = dbe_strdup (GTXT ("Incl. Kernel CPU"));
292	}
293      else if (st == ATTRIBUTED)
294	{
295	  name = dbe_strdup (GTXT ("Attributed Kernel CPU Time"));
296	  abbr = dbe_strdup (GTXT ("Attr. Kernel CPU"));
297	}
298      else
299	{
300	  name = dbe_sprintf (GTXT ("Unexpected CP_KERNEL_CPU metric subtype %d"),
301			      st);
302	  abbr = dbe_strdup (NTXT ("??"));
303	}
304      break;
305
306    case HWCNTR:
307      {
308	char *sstr, *estr1, *estr2;
309	if (get_hw_ctr () == NULL)
310	  abort ();
311	sstr = get_username ();
312	if (st == EXCLUSIVE)
313	  {
314	    estr1 = GTXT ("Exclusive ");
315	    estr2 = GTXT ("Excl. ");
316	  }
317	else if (st == INCLUSIVE)
318	  {
319	    estr1 = GTXT ("Inclusive ");
320	    estr2 = GTXT ("Incl. ");
321	  }
322	else if (st == ATTRIBUTED)
323	  {
324	    estr1 = GTXT ("Attributed ");
325	    estr2 = GTXT ("Attr. ");
326	  }
327	else if (st == DATASPACE)
328	  {
329	    estr1 = GTXT ("Data-derived ");
330	    estr2 = GTXT ("Data. ");
331	  }
332	else
333	  {
334	    estr1 = dbe_sprintf (GTXT ("Unexpected hwc %s metric subtype %d"),
335				 get_aux (), st);
336	    estr2 = dbe_strdup (NTXT ("??"));
337	  }
338	name = dbe_sprintf (NTXT ("%s%s"), estr1, sstr);
339	abbr = dbe_sprintf (NTXT ("%s%s"), estr2, sstr);
340	break;
341      }
342
343    case DERIVED:
344      {
345	switch (st)
346	  {
347	  case EXCLUSIVE:
348	    name = dbe_sprintf (GTXT ("Exclusive %s"), get_username ());
349	    abbr = dbe_sprintf (GTXT ("Excl. %s"), get_cmd ());
350	    break;
351	  case INCLUSIVE:
352	    name = dbe_sprintf (GTXT ("Inclusive %s"), get_username ());
353	    abbr = dbe_sprintf (GTXT ("Incl. %s"), get_cmd ());
354	    break;
355	  case ATTRIBUTED:
356	    name = dbe_sprintf (GTXT ("Attributed %s"), get_username ());
357	    abbr = dbe_sprintf (GTXT ("Attr. %s"), get_cmd ());
358	    break;
359	  default:
360	    name = dbe_sprintf (GTXT ("Unexpected derived %s metric subtype %d"),
361				get_username (), st);
362	    abbr = dbe_strdup (NTXT ("??"));
363	    break;
364	  }
365	break;
366      }
367
368    case OMP_MASTER_THREAD:
369      abbr_unit = dbe_strdup (GTXT ("sec."));
370      if (st == EXCLUSIVE)
371	{
372	  name = dbe_strdup (GTXT ("Exclusive Master Thread Time"));
373	  abbr = dbe_strdup (GTXT ("Excl. Master Thread"));
374	}
375      else if (st == INCLUSIVE)
376	{
377	  name = dbe_strdup (GTXT ("Inclusive Master Thread Time"));
378	  abbr = dbe_strdup (GTXT ("Incl. Master Thread"));
379	}
380      else if (st == ATTRIBUTED)
381	{
382	  name = dbe_strdup (GTXT ("Attributed Master Thread Time"));
383	  abbr = dbe_strdup (GTXT ("Attr. Master Thread"));
384	}
385      else
386	{
387	  name = dbe_sprintf (GTXT ("Unexpected Master Thread metric subtype %d"),
388			      st);
389	  abbr = dbe_strdup (NTXT ("??"));
390	}
391      break;
392
393    case CP_TOTAL:
394      abbr_unit = dbe_strdup (GTXT ("sec."));
395      if (st == EXCLUSIVE)
396	{
397	  name = dbe_strdup (GTXT ("Exclusive Total Thread Time"));
398	  abbr = dbe_strdup (GTXT ("Excl. Total Thread"));
399	}
400      else if (st == INCLUSIVE)
401	{
402	  name = dbe_strdup (GTXT ("Inclusive Total Thread Time"));
403	  abbr = dbe_strdup (GTXT ("Incl. Total Thread"));
404	}
405      else if (st == ATTRIBUTED)
406	{
407	  name = dbe_strdup (GTXT ("Attributed Total Thread Time"));
408	  abbr = dbe_strdup (GTXT ("Attr. Total Thread"));
409	}
410      else
411	{
412	  name = dbe_sprintf (GTXT ("Unexpected TOTAL metric subtype %d"), st);
413	  abbr = dbe_strdup (NTXT ("??"));
414	}
415      break;
416
417    case SYNC_WAIT_COUNT:
418      if (st == EXCLUSIVE)
419	{
420	  name = dbe_strdup (GTXT ("Exclusive Sync Wait Count"));
421	  abbr = dbe_strdup (GTXT ("Excl. Sync Wait Count"));
422	}
423      else if (st == INCLUSIVE)
424	{
425	  name = dbe_strdup (GTXT ("Inclusive Sync Wait Count"));
426	  abbr = dbe_strdup (GTXT ("Incl. Sync Wait Count"));
427	}
428      else if (st == ATTRIBUTED)
429	{
430	  name = dbe_strdup (GTXT ("Attributed Sync Wait Count"));
431	  abbr = dbe_strdup (GTXT ("Attr. Sync Wait Count"));
432	}
433      else
434	{
435	  name = dbe_sprintf (GTXT ("Unexpected LWCNT metric subtype %d"), st);
436	  abbr = dbe_strdup (NTXT ("??"));
437	}
438      break;
439
440    case CP_TOTAL_CPU:
441      abbr_unit = dbe_strdup (GTXT ("sec."));
442      if (st == EXCLUSIVE)
443	{
444	  name = dbe_strdup (GTXT ("Exclusive Total CPU Time"));
445	  abbr = dbe_strdup (GTXT ("Excl. Total CPU"));
446	}
447      else if (st == INCLUSIVE)
448	{
449	  name = dbe_strdup (GTXT ("Inclusive Total CPU Time"));
450	  abbr = dbe_strdup (GTXT ("Incl. Total CPU"));
451	}
452      else if (st == ATTRIBUTED)
453	{
454	  name = dbe_strdup (GTXT ("Attributed Total CPU Time"));
455	  abbr = dbe_strdup (GTXT ("Attr. Total CPU"));
456	}
457      else
458	{
459	  name = dbe_sprintf (GTXT ("Unexpected TOTAL_CPU metric subtype %d"),
460			      st);
461	  abbr = dbe_strdup (NTXT ("??"));
462	}
463      break;
464    case CP_LMS_TRAP:
465      abbr_unit = dbe_strdup (GTXT ("sec."));
466      if (st == EXCLUSIVE)
467	{
468	  name = dbe_strdup (GTXT ("Exclusive Trap CPU Time"));
469	  abbr = dbe_strdup (GTXT ("Excl. Trap CPU"));
470	}
471      else if (st == INCLUSIVE)
472	{
473	  name = dbe_strdup (GTXT ("Inclusive Trap CPU Time"));
474	  abbr = dbe_strdup (GTXT ("Incl. Trap CPU"));
475	}
476      else if (st == ATTRIBUTED)
477	{
478	  name = dbe_strdup (GTXT ("Attributed Trap CPU Time"));
479	  abbr = dbe_strdup (GTXT ("Attr. Trap CPU"));
480	}
481      else
482	{
483	  name = dbe_sprintf (GTXT ("Unexpected CP_LMS_TRAP metric subtype %d"),
484			      st);
485	  abbr = dbe_strdup (NTXT ("??"));
486	}
487      break;
488
489    case CP_LMS_KFAULT:
490      abbr_unit = dbe_strdup (GTXT ("sec."));
491      if (st == EXCLUSIVE)
492	{
493	  name = dbe_strdup (GTXT ("Exclusive Kernel Page Fault Time"));
494	  abbr = dbe_strdup (GTXT ("Excl. Kernel Page Fault"));
495	}
496      else if (st == INCLUSIVE)
497	{
498	  name = dbe_strdup (GTXT ("Inclusive Kernel Page Fault Time"));
499	  abbr = dbe_strdup (GTXT ("Incl. Kernel Page Fault"));
500	}
501      else if (st == ATTRIBUTED)
502	{
503	  name = dbe_strdup (GTXT ("Attributed Kernel Page Fault Time"));
504	  abbr = dbe_strdup (GTXT ("Attr. Kernel Page Fault"));
505	}
506      else
507	{
508	  name = dbe_sprintf (GTXT ("Unexpected CP_LMS_KFAULT metric subtype %d"),
509			      st);
510	  abbr = dbe_strdup (NTXT ("??"));
511	}
512      break;
513
514    case CP_LMS_SLEEP:
515      abbr_unit = dbe_strdup (GTXT ("sec."));
516      if (st == EXCLUSIVE)
517	{
518	  name = dbe_strdup (GTXT ("Exclusive Sleep Time"));
519	  abbr = dbe_strdup (GTXT ("Excl. Sleep"));
520	}
521      else if (st == INCLUSIVE)
522	{
523	  name = dbe_strdup (GTXT ("Inclusive Sleep Time"));
524	  abbr = dbe_strdup (GTXT ("Incl. Sleep"));
525	}
526      else if (st == ATTRIBUTED)
527	{
528	  name = dbe_strdup (GTXT ("Attributed Sleep Time"));
529	  abbr = dbe_strdup (GTXT ("Attr. Sleep"));
530	}
531      else
532	{
533	  name = dbe_sprintf (GTXT ("Unexpected CP_LMS_SLEEP metric subtype %d"),
534			      st);
535	  abbr = dbe_strdup (NTXT ("??"));
536	}
537      break;
538
539    case CP_LMS_STOPPED:
540      abbr_unit = dbe_strdup (GTXT ("sec."));
541      if (st == EXCLUSIVE)
542	{
543	  name = dbe_strdup (GTXT ("Exclusive Stopped Time"));
544	  abbr = dbe_strdup (GTXT ("Excl. Stopped"));
545	}
546      else if (st == INCLUSIVE)
547	{
548	  name = dbe_strdup (GTXT ("Inclusive Stopped Time"));
549	  abbr = dbe_strdup (GTXT ("Incl. Stopped"));
550	}
551      else if (st == ATTRIBUTED)
552	{
553	  name = dbe_strdup (GTXT ("Attributed Stopped Time"));
554	  abbr = dbe_strdup (GTXT ("Attr. Stopped"));
555	}
556      else
557	{
558	  name = dbe_sprintf (GTXT ("Unexpected CP_LMS_STOPPED metric subtype %d"),
559			      st);
560	  abbr = dbe_strdup (NTXT ("??"));
561	}
562      break;
563
564    case HEAP_ALLOC_BYTES:
565      if (st == EXCLUSIVE)
566	{
567	  name = dbe_strdup (GTXT ("Exclusive Bytes Allocated"));
568	  abbr = dbe_strdup (GTXT ("Excl. Bytes Allocated"));
569	}
570      else if (st == INCLUSIVE)
571	{
572	  name = dbe_strdup (GTXT ("Inclusive Bytes Allocated"));
573	  abbr = dbe_strdup (GTXT ("Incl. Bytes Allocated"));
574	}
575      else if (st == ATTRIBUTED)
576	{
577	  name = dbe_strdup (GTXT ("Attributed Bytes Allocated"));
578	  abbr = dbe_strdup (GTXT ("Attr. Bytes Allocated"));
579	}
580      else
581	{
582	  name = dbe_sprintf (GTXT ("Unexpected BYTES_MALLOCD metric subtype %d"),
583			      st);
584	  abbr = dbe_strdup (NTXT ("??"));
585	}
586      break;
587
588    case HEAP_ALLOC_CNT:
589      if (st == EXCLUSIVE)
590	{
591	  name = dbe_strdup (GTXT ("Exclusive Allocations"));
592	  abbr = dbe_strdup (GTXT ("Excl. Allocations"));
593	}
594      else if (st == INCLUSIVE)
595	{
596	  name = dbe_strdup (GTXT ("Inclusive Allocations"));
597	  abbr = dbe_strdup (GTXT ("Incl. Allocations"));
598	}
599      else if (st == ATTRIBUTED)
600	{
601	  name = dbe_strdup (GTXT ("Attributed Allocations"));
602	  abbr = dbe_strdup (GTXT ("Attr. Allocations"));
603	}
604      else
605	{
606	  name = dbe_sprintf (GTXT ("Unexpected MALLOCS metric subtype %d"), st);
607	  abbr = dbe_strdup (NTXT ("??"));
608	}
609      break;
610
611    case HEAP_LEAK_BYTES:
612      if (st == EXCLUSIVE)
613	{
614	  name = dbe_strdup (GTXT ("Exclusive Bytes Leaked"));
615	  abbr = dbe_strdup (GTXT ("Excl. Bytes Leaked"));
616	}
617      else if (st == INCLUSIVE)
618	{
619	  name = dbe_strdup (GTXT ("Inclusive Bytes Leaked"));
620	  abbr = dbe_strdup (GTXT ("Incl. Bytes Leaked"));
621	}
622      else if (st == ATTRIBUTED)
623	{
624	  name = dbe_strdup (GTXT ("Attributed Bytes Leaked"));
625	  abbr = dbe_strdup (GTXT ("Attr. Bytes Leaked"));
626	}
627      else
628	{
629	  name = dbe_sprintf (GTXT ("Unexpected BYTES_LEAKED metric subtype %d"),
630			      st);
631	  abbr = dbe_strdup (NTXT ("??"));
632	}
633      break;
634
635    case HEAP_LEAK_CNT:
636      if (st == EXCLUSIVE)
637	{
638	  name = dbe_strdup (GTXT ("Exclusive Leaks"));
639	  abbr = dbe_strdup (GTXT ("Excl. Leaks"));
640	}
641      else if (st == INCLUSIVE)
642	{
643	  name = dbe_strdup (GTXT ("Inclusive Leaks"));
644	  abbr = dbe_strdup (GTXT ("Incl. Leaks"));
645	}
646      else if (st == ATTRIBUTED)
647	{
648	  name = dbe_strdup (GTXT ("Attributed Leaks"));
649	  abbr = dbe_strdup (GTXT ("Attr. Leaks"));
650	}
651      else
652	{
653	  name = dbe_sprintf (GTXT ("Unexpected LEAKS metric subtype %d"), st);
654	  abbr = dbe_strdup (NTXT ("??"));
655	}
656      break;
657
658    case IO_READ_BYTES:
659      if (st == EXCLUSIVE)
660	{
661	  name = dbe_strdup (GTXT ("Exclusive Read Bytes"));
662	  abbr = dbe_strdup (GTXT ("Excl. Read Bytes"));
663	}
664      else if (st == INCLUSIVE)
665	{
666	  name = dbe_strdup (GTXT ("Inclusive Read Bytes"));
667	  abbr = dbe_strdup (GTXT ("Incl. Read Bytes"));
668	}
669      else if (st == ATTRIBUTED)
670	{
671	  name = dbe_strdup (GTXT ("Attributed Read Bytes"));
672	  abbr = dbe_strdup (GTXT ("Attr. Read Bytes"));
673	}
674      else
675	{
676	  name = dbe_sprintf (GTXT ("Unexpected READ_BYTES metric subtype %d"), st);
677	  abbr = dbe_strdup (NTXT ("??"));
678	}
679      break;
680
681    case IO_WRITE_BYTES:
682      if (st == EXCLUSIVE)
683	{
684	  name = dbe_strdup (GTXT ("Exclusive Write Bytes"));
685	  abbr = dbe_strdup (GTXT ("Excl. Write Bytes"));
686	}
687      else if (st == INCLUSIVE)
688	{
689	  name = dbe_strdup (GTXT ("Inclusive Write Bytes"));
690	  abbr = dbe_strdup (GTXT ("Incl. Write Bytes"));
691	}
692      else if (st == ATTRIBUTED)
693	{
694	  name = dbe_strdup (GTXT ("Attributed Write Bytes"));
695	  abbr = dbe_strdup (GTXT ("Attr. Write Bytes"));
696	}
697      else
698	{
699	  name = dbe_sprintf (GTXT ("Unexpected WRITE_BYTES metric subtype %d"), st);
700	  abbr = dbe_strdup (NTXT ("??"));
701	}
702      break;
703
704    case IO_READ_CNT:
705      if (st == EXCLUSIVE)
706	{
707	  name = dbe_strdup (GTXT ("Exclusive Read Count"));
708	  abbr = dbe_strdup (GTXT ("Excl. Read Count"));
709	}
710      else if (st == INCLUSIVE)
711	{
712	  name = dbe_strdup (GTXT ("Inclusive Read Count"));
713	  abbr = dbe_strdup (GTXT ("Incl. Read Count"));
714	}
715      else if (st == ATTRIBUTED)
716	{
717	  name = dbe_strdup (GTXT ("Attributed Read Count"));
718	  abbr = dbe_strdup (GTXT ("Attr. Read Count"));
719	}
720      else
721	{
722	  name = dbe_sprintf (GTXT ("Unexpected READCNT metric subtype %d"), st);
723	  abbr = dbe_strdup (NTXT ("??"));
724	}
725      break;
726
727    case IO_WRITE_CNT:
728      if (st == EXCLUSIVE)
729	{
730	  name = dbe_strdup (GTXT ("Exclusive Write Count"));
731	  abbr = dbe_strdup (GTXT ("Excl. Write Count"));
732	}
733      else if (st == INCLUSIVE)
734	{
735	  name = dbe_strdup (GTXT ("Inclusive Write Count"));
736	  abbr = dbe_strdup (GTXT ("Incl. Write Count"));
737	}
738      else if (st == ATTRIBUTED)
739	{
740	  name = dbe_strdup (GTXT ("Attributed Write Count"));
741	  abbr = dbe_strdup (GTXT ("Attr. Write Count"));
742	}
743      else
744	{
745	  name = dbe_sprintf (GTXT ("Unexpected WRITECNT metric subtype %d"), st);
746	  abbr = dbe_strdup (NTXT ("??"));
747	}
748      break;
749
750    case IO_OTHER_CNT:
751      if (st == EXCLUSIVE)
752	{
753	  name = dbe_strdup (GTXT ("Exclusive Other I/O Count"));
754	  abbr = dbe_strdup (GTXT ("Excl. Other I/O Count"));
755	}
756      else if (st == INCLUSIVE)
757	{
758	  name = dbe_strdup (GTXT ("Inclusive Other I/O Count"));
759	  abbr = dbe_strdup (GTXT ("Incl. Other I/O Count"));
760	}
761      else if (st == ATTRIBUTED)
762	{
763	  name = dbe_strdup (GTXT ("Attributed Other I/O Count"));
764	  abbr = dbe_strdup (GTXT ("Attr. Other I/O Count"));
765	}
766      else
767	{
768	  name = dbe_sprintf (GTXT ("Unexpected OTHERIOCNT metric subtype %d"), st);
769	  abbr = dbe_strdup (NTXT ("??"));
770	}
771      break;
772
773    case IO_ERROR_CNT:
774      if (st == EXCLUSIVE)
775	{
776	  name = dbe_strdup (GTXT ("Exclusive I/O Error Count"));
777	  abbr = dbe_strdup (GTXT ("Excl. I/O Error Count"));
778	}
779      else if (st == INCLUSIVE)
780	{
781	  name = dbe_strdup (GTXT ("Inclusive I/O Error Count"));
782	  abbr = dbe_strdup (GTXT ("Incl. I/O Error Count"));
783	}
784      else if (st == ATTRIBUTED)
785	{
786	  name = dbe_strdup (GTXT ("Attributed I/O Error Count"));
787	  abbr = dbe_strdup (GTXT ("Attr. I/O Error Count"));
788	}
789      else
790	{
791	  name = dbe_sprintf (GTXT ("Unexpected IOERRORCNT metric subtype %d"), st);
792	  abbr = dbe_strdup (NTXT ("??"));
793	}
794      break;
795
796    case IO_READ_TIME:
797      abbr_unit = dbe_strdup (GTXT ("sec."));
798      if (st == EXCLUSIVE)
799	{
800	  name = dbe_strdup (GTXT ("Exclusive Read Time"));
801	  abbr = dbe_strdup (GTXT ("Excl. Read Time"));
802	}
803      else if (st == INCLUSIVE)
804	{
805	  name = dbe_strdup (GTXT ("Inclusive Read Time"));
806	  abbr = dbe_strdup (GTXT ("Incl. Read Time"));
807	}
808      else if (st == ATTRIBUTED)
809	{
810	  name = dbe_strdup (GTXT ("Attributed Read Time"));
811	  abbr = dbe_strdup (GTXT ("Attr. Read Time"));
812	}
813      else
814	{
815	  name = dbe_sprintf (GTXT ("Unexpected READ_TIME metric subtype %d"), st);
816	  abbr = dbe_strdup (NTXT ("??"));
817	}
818      break;
819
820    case IO_WRITE_TIME:
821      abbr_unit = dbe_strdup (GTXT ("sec."));
822      if (st == EXCLUSIVE)
823	{
824	  name = dbe_strdup (GTXT ("Exclusive Write Time"));
825	  abbr = dbe_strdup (GTXT ("Excl. Write Time"));
826	}
827      else if (st == INCLUSIVE)
828	{
829	  name = dbe_strdup (GTXT ("Inclusive Write Time"));
830	  abbr = dbe_strdup (GTXT ("Incl. Write Time"));
831	}
832      else if (st == ATTRIBUTED)
833	{
834	  name = dbe_strdup (GTXT ("Attributed Write Time"));
835	  abbr = dbe_strdup (GTXT ("Attr. Write Time"));
836	}
837      else
838	{
839	  name = dbe_sprintf (GTXT ("Unexpected WRITE_TIME metric subtype %d"), st);
840	  abbr = dbe_strdup (NTXT ("??"));
841	}
842      break;
843
844    case IO_OTHER_TIME:
845      abbr_unit = dbe_strdup (GTXT ("sec."));
846      if (st == EXCLUSIVE)
847	{
848	  name = dbe_strdup (GTXT ("Exclusive Other I/O Time"));
849	  abbr = dbe_strdup (GTXT ("Excl. Other I/O Time"));
850	}
851      else if (st == INCLUSIVE)
852	{
853	  name = dbe_strdup (GTXT ("Inclusive Other I/O Time"));
854	  abbr = dbe_strdup (GTXT ("Incl. Other I/O Time"));
855	}
856      else if (st == ATTRIBUTED)
857	{
858	  name = dbe_strdup (GTXT ("Attributed Other I/O Time"));
859	  abbr = dbe_strdup (GTXT ("Attr. Other I/O Time"));
860	}
861      else
862	{
863	  name = dbe_sprintf (GTXT ("Unexpected OTHERIO_TIME metric subtype %d"), st);
864	  abbr = dbe_strdup (NTXT ("??"));
865	}
866      break;
867
868    case IO_ERROR_TIME:
869      abbr_unit = dbe_strdup (GTXT ("sec."));
870      if (st == EXCLUSIVE)
871	{
872	  name = dbe_strdup (GTXT ("Exclusive I/O Error Time"));
873	  abbr = dbe_strdup (GTXT ("Excl. I/O Error Time"));
874	}
875      else if (st == INCLUSIVE)
876	{
877	  name = dbe_strdup (GTXT ("Inclusive I/O Error Time"));
878	  abbr = dbe_strdup (GTXT ("Incl. I/O Error Time"));
879	}
880      else if (st == ATTRIBUTED)
881	{
882	  name = dbe_strdup (GTXT ("Attributed I/O Error Time"));
883	  abbr = dbe_strdup (GTXT ("Attr. I/O Error Time"));
884	}
885      else
886	{
887	  name = dbe_sprintf (GTXT ("Unexpected IOERROR_TIME metric subtype %d"), st);
888	  abbr = dbe_strdup (NTXT ("??"));
889	}
890      break;
891
892    case SIZES:
893      name = dbe_strdup (GTXT ("Size"));
894      abbr = dbe_strdup (GTXT ("Size"));
895      abbr_unit = dbe_strdup (GTXT ("bytes"));
896      break;
897
898    case ADDRESS:
899      name = dbe_strdup (GTXT ("PC Address"));
900      abbr = dbe_strdup (GTXT ("PC Addr."));
901      break;
902
903    case ONAME:
904      name = dbe_strdup (GTXT ("Name"));
905      abbr = dbe_strdup (GTXT ("Name"));
906      break;
907
908    case OMP_NONE:
909      abbr_unit = dbe_strdup (GTXT ("sec."));
910      if (st == EXCLUSIVE)
911	{
912	  name = dbe_strdup (GTXT ("Exclusive Non-OpenMP Time"));
913	  abbr = dbe_strdup (GTXT ("Excl. Non-OMP"));
914	}
915      else if (st == INCLUSIVE)
916	{
917	  name = dbe_strdup (GTXT ("Inclusive Non-OpenMP Time"));
918	  abbr = dbe_strdup (GTXT ("Incl. Non-OMP"));
919	}
920      else if (st == ATTRIBUTED)
921	{
922	  name = dbe_strdup (GTXT ("Attributed Non-OpenMP Time"));
923	  abbr = dbe_strdup (GTXT ("Attr. Non-OMP"));
924	}
925      else
926	{
927	  name = dbe_sprintf (GTXT ("Unexpected Non-OpenMP metric subtype %d"), st);
928	  abbr = dbe_strdup (NTXT ("??"));
929	}
930      break;
931    case OMP_OVHD:
932      abbr_unit = dbe_strdup (GTXT ("sec."));
933      if (st == EXCLUSIVE)
934	{
935	  name = dbe_strdup (GTXT ("Exclusive OpenMP Overhead Time"));
936	  abbr = dbe_strdup (GTXT ("Excl. OMP ovhd."));
937	}
938      else if (st == INCLUSIVE)
939	{
940	  name = dbe_strdup (GTXT ("Inclusive OpenMP Overhead Time"));
941	  abbr = dbe_strdup (GTXT ("Incl. OMP ovhd."));
942	}
943      else if (st == ATTRIBUTED)
944	{
945	  name = dbe_strdup (GTXT ("Attributed OpenMP Overhead Time"));
946	  abbr = dbe_strdup (GTXT ("Attr. OMP ovhd."));
947	}
948      else
949	{
950	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Overhead metric subtype %d"), st);
951	  abbr = dbe_strdup (NTXT ("??"));
952	}
953      break;
954    case OMP_WORK:
955      abbr_unit = dbe_strdup (GTXT ("sec."));
956      if (st == EXCLUSIVE)
957	{
958	  name = dbe_strdup (GTXT ("Exclusive OpenMP Work Time"));
959	  abbr = dbe_strdup (GTXT ("Excl. OMP Work"));
960	}
961      else if (st == INCLUSIVE)
962	{
963	  name = dbe_strdup (GTXT ("Inclusive OpenMP Work Time"));
964	  abbr = dbe_strdup (GTXT ("Incl. OMP Work"));
965	}
966      else if (st == ATTRIBUTED)
967	{
968	  name = dbe_strdup (GTXT ("Attributed OpenMP Work Time"));
969	  abbr = dbe_strdup (GTXT ("Attr. OMP Work"));
970	}
971      else
972	{
973	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Work metric subtype %d"), st);
974	  abbr = dbe_strdup (NTXT ("??"));
975	}
976      break;
977    case OMP_IBAR:
978      abbr_unit = dbe_strdup (GTXT ("sec."));
979      if (st == EXCLUSIVE)
980	{
981	  name = dbe_strdup (GTXT ("Exclusive OpenMP Implicit Barrier Time"));
982	  abbr = dbe_strdup (GTXT ("Excl. OMP i-barr."));
983	}
984      else if (st == INCLUSIVE)
985	{
986	  name = dbe_strdup (GTXT ("Inclusive OpenMP Implicit Barrier Time"));
987	  abbr = dbe_strdup (GTXT ("Incl. OMP i-barr."));
988	}
989      else if (st == ATTRIBUTED)
990	{
991	  name = dbe_strdup (GTXT ("Attributed OpenMP Implicit Barrier Time"));
992	  abbr = dbe_strdup (GTXT ("Attr. OMP i-barr."));
993	}
994      else
995	{
996	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Implicit Barrier metric subtype %d"), st);
997	  abbr = dbe_strdup (NTXT ("??"));
998	}
999      break;
1000    case OMP_EBAR:
1001      abbr_unit = dbe_strdup (GTXT ("sec."));
1002      if (st == EXCLUSIVE)
1003	{
1004	  name = dbe_strdup (GTXT ("Exclusive OpenMP Explicit Barrier Time"));
1005	  abbr = dbe_strdup (GTXT ("Excl. OMP e-barr."));
1006	}
1007      else if (st == INCLUSIVE)
1008	{
1009	  name = dbe_strdup (GTXT ("Inclusive OpenMP Explicit Barrier Time"));
1010	  abbr = dbe_strdup (GTXT ("Incl. OMP e-barr."));
1011	}
1012      else if (st == ATTRIBUTED)
1013	{
1014	  name = dbe_strdup (GTXT ("Attributed OpenMP Explicit Barrier Time"));
1015	  abbr = dbe_strdup (GTXT ("Attr. OMP e-barr."));
1016	}
1017      else
1018	{
1019	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Explicit Barrier metric subtype %d"), st);
1020	  abbr = dbe_strdup (NTXT ("??"));
1021	}
1022      break;
1023    case OMP_WAIT:
1024      abbr_unit = dbe_strdup (GTXT ("sec."));
1025      if (st == EXCLUSIVE)
1026	{
1027	  name = dbe_strdup (GTXT ("Exclusive OpenMP Wait Time"));
1028	  abbr = dbe_strdup (GTXT ("Excl. OMP Wait"));
1029	}
1030      else if (st == INCLUSIVE)
1031	{
1032	  name = dbe_strdup (GTXT ("Inclusive OpenMP Wait Time"));
1033	  abbr = dbe_strdup (GTXT ("Incl. OMP Wait"));
1034	}
1035      else if (st == ATTRIBUTED)
1036	{
1037	  name = dbe_strdup (GTXT ("Attributed OpenMP Wait Time"));
1038	  abbr = dbe_strdup (GTXT ("Attr. OMP Wait"));
1039	}
1040      else
1041	{
1042	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Wait metric subtype %d"), st);
1043	  abbr = dbe_strdup (NTXT ("??"));
1044	}
1045      break;
1046    case OMP_SERL:
1047      abbr_unit = dbe_strdup (GTXT ("sec."));
1048      if (st == EXCLUSIVE)
1049	{
1050	  name = dbe_strdup (GTXT ("Exclusive OpenMP Serial Time"));
1051	  abbr = dbe_strdup (GTXT ("Excl. OMP serl"));
1052	}
1053      else if (st == INCLUSIVE)
1054	{
1055	  name = dbe_strdup (GTXT ("Inclusive OpenMP Serial Time"));
1056	  abbr = dbe_strdup (GTXT ("Incl. OMP serl"));
1057	}
1058      else if (st == ATTRIBUTED)
1059	{
1060	  name = dbe_strdup (GTXT ("Attributed OpenMP Serial Time"));
1061	  abbr = dbe_strdup (GTXT ("Attr. OMP serl"));
1062	}
1063      else
1064	{
1065	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Slave Idle metric subtype %d"), st);
1066	  abbr = dbe_strdup (NTXT ("??"));
1067	}
1068      break;
1069    case OMP_RDUC:
1070      abbr_unit = dbe_strdup (GTXT ("sec."));
1071      if (st == EXCLUSIVE)
1072	{
1073	  name = dbe_strdup (GTXT ("Exclusive OpenMP Reduction Time"));
1074	  abbr = dbe_strdup (GTXT ("Excl. OMP rduc"));
1075	}
1076      else if (st == INCLUSIVE)
1077	{
1078	  name = dbe_strdup (GTXT ("Inclusive OpenMP Reduction Time"));
1079	  abbr = dbe_strdup (GTXT ("Incl. OMP rduc"));
1080	}
1081      else if (st == ATTRIBUTED)
1082	{
1083	  name = dbe_strdup (GTXT ("Attributed OpenMP Reduction Time"));
1084	  abbr = dbe_strdup (GTXT ("Attr. OMP rduc"));
1085	}
1086      else
1087	{
1088	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Reduction metric subtype %d"), st);
1089	  abbr = dbe_strdup (NTXT ("??"));
1090	}
1091      break;
1092    case OMP_LKWT:
1093      abbr_unit = dbe_strdup (GTXT ("sec."));
1094      if (st == EXCLUSIVE)
1095	{
1096	  name = dbe_strdup (GTXT ("Exclusive OpenMP Lock Wait Time"));
1097	  abbr = dbe_strdup (GTXT ("Excl. OMP lkwt"));
1098	}
1099      else if (st == INCLUSIVE)
1100	{
1101	  name = dbe_strdup (GTXT ("Inclusive OpenMP Lock Wait Time"));
1102	  abbr = dbe_strdup (GTXT ("Incl. OMP lkwt"));
1103	}
1104      else if (st == ATTRIBUTED)
1105	{
1106	  name = dbe_strdup (GTXT ("Attributed OpenMP Lock Wait Time"));
1107	  abbr = dbe_strdup (GTXT ("Attr. OMP lkwt"));
1108	}
1109      else
1110	{
1111	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Lock Wait metric subtype %d"), st);
1112	  abbr = dbe_strdup (NTXT ("??"));
1113	}
1114      break;
1115    case OMP_CTWT:
1116      abbr_unit = dbe_strdup (GTXT ("sec."));
1117      if (st == EXCLUSIVE)
1118	{
1119	  name = dbe_strdup (GTXT ("Exclusive OpenMP Critical Section Wait Time"));
1120	  abbr = dbe_strdup (GTXT ("Excl. OMP ctwt"));
1121	}
1122      else if (st == INCLUSIVE)
1123	{
1124	  name = dbe_strdup (GTXT ("Inclusive OpenMP Critical Section Wait Time"));
1125	  abbr = dbe_strdup (GTXT ("Incl. OMP ctwt"));
1126	}
1127      else if (st == ATTRIBUTED)
1128	{
1129	  name = dbe_strdup (GTXT ("Attributed OpenMP Critical Section Wait Time"));
1130	  abbr = dbe_strdup (GTXT ("Attr. OMP ctwt"));
1131	}
1132      else
1133	{
1134	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Critical Section Wait metric subtype %d"), st);
1135	  abbr = dbe_strdup (NTXT ("??"));
1136	}
1137      break;
1138    case OMP_ODWT:
1139      abbr_unit = dbe_strdup (GTXT ("sec."));
1140      if (st == EXCLUSIVE)
1141	{
1142	  name = dbe_strdup (GTXT ("Exclusive OpenMP Ordered Section Wait Time"));
1143	  abbr = dbe_strdup (GTXT ("Excl. OMP odwt"));
1144	}
1145      else if (st == INCLUSIVE)
1146	{
1147	  name = dbe_strdup (GTXT ("Inclusive OpenMP Ordered Section Wait Time"));
1148	  abbr = dbe_strdup (GTXT ("Incl. OMP odwt"));
1149	}
1150      else if (st == ATTRIBUTED)
1151	{
1152	  name = dbe_strdup (GTXT ("Attributed OpenMP Ordered Section Wait Time"));
1153	  abbr = dbe_strdup (GTXT ("Attr. OMP odwt"));
1154	}
1155      else
1156	{
1157	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Ordered Section Wait metric subtype %d"), st);
1158	  abbr = dbe_strdup (NTXT ("??"));
1159	}
1160      break;
1161    case OMP_MSTR:
1162      abbr_unit = dbe_strdup (GTXT ("sec."));
1163      if (st == EXCLUSIVE)
1164	{
1165	  name = dbe_strdup (GTXT ("Exclusive OpenMP Master Serial Time"));
1166	  abbr = dbe_strdup (GTXT ("Excl. OMP ser."));
1167	}
1168      else if (st == INCLUSIVE)
1169	{
1170	  name = dbe_strdup (GTXT ("Inclusive OpenMP Master Serial Time"));
1171	  abbr = dbe_strdup (GTXT ("Incl. OMP ser."));
1172	}
1173      else if (st == ATTRIBUTED)
1174	{
1175	  name = dbe_strdup (GTXT ("Attributed OpenMP Master Serial Time"));
1176	  abbr = dbe_strdup (GTXT ("Attr. OMP ser."));
1177	}
1178      else
1179	{
1180	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Master Serial metric subtype %d"), st);
1181	  abbr = dbe_strdup (NTXT ("??"));
1182	}
1183      break;
1184    case OMP_SNGL:
1185      abbr_unit = dbe_strdup (GTXT ("sec."));
1186      if (st == EXCLUSIVE)
1187	{
1188	  name = dbe_strdup (GTXT ("Exclusive OpenMP Single Region Time"));
1189	  abbr = dbe_strdup (GTXT ("Excl. OMP sngl"));
1190	}
1191      else if (st == INCLUSIVE)
1192	{
1193	  name = dbe_strdup (GTXT ("Inclusive OpenMP Single Region Time"));
1194	  abbr = dbe_strdup (GTXT ("Incl. OMP sngl"));
1195	}
1196      else if (st == ATTRIBUTED)
1197	{
1198	  name = dbe_strdup (GTXT ("Attributed OpenMP Single Region Time"));
1199	  abbr = dbe_strdup (GTXT ("Attr. OMP sngl"));
1200	}
1201      else
1202	{
1203	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Single Region metric subtype %d"), st);
1204	  abbr = dbe_strdup (NTXT ("??"));
1205	}
1206      break;
1207    case OMP_ORDD:
1208      abbr_unit = dbe_strdup (GTXT ("sec."));
1209      if (st == EXCLUSIVE)
1210	{
1211	  name = dbe_strdup (GTXT ("Exclusive OpenMP Ordered Region Time"));
1212	  abbr = dbe_strdup (GTXT ("Excl. OMP ordd"));
1213	}
1214      else if (st == INCLUSIVE)
1215	{
1216	  name = dbe_strdup (GTXT ("Inclusive OpenMP Ordered Region Time"));
1217	  abbr = dbe_strdup (GTXT ("Incl. OMP ordd"));
1218	}
1219      else if (st == ATTRIBUTED)
1220	{
1221	  name = dbe_strdup (GTXT ("Attributed OpenMP Ordered Region Time"));
1222	  abbr = dbe_strdup (GTXT ("Attr. OMP ordd"));
1223	}
1224      else
1225	{
1226	  name = dbe_sprintf (GTXT ("Unexpected OpenMP Ordered Region metric subtype %d"), st);
1227	  abbr = dbe_strdup (NTXT ("??"));
1228	}
1229      break;
1230    case RACCESS:
1231      if (st == EXCLUSIVE)
1232	{
1233	  name = dbe_strdup (GTXT ("Exclusive Race Accesses"));
1234	  abbr = dbe_strdup (GTXT ("Excl. Race Accesses"));
1235	}
1236      else if (st == INCLUSIVE)
1237	{
1238	  name = dbe_strdup (GTXT ("Inclusive Race Accesses"));
1239	  abbr = dbe_strdup (GTXT ("Incl. Race Accesses"));
1240	}
1241      else if (st == ATTRIBUTED)
1242	{
1243	  name = dbe_strdup (GTXT ("Attributed Race Accesses"));
1244	  abbr = dbe_strdup (GTXT ("Attr. Race Accesses"));
1245	}
1246      else
1247	{
1248	  name = dbe_sprintf (GTXT ("Unexpected Race Access metric subtype %d"), st);
1249	  abbr = dbe_strdup (NTXT ("??"));
1250	}
1251      break;
1252    case DEADLOCKS:
1253      if (st == EXCLUSIVE)
1254	{
1255	  name = dbe_strdup (GTXT ("Exclusive Deadlocks"));
1256	  abbr = dbe_strdup (GTXT ("Excl. Deadlocks"));
1257	}
1258      else if (st == INCLUSIVE)
1259	{
1260	  name = dbe_strdup (GTXT ("Inclusive Deadlocks"));
1261	  abbr = dbe_strdup (GTXT ("Incl. Deadlocks"));
1262	}
1263      else if (st == ATTRIBUTED)
1264	{
1265	  name = dbe_strdup (GTXT ("Attributed Deadlocks"));
1266	  abbr = dbe_strdup (GTXT ("Attr. Deadlocks"));
1267	}
1268      else
1269	{
1270	  name = dbe_sprintf (GTXT ("Unexpected Deadlocks metric subtype %d"), st);
1271	  abbr = dbe_strdup (NTXT ("??"));
1272	}
1273      break;
1274    default:
1275      abort ();
1276    }
1277} //Metric::set_subtype
1278
1279static bool
1280is_width_ok (int lines, size_t width, size_t *tlen, int last)
1281{
1282  size_t len = 0;
1283  for (int i = 0; i <= last; i++)
1284    {
1285      if (len != 0)
1286	len++;
1287      if (len + tlen[i] > width)
1288	{
1289	  if (--lines == 0)
1290	    return false;
1291	  len = 0;
1292	}
1293      len += tlen[i];
1294    }
1295  return true;
1296}
1297
1298void
1299Metric::legend_width (HistMetric *hitem, int gap)
1300{
1301  size_t tlen[MAX_LEN];
1302  char *tok[MAX_LEN], buf[MAX_LEN], unit[MAX_LEN];
1303  hitem->width = hitem->maxtime_width;
1304  if (hitem->maxvalue_width > 0)
1305    {
1306      if (hitem->width > 0)
1307	hitem->width++;
1308      hitem->width += hitem->maxvalue_width;
1309    }
1310  if (is_pvisible ())
1311    {
1312      if (hitem->width > 0)
1313	{
1314	  hitem->width++;
1315	}
1316      hitem->width += 6; // adjust to change format from xx.yy%
1317    }
1318  snprintf (buf, sizeof (buf), "%s", get_abbr ());
1319  size_t max_len = hitem->width;
1320  if (legend)
1321    {
1322      size_t legend_len = strlen (legend);
1323      if (max_len < legend_len)
1324	max_len = legend_len;
1325    }
1326  tok[0] = buf;
1327  int last = 0;
1328  for (int i = 0;; i++)
1329    {
1330      if (buf[i] == ' ')
1331	{
1332	  buf[i] = '\0';
1333	  while (buf[i + 1] == ' ')
1334	    i++;
1335	  tlen[last] = strlen (tok[last]);
1336	  if (max_len < tlen[last])
1337	    max_len = tlen[last];
1338	  last++;
1339	  tok[last] = buf + i + 1;
1340	}
1341      else if (buf[i] == '\0')
1342	{
1343	  tlen[last] = strlen (tok[last]);
1344	  if (max_len < tlen[last])
1345	    max_len = tlen[last];
1346	  if (tlen[last] == 0 && last > 0)
1347	    last--;
1348	  break;
1349	}
1350    }
1351
1352  *unit = '\0'; // get the extra unit tokens
1353  int max_lines = 3;
1354  if (is_tvisible ())
1355    {
1356      char *s = GTXT ("sec.");
1357      if ((get_visbits () & VAL_DELTA) != 0)
1358	s = GTXT ("delta");
1359      else if ((get_visbits () & VAL_RATIO) != 0)
1360	s = GTXT ("ratio");
1361      long len = strlen (s);
1362      if (hitem->maxtime_width < len)
1363	{
1364	  hitem->width += len - hitem->maxtime_width;
1365	  hitem->maxtime_width = len;
1366	}
1367      snprintf (unit, sizeof (unit), "%*s", (int) hitem->maxtime_width, s);
1368    }
1369  if (is_visible ())
1370    {
1371      char *s = NTXT ("");
1372      if (!is_tvisible ())
1373	{
1374	  if ((get_visbits () & VAL_DELTA) != 0)
1375	    s = GTXT ("delta");
1376	  else if ((get_visbits () & VAL_RATIO) != 0)
1377	    s = GTXT ("ratio");
1378	  else if ((get_value_styles () & VAL_TIMEVAL) != 0 && !is_time_val ())
1379	    s = GTXT ("sec.");
1380	}
1381      long len = strlen (s);
1382      if (hitem->maxvalue_width < len)
1383	{
1384	  hitem->width += len - hitem->maxvalue_width;
1385	  hitem->maxvalue_width = len;
1386	}
1387      if (*unit)
1388	{
1389	  max_lines = 2;
1390	  len = strlen (unit);
1391	  snprintf (unit + len, sizeof (unit) - len, " %*s",
1392		    (int) hitem->maxvalue_width, s);
1393	}
1394      else
1395	snprintf (unit, sizeof (unit), "%*s", (int) hitem->maxvalue_width, s);
1396    }
1397  if (is_pvisible ())
1398    {
1399      max_lines = 2;
1400      if (*unit)
1401	{
1402	  size_t len = strlen (unit);
1403	  snprintf (unit + len, sizeof (unit) - len, GTXT ("      %%"));
1404	}
1405      else
1406	snprintf (unit, sizeof (unit), GTXT ("     %%"));
1407    }
1408  for (size_t i = strlen (unit); i > 0;)
1409    { // remove trailing spaces
1410      i--;
1411      if (unit[i] != ' ')
1412	break;
1413      unit[i] = 0;
1414    }
1415
1416  if (*unit)
1417    {
1418      last++;
1419      tlen[last] = strlen (unit);
1420      tok[last] = unit;
1421      if (max_len < tlen[last])
1422	max_len = tlen[last];
1423      if (max_lines == 3 && *unit == ' ')
1424	{
1425	  char *str = unit;
1426	  while (*str == ' ')
1427	    str++;
1428	  tlen[last] = strlen (str);
1429	  tok[last] = str;
1430	}
1431    }
1432
1433  int last1 = max_lines == 3 ? last : last - 1;
1434  while (!is_width_ok (max_lines, max_len, tlen, last1))
1435    max_len++;
1436  hitem->width = max_len + gap;
1437
1438  char *legends[3];
1439  legends[0] = hitem->legend1;
1440  legends[1] = hitem->legend2;
1441  legends[2] = hitem->legend3;
1442  for (int i = 0, ind = 0; i < 3; i++)
1443    {
1444      char *str = legends[i];
1445      *str = 0;
1446      for (; ind <= last; ind++)
1447	{
1448	  if (*unit && (ind == last))
1449	    {
1450	      // Try to put 'unit' in 'legend3'
1451	      if (i != 2)
1452		{
1453		  tok[last] = unit; // restore a formated 'unit'
1454		  break;
1455		}
1456	    }
1457	  size_t len = strlen (str);
1458	  if (len != 0)
1459	    {
1460	      if (len + 1 + tlen[ind] > max_len)
1461		break;
1462	      snprintf (str + len, MAX_LEN - len, NTXT (" %s"), tok[ind]);
1463	    }
1464	  else
1465	    {
1466	      if (len + tlen[ind] > max_len)
1467		break;
1468	      snprintf (str + len, MAX_LEN - len, NTXT ("%s"), tok[ind]);
1469	    }
1470	}
1471    }
1472}
1473
1474int
1475Metric::get_real_visbits ()
1476{
1477  int v = visbits;
1478  if (!is_time_val () && (visbits & (VAL_TIMEVAL | VAL_VALUE)) != 0)
1479    {
1480      v &= ~(VAL_TIMEVAL | VAL_VALUE);
1481      v |= (get_value_styles () & (VAL_TIMEVAL | VAL_VALUE));
1482    }
1483  return v;
1484}
1485
1486char *
1487Metric::get_vis_string (int vis)
1488{
1489  char *vis_str;
1490  if (subtype == STATIC)
1491    vis_str = NTXT ("");
1492  else
1493    {
1494      int v;
1495      if (is_time_val ())
1496	v = vis & (VAL_TIMEVAL | VAL_VALUE | VAL_PERCENT);
1497      else
1498	{
1499	  v = vis & VAL_PERCENT;
1500	  if ((vis & (VAL_TIMEVAL | VAL_VALUE)) != 0)
1501	    v |= (get_value_styles () & (VAL_TIMEVAL | VAL_VALUE));
1502	}
1503      switch (v)
1504	{
1505	case VAL_TIMEVAL:
1506	  vis_str = NTXT (".");
1507	  break;
1508	case VAL_VALUE:
1509	  vis_str = NTXT ("+");
1510	  break;
1511	case VAL_TIMEVAL | VAL_VALUE:
1512	  vis_str = NTXT (".+");
1513	  break;
1514	case VAL_PERCENT:
1515	  vis_str = NTXT ("%");
1516	  break;
1517	case VAL_TIMEVAL | VAL_PERCENT:
1518	  vis_str = NTXT (".%");
1519	  break;
1520	case VAL_VALUE | VAL_PERCENT:
1521	  vis_str = NTXT ("+%");
1522	  break;
1523	case VAL_TIMEVAL | VAL_VALUE | VAL_PERCENT:
1524	  vis_str = NTXT (".+%");
1525	  break;
1526	default:
1527	  vis_str = NTXT ("!");
1528	  break;
1529	}
1530    }
1531  return vis_str;
1532}
1533
1534char *
1535Metric::get_vis_str ()
1536{
1537  char *vis_str = NULL;
1538  if (visbits == -1)
1539    {
1540      // unitialized, return all possible with a trailing -
1541      if (subtype == STATIC)
1542	vis_str = NTXT (".-");
1543      else if (is_time_val ())
1544	vis_str = NTXT (".+%-");
1545      else
1546	vis_str = NTXT (".%-");
1547    }
1548  else
1549    vis_str = get_vis_string (get_real_visbits ());
1550  return vis_str;
1551}
1552
1553void
1554Metric::set_dmetrics_visbits (int dmetrics_visbits)
1555{
1556  visbits = VAL_NA; // clear global state
1557
1558  // process the "show" bits
1559  int _visbits = dmetrics_visbits & ~VAL_HIDE_ALL;
1560  assert (_visbits != -1);
1561  if (_visbits == 0)
1562    return; // done.  (Ignore VAL_HIDE_ALL since there's nothing to hide.)
1563  if (get_subtype () == STATIC)
1564    // percent, time value not applicable
1565    visbits = VAL_VALUE;
1566  else
1567    {
1568      // now or in the bits, but manage . and + according to the is_time_val setting
1569      if (is_time_val () == 0)
1570	{
1571	  if ((_visbits & VAL_VALUE) || (_visbits & VAL_TIMEVAL))
1572	    visbits |= VAL_VALUE;
1573	}
1574      else
1575	visbits |= (_visbits & (VAL_VALUE | VAL_TIMEVAL));
1576      visbits |= (_visbits & (VAL_PERCENT | VAL_RATIO | VAL_DELTA));
1577    }
1578  // process the "hide" bit
1579  if (dmetrics_visbits & VAL_HIDE_ALL)
1580    visbits |= VAL_HIDE_ALL;
1581}
1582
1583void
1584Metric::set_vvisible (bool set)
1585{
1586  if (set)
1587    {
1588      visbits |= VAL_VALUE;
1589      visbits &= ~VAL_HIDE_ALL;
1590    }
1591  else
1592    visbits &= ~VAL_VALUE;
1593}
1594
1595void
1596Metric::set_tvisible (bool set)
1597{
1598  if (set)
1599    {
1600      visbits |= VAL_TIMEVAL;
1601      visbits &= ~VAL_HIDE_ALL;
1602    }
1603  else
1604    visbits &= ~VAL_TIMEVAL;
1605}
1606
1607void
1608Metric::set_pvisible (bool set)
1609{
1610  if (set)
1611    {
1612      visbits |= VAL_PERCENT;
1613      visbits &= ~VAL_HIDE_ALL;
1614    }
1615  else
1616    visbits &= ~VAL_PERCENT;
1617}
1618
1619char *
1620Metric::get_mcmd (bool allPossible)
1621{
1622  char *sc = NTXT (""); // subtype == STATIC
1623  char *hide;
1624  char *vis = get_vis_string (allPossible ? get_value_styles ()
1625			      : get_real_visbits ());
1626  if (subtype == INCLUSIVE)
1627    sc = NTXT ("i");
1628  else if (subtype == EXCLUSIVE)
1629    sc = NTXT ("e");
1630  else if (subtype == ATTRIBUTED)
1631    sc = NTXT ("a");
1632  else if (subtype == DATASPACE)
1633    sc = NTXT ("d");
1634  if (allPossible)
1635    hide = NTXT ("");
1636  else if (visbits == VAL_NA || (visbits & VAL_HIDE_ALL) != 0)
1637    hide = NTXT ("!");
1638  else
1639    hide = NTXT ("");
1640
1641  char *mcmd = get_cmd ();
1642  return dbe_sprintf (GTXT ("%s%s%s%s"), sc, hide, vis, mcmd);
1643}
1644
1645char *
1646Metric::dump ()
1647{
1648  int len = 4;
1649  BaseMetric *bm = (BaseMetric *) this;
1650  char *s = bm->dump ();
1651  char *msg = dbe_sprintf ("%s\n%*c subtype=%d time_val=%d vis=%d tvis=%d"
1652			   " pvis=%d\n%*c abbr='%s' cmd='%s' name='%s'\n",
1653			   STR (s), len, ' ', get_subtype (), is_time_val (),
1654			   is_visible (), is_tvisible (), is_pvisible (),
1655			   len, ' ', STR (get_abbr ()), STR (get_cmd ()),
1656			   STR (get_name ()));
1657  free (s);
1658  return msg;
1659}
1660
1661