diff options
Diffstat (limited to 'testsuites/samples/cdtest/main.cc')
-rw-r--r-- | testsuites/samples/cdtest/main.cc | 58 |
1 files changed, 49 insertions, 9 deletions
diff --git a/testsuites/samples/cdtest/main.cc b/testsuites/samples/cdtest/main.cc index 894e404ba1..1c5057a32b 100644 --- a/testsuites/samples/cdtest/main.cc +++ b/testsuites/samples/cdtest/main.cc @@ -25,9 +25,11 @@ #include <rtems.h> #include <rtems/bspIo.h> #include <rtems/test-info.h> +#include <rtems/sysinit.h> #include <cstdio> #include <cstdlib> +#include <cstring> #include <stdexcept> #ifdef RTEMS_TEST_IO_STREAM @@ -44,13 +46,6 @@ extern rtems_task main_task(rtems_task_argument); static int num_inst = 0; -static void check_begin_of_test(void) -{ - if ( num_inst == 0 ) { - TEST_BEGIN(); - } -} - static void check_end_of_test(void) { if ( num_inst == 0 ) { @@ -62,7 +57,6 @@ class AClass { public: AClass(const char *p = "LOCAL" ) : ptr( p ) { - check_begin_of_test(); num_inst++; printf( "%s: Hey I'm in base class constructor number %d for %p.\n", @@ -104,7 +98,6 @@ class BClass : public AClass { public: BClass(const char *p = "LOCAL" ) : AClass( p ) { - check_begin_of_test(); num_inst++; printf( "%s: Hey I'm in derived class constructor number %d for %p.\n", @@ -244,3 +237,50 @@ rtems_task main_task( printf( "Global Dtors should be called after this line....\n" ); exit(0); } + +/* + * Exceptions during system initialization work only on targets which do not + * need a registration of exception frames during the global construction. In + * particular, targets which use the DWARF2 unwinder cannot use exceptions + * during system initialization. + */ +#if defined(__arm__) +#define CAN_DO_EXCEPTIONS_DURING_SYSINIT +#endif + +#ifdef CAN_DO_EXCEPTIONS_DURING_SYSINIT +static void early_exception() +{ + try + { + throw "early exception"; + } + catch( const char *e ) + { + rtems_test_assert(strcmp(e, "early exception") == 0); + throw "early exception 2"; + } +} +#endif + +static void test_exceptions_during_system_init() +{ + TEST_BEGIN(); + +#ifdef CAN_DO_EXCEPTIONS_DURING_SYSINIT + try + { + early_exception(); + } + catch( const char *e ) + { + rtems_test_assert(strcmp(e, "early exception 2") == 0); + } +#endif +} + +RTEMS_SYSINIT_ITEM( + test_exceptions_during_system_init, + RTEMS_SYSINIT_IDLE_THREADS, + RTEMS_SYSINIT_ORDER_LAST +); |