diff --git a/src/unwind/SetGR.c b/src/unwind/SetGR.c index 056bfc70..96533643 100644 --- a/src/unwind/SetGR.c +++ b/src/unwind/SetGR.c @@ -24,11 +24,17 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "unwind-internal.h" +#ifdef UNW_TARGET_X86 +#include "dwarf_i.h" +#endif PROTECTED void _Unwind_SetGR (struct _Unwind_Context *context, int index, unsigned long new_value) { +#ifdef UNW_TARGET_X86 + index = dwarf_to_unw_regnum(index); +#endif unw_set_reg (&context->cursor, index, new_value); #ifdef UNW_TARGET_IA64 if (index >= UNW_IA64_GR && index <= UNW_IA64_GR + 127) diff --git a/src/x86/Gos-linux.c b/src/x86/Gos-linux.c index 31f83bae..255696ca 100644 --- a/src/x86/Gos-linux.c +++ b/src/x86/Gos-linux.c @@ -153,9 +153,6 @@ x86_get_scratch_loc (struct cursor *c, unw_regnum_t reg) case X86_SCF_LINUX_RT_SIGFRAME: addr += LINUX_UC_MCONTEXT_OFF; break; - - default: - return DWARF_NULL_LOC; } switch (reg) diff --git a/tests/Ltest-cxx-exceptions.cxx b/tests/Ltest-cxx-exceptions.cxx new file mode 100644 index 00000000..827ba98a --- /dev/null +++ b/tests/Ltest-cxx-exceptions.cxx @@ -0,0 +1,78 @@ +/* libunwind - a platform-independent unwind library + Copyright (C) 2010 stefan.demharter@gmx.net + Copyright (C) 2010 arun.sharma@google.com + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#define panic(args...) \ + { fprintf (stderr, args); exit (-1); } + +struct Test +{ + public: // --- ctor/dtor --- + Test() { ++counter_; } + ~Test() { -- counter_; } + Test(const Test&) { ++counter_; } + + public: // --- static members --- + static int counter_; +}; + +int Test::counter_ = 0; + +// Called by foo +extern "C" void bar() +{ + Test t; + try { + Test t; + throw 5; + } catch (...) { + Test t; + printf("Throwing an int\n"); + throw 6; + } +} + +int main() +{ + try { + Test t; + bar(); + } catch (int) { + // Dtor of all Test-object has to be called. + if (Test::counter_ != 0) + panic("Counter non-zero\n"); + return Test::counter_; + } catch (...) { + // An int was thrown - we should not get here. + panic("Int was thrown why are we here?\n"); + } + exit(0); +} diff --git a/tests/Makefile.am b/tests/Makefile.am index 1dd331c1..8786923e 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -45,6 +45,10 @@ endif #ARCH_IA64 noinst_PROGRAMS_cdep = forker mapper test-ptrace-misc test-varargs \ Gperf-simple Lperf-simple +if SUPPORT_CXX_EXCEPTIONS + check_PROGRAMS_cdep += Ltest-cxx-exceptions +endif + perf: perf-startup Gperf-simple Lperf-simple @echo "########## Basic performance of generic libunwind:" @./Gperf-simple @@ -81,6 +85,8 @@ ppc64_test_altivec_SOURCES = ppc64-test-altivec.c ppc64-test-altivec-utils.c ppc64_test_wchar_SOURCES = ppc64-test-wchar.c Gtest_init_SOURCES = Gtest-init.cxx Ltest_init_SOURCES = Ltest-init.cxx +Ltest_cxx_exceptions_SOURCES = Ltest-cxx-exceptions.cxx + Gtest_dyn1_SOURCES = Gtest-dyn1.c flush-cache.S Ltest_dyn1_SOURCES = Ltest-dyn1.c flush-cache.S test_static_link_SOURCES = test-static-link-loc.c test-static-link-gen.c