[LLVMdev] Technical details discussion for SEH

Kai Nacke kai.nacke at redstar.de
Sat Feb 1 01:41:46 PST 2014


Hi Jb,

with "real SEH handling" I mean "visual c++ style SEH".
With my patch it is possible to use the Windows SEH machinery but not 
with the _c_specific_handler from MSVC. You have to provide your own 
personality function which must work with the Dwarf encoding.

My patch is always linked to this wiki page: 
http://wiki.dlang.org/Building_and_hacking_LDC_on_Windows_using_MSVC. 
Just look for the section "Required source downloads".
An implementation of a personality function in D is here: 
https://github.com/ldc-developers/druntime/blob/ldc/src/ldc/eh2.d.
You can also look at libgcc on mingw64 and search for the implementation 
of __gcc_personality_seh0. That is the stuff which is supported by my patch.

I also think that the same mechanism can be implemented with 32bit SEH.

Regards,
Kai

On 31.01.2014 23:49, Jb Feldman wrote:
> Can you clarify what you mean by "real SEH handling"? My company has me
> looking at this in the hopes that I can make LLVM capable of building
> windows drivers. If you mean "visual c++ style SEH", I'm fairly sure
> that isn't necessary for my purposes, but it would be nice. If you mean
> "something that works at all," then your concern about generalizing LLVM
> exception handling probably means that I will need to do some work
> learning about how exception handling is currently implemented. Do you
> have a link to the patch your discussing, or a revision number?
>
> Thanks,
> JB
>
>
> On Fri, Jan 31, 2014 at 6:41 AM, Kai Nacke <kai.nacke at redstar.de
> <mailto:kai.nacke at redstar.de>> wrote:
>
>     Hi Jb, Hi Tong,
>
>     with my patch LLVM emits unwind information for Windows 64bit. The
>     Dwarf EH encoding is used language specific data. That is the same
>     way gcc implements SEH for Windows 64bit. (As a side note, PR18546
>     now contains a patch for Clang to use my patch on mingw64.)
>
>     The rational behind this approach is that Windows provides support
>     for stack unwinding (RtlUnwind etc.) but LLVM is inherently based on
>     Dwarf EH. This approach combine both worlds. If the personality
>     function is tolerant enough then it should also be possible to mix
>     exceptions.
>
>     If you want to make exception handling MS compatible then you can
>     take my code as base. You only need to emit the MS handler data
>     instead of the Dwarf data.
>
>     However, at least as a first approach I would recommend to implement
>     32bit SEH with a similar approach. It should have some similarities
>     to SjLj exception handling - this really helps to understand what
>     needs to be done.
>
>     "real SEH handling" requires a small function which is called to
>     decide if the exception is handled. If yes then the handler is
>     called. If not then stack unwinding continues (after a possible call
>     of a cleanup handler). I found it difficult (if not impossible) to
>     create this code based on the exception design of LLVM. IMHO, some
>     some generalizations are required.
>
>     Regards,
>     Kai
>
>
>     On 31.01.2014 05:29, endlessroad1991 at gmail.com
>     <mailto:endlessroad1991 at gmail.com> wrote:
>
>         Hi Jb,
>
>         It's good to see someone step up and take a shot as this again. I
>         dropped this because it seems to me it wasn't a high priority
>         task for
>         LLVM/Clang.
>
>         Implementing SEH is more of LLVM work than Clang work.
>
>         For 32-bit SEH, there are prologue/epilogue instruction sequence to
>         emit, setting try-level ([ebp-4]), recovering EBP ([ebp-18h]),
>         and all
>         these can only happen in LLVM, not Clang. In my opinion, we should
>         implement these as LLVM intrinsics, like the gcc ones: see
>         http://llvm.org/docs/__ExceptionHandling.html#__exception-handling-intrinsics
>         <http://llvm.org/docs/ExceptionHandling.html#exception-handling-intrinsics>.
>         Also, we should emit the tables for each function, which is not
>         a simple
>         task either.
>
>         For 64-bit SEH, things are simpler. There are no more
>         instructions to
>         emit than no-SEH code. We have only two tasks: emit the table
>         for each
>         function, and place some code right. If I remember it correctly,
>         __finally block code should be replicated at 2 places: one in the
>         original function as part of the normal execution path, and
>         other one
>         separately if anything in __try block goes south.
>         As for the table part, I've seen some commits from Kai(as CC'ed
>         in this
>         email) doing it, you should ask him for details.
>
>         Thanks again.
>
>         --
>         Best Regards, Tong Shen (沈彤)
>
>
>         _________________________________________________
>         LLVM Developers mailing list
>         LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>         http://llvm.cs.uiuc.edu
>         http://lists.cs.uiuc.edu/__mailman/listinfo/llvmdev
>         <http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev>
>
>
>
>





More information about the llvm-dev mailing list