diff options
Diffstat (limited to 'gprofng/src/ExpGroup.cc')
-rw-r--r-- | gprofng/src/ExpGroup.cc | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/gprofng/src/ExpGroup.cc b/gprofng/src/ExpGroup.cc new file mode 100644 index 0000000..0ad269a --- /dev/null +++ b/gprofng/src/ExpGroup.cc @@ -0,0 +1,163 @@ +/* Copyright (C) 2021 Free Software Foundation, Inc. + Contributed by Oracle. + + This file is part of GNU Binutils. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "config.h" +#include "util.h" +#include "ExpGroup.h" +#include "Experiment.h" +#include "LoadObject.h" +#include "DbeSession.h" + +////////////////////////////////////////////////////////// +// class ExpGroup + +int ExpGroup::phaseCompareIdx = 0; + +ExpGroup::ExpGroup (char *nm) +{ + name = dbe_strdup (nm); + canonical_path (name); + exps = new Vector<Experiment*>; + founder = NULL; + groupId = 0; + phaseCompareIdx++; + loadObjs = NULL; + loadObjsMap = NULL; +} + +ExpGroup::~ExpGroup () +{ + phaseCompareIdx++; + free (name); + delete exps; + delete loadObjs; + delete loadObjsMap; +} + +void +ExpGroup::append (Experiment *exp) +{ + for (int i = 0, sz = exps->size (); i < sz; i++) + { + Experiment *e = exps->fetch (i); + if (exp == e) + return; + } + exps->append (exp); + if (exps->size () == 1) + founder = exp; +} + +void +ExpGroup::drop_experiment (Experiment *exp) +{ + for (int i = 0, sz = exps->size (); i < sz; i++) + { + Experiment *e = exps->fetch (i); + if (exp == e) + { + exps->remove (i); + break; + } + } + if (founder == exp) + founder = NULL; +} + +Vector<Experiment*> * +ExpGroup::get_founders () +{ + Vector<Experiment*> *expList = NULL; + for (int i = 0, sz = exps ? exps->size () : 0; i < sz; i++) + { + Experiment *exp = exps->fetch (i); + if (exp->founder_exp == NULL) + { + if (expList == NULL) + expList = new Vector<Experiment*>; + expList->append (exp); + } + } + return expList; +} + +void +ExpGroup::create_list_of_loadObjects () +{ + if (loadObjs == NULL) + { + loadObjs = new Vector<LoadObject*>(); + loadObjsMap = new DefaultMap<LoadObject*, int>(); + for (int i = 0, sz = exps ? exps->size () : 0; i < sz; i++) + { + Experiment *exp = exps->fetch (i); + for (int i1 = 0, sz1 = VecSize(exp->loadObjs); i1 < sz1; i1++) + { + LoadObject *lo = exp->loadObjs->fetch (i1); + if (!loadObjsMap->get (lo)) + { + loadObjs->append (lo); + loadObjsMap->put (lo, loadObjs->size ()); + } + } + } + } +} + +LoadObject * +ExpGroup::get_comparable_loadObject (LoadObject *lo) +{ + create_list_of_loadObjects (); + if (loadObjsMap->get (lo)) + return lo; + if ((lo->flags & SEG_FLAG_EXE) != 0) + if (dbeSession->expGroups->size () == dbeSession->nexps ()) + for (int i = 0, sz = loadObjs ? loadObjs->size () : 0; i < sz; i++) + { + LoadObject *lobj = loadObjs->fetch (i); + if ((lobj->flags & SEG_FLAG_EXE) != 0) + return lobj; + } + + long first_ind = -1; + char *bname = get_basename (lo->get_pathname ()); + for (long i = 0, sz = loadObjs ? loadObjs->size () : 0; i < sz; i++) + { + LoadObject *lobj = loadObjs->get (i); + if (lobj->comparable_objs == NULL + && strcmp (bname, get_basename (lobj->get_pathname ())) == 0) + { + if (lo->platform == lobj->platform) + { + if ((lo->flags & SEG_FLAG_DYNAMIC) != 0) + { + if (dbe_strcmp (lo->firstExp->uarglist, + lobj->firstExp->uarglist) == 0) + return lobj; + } + else + return lobj; + } + if (first_ind == -1) + first_ind = i; + } + } + return first_ind == -1 ? NULL : loadObjs->get (first_ind); +} |