Exception tables are necessary to handle exceptions thrown by functions in high-level
languages such as C++. Unwind tables contain debug frame information which is also necessary
for the handling of such exceptions. An exception can only propagate through a function with
an unwind table.
An assembly language function is code enclosed by either
Functions written in C++ have unwind information by default. However, for assembly language
functions that are called from C++ code, you must ensure that there are exception tables and
unwind tables to enable the exceptions to propagate through them.
An exception cannot propagate through a function with a nounwind table. The
exception handling runtime environment terminates the program if it encounters a nounwind
table during exception processing.
The assembler can generate nounwind table entries for all functions and non-functions. The
assembler can generate an unwind table for a function only if the function contains
FRAME directives to describe the use of the stack within the
function. To be able to create an unwind table for a function, each
PUSH instruction must be followed by a
FRAME POP or
FRAME PUSH directive respectively. Functions must conform to the
conditions set out in the Exception Handling ABI for the ARM Architecture
(EHABI), section 9.1 Constraints on Use. If the assembler cannot generate an
unwind table it generates a nounwind table.