re PR middle-end/49675 (ICE (segfault) with -finstrument-functions)
authorJakub Jelinek <jakub@redhat.com>
Mon, 18 Jul 2011 19:41:45 +0000 (21:41 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 18 Jul 2011 19:41:45 +0000 (21:41 +0200)
PR middle-end/49675
* tree.c (build_common_builtin_nodes): Register
__builtin_return_address, __cyg_profile_func_enter
and __cyg_profile_func_exit.

* gfortran.dg/pr49675.f90: New test.

From-SVN: r176417

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr49675.f90 [new file with mode: 0644]
gcc/tree.c

index 4bfd455628a23b485b6da55830fbea999e2485bc..8a30143f5782668081c12be11659ce0d532d64af 100644 (file)
@@ -1,3 +1,10 @@
+2011-07-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/49675
+       * tree.c (build_common_builtin_nodes): Register
+       __builtin_return_address, __cyg_profile_func_enter
+       and __cyg_profile_func_exit.
+
 2011-07-18  Richard Henderson  <rth@redhat.com>
 
        * bb-reorder.c (emit_barrier_after_bb): Split out of ...
index 32f59bd279b192d18328431327597446e478e6e0..03b4441c29daa5d6de9fc51eb8cca7b80ee750a9 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-18  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/49675
+       * gfortran.dg/pr49675.f90: New test.
+
 2011-07-18  Richard Guenther  <rguenther@suse.de>
 
        * gcc.dg/torture/20110718-1.c: New testcase.
diff --git a/gcc/testsuite/gfortran.dg/pr49675.f90 b/gcc/testsuite/gfortran.dg/pr49675.f90
new file mode 100644 (file)
index 0000000..06fd1b6
--- /dev/null
@@ -0,0 +1,6 @@
+! PR middle-end/49675
+! { dg-do compile }
+! { dg-options "-finstrument-functions" }
+end
+! { dg-final { scan-assembler "__cyg_profile_func_enter" } }
+! { dg-final { scan-assembler "__cyg_profile_func_exit" } }
index 10f50de8a5251a5c2ce0bdc1f849d767f1467219..8c44851a18b5d5c5b318b3c2201126f51b3f753a 100644 (file)
@@ -9546,6 +9546,31 @@ build_common_builtin_nodes (void)
                         ? "_Unwind_SjLj_Resume" : "_Unwind_Resume"),
                        ECF_NORETURN);
 
+  if (built_in_decls[BUILT_IN_RETURN_ADDRESS] == NULL_TREE)
+    {
+      ftype = build_function_type_list (ptr_type_node, integer_type_node,
+                                       NULL_TREE);
+      local_define_builtin ("__builtin_return_address", ftype,
+                           BUILT_IN_RETURN_ADDRESS,
+                           "__builtin_return_address",
+                           ECF_NOTHROW);
+    }
+
+  if (built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER] == NULL_TREE
+      || built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT] == NULL_TREE)
+    {
+      ftype = build_function_type_list (void_type_node, ptr_type_node,
+                                       ptr_type_node, NULL_TREE);
+      if (built_in_decls[BUILT_IN_PROFILE_FUNC_ENTER] == NULL_TREE)
+       local_define_builtin ("__cyg_profile_func_enter", ftype,
+                             BUILT_IN_PROFILE_FUNC_ENTER,
+                             "__cyg_profile_func_enter", 0);
+      if (built_in_decls[BUILT_IN_PROFILE_FUNC_EXIT] == NULL_TREE)
+       local_define_builtin ("__cyg_profile_func_exit", ftype,
+                             BUILT_IN_PROFILE_FUNC_EXIT,
+                             "__cyg_profile_func_exit", 0);
+    }
+
   /* The exception object and filter values from the runtime.  The argument
      must be zero before exception lowering, i.e. from the front end.  After
      exception lowering, it will be the region number for the exception