aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@gcc.gnu.org>2017-09-09 18:22:16 -0400
committerJason Merrill <jason@gcc.gnu.org>2017-09-09 18:22:16 -0400
commit96fddae85c00659239e26165c20480dd01d74a60 (patch)
treea682b6f36508c8a84572fae32404debb2d19bffc /gcc
parent84d0b6f5a52834bf4d8587521b16f5b2854e6234 (diff)
downloadgcc-96fddae85c00659239e26165c20480dd01d74a60.zip
gcc-96fddae85c00659239e26165c20480dd01d74a60.tar.gz
gcc-96fddae85c00659239e26165c20480dd01d74a60.tar.bz2
Revert: * dwarf2out.c (gen_formal_parameter_die): Remove obsolete hunk.
Check ultimate_origin before setting reusing_die. From-SVN: r251941
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dwarf2out.c25
2 files changed, 22 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 01d4251..b9b0456 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,9 +1,3 @@
-2017-09-09 Richard Biener <rguenther@suse.de>
- Jason Merrill <jason@redhat.com>
-
- * dwarf2out.c (gen_formal_parameter_die): Remove obsolete hunk.
- Check ultimate_origin before setting reusing_die.
-
2017-09-08 Jason Merrill <jason@redhat.com>
PR c++/70029 - ICE with ref-qualifier and -flto
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index cc93db3..00d6d95 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -21285,15 +21285,30 @@ gen_formal_parameter_die (tree node, tree origin, bool emit_name_p,
dw_die_ref context_die)
{
tree node_or_origin = node ? node : origin;
+ tree ultimate_origin;
dw_die_ref parm_die = NULL;
if (DECL_P (node_or_origin))
{
parm_die = lookup_decl_die (node);
- tree ultimate_origin = decl_ultimate_origin (node_or_origin);
- if (node || ultimate_origin)
- origin = ultimate_origin;
+ /* If the contexts differ, we may not be talking about the same
+ thing.
+ ??? When in LTO the DIE parent is the "abstract" copy and the
+ context_die is the specification "copy". But this whole block
+ should eventually be no longer needed. */
+ if (parm_die && parm_die->die_parent != context_die && !in_lto_p)
+ {
+ if (!DECL_ABSTRACT_P (node))
+ {
+ /* This can happen when creating an inlined instance, in
+ which case we need to create a new DIE that will get
+ annotated with DW_AT_abstract_origin. */
+ parm_die = NULL;
+ }
+ else
+ gcc_unreachable ();
+ }
if (parm_die && parm_die->die_parent == NULL)
{
@@ -21328,6 +21343,10 @@ gen_formal_parameter_die (tree node, tree origin, bool emit_name_p,
switch (TREE_CODE_CLASS (TREE_CODE (node_or_origin)))
{
case tcc_declaration:
+ ultimate_origin = decl_ultimate_origin (node_or_origin);
+ if (node || ultimate_origin)
+ origin = ultimate_origin;
+
if (reusing_die)
goto add_location;