Pedro Alves wrote:
> Hi Kevin,
>
> glad to see you're still around :)
>
> Kevin O'Connor wrote:
>> I recently ported the haret application
>> (http://www.handhelds.org/moin/moin.cgi/HaRET) to mingwce32. In the
>> process, I used the c++ compiler, mainly because there were a few
>> places in the existing msvc code that would catch bad pointer accesses
>> and handle them gracefully.
>>
>> In the old code you'd see something like:
>>
>> __try
>> {
>> while (wcount--)
>> *vaddr++ = value;
>> }
>> __except (EXCEPTION_EXECUTE_HANDLER)
>> {
>> Complain (C_ERROR ("EXCEPTION while writing %08x to address %08x"),
>> value, vaddr);
>> }
>>
>> Which I converted to:
>>
>> try
>> {
>> while (wcount--)
>> *vaddr++ = value;
>> }
>> catch (...)
>> {
>> Output(C_ERROR "EXCEPTION while writing %08x to address %p",
>> value, vaddr);
>> }
>>
>> However, it doesn't work. (A bad memory access causes the program to
>> terminate.) What can be done to get this working?
>>
>
> Unfortunately, gcc doesn't support SEH. On x86 windows, people work
> around that with a few macros that result in a sintax quite similar.
> That is possible, because on x86, SEH is implemented as an linked list
> of exception handlers built on the stack. It works somewhat like
> setjmp/lonjmp (sjlj) schemes used to implement exceptions in C.
>
> On MSFT compilers, c++ exceptions are implemented on top of SEH,
> so a 'catch (...)' will also catch SEH exceptions. In gcc, we have
> sjlj exceptions (we use this variant), or DWARF2 exceptions,
> which don't know a thing about SEH, hence, the behaviour you see.
>
> Now, on ARM, SEH is table based, like DWARF2 exceptions are too. This
> means, the compiler must put unwind information in tables that the OS will
> read. Only the compiler and linker have enough information to build those
> tables. There is a very rudimentary SEH handler implemented in
> src/newlib/libc/wince/crt0.S, and src/newlib/libc/wince/startup.c, that
> install
> a catch all top level handler. You could install a top level handler like
> crt0.S does in your app, having but more handlers is something I don't think
> is practical to do manually.
>
> Perhaps you can rewrite those sections with IsBad{Write|Read|Code}Ptr [1], or
> VirtualQuery ? IsBadWritePtr, and friends internally do what you've done, so
> calling it on every byte may be slow, I don't know. If it is, you may get
> around by doing a binary search for a valid range with IsBadWritePtr, and then
> write away with memset/memcpy.
>
> Hope it helps,
>
Forgot to add the [1]. Here it is:
[1] - They have their own problems, at least on x86 (stack guard
pages + multithreading - google is your friend), and their usage is
discouraged. But in this case I don't see any other way.
Cheers,
Pedro Alves
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Cegcc-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/cegcc-devel