|
From: | address@hidden |
Subject: | [Libunwind-devel] Exception handling routines on x86 |
Date: | Sun, 21 Feb 2010 00:46:35 +0100 |
User-agent: | Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.4pre) Gecko/20090915 Thunderbird/3.0b4 |
Hi,i've tested libunwind's exception handling routines under linux-x86 (compiled into libunwind via --enable-cxx-exceptions). Initially my test program segfaulted, so i've patched the code of libunwind a little bit. Two patches are attached.
The first patch addresses a difference between gcc and libunwind: the size of exception_class is different - libunwind uses a 32-bit value whereas gcc uses and expects a 64-bit value (which equals to 'GNUCC++\0' or 'GNUCC++\x01')
The second patch is just a quick'n'dirty fix to get the testing executable running correctly. The problem is, that gcc's personality function (eh_personailty.cc) uses __builtin_eh_return_data_regno(0) (== 0) and __builtin_eh_return_data_regno(1) (== 2) to set data registers for exception handling with _Unwind_SetGR. It expects EAX and EDX to be set, respectively. But libunwind sets EAX and ECX. So, how should this problem be addressed cleanly? Should the registers be renumbered (via UNW_REG_* enums in libunwind-x86.h)? Or should _Unwind_SetGR and _Unwind_GetGR be patched to renumber the registers? Or do you have any other idea?
My test program can simply be compiled and executed by calling test-eh.sh. On my linux machine it fails with gcc's own exception handling routines, while libunwind's ones work great with these patches.
Greetings Stefan
libunwind-exception_class-64bit.patch
Description: Text document
libunwind-setgr-workaround.patch
Description: Text document
test-eh.c
Description: Text Data
test-eh.cxx
Description: Text Data
test-eh.sh
Description: Bourne shell script
[Prev in Thread] | Current Thread | [Next in Thread] |