]> Git Repo - binutils.git/blob - gprofng/src/ExpGroup.cc
Automatic date update in version.in
[binutils.git] / gprofng / src / ExpGroup.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 "util.h"
23 #include "ExpGroup.h"
24 #include "Experiment.h"
25 #include "LoadObject.h"
26 #include "DbeSession.h"
27
28 //////////////////////////////////////////////////////////
29 //  class ExpGroup
30
31 int ExpGroup::phaseCompareIdx = 0;
32
33 ExpGroup::ExpGroup (char *nm)
34 {
35   name = dbe_strdup (nm);
36   canonical_path (name);
37   exps = new Vector<Experiment*>;
38   founder = NULL;
39   groupId = 0;
40   phaseCompareIdx++;
41   loadObjs = NULL;
42   loadObjsMap = NULL;
43 }
44
45 ExpGroup::~ExpGroup ()
46 {
47   phaseCompareIdx++;
48   free (name);
49   delete exps;
50   delete loadObjs;
51   delete loadObjsMap;
52 }
53
54 void
55 ExpGroup::append (Experiment *exp)
56 {
57   for (int i = 0, sz = exps->size (); i < sz; i++)
58     {
59       Experiment *e = exps->fetch (i);
60       if (exp == e)
61         return;
62     }
63   exps->append (exp);
64   if (exps->size () == 1)
65     founder = exp;
66 }
67
68 void
69 ExpGroup::drop_experiment (Experiment *exp)
70 {
71   for (int i = 0, sz = exps->size (); i < sz; i++)
72     {
73       Experiment *e = exps->fetch (i);
74       if (exp == e)
75         {
76           exps->remove (i);
77           break;
78         }
79     }
80   if (founder == exp)
81     founder = NULL;
82 }
83
84 Vector<Experiment*> *
85 ExpGroup::get_founders ()
86 {
87   Vector<Experiment*> *expList = NULL;
88   for (int i = 0, sz = exps ? exps->size () : 0; i < sz; i++)
89     {
90       Experiment *exp = exps->fetch (i);
91       if (exp->founder_exp == NULL)
92         {
93           if (expList == NULL)
94             expList = new Vector<Experiment*>;
95           expList->append (exp);
96         }
97     }
98   return expList;
99 }
100
101 void
102 ExpGroup::create_list_of_loadObjects ()
103 {
104   if (loadObjs == NULL)
105     {
106       loadObjs = new Vector<LoadObject*>();
107       loadObjsMap = new DefaultMap<LoadObject*, int>();
108       for (int i = 0, sz = exps ? exps->size () : 0; i < sz; i++)
109         {
110           Experiment *exp = exps->fetch (i);
111           for (int i1 = 0, sz1 = VecSize(exp->loadObjs); i1 < sz1; i1++)
112             {
113               LoadObject *lo = exp->loadObjs->fetch (i1);
114               if (!loadObjsMap->get (lo))
115                 {
116                   loadObjs->append (lo);
117                   loadObjsMap->put (lo, loadObjs->size ());
118                 }
119             }
120         }
121     }
122 }
123
124 LoadObject *
125 ExpGroup::get_comparable_loadObject (LoadObject *lo)
126 {
127   create_list_of_loadObjects ();
128   if (loadObjsMap->get (lo))
129     return lo;
130   if ((lo->flags & SEG_FLAG_EXE) != 0)
131     if (dbeSession->expGroups->size () == dbeSession->nexps ())
132       for (int i = 0, sz = loadObjs ? loadObjs->size () : 0; i < sz; i++)
133         {
134           LoadObject *lobj = loadObjs->fetch (i);
135           if ((lobj->flags & SEG_FLAG_EXE) != 0)
136             return lobj;
137         }
138
139   long first_ind = -1;
140   char *bname = get_basename (lo->get_pathname ());
141   for (long i = 0, sz = loadObjs ? loadObjs->size () : 0; i < sz; i++)
142     {
143       LoadObject *lobj = loadObjs->get (i);
144       if (lobj->comparable_objs == NULL
145           && strcmp (bname, get_basename (lobj->get_pathname ())) == 0)
146         {
147           if (lo->platform == lobj->platform)
148             {
149               if ((lo->flags & SEG_FLAG_DYNAMIC) != 0)
150                 {
151                   if (dbe_strcmp (lo->firstExp->uarglist,
152                                   lobj->firstExp->uarglist) == 0)
153                     return lobj;
154                 }
155               else
156                 return lobj;
157             }
158           if (first_ind == -1)
159             first_ind = i;
160         }
161     }
162   return first_ind == -1 ? NULL : loadObjs->get (first_ind);
163 }
This page took 0.043538 seconds and 4 git commands to generate.