This is my attempt to fix PR 54061, a bug where GCC aborts while trying to put out debug information for a co-processor register. My understanding is that gdb cannot access the coprocessor registers and so there is no valid debug information that can be put out for this case. So my fix is to remove the assert from dbx_reg_number and change the callers to check for a INVALID_REGNUM value coming from dbx_reg_number. If they get this value then they do not put out any debug information for the register. I have tested this on gcc.c-torture/compile/mipscop-[1234].c and it fixes the abort.
I haven't done a full regression test but will do that shortly, in the mean time I wanted to see if this approach was considered acceptable and if not, how I should fix it? Steve Ellcey sell...@mips.com 2012-12-07 Steve Ellcey <sell...@mips.com> PR target/54061 * dwarfwout.c (dbx_reg_number): Remove assert. (reg_loc_descriptor): Check for INVALID_REGNUM. (mem_loc_descriptor): Ditto. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index f0256ae..7d26e7e 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -10438,7 +10438,6 @@ dbx_reg_number (const_rtx rtl) #endif regno = DBX_REGISTER_NUMBER (regno); - gcc_assert (regno != INVALID_REGNUM); return regno; } @@ -10473,6 +10472,9 @@ reg_loc_descriptor (rtx rtl, enum var_init_status initialized) if (REGNO (rtl) >= FIRST_PSEUDO_REGISTER) return 0; + if (dbx_reg_number(rtl) == INVALID_REGNUM) + return 0; + /* We only use "frame base" when we're sure we're talking about the post-prologue local stack frame. We do this by *not* running register elimination until this point, and recognizing the special @@ -11931,6 +11933,8 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode, break; if (REGNO (rtl) > FIRST_PSEUDO_REGISTER) break; + if (dbx_reg_number (rtl) == INVALID_REGNUM) + break; type_die = base_type_for_mode (mode, GET_MODE_CLASS (mode) == MODE_INT); if (type_die == NULL) @@ -12133,6 +12137,9 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode, return NULL; if (REG_P (ENTRY_VALUE_EXP (rtl))) { + if (dbx_reg_number (ENTRY_VALUE_EXP (rtl)) == INVALID_REGNUM) + return NULL; + if (GET_MODE_CLASS (mode) != MODE_INT || GET_MODE_SIZE (mode) > DWARF2_ADDR_SIZE) op0 = mem_loc_descriptor (ENTRY_VALUE_EXP (rtl), mode,