diff --git a/libsel4test/include/sel4test/test.h b/libsel4test/include/sel4test/test.h index 86522e582..7259bef76 100644 --- a/libsel4test/include/sel4test/test.h +++ b/libsel4test/include/sel4test/test.h @@ -98,6 +98,18 @@ typedef struct test_type { /* Declare a test type. * For now, we put the test types in a separate elf section. */ +#if defined(__has_attribute) && __has_attribute(retain) +#define DEFINE_TEST_TYPE(_name, _id, _set_up_test_type, _tear_down_test_type, _set_up, _tear_down, _run_test) \ + __attribute__((used,retain)) __attribute__((section("_test_type"))) struct test_type TEST_TYPE_ ##_name = { \ + .name = #_name, \ + .id = _id, \ + .set_up_test_type = _set_up_test_type, \ + .tear_down_test_type = _tear_down_test_type, \ + .set_up = _set_up, \ + .tear_down = _tear_down, \ + .run_test = _run_test, \ +}; +#else #define DEFINE_TEST_TYPE(_name, _id, _set_up_test_type, _tear_down_test_type, _set_up, _tear_down, _run_test) \ __attribute__((used)) __attribute__((section("_test_type"))) struct test_type TEST_TYPE_ ##_name = { \ .name = #_name, \ @@ -108,6 +120,7 @@ typedef struct test_type { .tear_down = _tear_down, \ .run_test = _run_test, \ }; +#endif /* Represents a single testcase. * Because this struct is used to declare variables that get @@ -133,6 +146,16 @@ typedef struct testcase ALIGN(sizeof(struct testcase)) testcase_t; * C99 style (name = _name, desc = _desc, func = _func...) to make sure * that it is accepted by C++ compilers. */ +#if defined(__has_attribute) && __has_attribute(retain) +#define DEFINE_TEST_WITH_TYPE(_name, _description, _function, _test_type, _enabled) \ + __attribute__((used,retain)) __attribute__((section("_test_case"))) struct testcase TEST_ ## _name = { \ + #_name, \ + _description, \ + (test_fn)_function, \ + _test_type, \ + _enabled, \ +}; +#else #define DEFINE_TEST_WITH_TYPE(_name, _description, _function, _test_type, _enabled) \ __attribute__((used)) __attribute__((section("_test_case"))) struct testcase TEST_ ## _name = { \ #_name, \ @@ -141,6 +164,7 @@ typedef struct testcase ALIGN(sizeof(struct testcase)) testcase_t; _test_type, \ _enabled, \ }; +#endif #define DEFINE_TEST(_name, _description, _function, _enabled) DEFINE_TEST_WITH_TYPE(_name, _description, _function, BASIC, _enabled)