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