From 7cc95c3a57a79864fa60de4827193fa7aadac92c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Mon, 1 Jan 2018 21:29:37 +0100 Subject: 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. --- qtmips_cli/reporter.cpp | 2 +- qtmips_machine/qtmipsexception.cpp | 42 ++++---------- qtmips_machine/qtmipsexception.h | 115 ++++++++++++++++--------------------- 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) -- cgit v1.2.3