1 /* Copyright (C) 2021 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 
Metric(BaseMetric * item,SubType st)33 Metric::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 
Metric(const Metric & item)45 Metric::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 
~Metric()55 Metric::~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 
66 ValueTag
get_vtype2()67 Metric::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 
93 void
set_subtype(SubType st)94 Metric::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 
1279 static bool
is_width_ok(int lines,size_t width,size_t * tlen,int last)1280 is_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 
1298 void
legend_width(HistMetric * hitem,int gap)1299 Metric::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 
1474 int
get_real_visbits()1475 Metric::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 
1486 char *
get_vis_string(int vis)1487 Metric::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 
1534 char *
get_vis_str()1535 Metric::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 
1553 void
set_dmetrics_visbits(int dmetrics_visbits)1554 Metric::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 
1583 void
set_vvisible(bool set)1584 Metric::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 
1595 void
set_tvisible(bool set)1596 Metric::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 
1607 void
set_pvisible(bool set)1608 Metric::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 
1619 char *
get_mcmd(bool allPossible)1620 Metric::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 
1645 char *
dump()1646 Metric::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