aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2002-02-21 00:19:24 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2002-02-21 00:19:24 +0100
commit149d6f9edd9430452e81bde4f6e611f5e81c9f2e (patch)
treed49e4ee1337f2fdce87409b5a2a0ec6e2c56a37b /gcc
parent4161da12190d52eb1d622354e6ea67f67195c73c (diff)
downloadgcc-149d6f9edd9430452e81bde4f6e611f5e81c9f2e.zip
gcc-149d6f9edd9430452e81bde4f6e611f5e81c9f2e.tar.gz
gcc-149d6f9edd9430452e81bde4f6e611f5e81c9f2e.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/dwarf2out.c18
-rw-r--r--gcc/rtl.h1
-rw-r--r--gcc/testsuite/ChangeLog2
-rw-r--r--gcc/testsuite/gcc.dg/debug/20020220-1.c31
-rw-r--r--gcc/varasm.c13
6 files changed, 71 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7a64a64..7abdd71 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 4eb18c7..f51df45 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 714faac..c5b3397 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 faec271..a665359 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 <jakub@redhat.com>
* 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 0000000..07109e8
--- /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 67d64e6..46810c6 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