Hi, I've been reading as much as possible and trying to follow the source as much as possible and have, I think, come across a bit of a stopper as it may require a re-arrangement of GNAT sources, if I'm right, that is.
So an exception object is defined within a-exexpr-gcc.adb as: type Unwind_Exception is record Class : Exception_Class := GNAT_Exception_Class; Cleanup : System.Address := System.Null_Address; Private1 : Unwind_Word; Private2 : Unwind_Word; end record; This maps onto the C structure for DWARF2 exceptions. GNAT then defines it's language specific record: type GNAT_GCC_Exception is record Header : Unwind_Exception; -- ABI Exception header first Id : Exception_Id; ... etc. ... end record; With it's extra fields tagged onto the end. No problem there. The ARM EABI code has it's own unwinder library defined within gcc/config/arm/unwind-arm.[ch]. When _Unwind_RaiseException is called, a stub in libunwind.S is called which sets up an extra parameter for the Virtual Register Set (VRS) data and then calls the __gnu_Unwind_RaiseException which was a _Unwind_Control_Block as a first parameter. All the other API functions are handled similarly. Within unwind-arm.h this line is defined: #define _Unwind_Exception _Unwind_Control_Block >From what I can tell, the _Unwind_Control_Block is the _Unwind_Exception under ARM EABI, which is actually bigger than the _Unwind_Exception struct by quite a bit. This will cause a problem for GNAT as it's written in Ada, rather than C, like the other front-ends. So, if I'm correct, I need to extract Unwind_Exception from a-exexpr-gcc.adb into 2 private child packages, 1 for the ARM EABI and 1 for everything else which works normally. The ARM EABI version will then mirror the _Unwind_Control_Block defined in unwind-arm.h. Can someone verify if my assertions are correct before I do anything further? Thanks, Luke.