re PR debug/45088 (pointer type information lost in debuginfo)

Fix for PR debug/45088

gcc/

	* dwarf2out.c (gen_type_die_with_usage): Do not try to emit debug
	info for a redundant typedef that has DECL_ORIGINAL_TYPE set. Use
	that underlying type instead.

gcc/testsuite/

	* g++.dg/debug/dwarf2/self-ref-1.C: New test.
	* g++.dg/debug/dwarf2/self-ref-2.C: Likewise.

From-SVN: r167976
This commit is contained in:
Dodji Seketeli 2010-12-17 10:39:21 +00:00 committed by Dodji Seketeli
parent a4ad1c7a08
commit d997fbe8f1
5 changed files with 79 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2010-12-17 Dodji Seketeli <dodji@redhat.com>
* dwarf2out.c (gen_type_die_with_usage): Do not try to emit debug
info for a redundant typedef that has DECL_ORIGINAL_TYPE set. Use
that underlying type instead.
2010-12-16 Jan Hubicka <jh@suse.cz>
PR middle-end/44563

View File

@ -20251,13 +20251,23 @@ gen_tagged_type_die (tree type,
static void
gen_type_die_with_usage (tree type, dw_die_ref context_die,
enum debug_info_usage usage)
enum debug_info_usage usage)
{
struct array_descr_info info;
if (type == NULL_TREE || type == error_mark_node)
return;
if (TYPE_NAME (type) != NULL_TREE
&& TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
&& is_redundant_typedef (TYPE_NAME (type))
&& DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
/* The DECL of this type is a typedef we don't want to emit debug
info for but we want debug info for its underlying typedef.
This can happen for e.g, the injected-class-name of a C++
type. */
type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
/* If TYPE is a typedef type variant, let's generate debug info
for the parent typedef which TYPE is a type of. */
if (typedef_variant_p (type))

View File

@ -1,3 +1,8 @@
2010-12-17 Dodji Seketeli <dodji@redhat.com>
* g++.dg/debug/dwarf2/self-ref-1.C: New test.
* g++.dg/debug/dwarf2/self-ref-2.C: Likewise.
2010-12-16 Sebastian Pop <sebastian.pop@amd.com>
PR tree-optimization/46924

View File

@ -0,0 +1,28 @@
// Origin: PR debug/45088
// { dg-do compile }
// { dg-options "-g -dA" }
// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
struct A
{
virtual ~A();
};
struct B : public A
{
virtual ~B(){}
};
struct C : public B
{
A* a1;
};
int
main()
{
C c;
c.a1 = 0;
return 0;
}

View File

@ -0,0 +1,29 @@
// Origin: PR debug/45088
// { dg-do compile }
// { dg-options "-g -dA" }
// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
template<class T>
struct A
{
virtual ~A();
};
struct B : public A<int>
{
virtual ~B(){}
};
struct C : public B
{
A<int>* a1;
};
int
main()
{
C c;
c.a1 = 0;
return 0;
}