From patchwork Fri Dec 7 21:59:00 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [mips,debug] Fix PR 54061, mips compiler aborts in testsuite Date: Fri, 07 Dec 2012 11:59:00 -0000 From: Steve Ellcey X-Patchwork-Id: 204614 Message-Id: To: 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 sellcey@mips.com 2012-12-07 Steve Ellcey 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,