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:
parent
4161da1219
commit
149d6f9edd
6 changed files with 71 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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.
|
||||
|
|
31
gcc/testsuite/gcc.dg/debug/20020220-1.c
Normal file
31
gcc/testsuite/gcc.dg/debug/20020220-1.c
Normal 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;
|
||||
}
|
13
gcc/varasm.c
13
gcc/varasm.c
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue