diff options
author | Ian Lance Taylor <ian@airs.com> | 2008-06-09 19:12:34 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2008-06-09 19:12:34 +0000 |
commit | 7b3082352faa8596807f9f5ad038039aae615020 (patch) | |
tree | 2e404b7f4fb90da4310fd9429f6628d209d53fab /gold/testsuite/relro_test.cc | |
parent | e8568f6c630ea3d6681195e0a2b0d1e2e3866a1b (diff) | |
download | binutils-7b3082352faa8596807f9f5ad038039aae615020.zip binutils-7b3082352faa8596807f9f5ad038039aae615020.tar.gz binutils-7b3082352faa8596807f9f5ad038039aae615020.tar.bz2 |
* testsuite/relro_test.cc: Include <cstdio>, <cstdlib>, and
<exception>.
(throwing, orig_terminate): New static variables.
(terminate_handler): New static function.
(t2): Set terminate handler.
Diffstat (limited to 'gold/testsuite/relro_test.cc')
-rw-r--r-- | gold/testsuite/relro_test.cc | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/gold/testsuite/relro_test.cc b/gold/testsuite/relro_test.cc index d1bd9dd..1fc1b43 100644 --- a/gold/testsuite/relro_test.cc +++ b/gold/testsuite/relro_test.cc @@ -22,6 +22,9 @@ #include <cassert> #include <csignal> +#include <cstdio> +#include <cstdlib> +#include <exception> #include <stdint.h> #include <unistd.h> @@ -69,15 +72,42 @@ t1() return true; } +// Tell terminate handler that we are throwing from a signal handler. + +static bool throwing; + // A signal handler for SIGSEGV. extern "C" void sigsegv_handler(int) { + throwing = true; throw 0; } +// The original terminate handler. + +std::terminate_handler orig_terminate; + +// Throwing an exception out of a signal handler doesn't always work +// reliably. When that happens the program will call terminate. We +// set a terminate handler to indicate that the test probably passed. + +void +terminate_handler() +{ + if (!throwing) + { + orig_terminate(); + ::exit(EXIT_FAILURE); + } + fprintf(stderr, + "relro_test: terminate called due to failure to throw through signal handler\n"); + fprintf(stderr, "relro_test: assuming test succeeded\n"); + ::exit(EXIT_SUCCESS); +} + // Use a separate function to throw the exception, so that we don't // need to use -fnon-call-exceptions. @@ -100,6 +130,7 @@ bool t2() { signal(SIGSEGV, sigsegv_handler); + orig_terminate = std::set_terminate(terminate_handler); try { |