This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
fix dwarf2 constant reference
- To: gcc-patches at gcc dot gnu dot org
- Subject: fix dwarf2 constant reference
- From: Richard Henderson <rth at redhat dot com>
- Date: Thu, 26 Jul 2001 17:01:42 -0700
SpecFP 95 applu.f has a couple of variables that are assigned
constants, e.g.
r43 = ( 4.0d+00 / 3.0d+00 )
Something about the way the fortran front end is emitting the
variable reference (I didn't investigate) leaves the debug info
with the idea that the variable's address is in the constant pool,
i.e., (mem:DF (symbol_ref:DI "$LC43")). Which is all well and
good, since that memory location would contain the correct value
for that variable.
Except that it turns out that those constants are never actually
used -- we always manage to constant-fold each and every one of
them with something adjacent. Which means that $LC43 isn't emitted,
which means that we've got a reference to an undefined label in
the debug info, which means the link fails.
Fixed by noticing constant pool references in the debug info and
emitting the constant into the debug info directly, like so:
.ascii "r43\0" # DW_AT_name
.byte 0x1 # DW_AT_decl_file
.2byte 0x67a # DW_AT_decl_line
.4byte 0x642 # DW_AT_type
.byte 0x8 # DW_AT_const_value
.4byte 0x55555555 # fp constant word 0
.4byte 0x3ff55555 # fp constant word 1
Oh, and I happened to notice a buglet in how unsigned integer
constants are emitted.
Tested on alphaev56-linux.
r~
* simplify-rtx.c (avoid_constant_pool_reference): Export.
* rtl.h (avoid_constant_pool_reference): Declare it.
* dwarf2out.c (add_location_or_const_value_attribute): Use it.
(add_const_value_attribute): Use add_AT_unsigned for unsigned values.
Index: dwarf2out.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/dwarf2out.c,v
retrieving revision 1.294
diff -c -p -d -r1.294 dwarf2out.c
*** dwarf2out.c 2001/07/19 21:17:07 1.294
--- dwarf2out.c 2001/07/26 23:44:46
*************** add_const_value_attribute (die, rtl)
*** 8215,8221 ****
{
if ((unsigned long) val != (unsigned HOST_WIDE_INT) val)
abort ();
! add_AT_int (die, DW_AT_const_value, (unsigned long) val);
}
}
break;
--- 8215,8221 ----
{
if ((unsigned long) val != (unsigned HOST_WIDE_INT) val)
abort ();
! add_AT_unsigned (die, DW_AT_const_value, (unsigned long) val);
}
}
break;
*************** add_location_or_const_value_attribute (d
*** 8473,8478 ****
--- 8473,8483 ----
rtl = rtl_for_decl_location (decl);
if (rtl == NULL_RTX)
return;
+
+ /* If we don't look past the constant pool, we risk emitting a
+ reference to a constant pool entry that isn't referenced from
+ code, and thus is not emitted. */
+ rtl = avoid_constant_pool_reference (rtl);
switch (GET_CODE (rtl))
{
Index: rtl.h
===================================================================
RCS file: /cvs/gcc/egcs/gcc/rtl.h,v
retrieving revision 1.279
diff -c -p -d -r1.279 rtl.h
*** rtl.h 2001/07/26 20:36:00 1.279
--- rtl.h 2001/07/26 23:44:46
*************** extern rtx simplify_gen_subreg PARAMS (
*** 1345,1350 ****
--- 1345,1351 ----
unsigned int));
extern rtx simplify_replace_rtx PARAMS ((rtx, rtx, rtx));
extern rtx simplify_rtx PARAMS ((rtx));
+ extern rtx avoid_constant_pool_reference PARAMS ((rtx));
/* In function.c */
extern rtx gen_mem_addressof PARAMS ((rtx, union tree_node *));
Index: simplify-rtx.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/simplify-rtx.c,v
retrieving revision 1.72
diff -c -p -d -r1.72 simplify-rtx.c
*** simplify-rtx.c 2001/07/24 23:43:55 1.72
--- simplify-rtx.c 2001/07/26 23:44:46
*************** Boston, MA 02111-1307, USA. */
*** 99,105 ****
static rtx simplify_plus_minus PARAMS ((enum rtx_code,
enum machine_mode, rtx, rtx));
static void check_fold_consts PARAMS ((PTR));
- static rtx avoid_constant_pool_reference PARAMS ((rtx));
/* Make a binary operation by properly ordering the operands and
seeing if the expression folds. */
--- 99,104 ----
*************** simplify_gen_binary (code, mode, op0, op
*** 138,144 ****
/* If X is a MEM referencing the constant pool, return the real value.
Otherwise return X. */
! static rtx
avoid_constant_pool_reference (x)
rtx x;
{
--- 137,143 ----
/* If X is a MEM referencing the constant pool, return the real value.
Otherwise return X. */
! rtx
avoid_constant_pool_reference (x)
rtx x;
{