Currently in config/i386/cygming.h we have this: #undef DBX_REGISTER_NUMBER #define DBX_REGISTER_NUMBER(n) (write_symbols == DWARF2_DEBUG \ ? svr4_dbx_register_map[n] \ : dbx_register_map[n])
This is fine as long as we assume that cygwin and mingw32 will always use only SjLj EH model. However, once we move to Dwarf 2 unwind, it will cause serious problems with exception handling when we mix objects with DW2_DEBUG with objects with other or no debug info: The register mapping for unwind frames (and in particular for SP and BP) will not be consistent across objects. A testcase for this is already present in g++.dg/eh/spbp.C One 'easy' solution to the EH problem is to simply use the default i386 dbx_register_map regardless of the type of debug info. Or since a change to DW2 unwind is a pretty major ABI change anyway, we could make the svr4 dwarf2 mapping the new standard if DWARF_UNWIND_INFO. Finally, we could do what x86-darwin does and do a remapping back from the svr4 dwarf debug map to a default EH frame map, like so: /* Unfortunately, the 32-bit EH information also doesn't use the standard DWARF register numbers. */ #define DWARF2_FRAME_REG_OUT(n, for_eh) \ (! (for_eh) || write_symbols != DWARF2_DEBUG || TARGET_64BIT ? (n) \ : (n) == 5 ? 4 \ : (n) == 4 ? 5 \ : (n) >= 11 && (n) <= 18 ? (n) + 1 \ : (n)) Any other ideas? What is likely GDB fallout? Danny