[cfe-dev] How do SJLJ-Exceptions works?
Tim Northover via cfe-dev
cfe-dev at lists.llvm.org
Mon Feb 10 10:26:47 PST 2020
On Mon, 10 Feb 2020 at 07:30, Gaier, Bjoern via cfe-dev
<cfe-dev at lists.llvm.org> wrote:
> When I execute a function with a try-catch segment, as soon as I hit the try statement (Pretending I'm a Debugger or so), I would save the registerts (RSP, RIP of the catch block) on the stack I guess and keep doing what I do. However, when I encounter an exception now - how do I know where to find my stored registers on the stack?
It's a bit more dependent on the runtime than that. You can use
-fsjlj-exceptions with Clang to see what it would actually do to code
even on platforms that normally use DWARF based exceptions (obviously
just a tool to inspect assembly, you shouldn't try to run the result).
Roughly speaking, try blocks result in a call to some function like
_Unwind_SjLj_Register that stashes the information needed to find the
right catch block and/or call needed destructors in a reasonably
generic fashion. It looks like libunwind's implementation makes those
frame-contexts into a linked-list accessed (essentially) via a global
The key files are lib/CodeGen/SjLjEHPrepare.cpp in LLVM and
src/Unwind-sjlj.c in libunwind.
> Also is that the mysterious 'stack unwinding' I often heard about?
More or less. The process libunwind goes through to look through all
these registered frames and restore needed state is called unwinding.
More information about the cfe-dev