blob: 0ad269a23833dd6de9a1fab1a2c81c59949139cf [file] [log] [blame]
/* 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);
}