From: Jakub Jelinek Date: Wed, 20 Feb 2002 23:19:24 +0000 (+0100) Subject: re PR debug/4461 (Invalid dawrf2 debug code) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=149d6f9edd9430452e81bde4f6e611f5e81c9f2e;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a64a64af8a..7abdd710fb0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2002-02-20 Jakub Jelinek + + 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 * combine.c (do_SUBST): Sanity check substitutions of diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 4eb18c7c7a8..f51df45d77b 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -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); diff --git a/gcc/rtl.h b/gcc/rtl.h index 714faac91c6..c5b3397a355 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -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)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index faec271d206..a6653596fa6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -12,6 +12,8 @@ * g++.dg/opt/ptrintsum1.C: New test. + * gcc.dg/debug/20020220-1.c: New test. + 2002-02-17 Jakub Jelinek * gcc.c-torture/execute/20020216-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/debug/20020220-1.c b/gcc/testsuite/gcc.dg/debug/20020220-1.c new file mode 100644 index 00000000000..07109e86a98 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/20020220-1.c @@ -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; +} diff --git a/gcc/varasm.c b/gcc/varasm.c index 67d64e6263b..46810c6833f 100644 --- a/gcc/varasm.c +++ b/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