[llvm-dev] How to call an (x86) cleanup/catchpad funclet

49 views
Skip to first unread message

Carlo Kok via llvm-dev

unread,
Apr 4, 2016, 5:27:31 PM4/4/16
to llvm-dev
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?

--
Carlo Kok
_______________________________________________
LLVM Developers mailing list
llvm...@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

Reid Kleckner via llvm-dev

unread,
Apr 4, 2016, 7:35:51 PM4/4/16
to Carlo Kok, llvm-dev
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.

Carlo Kok via llvm-dev

unread,
Apr 5, 2016, 3:57:39 AM4/5/16
to Reid Kleckner, llvm-dev

Op 2016-04-05 om 01:35 schreef Reid Kleckner:


> 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?

--
Carlo Kok
RemObjects Software

Reid Kleckner via llvm-dev

unread,
Apr 5, 2016, 12:18:51 PM4/5/16
to Carlo Kok, llvm-dev
On Tue, Apr 5, 2016 at 12:57 AM, Carlo Kok <c...@remobjects.com> wrote:
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.
Reply all
Reply to author
Forward
0 new messages