forked from BSB-WS23/mpstubs
64 lines
2.1 KiB
C
64 lines
2.1 KiB
C
/*! \file
|
|
* \brief Contains several macros usable for making assertions
|
|
*
|
|
* Depending on the type of assertion (either static or at runtime), a failing assertion will trigger an error.
|
|
* For static assertion, this error will be shown at compile time and abort compilation.
|
|
* Runtime assertions will trigger a message containing details about the error occurred and will make the CPU die.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#ifndef STRINGIFY
|
|
/*! \def STRINGIFY(S)
|
|
* \brief Converts a macro parameter into a string
|
|
* \ingroup debug
|
|
* \param S Expression to be converted
|
|
* \return stringified version of S
|
|
*/
|
|
#define STRINGIFY(S) #S
|
|
#endif
|
|
|
|
/*! \def assert_size(TYPE, SIZE)
|
|
* \brief Statically ensure (at compile time) that a data type (or variable) has the expected size.
|
|
* \ingroup debug
|
|
* \param TYPE The type to be checked
|
|
* \param SIZE Expected size in bytes
|
|
*/
|
|
#define assert_size(TYPE, SIZE) \
|
|
static_assert(sizeof(TYPE) == (SIZE), "Wrong size for " STRINGIFY(TYPE))
|
|
|
|
/*! \def assert(EXP)
|
|
* \brief Ensure (at execution time) an expression evaluates to `true`, print an error message and stop the CPU otherwise.
|
|
* \ingroup debug
|
|
* \param EXP The expression to be checked
|
|
*/
|
|
#ifdef NDEBUG
|
|
#define assert(EXP) \
|
|
do { \
|
|
(void)sizeof(EXP); \
|
|
} while (false)
|
|
#else
|
|
#define assert(EXP) \
|
|
do { \
|
|
if (__builtin_expect(!(EXP), 0)) { \
|
|
assertion_failed(STRINGIFY(EXP), __func__, __FILE__, __LINE__); \
|
|
} \
|
|
} while (false)
|
|
|
|
/*! \brief Handles a failed assertion
|
|
*
|
|
* This function will print a message containing further information about the
|
|
* failed assertion and stops the current CPU permanently.
|
|
*
|
|
* \note This function should never be called directly, but only via the macro `assert`.
|
|
*
|
|
* \todo Implement Remainder of Method (output & CPU stopping)
|
|
*
|
|
* \param exp Expression that did not hold
|
|
* \param func Name of the function in which the assertion failed
|
|
* \param file Name of the file in which the assertion failed
|
|
* \param line Line in which the assertion failed
|
|
*/
|
|
[[noreturn]] void assertion_failed(const char * exp, const char * func, const char * file, int line);
|
|
#endif
|