| /* Copyright (C) 2021-2024 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); | |
| } |