aboutsummaryrefslogtreecommitdiff
path: root/gcc/dwarf2out.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2009-12-17 23:07:13 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2009-12-17 23:07:13 +0100
commit1d6a323453a9261b5ffea44bf37af20369203ef8 (patch)
tree035d2af942a102f0f2d21ec3c9dc44b27f699373 /gcc/dwarf2out.c
parentcbdd74793b8442f78a18c036cdac8a5ba472b7c5 (diff)
downloadgcc-1d6a323453a9261b5ffea44bf37af20369203ef8.zip
gcc-1d6a323453a9261b5ffea44bf37af20369203ef8.tar.gz
gcc-1d6a323453a9261b5ffea44bf37af20369203ef8.tar.bz2
dwarf2out.c (loc_descriptor): For SYMBOL_REFs and LABEL_REFs use DW_OP_addr+DW_OP_stack_value instead of...
* dwarf2out.c (loc_descriptor): For SYMBOL_REFs and LABEL_REFs use DW_OP_addr+DW_OP_stack_value instead of DW_OP_implicit_value. (add_const_value_attribute): For CONST_STRING, SYMBOL_REFs and LABEL_REFs use DW_OP_addr+DW_OP_stack_value DW_AT_location instead of DW_AT_const_value. * gcc.dg/debug/dwarf2/const-1.c: Don't expect DW_AT_const_value, but instead DW_AT_location with DW_OP_addr+DW_OP_stack_value. Add -gno-strict-dwarf -fno-merge-debug-strings to dg-options. * g++.dg/debug/dwarf2/const1.C: Likewise. * g++.dg/debug/dwarf2/template-params-3.C: Likewise. * g++.dg/debug/dwarf2/template-func-params-3.C: Likewise. From-SVN: r155327
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r--gcc/dwarf2out.c32
1 files changed, 21 insertions, 11 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index c366ee5..da04057 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -13775,10 +13775,10 @@ loc_descriptor (rtx rtl, enum machine_mode mode,
if (mode != VOIDmode && GET_MODE_SIZE (mode) == DWARF2_ADDR_SIZE
&& (dwarf_version >= 4 || !dwarf_strict))
{
- loc_result = new_loc_descr (DW_OP_implicit_value,
- DWARF2_ADDR_SIZE, 0);
- loc_result->dw_loc_oprnd2.val_class = dw_val_class_addr;
- loc_result->dw_loc_oprnd2.v.val_addr = rtl;
+ loc_result = new_loc_descr (DW_OP_addr, 0, 0);
+ loc_result->dw_loc_oprnd1.val_class = dw_val_class_addr;
+ loc_result->dw_loc_oprnd1.v.val_addr = rtl;
+ add_loc_descr (&loc_result, new_loc_descr (DW_OP_stack_value, 0, 0));
VEC_safe_push (rtx, gc, used_rtx_array, rtl);
}
break;
@@ -15223,10 +15223,20 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
return true;
case CONST_STRING:
- resolve_one_addr (&rtl, NULL);
- add_AT_addr (die, DW_AT_const_value, rtl);
- VEC_safe_push (rtx, gc, used_rtx_array, rtl);
- return true;
+ if (dwarf_version >= 4 || !dwarf_strict)
+ {
+ dw_loc_descr_ref loc_result;
+ resolve_one_addr (&rtl, NULL);
+ rtl_addr:
+ loc_result = new_loc_descr (DW_OP_addr, 0, 0);
+ loc_result->dw_loc_oprnd1.val_class = dw_val_class_addr;
+ loc_result->dw_loc_oprnd1.v.val_addr = rtl;
+ add_loc_descr (&loc_result, new_loc_descr (DW_OP_stack_value, 0, 0));
+ add_AT_loc (die, DW_AT_location, loc_result);
+ VEC_safe_push (rtx, gc, used_rtx_array, rtl);
+ return true;
+ }
+ return false;
case CONST:
if (CONSTANT_P (XEXP (rtl, 0)))
@@ -15236,9 +15246,9 @@ add_const_value_attribute (dw_die_ref die, rtx rtl)
if (!const_ok_for_output (rtl))
return false;
case LABEL_REF:
- add_AT_addr (die, DW_AT_const_value, rtl);
- VEC_safe_push (rtx, gc, used_rtx_array, rtl);
- return true;
+ if (dwarf_version >= 4 || !dwarf_strict)
+ goto rtl_addr;
+ return false;
case PLUS:
/* In cases where an inlined instance of an inline function is passed