aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2018-01-01 21:29:37 +0100
committerKarel Kočí <cynerd@email.cz>2018-01-01 21:29:37 +0100
commit7cc95c3a57a79864fa60de4827193fa7aadac92c (patch)
treec640ac942c2f395e6f4cef06b6d22b5cdfc878f3
parent7e942e26074107153d4a553df22b83b96ee3deaa (diff)
downloadqtmips-7cc95c3a57a79864fa60de4827193fa7aadac92c.tar.gz
qtmips-7cc95c3a57a79864fa60de4827193fa7aadac92c.tar.bz2
qtmips-7cc95c3a57a79864fa60de4827193fa7aadac92c.zip
Simplify how we define exceptions
Exceptions definition was pretty much just copy and past. That can do preprocessor for us too so use it for it.
-rw-r--r--qtmips_cli/reporter.cpp2
-rw-r--r--qtmips_machine/qtmipsexception.cpp42
-rw-r--r--qtmips_machine/qtmipsexception.h115
3 files changed, 63 insertions, 96 deletions
diff --git a/qtmips_cli/reporter.cpp b/qtmips_cli/reporter.cpp
index 70d1d27..bcb9d65 100644
--- a/qtmips_cli/reporter.cpp
+++ b/qtmips_cli/reporter.cpp
@@ -48,7 +48,7 @@ void Reporter::machine_trap(QtMipsException &e) {
else if (etype == typeid(QtMipsExceptionUnalignedJump))
expected = e_fail & FR_J;
- cout << "Machine trapped: " << e.what() << endl;
+ cout << "Machine trapped: " << e.msg(false).toStdString() << endl;
app->exit(expected ? 0 : 1);
}
diff --git a/qtmips_machine/qtmipsexception.cpp b/qtmips_machine/qtmipsexception.cpp
index d2b0622..278fbc8 100644
--- a/qtmips_machine/qtmipsexception.cpp
+++ b/qtmips_machine/qtmipsexception.cpp
@@ -4,7 +4,8 @@
using namespace machine;
-QtMipsException::QtMipsException(QTMIPS_ARGS_COMMON) {
+QtMipsException::QtMipsException(QString reason, QString ext, QString file, int line) {
+ this->name = "Exception";
this->reason = reason;
this->ext = ext;
this->file = file;
@@ -20,9 +21,10 @@ const char *QtMipsException::what() const throw() {
QString QtMipsException::msg(bool pos) const {
QString message;
+ message += name;
if (pos)
- message += QString("(") + QString(this->file) + QString(":") + QString::number(this->line) + QString(") ");
- message += this->reason;
+ message += QString(" (") + QString(this->file) + QString(":") + QString::number(this->line) + QString(")");
+ message += ": " + this->reason;
if (!this->ext.isEmpty()) {
message += QString(": ");
message += this->ext;
@@ -30,30 +32,10 @@ QString QtMipsException::msg(bool pos) const {
return message;
}
-
-QtMipsExceptionInput::QtMipsExceptionInput(QTMIPS_ARGS_COMMON)
- : QtMipsException(reason, ext, file, line) { }
-
-QtMipsExceptionRuntime::QtMipsExceptionRuntime(QTMIPS_ARGS_COMMON)
- : QtMipsException(reason, ext, file, line) { }
-
-QtMipsExceptionUnsupportedInstruction::QtMipsExceptionUnsupportedInstruction(QTMIPS_ARGS_COMMON)
- : QtMipsExceptionRuntime(reason, ext, file, line) { }
-
-QtMipsExceptionUnsupportedAluOperation::QtMipsExceptionUnsupportedAluOperation(QTMIPS_ARGS_COMMON)
- : QtMipsExceptionRuntime(reason, ext, file, line) { }
-
-QtMipsExceptionOverflow::QtMipsExceptionOverflow(QTMIPS_ARGS_COMMON)
- : QtMipsExceptionRuntime(reason, ext, file, line) { }
-
-QtMipsExceptionUnalignedJump::QtMipsExceptionUnalignedJump(QTMIPS_ARGS_COMMON)
- : QtMipsExceptionRuntime(reason, ext, file, line) { }
-
-QtMipsExceptionUnknownMemoryControl::QtMipsExceptionUnknownMemoryControl(QTMIPS_ARGS_COMMON)
- : QtMipsExceptionRuntime(reason, ext, file, line) { }
-
-QtMipsExceptionOutOfMemoryAccess::QtMipsExceptionOutOfMemoryAccess(QTMIPS_ARGS_COMMON)
- : QtMipsExceptionRuntime(reason, ext, file, line) { }
-
-QtMipsExceptionSanity::QtMipsExceptionSanity(QTMIPS_ARGS_COMMON)
- : QtMipsException(reason, ext, file, line) { }
+#define EXCEPTION(NAME, PARENT) \
+ QtMipsException##NAME::QtMipsException##NAME(QString reason, QString ext, QString file, int line) \
+ : QtMipsException##PARENT(reason, ext, file, line) { \
+ name = #NAME; \
+ }
+QTMIPS_EXCEPTIONS
+#undef EXCEPTION
diff --git a/qtmips_machine/qtmipsexception.h b/qtmips_machine/qtmipsexception.h
index 8cfc9be..db8cf5e 100644
--- a/qtmips_machine/qtmipsexception.h
+++ b/qtmips_machine/qtmipsexception.h
@@ -6,81 +6,66 @@
namespace machine {
-#define QTMIPS_EXCEPTION(TYPE, REASON, EXT) (machine::QtMipsException ## TYPE (QString(REASON), QString(EXT), QString(__FILE__), __LINE__))
-#define QTMIPS_ARGS_COMMON QString reason, QString ext, QString file, int line
+#define QTMIPS_EXCEPTION(TYPE, REASON, EXT) (machine::QtMipsException##TYPE (QString(REASON), QString(EXT), QString(__FILE__), __LINE__))
// Base exception for all machine ones
class QtMipsException : public std::exception {
public:
- QtMipsException(QTMIPS_ARGS_COMMON);
+ QtMipsException(QString reason, QString ext, QString file, int line);
const char *what() const throw();
QString msg(bool pos) const;
protected:
- QString reason, ext, file;
+ QString name, reason, ext, file;
int line;
};
-// Exception durring input loading
-class QtMipsExceptionInput : public QtMipsException {
-public:
- QtMipsExceptionInput(QTMIPS_ARGS_COMMON);
-};
-
-// Exceptions caused by machine invalid input or unsupported action
-class QtMipsExceptionRuntime : public QtMipsException {
-public:
- QtMipsExceptionRuntime(QTMIPS_ARGS_COMMON);
-};
-
-// Decoded instruction is not supported.
-// This can be cause by really using some unimplemented instruction or because of problems in instruction decode.
-class QtMipsExceptionUnsupportedInstruction : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionUnsupportedInstruction(QTMIPS_ARGS_COMMON);
-};
-
-// Decoded ALU operation is not supported
-// This is basically same exception as QtMipsExceptionUnsupportedInstruction but it is emmited from ALU when executed and not before that.
-class QtMipsExceptionUnsupportedAluOperation : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionUnsupportedAluOperation(QTMIPS_ARGS_COMMON);
-};
-
-// Integer operation resulted to overflow (or underflow as we are working with unsigned values)
-// This is for sure caused by program it self.
-class QtMipsExceptionOverflow : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionOverflow(QTMIPS_ARGS_COMMON);
-};
-
-// Instruction is jumping to unaligned address (ADDR%4!=0)
-// This can be caused by bug or by user program as it can be jumping relative to register
-// This shouldn't be happening with non-register jumps as those should be verified by compiler
-class QtMipsExceptionUnalignedJump : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionUnalignedJump(QTMIPS_ARGS_COMMON);
-};
-
-// Used unknown MemoryAccess control value (write_ctl or read_ctl)
-// This can be raised by invalid instruction but in such case we shoul raise UnknownInstruction instead
-// So this should signal just some QtMips bug.
-class QtMipsExceptionUnknownMemoryControl : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionUnknownMemoryControl(QTMIPS_ARGS_COMMON);
-};
-
-// Trying to access address outside of the memory
-// As we are simulating whole 32bit memory address space then this is most probably QtMips bug if raised not program.
-class QtMipsExceptionOutOfMemoryAccess : public QtMipsExceptionRuntime {
-public:
- QtMipsExceptionOutOfMemoryAccess(QTMIPS_ARGS_COMMON);
-};
-
-// This is sanity check exception
-class QtMipsExceptionSanity : public QtMipsException {
-public:
- QtMipsExceptionSanity(QTMIPS_ARGS_COMMON);
-};
+/* This is list of all QtMips specific exceptions
+ *
+ * Input:
+ * Exception durring input loading
+ * Runtime:
+ * Exceptions caused by machine invalid input or unsupported action
+ * UnsupportedInstruction:
+ * Decoded instruction is not supported.
+ * This can be cause by really using some unimplemented instruction or because of problems in instruction decode.
+ * UnsupportedAluOperation:
+ * Decoded ALU operation is not supported
+ * This is basically same exception as QtMipsExceptionUnsupportedInstruction but it is emmited from ALU when executed and not before that.
+ * Overflow:
+ * Integer operation resulted to overflow (or underflow as we are working with unsigned values)
+ * This is for sure caused by program it self.
+ * UnalignedJump:
+ * Instruction is jumping to unaligned address (ADDR % 4 != 0)
+ * This can be caused by bug or by user program as it can be jumping relative to register
+ * This shouldn't be happening with non-register jumps as those should be verified by compiler
+ * UnknownMemoryControl:
+ * Used unknown MemoryAccess control value (write_ctl or read_ctl)
+ * This can be raised by invalid instruction but in such case we shoul raise UnknownInstruction instead
+ * So this should signal just some QtMips bug.
+ * OutOfMemoryAccess:
+ * Trying to access address outside of the memory
+ * As we are simulating whole 32bit memory address space then this is most probably QtMips bug if raised not program.
+ * Sanity:
+ * This is sanity check exception
+ */
+#define QTMIPS_EXCEPTIONS \
+ EXCEPTION(Input,) \
+ EXCEPTION(Runtime,) \
+ EXCEPTION(UnsupportedInstruction, Runtime) \
+ EXCEPTION(UnsupportedAluOperation, Runtime) \
+ EXCEPTION(Overflow, Runtime) \
+ EXCEPTION(UnalignedJump, Runtime) \
+ EXCEPTION(UnknownMemoryControl, Runtime) \
+ EXCEPTION(OutOfMemoryAccess, Runtime) \
+ EXCEPTION(Sanity,)
+
+#define EXCEPTION(NAME, PARENT) \
+ class QtMipsException##NAME : public QtMipsException##PARENT { \
+ public: \
+ QtMipsException##NAME(QString reason, QString ext, QString file, int line); \
+ };
+QTMIPS_EXCEPTIONS
+#undef EXCEPTION
#define SANITY_ASSERT(COND, MSG) do { if (!(COND)) throw QTMIPS_EXCEPTION(Sanity, "Sanity check failed (" #COND ")", MSG); } while (false)