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 | |
parent | e8568f6c630ea3d6681195e0a2b0d1e2e3866a1b (diff) | |
download | fsf-binutils-gdb-7b3082352faa8596807f9f5ad038039aae615020.zip fsf-binutils-gdb-7b3082352faa8596807f9f5ad038039aae615020.tar.gz fsf-binutils-gdb-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')
-rw-r--r-- | gold/ChangeLog | 8 | ||||
-rw-r--r-- | gold/testsuite/relro_test.cc | 31 |
2 files changed, 39 insertions, 0 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index f534b6d..ded95ca 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,11 @@ +2008-06-09 Ian Lance Taylor <iant@google.com> + + * testsuite/relro_test.cc: Include <cstdio>, <cstdlib>, and + <exception>. + (throwing, orig_terminate): New static variables. + (terminate_handler): New static function. + (t2): Set terminate handler. + 2008-06-05 Kris Van Hees <kris.van.hees@oracle.com> PR 6584 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 { |