re PR debug/66535 (segfault in gen_subprogram_die after debug-early merge)
authorAldy Hernandez <aldyh@redhat.com>
Mon, 15 Jun 2015 16:34:53 +0000 (16:34 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Mon, 15 Jun 2015 16:34:53 +0000 (16:34 +0000)
PR debug/66535
* dwarf2out.c (gen_subprogram_die): Do not check a parent's tag if
there is no parent.

From-SVN: r224486

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/gnat.dg/debug4.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/debug4_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/debug4_pkg.ads [new file with mode: 0644]

index f9cf11563363c5adceada81159415937db66babb..48b9ca72059124147d720853c7b6bc768fdbfbf3 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-15  Aldy Hernandez  <aldyh@redhat.com>
+
+       PR debug/66535
+       * dwarf2out.c (gen_subprogram_die): Do not check a parent's tag if
+       there is no parent.
+
 2015-06-14  Shiva Chen  <shiva0217@gmail.com>
 
        * aarch64.c (aarch64_simd_lane_bounds): Change %ld to %wd for
index d2c516ab87985ae0a93e52fe0af3477f3959fd34..4fe33f8a8b99aa827853b470a8a0fa8a943c5f6e 100644 (file)
@@ -18790,7 +18790,8 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
                   end function
                 end module
           */
-          || old_die->die_parent->die_tag == DW_TAG_module
+          || (old_die->die_parent
+              && old_die->die_parent->die_tag == DW_TAG_module)
           || context_die == NULL)
           && (DECL_ARTIFICIAL (decl)
               || (get_AT_file (old_die, DW_AT_decl_file) == file_index
diff --git a/gcc/testsuite/gnat.dg/debug4.adb b/gcc/testsuite/gnat.dg/debug4.adb
new file mode 100644 (file)
index 0000000..1ec37c2
--- /dev/null
@@ -0,0 +1,10 @@
+-- { dg-compile }
+-- { dg-options "-g" }
+
+with Debug4_Pkg;
+
+procedure Debug4 is
+   package P is new Debug4_Pkg (Natural);
+begin
+   null;
+end;
diff --git a/gcc/testsuite/gnat.dg/debug4_pkg.adb b/gcc/testsuite/gnat.dg/debug4_pkg.adb
new file mode 100644 (file)
index 0000000..18ba0c0
--- /dev/null
@@ -0,0 +1,23 @@
+package body Debug4_Pkg is
+
+   type Vertex_To_Vertex_T is array (Vertex_Id range <>) of Vertex_Id;
+
+   function Dominator_Tree_Internal (G : T'Class) return Vertex_To_Vertex_T is
+      subtype V_To_V is Vertex_To_Vertex_T (0 .. G.Vertices.Last_Index);
+      type V_To_VIL is array
+        (Valid_Vertex_Id range 1 .. G.Vertices.Last_Index)
+        of Vertex_Index_List;
+      Bucket : V_To_VIL := (others => VIL.Empty_Vector);
+      Dom    : V_To_V   := (others => 0);
+   begin
+      return Dom;
+   end;
+
+   function Dominator_Tree (G : T'Class) return T is
+      Dom : constant Vertex_To_Vertex_T := Dominator_Tree_Internal (G);
+      DT  : T := (Vertices => VL.Empty_Vector);
+   begin
+      return DT;
+   end;
+
+end Debug4_Pkg;
diff --git a/gcc/testsuite/gnat.dg/debug4_pkg.ads b/gcc/testsuite/gnat.dg/debug4_pkg.ads
new file mode 100644 (file)
index 0000000..bac4953
--- /dev/null
@@ -0,0 +1,28 @@
+with Ada.Containers.Vectors;
+
+generic
+   type Vertex_Key is private;
+package Debug4_Pkg is
+
+   type Vertex_Id is new Natural;
+   subtype Valid_Vertex_Id is Vertex_Id range 1 .. Vertex_Id'Last;
+
+   package VIL is new Ada.Containers.Vectors
+     (Index_Type   => Positive,
+      Element_Type => Valid_Vertex_Id);
+   use VIL;
+   subtype Vertex_Index_List is VIL.Vector;
+
+   package VL is new Ada.Containers.Vectors
+     (Index_Type   => Valid_Vertex_Id,
+      Element_Type => Vertex_Key);
+   use VL;
+   subtype Vertex_List is VL.Vector;
+
+   type T is tagged record
+      Vertices : Vertex_List;
+   end record;
+
+   function Dominator_Tree (G : T'Class) return T;
+
+end Debug4_Pkg;