Commit 1d6a3234 by Jakub Jelinek Committed by Jakub Jelinek

dwarf2out.c (loc_descriptor): For SYMBOL_REFs and LABEL_REFs use…

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
parent cbdd7479
2009-12-17 Jakub Jelinek <jakub@redhat.com>
* 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.
2009-12-17 Alexandre Oliva <aoliva@redhat.com>
PR debug/41679
......@@ -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
......
2009-12-17 Jakub Jelinek <jakub@redhat.com>
* 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.
2009-12-17 Alexandre Oliva <aoliva@redhat.com>
PR debug/41679
......
/* { dg-do compile } */
/* { dg-options "-O -gdwarf-2 -dA" } */
/* { dg-options "-O -gdwarf-2 -dA -gno-strict-dwarf -fno-merge-debug-strings" } */
/* { dg-require-visibility "" } */
/* { dg-final { scan-assembler "DW_AT_const_value" } } */
/* { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*fnx\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */
extern void x () __attribute__((visibility ("hidden")));
void (* const f) () = x;
extern void fnx () __attribute__((visibility ("hidden")));
void (* const f) () = fnx;
// Contributed by Dodji Seketeli <dodji@redhat.com>
// Origin PR debug/30161
// { dg-options "-g -dA" }
// { dg-options "-g -dA -gno-strict-dwarf -fno-merge-debug-strings" }
// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
// { dg-final { scan-assembler "f.*DW_AT_name" } }
// { dg-final { scan-assembler "_Z4blehv.*DW_AT_const_value" } }
// { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */
typedef void (*func_ptr)();
......
// Contributed by Dodji Seketeli <dodji@redhat.com>
// Origin PR debug/30161
// { dg-options "-g -dA" }
// { dg-options "-g -dA -gno-strict-dwarf -fno-merge-debug-strings" }
// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
// { dg-final { scan-assembler "f.*DW_AT_name" } }
// { dg-final { scan-assembler "_Z4blehv.*DW_AT_const_value" } }
// { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */
typedef void (*func_ptr) ();
......
/* { dg-do compile } */
/* { dg-options "-O -gdwarf-2 -dA" } */
/* { dg-options "-O -gdwarf-2 -dA -gno-strict-dwarf -fno-merge-debug-strings" } */
/* { dg-require-visibility "" } */
/* { dg-final { scan-assembler "DW_AT_const_value" } } */
/* { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*fnx\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */
extern void x() __attribute__((visibility("hidden")));
static void (*f)() = x;
extern void fnx() __attribute__((visibility("hidden")));
static void (*f)() = fnx;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment