/* Copyright (C) 2021-2023 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; 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 * ExpGroup::get_founders () { Vector *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; expList->append (exp); } } return expList; } void ExpGroup::create_list_of_loadObjects () { if (loadObjs == NULL) { loadObjs = new Vector(); loadObjsMap = new DefaultMap(); 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); }