systemc: Add some error checks to sc_export.
authorGabe Black <gabeblack@google.com>
Sat, 22 Sep 2018 12:34:37 +0000 (05:34 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 16 Oct 2018 00:26:45 +0000 (00:26 +0000)
Change-Id: Ib0c14a5c7dad37b33d61c9b406f6b84121d94e46
Reviewed-on: https://gem5-review.googlesource.com/c/12965
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/ext/core/sc_export.hh
src/systemc/tests/systemc/communication/sc_export/test02/expected_returncode [new file with mode: 0644]
src/systemc/tests/systemc/communication/sc_export/test04/expected_returncode [new file with mode: 0644]

index e8bf0d911589d623734971a5551d626fd54dab27..e36e34ae918fe54d9a7717e0affe878f03c9db02 100644 (file)
@@ -30,6 +30,7 @@
 #ifndef __SYSTEMC_EXT_CORE_SC_EXPORT_HH__
 #define __SYSTEMC_EXT_CORE_SC_EXPORT_HH__
 
+#include "../utils/sc_report_handler.hh"
 #include "sc_module.hh" // for sc_gen_unique_name
 #include "sc_object.hh"
 
@@ -71,19 +72,58 @@ class sc_export : public sc_export_base
     virtual const char *kind() const { return "sc_export"; }
 
     void operator () (IF &i) { bind(i); }
-    virtual void bind(IF &i) { interface = &i; }
-    operator IF & () { return *interface; }
+    virtual void
+    bind(IF &i)
+    {
+        if (interface) {
+            SC_REPORT_ERROR("(E126) sc_export instance already bound", name());
+            return;
+        }
+        interface = &i;
+    }
+    operator IF & ()
+    {
+        if (!interface) {
+            SC_REPORT_ERROR("(E120) sc_export instance has no interface",
+                    name());
+        }
+        return *interface;
+    }
     operator const IF & () const { return *interface; }
 
-    IF *operator -> () { return interface; }
-    const IF *operator -> () const { return interface; }
+    IF *
+    operator -> ()
+    {
+        if (!interface) {
+            SC_REPORT_ERROR("(E120) sc_export instance has no interface",
+                    name());
+        }
+        return interface;
+    }
+    const IF *
+    operator -> () const
+    {
+        if (!interface) {
+            SC_REPORT_ERROR("(E120) sc_export instance has no interface",
+                    name());
+        }
+        return interface;
+    }
 
     sc_interface *get_iterface() override { return interface; }
     const sc_interface *get_interface() const override { return interface; }
 
   protected:
     void before_end_of_elaboration() {}
-    void end_of_elaboration() {}
+    void
+    end_of_elaboration()
+    {
+        if (!interface) {
+            std::string msg = "export not bound: export '";
+            msg = msg + name() + "' (" + kind() + ")";
+            SC_REPORT_ERROR("(E109) complete binding failed", msg.c_str());
+        }
+    }
     void start_of_simulation() {}
     void end_of_simulation() {}
 
diff --git a/src/systemc/tests/systemc/communication/sc_export/test02/expected_returncode b/src/systemc/tests/systemc/communication/sc_export/test02/expected_returncode
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1
diff --git a/src/systemc/tests/systemc/communication/sc_export/test04/expected_returncode b/src/systemc/tests/systemc/communication/sc_export/test04/expected_returncode
new file mode 100644 (file)
index 0000000..d00491f
--- /dev/null
@@ -0,0 +1 @@
+1