From 7b3082352faa8596807f9f5ad038039aae615020 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 9 Jun 2008 19:12:34 +0000 Subject: * testsuite/relro_test.cc: Include , , and . (throwing, orig_terminate): New static variables. (terminate_handler): New static function. (t2): Set terminate handler. --- gold/ChangeLog | 8 ++++++++ gold/testsuite/relro_test.cc | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) 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 + + * testsuite/relro_test.cc: Include , , and + . + (throwing, orig_terminate): New static variables. + (terminate_handler): New static function. + (t2): Set terminate handler. + 2008-06-05 Kris Van Hees 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 #include +#include +#include +#include #include #include @@ -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 { -- cgit v1.1