This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch, mips, debug] Fix PR 54061, mips compiler aborts in testsuite
On Fri, Dec 7, 2012 at 2:17 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Fri, Dec 7, 2012 at 1:59 PM, Steve Ellcey <sellcey@mips.com> wrote:
>> 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 <sellcey@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;
>> }
>
> I added it for
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52857
>
> In this bug, we used the wrong register to generate DWARF
> info. Your patch removes the assert, which may make GCC
> silently generate bad DWARF info.
>
>> @@ -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,
>
> I think you need a way to tell a bad register from a good register
> which doesn't have DWARF register number.
>
Something like
#define IGNORED_DWARF_REGNUM (INVALID_REGNUM - 1)
--
H.J.