sim: Add some helpers to catch and reporting using unbound ports.

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>
This commit is contained in:
Gabe Black
2020-06-12 21:28:12 -07:00
parent 5d80780f89
commit d3024accaf
2 changed files with 13 additions and 0 deletions

View File

@@ -45,7 +45,16 @@
#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());
}

View File

@@ -63,6 +63,10 @@ class Port
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.