re PR debug/4461 (Invalid dawrf2 debug code)

PR debug/4461
	* varasm.c (get_pool_constant_mark): New.
	* rtl.h (get_pool_constant_mark): Add prototype.
	* dwarf2out.c (mem_loc_descriptor): A pool constant cannot
	be represented if it has not been output.

	* gcc.dg/debug/20020220-1.c: New test.

From-SVN: r49921
This commit is contained in:
Jakub Jelinek 2002-02-21 00:19:24 +01:00 committed by Jakub Jelinek
parent 4161da1219
commit 149d6f9edd
6 changed files with 71 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2002-02-20 Jakub Jelinek <jakub@redhat.com>
PR debug/4461
* varasm.c (get_pool_constant_mark): New.
* rtl.h (get_pool_constant_mark): Add prototype.
* dwarf2out.c (mem_loc_descriptor): A pool constant cannot
be represented if it has not been output.
2002-02-20 Alexandre Oliva <aoliva@redhat.com>
* combine.c (do_SUBST): Sanity check substitutions of

View File

@ -7801,10 +7801,24 @@ mem_loc_descriptor (rtl, mode)
by a different symbol. */
if (GET_CODE (rtl) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (rtl))
{
rtx tmp = get_pool_constant (rtl);
bool marked;
rtx tmp = get_pool_constant_mark (rtl, &marked);
if (GET_CODE (tmp) == SYMBOL_REF)
rtl = tmp;
{
rtl = tmp;
if (CONSTANT_POOL_ADDRESS_P (tmp))
get_pool_constant_mark (tmp, &marked);
else
marked = true;
}
/* If all references to this pool constant were optimized away,
it was not output and thus we can't represent it.
FIXME: might try to use DW_OP_const_value here, though
DW_OP_piece complicates it. */
if (!marked)
return 0;
}
mem_loc_result = new_loc_descr (DW_OP_addr, 0, 0);

View File

@ -1301,6 +1301,7 @@ extern rtx force_const_mem PARAMS ((enum machine_mode, rtx));
/* In varasm.c */
extern rtx get_pool_constant PARAMS ((rtx));
extern rtx get_pool_constant_mark PARAMS ((rtx, bool *));
extern enum machine_mode get_pool_mode PARAMS ((rtx));
extern rtx get_pool_constant_for_function PARAMS ((struct function *, rtx));
extern enum machine_mode get_pool_mode_for_function PARAMS ((struct function *, rtx));

View File

@ -12,6 +12,8 @@
* g++.dg/opt/ptrintsum1.C: New test.
* gcc.dg/debug/20020220-1.c: New test.
2002-02-17 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/execute/20020216-1.c: New test.

View File

@ -0,0 +1,31 @@
/* PR debug/4461
This testcase failed to link in Dwarf-2 because
constant -4.0 in constant pool was never referenced by anything
but Dwarf-2 location descriptor. */
/* { dg-do run } */
void __attribute__((noinline))
foo (const char *x __attribute__((unused)),
__complex__ long double y __attribute__((unused)),
__complex__ long double z __attribute__((unused)))
{
}
void
bar (void)
{
foo ("",
__builtin_conjl (({ __complex__ long double r;
__real__ r = 3.0;
__imag__ r = -4.0;
r; })),
({ __complex__ long double s;
__real__ s = 3.0;
__imag__ s = 4.0;
s; }));
}
int main (void)
{
return 0;
}

View File

@ -3900,6 +3900,19 @@ get_pool_constant (addr)
return (find_pool_constant (cfun, addr))->constant;
}
/* Given a constant pool SYMBOL_REF, return the corresponding constant
and whether it has been output or not. */
rtx
get_pool_constant_mark (addr, pmarked)
rtx addr;
bool *pmarked;
{
struct pool_constant *pool = find_pool_constant (cfun, addr);
*pmarked = (pool->mark != 0);
return pool->constant;
}
/* Likewise, but for the constant pool of a specific function. */
rtx