summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2019-09-06 18:43:31 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2019-09-10 15:55:50 +0000
commiteb920362ae7f370028522f72d338573ceb435583 (patch)
tree82cd196ddc210306370b21c75d981387a7d7c863
parentebc1caf9e818d046a18919209a2afee55a37caf1 (diff)
downloadgem5-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>
-rw-r--r--src/base/statistics.cc24
-rw-r--r--src/base/statistics.hh2
-rw-r--r--src/base/stats/info.hh3
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;}
/**