xref: /netbsd-src/external/gpl3/binutils.old/dist/gprofng/src/UserLabel.cc (revision c42dbd0ed2e61fe6eda8590caa852ccf34719964)
1*c42dbd0eSchristos /* Copyright (C) 2021 Free Software Foundation, Inc.
2*c42dbd0eSchristos    Contributed by Oracle.
3*c42dbd0eSchristos 
4*c42dbd0eSchristos    This file is part of GNU Binutils.
5*c42dbd0eSchristos 
6*c42dbd0eSchristos    This program is free software; you can redistribute it and/or modify
7*c42dbd0eSchristos    it under the terms of the GNU General Public License as published by
8*c42dbd0eSchristos    the Free Software Foundation; either version 3, or (at your option)
9*c42dbd0eSchristos    any later version.
10*c42dbd0eSchristos 
11*c42dbd0eSchristos    This program is distributed in the hope that it will be useful,
12*c42dbd0eSchristos    but WITHOUT ANY WARRANTY; without even the implied warranty of
13*c42dbd0eSchristos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*c42dbd0eSchristos    GNU General Public License for more details.
15*c42dbd0eSchristos 
16*c42dbd0eSchristos    You should have received a copy of the GNU General Public License
17*c42dbd0eSchristos    along with this program; if not, write to the Free Software
18*c42dbd0eSchristos    Foundation, 51 Franklin Street - Fifth Floor, Boston,
19*c42dbd0eSchristos    MA 02110-1301, USA.  */
20*c42dbd0eSchristos 
21*c42dbd0eSchristos #include "config.h"
22*c42dbd0eSchristos #include <time.h>
23*c42dbd0eSchristos 
24*c42dbd0eSchristos #include "DbeSession.h"
25*c42dbd0eSchristos #include "Expression.h"
26*c42dbd0eSchristos #include "StringBuilder.h"
27*c42dbd0eSchristos #include "util.h"
28*c42dbd0eSchristos #include "UserLabel.h"
29*c42dbd0eSchristos #include "debug.h"
30*c42dbd0eSchristos 
31*c42dbd0eSchristos int UserLabel::last_id = 0;
32*c42dbd0eSchristos 
UserLabel(char * _name)33*c42dbd0eSchristos UserLabel::UserLabel (char *_name)
34*c42dbd0eSchristos {
35*c42dbd0eSchristos   name = dbe_strdup (_name);
36*c42dbd0eSchristos   comment = str_expr = all_times = hostname = NULL;
37*c42dbd0eSchristos   start_f = stop_f = false;
38*c42dbd0eSchristos   expr = NULL;
39*c42dbd0eSchristos   start_tv.tv_sec = 0;
40*c42dbd0eSchristos   start_tv.tv_usec = 0;
41*c42dbd0eSchristos   atime = timeStart = timeStop = start_sec = start_hrtime = 0;
42*c42dbd0eSchristos   relative = REL_TIME;
43*c42dbd0eSchristos   id = ++last_id;
44*c42dbd0eSchristos }
45*c42dbd0eSchristos 
~UserLabel()46*c42dbd0eSchristos UserLabel::~UserLabel ()
47*c42dbd0eSchristos {
48*c42dbd0eSchristos   free (name);
49*c42dbd0eSchristos   free (comment);
50*c42dbd0eSchristos   free (all_times);
51*c42dbd0eSchristos   free (hostname);
52*c42dbd0eSchristos   free (str_expr);
53*c42dbd0eSchristos   delete expr;
54*c42dbd0eSchristos }
55*c42dbd0eSchristos 
56*c42dbd0eSchristos void
gen_expr()57*c42dbd0eSchristos UserLabel::gen_expr ()
58*c42dbd0eSchristos {
59*c42dbd0eSchristos   if (!start_f && !stop_f)
60*c42dbd0eSchristos     return;
61*c42dbd0eSchristos   StringBuilder sb;
62*c42dbd0eSchristos   sb.append ('(');
63*c42dbd0eSchristos   if (str_expr)
64*c42dbd0eSchristos     {
65*c42dbd0eSchristos       sb.append (str_expr);
66*c42dbd0eSchristos       sb.append (NTXT (" || ("));
67*c42dbd0eSchristos     }
68*c42dbd0eSchristos   if (start_f)
69*c42dbd0eSchristos     {
70*c42dbd0eSchristos       sb.append (NTXT ("TSTAMP"));
71*c42dbd0eSchristos       sb.append (NTXT (">="));
72*c42dbd0eSchristos       sb.append (timeStart);
73*c42dbd0eSchristos       if (stop_f)
74*c42dbd0eSchristos 	{
75*c42dbd0eSchristos 	  sb.append (NTXT (" && "));
76*c42dbd0eSchristos 	}
77*c42dbd0eSchristos     }
78*c42dbd0eSchristos   if (stop_f)
79*c42dbd0eSchristos     {
80*c42dbd0eSchristos       sb.append (NTXT ("TSTAMP"));
81*c42dbd0eSchristos       sb.append ('<');
82*c42dbd0eSchristos       sb.append (timeStop);
83*c42dbd0eSchristos     }
84*c42dbd0eSchristos   sb.append (')');
85*c42dbd0eSchristos   if (str_expr)
86*c42dbd0eSchristos     {
87*c42dbd0eSchristos       sb.append (')');
88*c42dbd0eSchristos       delete str_expr;
89*c42dbd0eSchristos     }
90*c42dbd0eSchristos   str_expr = sb.toString ();
91*c42dbd0eSchristos   start_f = stop_f = false;
92*c42dbd0eSchristos }
93*c42dbd0eSchristos 
94*c42dbd0eSchristos void
register_user_label(int groupId)95*c42dbd0eSchristos UserLabel::register_user_label (int groupId)
96*c42dbd0eSchristos {
97*c42dbd0eSchristos   gen_expr ();
98*c42dbd0eSchristos   if (str_expr)
99*c42dbd0eSchristos     {
100*c42dbd0eSchristos       char *old_str = str_expr;
101*c42dbd0eSchristos       str_expr = dbe_sprintf (NTXT ("(EXPGRID==%d && %s)"), groupId, old_str);
102*c42dbd0eSchristos       delete old_str;
103*c42dbd0eSchristos       UserLabel *ulbl = dbeSession->findUserLabel (name);
104*c42dbd0eSchristos       if (ulbl)
105*c42dbd0eSchristos 	{
106*c42dbd0eSchristos 	  old_str = ulbl->str_expr;
107*c42dbd0eSchristos 	  ulbl->str_expr = dbe_sprintf (NTXT ("(%s || %s)"), old_str, str_expr);
108*c42dbd0eSchristos 	  delete old_str;
109*c42dbd0eSchristos 	  if (comment)
110*c42dbd0eSchristos 	    {
111*c42dbd0eSchristos 	      if (ulbl->comment)
112*c42dbd0eSchristos 		{
113*c42dbd0eSchristos 		  old_str = ulbl->comment;
114*c42dbd0eSchristos 		  ulbl->comment = dbe_sprintf (NTXT ("%s; %s"), old_str, comment);
115*c42dbd0eSchristos 		  delete old_str;
116*c42dbd0eSchristos 		}
117*c42dbd0eSchristos 	      else
118*c42dbd0eSchristos 		ulbl->comment = dbe_strdup (comment);
119*c42dbd0eSchristos 	    }
120*c42dbd0eSchristos 	  delete ulbl->expr;
121*c42dbd0eSchristos 	  ulbl->expr = dbeSession->ql_parse (ulbl->str_expr);
122*c42dbd0eSchristos 	}
123*c42dbd0eSchristos       else
124*c42dbd0eSchristos 	{
125*c42dbd0eSchristos 	  expr = dbeSession->ql_parse (str_expr);
126*c42dbd0eSchristos 	  dbeSession->append (this);
127*c42dbd0eSchristos 	}
128*c42dbd0eSchristos     }
129*c42dbd0eSchristos }
130*c42dbd0eSchristos 
131*c42dbd0eSchristos char *
dump()132*c42dbd0eSchristos UserLabel::dump ()
133*c42dbd0eSchristos {
134*c42dbd0eSchristos   StringBuilder sb;
135*c42dbd0eSchristos   sb.append (name);
136*c42dbd0eSchristos   if (str_expr)
137*c42dbd0eSchristos     {
138*c42dbd0eSchristos       sb.append (NTXT ("  str_expr='"));
139*c42dbd0eSchristos       sb.append (str_expr);
140*c42dbd0eSchristos       sb.append ('\'');
141*c42dbd0eSchristos     }
142*c42dbd0eSchristos   if (all_times)
143*c42dbd0eSchristos     {
144*c42dbd0eSchristos       sb.append (NTXT (" atime="));
145*c42dbd0eSchristos       sb.append ((unsigned int) (atime / NANOSEC));
146*c42dbd0eSchristos       sb.append ('.');
147*c42dbd0eSchristos       char buf[128];
148*c42dbd0eSchristos       snprintf (buf, sizeof (buf), NTXT ("%09llu"), (unsigned long long) (atime % NANOSEC));
149*c42dbd0eSchristos       sb.append (buf);
150*c42dbd0eSchristos       sb.append (NTXT ("  all_times='"));
151*c42dbd0eSchristos       sb.append (all_times);
152*c42dbd0eSchristos       sb.append ('\'');
153*c42dbd0eSchristos     }
154*c42dbd0eSchristos   if (comment)
155*c42dbd0eSchristos     {
156*c42dbd0eSchristos       sb.append (NTXT ("  comment='"));
157*c42dbd0eSchristos       sb.append (comment);
158*c42dbd0eSchristos       sb.append ('\'');
159*c42dbd0eSchristos     }
160*c42dbd0eSchristos   return sb.toString ();
161*c42dbd0eSchristos }
162*c42dbd0eSchristos 
163*c42dbd0eSchristos void
dump(const char * msg,Vector<UserLabel * > * labels)164*c42dbd0eSchristos UserLabel::dump (const char *msg, Vector<UserLabel*> *labels)
165*c42dbd0eSchristos {
166*c42dbd0eSchristos   if (!DUMP_USER_LABELS)
167*c42dbd0eSchristos     return;
168*c42dbd0eSchristos   if (msg)
169*c42dbd0eSchristos     fprintf (stderr, NTXT ("%s\n"), msg);
170*c42dbd0eSchristos   for (int i = 0, sz = labels ? labels->size () : 0; i < sz; i++)
171*c42dbd0eSchristos     {
172*c42dbd0eSchristos       UserLabel *lbl = labels->fetch (i);
173*c42dbd0eSchristos       char *s = lbl->dump ();
174*c42dbd0eSchristos       fprintf (stderr, NTXT ("%2d %s\n"), i, s);
175*c42dbd0eSchristos       delete s;
176*c42dbd0eSchristos     }
177*c42dbd0eSchristos }
178