[HN Gopher] C++ Exceptions: Under the Hood ___________________________________________________________________ C++ Exceptions: Under the Hood Author : arcatek Score : 20 points Date : 2021-08-12 21:17 UTC (1 hours ago) (HTM) web link (monkeywritescode.blogspot.com) (TXT) w3m dump (monkeywritescode.blogspot.com) | AshamedCaptain wrote: | [2013]ish if I remember. | | Also note the ABI for C++ exceptions followed by G++ et al is | actually documented as part of the Itanium C++ ABI : | | https://itanium-cxx-abi.github.io/cxx-abi/abi-eh.html | gpderetta wrote: | The doc is actually incomplete, it refers to implementation | defined ABI entry points for the actual unwinding. The actual | unwind tables and compensation opcodes are, IIRC, part of the | DWARF standard, but last time I looked at it that standard was | also incomplete and left a lot unspecified. Many of the details | (including bugs that have now become part of the ABI) are | basically folklore. | | IIRC Ian LAnce Taylor had a series of blog posts that did shed | light on a lot of these details. | jcranmer wrote: | There's essentially three separate moving pieces here. | | At the bottom layer you have the unwind API. This is actually | generally defined by the platform-specific ABI, although the | definition here on most Unixes is "we have a .eh_frame | section that's basically the same as .debug_frame in DWARF." | The API is provided by some platform library (libunwind), and | it's language-agnostic. | | Part of the generic unwind structure is that each stack frame | has a personality function and a Language-Specific Data Area, | and the unwind semantics will call the personality function | to figure out whether to drop off into the stack frame, and | where in the function to drop off, or continue unwinding the | stack. The personality function itself uses the LSDA to | figure out what to do. The personality function lives in the | language standard library (e.g., libstdc++), and the LSDA | format is of course entirely undocumented (i.e., read Ian | Lance Taylor's blog posts as the best documentation that | exists). | | The final level of the ABI is how you actually represent the | exceptions themselves. This is provided by the Itanium ABI | and describes the names of the functions needed to effect | exception handling (e.g., __cxa_begin_catch), the structure | layouts involved, and even some nominal data on how to handle | foreign exceptions which don't really exist. | | And that's not entirely true for all systems. ARM notably | uses a different ABI exception handling, which is rather | close to the standard Itanium exception handling except the | details are different. Some operating systems choose to forgo | unwinding-based exceptions in lieu of setjmp/longjmp as the | standard ABI, which of course requires different versions of | everything. And Windows has an entirely different form of | exception handling which isn't centered around unwinding but | actually calling exception handlers as new functions on the | stack, requiring frame links to the original-would-be- | unwound-to function. | zabzonk wrote: | Under the hood of GCC specifically. | arcatek wrote: | That's the article I used when I implemented exceptions in an | LLVM-based compiler, so it's applicable to more than just GCC. | cogman10 wrote: | Doesn't GCC support multiple exception handling options? | zabzonk wrote: | I'm not sure what your point is - mine was that the original | post is specifically about GCC, not Standard C++. | [deleted] | cogman10 wrote: | Mainly that exception handling doesn't have a single | solution, even in GCC. I'm agreeing with you that this | article only highlights one version of exception handling | for one compiler. | | There's also potential operating system involvement that's | not really covered in this article. | mhh__ wrote: | I'm not sure exactly what you mean but there was a switch to | DWARF EH ages ago (GCC 2?) ___________________________________________________________________ (page generated 2021-08-12 23:00 UTC)