diff options
author | Andreas Sandberg <andreas.sandberg@arm.com> | 2019-09-06 18:43:31 +0100 |
---|---|---|
committer | Andreas Sandberg <andreas.sandberg@arm.com> | 2019-09-10 15:55:50 +0000 |
commit | eb920362ae7f370028522f72d338573ceb435583 (patch) | |
tree | 82cd196ddc210306370b21c75d981387a7d7c863 /src | |
parent | ebc1caf9e818d046a18919209a2afee55a37caf1 (diff) | |
download | gem5-eb920362ae7f370028522f72d338573ceb435583.tar.xz |
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>
Diffstat (limited to 'src')
-rw-r--r-- | src/base/statistics.cc | 24 | ||||
-rw-r--r-- | src/base/statistics.hh | 2 | ||||
-rw-r--r-- | src/base/stats/info.hh | 3 |
3 files changed, 19 insertions, 10 deletions
diff --git a/src/base/statistics.cc b/src/base/statistics.cc index a186f9763..5e6882c79 100644 --- a/src/base/statistics.cc +++ b/src/base/statistics.cc @@ -203,19 +203,25 @@ 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)); - - Info *other = p.first->second; - bool result = p.second; + // 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)); - 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; diff --git a/src/base/statistics.hh b/src/base/statistics.hh index f4fa123e9..07f295995 100644 --- a/src/base/statistics.hh +++ b/src/base/statistics.hh @@ -262,7 +262,7 @@ class DataWrap : public InfoAccess parent->addStat(info); if (name) { - info->setName(name); + info->setName(parent, name); info->flags.set(display); } diff --git a/src/base/stats/info.hh b/src/base/stats/info.hh index 6ce7376a4..c03b51183 100644 --- a/src/base/stats/info.hh +++ b/src/base/stats/info.hh @@ -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;} /** |