(Patch 4/5, which adds support for noncontiguous arrays to the finalization wrapper follows soon; it works, but I should do a small cleanup before submittal.)

Contrary to the other patches in this series, this patch changes the generated code - and it changes the ABI. With this patch, the virtual table (vtab) gets a "_final" components between _copy and the user's type-bound procedures. Additionally, the finalization wrapper is generated.


Note: This patch only adds the finalization wrapper function - it does not use it. Thus, there is no user-visible benefit of this patch - except for the avoided 4.9 ABI issue.

The risk of this patch is rather low (only ICEs are possible).

The (only? main?) advantage of this patch is that it avoids ABI breakage for polymorphic variables immediately after branching 4.8. (Due to two recent patches, we have already broken the ABI for 4.8 and bumped the .mod version. Thus, this breakage could make use of the already bumped .mod file version number.)


Build and regtested on x86-64-gnu-linux.
OK for the 4.8 trunk? – Alternatively: OK for the 4.9 trunk?

* * *

The next step is make use of the finalization wrapper for both calling the user's finalization subroutines but also for deallocating allocatable components of polymorphic variables/components. ("polymorphic freeing").

At https://userpage.physik.fu-berlin.de/~tburnus/final/ I have a draft patch which handles some of the cases; however, the support is incomplete and there are possibly some issues.

One could consider supporting some subset of polymorphic freeing or finalization using the user's FINAL subroutines even for 4.8. However, it looks more like GCC 4.9 material. Comments?

Tobias
2012-12-31  Tobias Burnus  <bur...@net-b.de>

	* class.c (gfc_find_derived_vtab): Activate the generation
	of the finalization wrapper.

diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index 61d65e7..84f383e 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -2024,9 +2425,7 @@ gfc_find_derived_vtab (gfc_symbol *derived)
 		 components and the calls to finalization subroutines.
 		 Note: The actual wrapper function can only be generated
 		 at resolution time.  */
-	    /* FIXME: Enable ABI-breaking "_final" generation.  */
-	    if (0)
-	    {
+
 	      if (gfc_add_component (vtype, "_final", &c) == FAILURE)
 		goto cleanup;
 	      c->attr.proc_pointer = 1;
@@ -2034,7 +2433,6 @@ gfc_find_derived_vtab (gfc_symbol *derived)
 	      c->tb = XCNEW (gfc_typebound_proc);
 	      c->tb->ppc = 1;
 	      generate_finalization_wrapper (derived, ns, tname, c);
-	    }
 
 	      /* Add procedure pointers for type-bound procedures.  */
 	      if (!derived->attr.unlimited_polymorphic)

Reply via email to