How to call an (x86) cleanup/catchpad funclet

I've modified llvm to emit vc++ compatible SEH structures for my personality on x86/Windows and my handler works fine, but the only thing I can't figure out is how to call these funclets, they look like:

Catch:

"?catch$3@?0?m3@4HA":
LBB4_3: # %BasicBlock26
  pushl %ebp
  pushl %eax
  addl $12, %ebp
  movl %esp, -28(%ebp)
  movl $LBB4_5, %eax
  addl $4, %esp
  popl %ebp
  retl # CATCHRET

cleanup:
"?dtor$2@?0?m2@4HA":
LBB3_2:
  pushl %ebp
  subl $8, %esp
  addl $12, %ebp
  movl %ebp, %eax
  movl %esp, %ecx
  movl %eax, 4(%ecx)
  movl $1, (%ecx)
  calll m2$Fin
  addl $8, %esp
  popl %ebp
  retl # CLEANUPRET

What do I pass to these to get a valid frame on the other end?

The cleanup one calls the finally and properly returns, but what about the catch?

For 32-bit x86, set EBP to the address of the end of the SEH registration node before calling any funclet. The prologue does ‘addl $12, %ebp’ to recompute the real frame pointer from that address. The return value of the catch handler is the label that you should jump to with EBP set in the same manner. The code at that label will take care of restoring other registers.

Also, unless you absolutely need to be compatible with MSVC exceptions, don’t use funclets for your new personality. Use landingpads. They are better and will get you better code.

For 32-bit x86, set EBP to the address of the end of the SEH
registration node before calling any funclet. The prologue does 'addl
$12, %ebp' to recompute the real frame pointer from that address. The
return value of the catch handler is the label that you should jump to
with EBP set in the same manner. The code at that label will take care
of restoring other registers.

thanks! that works.

Also, unless you absolutely need to be compatible with MSVC exceptions,
don't use funclets for your new personality. Use landingpads. They are
better and will get you better code.

ah ke, but landingpads won't let me catch SEH exceptions will they?

You can build a personality function similar to __gxx_personality_seh0 that
calls filter functions, and then resumes control at the appropriate
landingpad. You'd need to build out something similar to _Unwind_Resume or
use mingw's from libgcc to implement successive unwinding for finally.