]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR fortran/47331 (ICE in make_decl_rtl, at varasm.c:1133 (with -fopenmp))
authorTobias Burnus <burnus@net-b.de>
Tue, 25 Jan 2011 17:01:06 +0000 (18:01 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Tue, 25 Jan 2011 17:01:06 +0000 (18:01 +0100)
2011-01-25  Tobias Burnus  <burnus@net-b.de>

        Backport from mainline
        2011-01-17  Jakub Jelinek  <jakub@redhat.com>

        PR fortran/47331
        * gfortran.h (struct gfc_omp_saved_state): New type.
        (gfc_omp_save_and_clear_state, gfc_omp_restore_state): New
        prototypes.
        * resolve.c (resolve_global_procedure): Call it around
        gfc_resolve call.

2011-01-25  Tobias Burnus  <burnus@net-b.de>

        Backport from mainline
        2011-01-17  Jakub Jelinek  <jakub@redhat.com>

        PR fortran/47331
        * gfortran.dg/gomp/pr47331.f90: New test.

From-SVN: r169244

gcc/fortran/ChangeLog
gcc/fortran/gfortran.h
gcc/fortran/openmp.c
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/gomp/pr47331.f90 [new file with mode: 0644]

index d93841351bf3386e91bd2025308c6c92df513897..9b78c07755c6e4c95f0ce331df4767aca7efada8 100644 (file)
@@ -1,3 +1,16 @@
+2011-01-25  Tobias Burnus  <burnus@net-b.de>
+
+       Backport from mainline
+       2011-01-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/47331
+       * gfortran.h (struct gfc_omp_saved_state): New type.
+       (gfc_omp_save_and_clear_state, gfc_omp_restore_state): New prototypes.
+       * resolve.c (resolve_global_procedure): Call it around gfc_resolve
+       call.
+       * openmp.c (gfc_omp_save_and_clear_state, gfc_omp_restore_state): New
+       functions.
+
 2011-01-25  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/47448
index 79bdfeb08b1831ecc716912635b6e6720aa1256f..3fcc5ccba7c7208a9b3c75835e53d6439196dd90 100644 (file)
@@ -2575,11 +2575,14 @@ void gfc_free_case_list (gfc_case *);
 gfc_expr *gfc_get_parentheses (gfc_expr *);
 
 /* openmp.c */
+struct gfc_omp_saved_state { void *ptrs[2]; int ints[1]; };
 void gfc_free_omp_clauses (gfc_omp_clauses *);
 void gfc_resolve_omp_directive (gfc_code *, gfc_namespace *);
 void gfc_resolve_do_iterator (gfc_code *, gfc_symbol *);
 void gfc_resolve_omp_parallel_blocks (gfc_code *, gfc_namespace *);
 void gfc_resolve_omp_do_blocks (gfc_code *, gfc_namespace *);
+void gfc_omp_save_and_clear_state (struct gfc_omp_saved_state *);
+void gfc_omp_restore_state (struct gfc_omp_saved_state *);
 
 /* expr.c */
 void gfc_free_actual_arglist (gfc_actual_arglist *);
index 851b9f228544638ff12a9325be9dc6068f153d10..e26535eaeb039e22ad7b2d8dcb9e8f8a1eec24e8 100644 (file)
@@ -1363,6 +1363,31 @@ gfc_resolve_omp_parallel_blocks (gfc_code *code, gfc_namespace *ns)
 }
 
 
+/* Save and clear openmp.c private state.  */
+
+void
+gfc_omp_save_and_clear_state (struct gfc_omp_saved_state *state)
+{
+  state->ptrs[0] = omp_current_ctx;
+  state->ptrs[1] = omp_current_do_code;
+  state->ints[0] = omp_current_do_collapse;
+  omp_current_ctx = NULL;
+  omp_current_do_code = NULL;
+  omp_current_do_collapse = 0;
+}
+
+
+/* Restore openmp.c private state from the saved state.  */
+
+void
+gfc_omp_restore_state (struct gfc_omp_saved_state *state)
+{
+  omp_current_ctx = (struct omp_context *) state->ptrs[0];
+  omp_current_do_code = (gfc_code *) state->ptrs[1];
+  omp_current_do_collapse = state->ints[0];
+}
+
+
 /* Note a DO iterator variable.  This is special in !$omp parallel
    construct, where they are predetermined private.  */
 
index 83d48b6653dbbe329e91f952af38d7cdeb1fc063..d102357645f631ef361d9c7a5decf9d0567ba112 100644 (file)
@@ -1810,11 +1810,14 @@ resolve_global_procedure (gfc_symbol *sym, locus *where,
       if (!gsym->ns->resolved)
        {
          gfc_dt_list *old_dt_list;
+         struct gfc_omp_saved_state old_omp_state;
 
          /* Stash away derived types so that the backend_decls do not
             get mixed up.  */
          old_dt_list = gfc_derived_types;
          gfc_derived_types = NULL;
+         /* And stash away openmp state.  */
+         gfc_omp_save_and_clear_state (&old_omp_state);
 
          gfc_resolve (gsym->ns);
 
@@ -1824,6 +1827,8 @@ resolve_global_procedure (gfc_symbol *sym, locus *where,
 
          /* Restore the derived types of this namespace.  */
          gfc_derived_types = old_dt_list;
+         /* And openmp state.  */
+         gfc_omp_restore_state (&old_omp_state);
        }
 
       /* Make sure that translation for the gsymbol occurs before
index adad4a6294737dce54b2342923873a7c862190ea..7eb83817dadbaac2543feaa09c7d5ea922a69cab 100644 (file)
@@ -1,3 +1,11 @@
+2011-01-25  Tobias Burnus  <burnus@net-b.de>
+
+       Backport from mainline
+       2011-01-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/47331
+       * gfortran.dg/gomp/pr47331.f90: New test.
+
 2011-01-25  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/47448
diff --git a/gcc/testsuite/gfortran.dg/gomp/pr47331.f90 b/gcc/testsuite/gfortran.dg/gomp/pr47331.f90
new file mode 100644 (file)
index 0000000..71713e0
--- /dev/null
@@ -0,0 +1,24 @@
+! PR fortran/47331
+! { dg-do compile }
+! { dg-options "-fopenmp -fwhole-file" }
+
+subroutine foo
+  !$omp parallel
+    call bar ()
+  !$omp end parallel
+end subroutine foo
+
+subroutine bar
+  integer :: k
+  do k=1,5
+    call baz (k)
+  end do
+end subroutine bar
+
+subroutine baz (k)
+  integer :: k
+end subroutine
+
+program pr47331
+  call foo
+end program pr47331