SPRAB89A September 2011 – March 2014
FESPEC descriptors enforce throw() declarations in the user's code. If a throw declaration is used, a FESPEC descriptor will be created for this function to ensure that only those types listed are thrown. If a type not listed is thrown, the unwinder will typically call std::unexpected (but there are exceptions).
The first word of the descriptor consists of a 31-bit unsigned integer, which specifies the number of type_info fields that follow.
If bit D is 1, the type_info list is followed by a 32-bit word containing a PREL31 program address of a code fragment which is called if no type in the list matches the thrown type. Bit 31 of this word is set to 0.
If bit D is 0, and no type in the list matches the thrown type, the unwinding code should call _ _cxa_call_unexpected. If any descriptors match this form, the EXTAB section must contain a R_C6000_NONE relocation to _ _cxa_call_unexpected.