diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-07-19 20:01:56 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-07-19 20:01:56 +0000 |
commit | d11043f9ea352ea0715e9e98c3076829eb503fd4 (patch) | |
tree | fb904da8c31d229932491fddd79d8a08930b1eed /gcc/dwarf2out.c | |
parent | bd7ac405a2e595c312d5b76eecf96b9f54dc9f8d (diff) | |
download | gcc-d11043f9ea352ea0715e9e98c3076829eb503fd4.tar.gz |
PR debug/53235
* dwarf2out.c (generate_type_signature): Handle the case of DIE
being nested, rather than its declaration..
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189676 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r-- | gcc/dwarf2out.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index dd48d1d7891..e36a15d60c9 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -4011,6 +4011,23 @@ get_AT (dw_die_ref die, enum dwarf_attribute attr_kind) return NULL; } +/* Returns the parent of the declaration of DIE. */ + +static dw_die_ref +get_die_parent (dw_die_ref die) +{ + dw_die_ref t; + + if (!die) + return NULL; + + if ((t = get_AT_ref (die, DW_AT_abstract_origin)) + || (t = get_AT_ref (die, DW_AT_specification))) + die = t; + + return die->die_parent; +} + /* Return the "low pc" attribute value, typically associated with a subprogram DIE. Return null if the "low pc" attribute is either not present, or if it cannot be represented as an assembler label identifier. */ @@ -5630,9 +5647,11 @@ generate_type_signature (dw_die_ref die, comdat_type_node *type_node) unsigned char checksum[16]; struct md5_ctx ctx; dw_die_ref decl; + dw_die_ref parent; name = get_AT_string (die, DW_AT_name); decl = get_AT_ref (die, DW_AT_specification); + parent = get_die_parent (die); /* First, compute a signature for just the type name (and its surrounding context, if any. This is stored in the type unit DIE for link-time @@ -5643,8 +5662,8 @@ generate_type_signature (dw_die_ref die, comdat_type_node *type_node) md5_init_ctx (&ctx); /* Checksum the names of surrounding namespaces and structures. */ - if (decl != NULL && decl->die_parent != NULL) - checksum_die_context (decl->die_parent, &ctx); + if (parent != NULL) + checksum_die_context (parent, &ctx); md5_process_bytes (&die->die_tag, sizeof (die->die_tag), &ctx); md5_process_bytes (name, strlen (name) + 1, &ctx); @@ -5660,8 +5679,8 @@ generate_type_signature (dw_die_ref die, comdat_type_node *type_node) die->die_mark = mark; /* Checksum the names of surrounding namespaces and structures. */ - if (decl != NULL && decl->die_parent != NULL) - checksum_die_context (decl->die_parent, &ctx); + if (parent != NULL) + checksum_die_context (parent, &ctx); /* Checksum the DIE and its children. */ die_checksum_ordered (die, &ctx, &mark); |