summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGiacomo Travaglini <giacomo.travaglini@arm.com>2018-10-17 18:08:30 +0100
committerGiacomo Travaglini <giacomo.travaglini@arm.com>2018-11-14 10:13:01 +0000
commite8e92a12af8cc499659ad840c84c99e293ff1e96 (patch)
tree92a4e5ff7a26c99e1d8b9fb031c1e27b5263d597
parent16bf103ad8e2bfbdf200a0ade11cff17dd33e81d (diff)
downloadgem5-e8e92a12af8cc499659ad840c84c99e293ff1e96.tar.xz
sim: Move BitUnion overloading to show/parseParams
This patch is moving template overloading for BitUnions into the showParam, parseParams functions. Henceforth BitUnion types will use the common param wrapper. This patch implicitly implements (UN)SERIALIZE_CONTAINER for BitUnions. Change-Id: I0e1faadb4afd4dc9de5dc5fca40041e349c9ba73 Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/13636 Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
-rw-r--r--src/sim/serialize.hh78
1 files changed, 23 insertions, 55 deletions
diff --git a/src/sim/serialize.hh b/src/sim/serialize.hh
index adaefdd84..543477726 100644
--- a/src/sim/serialize.hh
+++ b/src/sim/serialize.hh
@@ -285,6 +285,29 @@ showParam(CheckpointOut &os, const T &value)
os << value;
}
+template <class T>
+bool
+parseParam(const std::string &s, BitUnionType<T> &value)
+{
+ auto storage = static_cast<BitUnionBaseType<T>>(value);
+ auto res = to_number(s, storage);
+ value = storage;
+ return res;
+}
+
+template <class T>
+void
+showParam(CheckpointOut &os, const BitUnionType<T> &value)
+{
+ auto storage = static_cast<BitUnionBaseType<T>>(value);
+
+ // For a BitUnion8, the storage type is an unsigned char.
+ // Since we want to serialize a number we need to cast to
+ // unsigned int
+ os << ((sizeof(storage) == 1) ?
+ static_cast<unsigned int>(storage) : storage);
+}
+
// Treat 8-bit ints (chars) as ints on output, not as chars
template <>
inline void
@@ -354,13 +377,6 @@ paramOut(CheckpointOut &os, const std::string &name, const T &param)
os << "\n";
}
-template <typename T>
-void
-paramOut(CheckpointOut &cp, const std::string &name, const BitUnionType<T> &p)
-{
- paramOut(cp, name, static_cast<BitUnionBaseType<T> >(p));
-}
-
template <class T>
void
paramIn(CheckpointIn &cp, const std::string &name, T &param)
@@ -372,15 +388,6 @@ paramIn(CheckpointIn &cp, const std::string &name, T &param)
}
}
-template <typename T>
-void
-paramIn(CheckpointIn &cp, const std::string &name, BitUnionType<T> &p)
-{
- BitUnionBaseType<T> b;
- paramIn(cp, name, b);
- p = b;
-}
-
template <class T>
bool
optParamIn(CheckpointIn &cp, const std::string &name,
@@ -397,20 +404,6 @@ optParamIn(CheckpointIn &cp, const std::string &name,
}
}
-template <typename T>
-bool
-optParamIn(CheckpointIn &cp, const std::string &name,
- BitUnionType<T> &p, bool warn = true)
-{
- BitUnionBaseType<T> b;
- if (optParamIn(cp, name, b, warn)) {
- p = b;
- return true;
- } else {
- return false;
- }
-}
-
template <class T>
void
arrayParamOut(CheckpointOut &os, const std::string &name,
@@ -628,31 +621,6 @@ arrayParamIn(CheckpointIn &cp, const std::string &name, std::set<T> &param)
}
}
-template <class T>
-static void
-arrayParamOut(CheckpointOut &cp, const std::string &name,
- const BitUnionType<T> *param, unsigned size)
-{
- // We copy the array into a vector. This is needed since we cannot
- // directly typecast a pointer to BitUnionType<T> into a pointer
- // of BitUnionBaseType<T> but we can typecast BitUnionType<T>
- // to BitUnionBaseType<T> since we overloaded the typecast operator
- std::vector<BitUnionBaseType<T>> bitunion_vec(param, param + size);
-
- arrayParamOut(cp, name, bitunion_vec);
-}
-
-template <class T>
-static void
-arrayParamIn(CheckpointIn &cp, const std::string &name,
- BitUnionType<T> *param, unsigned size)
-{
- std::vector<BitUnionBaseType<T>> bitunion_vec(size);
-
- arrayParamIn(cp, name, bitunion_vec);
- std::copy(bitunion_vec.begin(), bitunion_vec.end(), param);
-}
-
void
debug_serialize(const std::string &cpt_dir);