re PR debug/59418 (ICE in maybe_record_trace_start, at dwarf2cfi.c:2221)

PR debug/59418
	* dwarf2cfi.c (dwarf2out_frame_debug_cfa_offset): Fix comment and tidy.
	(dwarf2out_frame_debug_cfa_restore): Handle TARGET_DWARF_REGISTER_SPAN.
	(dwarf2out_frame_debug_expr): Tidy.

From-SVN: r206084
This commit is contained in:
Eric Botcazou 2013-12-18 10:34:00 +00:00 committed by Eric Botcazou
parent 468f5fc95c
commit a4d47cacbd
4 changed files with 78 additions and 14 deletions

View File

@ -1,3 +1,10 @@
2013-12-18 Eric Botcazou <ebotcazou@adacore.com>
PR debug/59418
* dwarf2cfi.c (dwarf2out_frame_debug_cfa_offset): Fix comment and tidy.
(dwarf2out_frame_debug_cfa_restore): Handle TARGET_DWARF_REGISTER_SPAN.
(dwarf2out_frame_debug_expr): Tidy.
2013-12-18 Alexander Ivchenko <alexander.ivchenko@intel.com>
Maxim Kuznetsov <maxim.kuznetsov@intel.com>
Sergey Lega <sergey.s.lega@intel.com>

View File

@ -1149,18 +1149,15 @@ dwarf2out_frame_debug_cfa_offset (rtx set)
else
{
/* We have a PARALLEL describing where the contents of SRC live.
Queue register saves for each piece of the PARALLEL. */
int par_index;
int limit;
Adjust the offset for each piece of the PARALLEL. */
HOST_WIDE_INT span_offset = offset;
gcc_assert (GET_CODE (span) == PARALLEL);
limit = XVECLEN (span, 0);
for (par_index = 0; par_index < limit; par_index++)
const int par_len = XVECLEN (span, 0);
for (int par_index = 0; par_index < par_len; par_index++)
{
rtx elem = XVECEXP (span, 0, par_index);
sregno = dwf_regno (src);
reg_save (sregno, INVALID_REGNUM, span_offset);
span_offset += GET_MODE_SIZE (GET_MODE (elem));
@ -1229,10 +1226,31 @@ dwarf2out_frame_debug_cfa_expression (rtx set)
static void
dwarf2out_frame_debug_cfa_restore (rtx reg)
{
unsigned int regno = dwf_regno (reg);
gcc_assert (REG_P (reg));
add_cfi_restore (regno);
update_row_reg_save (cur_row, regno, NULL);
rtx span = targetm.dwarf_register_span (reg);
if (!span)
{
unsigned int regno = dwf_regno (reg);
add_cfi_restore (regno);
update_row_reg_save (cur_row, regno, NULL);
}
else
{
/* We have a PARALLEL describing where the contents of REG live.
Restore the register for each piece of the PARALLEL. */
gcc_assert (GET_CODE (span) == PARALLEL);
const int par_len = XVECLEN (span, 0);
for (int par_index = 0; par_index < par_len; par_index++)
{
reg = XVECEXP (span, 0, par_index);
gcc_assert (REG_P (reg));
unsigned int regno = dwf_regno (reg);
add_cfi_restore (regno);
update_row_reg_save (cur_row, regno, NULL);
}
}
}
/* A subroutine of dwarf2out_frame_debug, process a REG_CFA_WINDOW_SAVE.
@ -1884,23 +1902,23 @@ dwarf2out_frame_debug_expr (rtx expr)
}
}
span = NULL;
if (REG_P (src))
span = targetm.dwarf_register_span (src);
else
span = NULL;
if (!span)
queue_reg_save (src, NULL_RTX, offset);
else
{
/* We have a PARALLEL describing where the contents of SRC live.
Queue register saves for each piece of the PARALLEL. */
int par_index;
int limit;
HOST_WIDE_INT span_offset = offset;
gcc_assert (GET_CODE (span) == PARALLEL);
limit = XVECLEN (span, 0);
for (par_index = 0; par_index < limit; par_index++)
const int par_len = XVECLEN (span, 0);
for (int par_index = 0; par_index < par_len; par_index++)
{
rtx elem = XVECEXP (span, 0, par_index);
queue_reg_save (elem, NULL_RTX, span_offset);

View File

@ -1,3 +1,7 @@
2013-12-18 Eric Botcazou <ebotcazou@adacore.com>
* gcc.dg/pr59418.c: New test.
2013-12-17 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/59523

View File

@ -0,0 +1,35 @@
/* PR debug/59418 */
/* Reported by Ryan Mansfield <rmansfield@qnx.com> */
/* { dg-do compile } */
/* { dg-options "-Os -g" } */
/* { dg-options "-march=armv7-a -mfloat-abi=hard -Os -g" { target arm*-*-* } } */
extern int printf (const char *__format, ...);
void
foo (const char *pptr, int caplen)
{
int type;
const char *tptr;
if (caplen < 4)
{
(void) printf ("foo");
return;
}
while (tptr < pptr)
{
switch (type)
{
case 0x01:
printf ("");
case 0x0b:
printf ("");
case 0x0e:
printf ("");
case 0x10:
printf ("%1.2fW", bar (tptr, caplen) / 1000.0);
}
}
printf ("foo");
}