]> Git Repo - binutils.git/blob - gprofng/src/Metric.cc
Automatic date update in version.in
[binutils.git] / gprofng / src / Metric.cc
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
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
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
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
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
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
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
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
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 *
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 *
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
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
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
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
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 *
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 *
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
This page took 0.119395 seconds and 4 git commands to generate.