This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch, Fortran, committed] PR58579 - fix allocation of string temporaries: Avoid overallocation


Tobias Burnus wrote:
In gfc_conv_string_tmp, gfortran allocates temporary strings. However, using "TYPE_SIZE (type)" didn't yield one byte as intended but 64 - which means that gfortran allocated 64 times as much memory as needed.

Committed (Rev. ) after building and regtesting on x86-64-gnu-linux. I didn't see a simple way to generate a test case - but the dump of the PR's test case looks fine both for kind=1 and kind=4 strings.

It turned out - see PR58593 - that one sometimes doesn't have an array type but a simple single-character type. Fixed by the attached patch.

Committed as Rev.  203135 after build+regtesting on x86-64-gnu-linux.

Tobias
Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog	(Revision 203134)
+++ gcc/fortran/ChangeLog	(Arbeitskopie)
@@ -1,3 +1,9 @@
+2013-10-02  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/58593
+	* trans-expr.c (gfc_conv_string_tmp): Fix obtaining
+	the byte size of a single character.
+
 2013-10-01  Tobias Burnus  <burnus@net-b.de>
 
 	PR fortran/58579
Index: gcc/fortran/trans-expr.c
===================================================================
--- gcc/fortran/trans-expr.c	(Revision 203134)
+++ gcc/fortran/trans-expr.c	(Arbeitskopie)
@@ -2357,8 +2357,9 @@ gfc_conv_string_tmp (gfc_se * se, tree type, tree
       var = gfc_create_var (type, "pstr");
       gcc_assert (POINTER_TYPE_P (type));
       tmp = TREE_TYPE (type);
-      gcc_assert (TREE_CODE (tmp) == ARRAY_TYPE);
-      tmp = TYPE_SIZE_UNIT (TREE_TYPE (tmp));
+      if (TREE_CODE (tmp) == ARRAY_TYPE)
+        tmp = TREE_TYPE (tmp);
+      tmp = TYPE_SIZE_UNIT (tmp);
       tmp = fold_build2_loc (input_location, MULT_EXPR, size_type_node,
 			    fold_convert (size_type_node, len),
 			    fold_convert (size_type_node, tmp));
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(Revision 203134)
+++ gcc/testsuite/ChangeLog	(Arbeitskopie)
@@ -1,3 +1,8 @@
+2013-10-02  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/58593
+	* gfortran.dg/char_length_19.f90: New.
+
 2013-10-02  Paolo Carlini  <paolo.carlini@oracle.com>
 
 	PR c++/58535
Index: gcc/testsuite/gfortran.dg/char_length_19.f90
===================================================================
--- gcc/testsuite/gfortran.dg/char_length_19.f90	(Revision 0)
+++ gcc/testsuite/gfortran.dg/char_length_19.f90	(Arbeitskopie)
@@ -0,0 +1,44 @@
+! { dg-do compile }
+!
+! PR fortran/58579
+!
+! Contributed by Joost VandeVondele
+!
+! Was ICEing before due to the patch for PR 58593
+!
+  subroutine test
+    CHARACTER(len=20)                        :: tmpStr
+    CHARACTER(len=20, kind=4)                :: tmpStr4
+    INTEGER :: output_unit=6
+       WRITE (UNIT=output_unit,FMT="(T2,A,T61,A20)")&
+         "DFT| Self-interaction correction (SIC)",ADJUSTR(TRIM(tmpstr))
+       WRITE (UNIT=output_unit,FMT="(T2,A,T61,A20)")&
+         4_"DFT| Self-interaction correction (SIC)",ADJUSTR(TRIM(tmpstr4))
+   END
+
+!
+! PR fortran/58593
+! Contributed by Albert Bartok
+!
+! The PR was overallocating memory. I placed it here to check for a
+! variant of the test case above, which takes a slightly differnt code
+! patch. Thus, its purpose is just to ensure that it won't ICE.
+!
+program test_char
+
+   implicit none
+   integer :: i
+
+   read*, i
+   print*, trim(test(i))
+
+   contains
+
+      function test(i)
+         integer, intent(in) :: i
+         character(len=i) :: test
+
+         test(1:1) = "A"
+      endfunction test
+
+endprogram test_char

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]