sim: Add some helpers to catch and reporting using unbound ports.
authorGabe Black <gabeblack@google.com>
Sat, 13 Jun 2020 04:28:12 +0000 (21:28 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 16 Jun 2020 02:35:41 +0000 (02:35 +0000)
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>
src/sim/port.cc
src/sim/port.hh

index 7ca8db67b4c630c8cab65fd8d0ca13e7d4f3b0e6..9131f84b6eb00b13a1f32a42c2874d1452b9d14f 100644 (file)
 
 #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());
+}
index 251624c5b912248b9b851227d173513312913164..85472d09bb6c23ad3179e44561c2ba1e8f1e9448 100644 (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.