If a port is unbound, trying to call its peer will likely cause a
segfault. Rather than check if a port is bound every time you go to use
it, we can instead bind to a default peer which just throws an exception
back to the caller. The caller can catch the exception and report the
error.
This change adds a common new class to throw as the exception, and also
a small utility function which reports the error and dies.
Change-Id: Ia58a2030922c73e2fd7d139822bce38d9b0f2171
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/30295
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
#include "sim/port.hh"
+#include "base/logging.hh"
+
Port::Port(const std::string& _name, PortID _id) :
portName(_name), id(_id), _peer(nullptr), _connected(false)
{}
Port::~Port() {}
+
+
+void
+Port::reportUnbound() const
+{
+ fatal("%s: Unconnected port!", name());
+}
protected:
+ class UnboundPortException {};
+
+ [[noreturn]] void reportUnbound() const;
+
/**
* A numeric identifier to distinguish ports in a vector, and set
* to InvalidPortID in case this port is not part of a vector.