This is the mail archive of the
cygwin
mailing list for the Cygwin project.
stdcall lib functions with exception throwing callbacks vs Dwarf2 EH
- From: Danny Smith <dannysmith at clear dot net dot nz>
- To: gcc at gcc dot gnu dot org
- Cc: Cygwin <cygwin at cygwin dot com>, mingw-dvlpr <mingw-dvlpr at lists dot sourceforge dot net>
- Date: Wed, 24 Nov 2004 11:27:11 +1300
- Subject: stdcall lib functions with exception throwing callbacks vs Dwarf2 EH
- Reply-to: Danny Smith <dannysmith at users dot sourceforge dot net>
Hi,
I've been trying to get DW2 EH exception handling working
on windows targets with general success, but have hit a snag.
If a C library function that takes a callback arg is compiled
using stdcall convention, C++ exception thrown by the callback
result in abort.
If the C libarary function uses normal (cdelc) calling convention
than exceptions thrown by callback are handled.
Example:
==============================================
/* callback.c library functions */
/* compile this with c */
void
caller_c (void (*callback)(void))
{
callback();
}
void __attribute__((stdcall))
caller_s (void (*callback)(void))
{
callback();
}
==============================================
/* main.cc */
#include <stdio.h>
extern "C"
{
typedef void (*foo)(void);
extern void caller_c (foo);
extern void __attribute__ ((__stdcall__)) caller_s (foo);
}
void callback (void)
{
printf ("Hello from callback\n");
fflush (stdout);
throw 1;
}
int main ()
{
try {
printf ("Testing cdecl\n");
caller_c (callback);
}
catch (int) {
printf ("Caught cdecl\n");
}
try {
printf ("\nTesting stdcall\n");
caller_s (callback);
}
catch (int) {
printf ("Caught stdcall\n");
}
return 0;
}
==================================================
Compiling with sjlj enabled compiler:
gcc -c -o callback.o callback.c
g++-sjlj -o main-sjlj.exe main.cc callback.o
Both throws are caught.
However, if using DW2 EH enabled compiler
g++-dw2 -omain-dw2.exe main.cc callback.o
I get this:
> Testing cdecl
> Hello from callback
> Caught cdecl
> Testing stdcall
> Hello from callback
>
> abnormal program termination.
This is significant for windows targets, since the
OS win32 api uses stdcall almost exclusively.
Before I pull any more hair out trying, does any one have any hints on
how to use an MD_FALLBACK_FRAME_STATE_FOR to workaround, or is this a
blocker for the use of DW2 EH on windows targets.
Danny
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/