OSDN Git Service

Fix dwarf2 abort while compiling mips simulator, reported by Michael Tiemann.
authorwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Apr 1998 13:47:28 +0000 (13:47 +0000)
committerwilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 29 Apr 1998 13:47:28 +0000 (13:47 +0000)
* dwarf2out.c (scope_die_for): If could not find proper scope,
check for and handle tagged type with incorrect TYPE_CONTEXT.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@19493 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c

index 341de00..42f7119 100644 (file)
@@ -1,3 +1,8 @@
+Wed Apr 29 13:46:03 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * dwarf2out.c (scope_die_for): If could not find proper scope,
+       check for and handle tagged type with incorrect TYPE_CONTEXT.
+
 Wed Apr 29 15:34:40 1998  John Carr  <jfc@mit.edu>
 
        * calls.c (expand_call): Fix recognition of C++ operator new.
index 5ee4a90..71f2ec0 100644 (file)
@@ -7577,6 +7577,24 @@ scope_die_for (t, context_die)
            i = decl_scope_table[i].previous))
        ;
 
+      /* ??? Integrate_decl_tree does not handle BLOCK_TYPE_TAGS, nor
+        does it try to handle types defined by TYPE_DECLs.  Such types
+        thus have an incorrect TYPE_CONTEXT, which points to the block
+        they were originally defined in, instead of the current block
+        created by function inlining.  We try to detect that here and
+        work around it.  */
+
+      if (i < 0 && scope_die == comp_unit_die
+         && TREE_CODE (containing_scope) == BLOCK
+         && is_tagged_type (t)
+         && (block_ultimate_origin (decl_scope_table[decl_scope_depth - 1].scope)
+             == containing_scope))
+       {
+         scope_die = context_die;
+         /* Since the checks below are no longer applicable.  */
+         i = 0;
+       }
+
       if (i < 0)
        {
          if (scope_die != comp_unit_die