<div dir="ltr"><div>Yes, it is definitely technically feasible to catch access violations with landingpads, but it will involve writing your own EH personality, probably by starting with the one from libgcc.</div><div><br></div><div>The major consideration for whether to use a landingpad EH personality or a funclet-based EH personality is, do you need to be compatible with MSVC EH? That is, do you want destructors in MSVC frames to run if your exception is thrown, and do you want to clean up if an MSVC C++ exception unwinds through your stack frame? If yes, then you need to use the new EH instructions (catchpad). If no, then you'll get better code if you use landingpad.</div><div><br></div><div>I also want to try to unpack what you mean when you say "landing pads instead of seh" and "win64-gnu does use seh but calls the landingpad somehow". SEH is a very overloaded term. Here are the two things people usually mean by it:</div><div>- The mechanisms used to unwind the stack on Windows, either for 32-bit or 64-bit x86 (.seh_* directives)</div><div>- The MSVC language mechanism for catching non-call exceptions in a structured manner (__try / __except)</div><div><br></div><div>Every major compiler on Win64 implements the standard stack unwind information format that Microsoft specified at <a href="https://msdn.microsoft.com/en-us/library/0kd71y96.aspx" target="_blank">https://msdn.microsoft.com/<wbr>en-us/library/0kd71y96.aspx</a>. This corresponds to the .seh_* assembler directives that GCC, gas, and LLVM use on Win64, which is what you're seeing.</div><div><br></div><div>x86_32 Windows uses a less sophisticated unwind mechanism involving a linked list maintained in TLS at fs:00. Sometimes people use SEH to refer to this and related structures.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Sep 28, 2016 at 11:56 AM, Carlo Kok via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">In the past people in #llvm suggested to me I should use landing pads instead of seh when it comes to Windows unless i really need seh. Looking at what gets generated win64 -gnu does use seh but calls the landing pad somehow, while win32 doesn't at all. It looks to me a custom win64 landing pad personality can also deal with things like Access Violation. Is there a way to make win32 also able to catch say access violation but still use landing pads?<br>
<br>
Also are there open source Unwind* implementions that work on windows, that anyone knows of?<span class="m_-7463828730707617711HOEnZb"><font color="#888888"><br>
-- <br>
Carlo Kok<br>
______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
</font></span></blockquote></div><br></div></div>