stats: Fix incorrect name conflict panic with grouped stats
Info::setName() performs a sanity check to ensure that the same stat name isn't used twice. This doesn't work for new-style stats with a parent group since the name is only unique within the group. Disable the check for new-style stats since these usually use names generated from member variable names. Change-Id: I590abe6040407c6a4fe582c0782a418165ff5588 Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20760 Maintainer: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
@@ -202,20 +202,26 @@ validateStatName(const string &name)
|
||||
|
||||
void
|
||||
Info::setName(const string &name)
|
||||
{
|
||||
setName(nullptr, name);
|
||||
}
|
||||
|
||||
void
|
||||
Info::setName(const Group *parent, const string &name)
|
||||
{
|
||||
if (!validateStatName(name))
|
||||
panic("invalid stat name '%s'", name);
|
||||
|
||||
pair<NameMapType::iterator, bool> p =
|
||||
nameMap().insert(make_pair(name, this));
|
||||
// We only register the stat with the nameMap() if we are using
|
||||
// old-style stats without a parent group. New-style stats should
|
||||
// be unique since their names should correspond to a member
|
||||
// variable.
|
||||
if (!parent) {
|
||||
auto p = nameMap().insert(make_pair(name, this));
|
||||
|
||||
Info *other = p.first->second;
|
||||
bool result = p.second;
|
||||
|
||||
if (!result) {
|
||||
// using other->name instead of just name to avoid a compiler
|
||||
// warning. They should be the same.
|
||||
panic("same statistic name used twice! name=%s\n", other->name);
|
||||
if (!p.second)
|
||||
panic("same statistic name used twice! name=%s\n",
|
||||
name);
|
||||
}
|
||||
|
||||
this->name = name;
|
||||
|
||||
@@ -262,7 +262,7 @@ class DataWrap : public InfoAccess
|
||||
parent->addStat(info);
|
||||
|
||||
if (name) {
|
||||
info->setName(name);
|
||||
info->setName(parent, name);
|
||||
info->flags.set(display);
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
|
||||
namespace Stats {
|
||||
|
||||
class Group;
|
||||
|
||||
typedef uint16_t FlagsType;
|
||||
typedef ::Flags<FlagsType> Flags;
|
||||
|
||||
@@ -97,6 +99,7 @@ class Info
|
||||
|
||||
/** Set the name of this statistic */
|
||||
void setName(const std::string &name);
|
||||
void setName(const Group *parent, const std::string &name);
|
||||
void setSeparator(std::string _sep) { separatorString = _sep;}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user