aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/qtmipsexception.h
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 /qtmips_machine/qtmipsexception.h
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.
Diffstat (limited to 'qtmips_machine/qtmipsexception.h')
-rw-r--r--qtmips_machine/qtmipsexception.h115
1 files changed, 50 insertions, 65 deletions
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)