PR fortran/95106 - truncation of long symbol names with EQUIVALENCE

Message ID trinity-bba90ca5-06a0-498d-8359-09d26dc510dc-1590172957237@3c-app-gmx-bs60
State New
Headers show
Series
  • PR fortran/95106 - truncation of long symbol names with EQUIVALENCE
Related show

Commit Message

Harald Anlauf May 22, 2020, 6:42 p.m.
The PR is originally about a bogus warning, which turned out to originate
from truncation of mangled names.  Fix: simply extend temporaries to hold
all possible allowed values (which would enable 2^31 equivalences).

Regtested on x86_64-pc-linux-gnu.

The testcase checks the presence of properly generated mangled names
in the assembler.  If this should be restricted to x86-type systems,
I can adjust that.

OK for master?

Thanks,
Harald


PR fortran/95106 - truncation of long symbol names with EQUIVALENCE

	For long module names, the generated name-mangled symbol was
	truncated, leading to bogus warnings about COMMON block
	mismatches.  Provide sufficiently large temporaries.

gcc/fortran/

2020-05-22  Harald Anlauf  <anlauf@gmx.de>

	PR fortran/95106
	* trans-common.c (gfc_sym_mangled_common_id): Enlarge temporaries
	for name-mangling.

gcc/testsuite/

2020-05-22  Harald Anlauf  <anlauf@gmx.de>

	PR fortran/95106
	* gfortran.dg/equiv_11.f90: New test.

Comments

David Malcolm via Gcc-patches May 24, 2020, 7:02 p.m. | #1
Hi Harald,

> OK for master?


The patch is OK.

Regarding the test case - I think it should be OK.  If not,
expect to hear from people soon, you could then still restrict
it to Linux (or something else along those lines).

Regards

	Thomas

Patch

diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c
index bf163bc4f52..3775a8bea74 100644
--- a/gcc/fortran/trans-common.c
+++ b/gcc/fortran/trans-common.c
@@ -242,8 +242,9 @@  static tree
 gfc_sym_mangled_common_id (gfc_common_head *com)
 {
   int has_underscore;
-  char mangled_name[GFC_MAX_MANGLED_SYMBOL_LEN + 1];
-  char name[GFC_MAX_SYMBOL_LEN + 1];
+  /* Provide sufficient space to hold "symbol.eq.1234567890__".  */
+  char mangled_name[GFC_MAX_MANGLED_SYMBOL_LEN + 1 + 16];
+  char name[GFC_MAX_SYMBOL_LEN + 1 + 16];

   /* Get the name out of the common block pointer.  */
   strcpy (name, com->name);
diff --git a/gcc/testsuite/gfortran.dg/equiv_11.f90 b/gcc/testsuite/gfortran.dg/equiv_11.f90
new file mode 100644
index 00000000000..0f4a1ab5c32
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/equiv_11.f90
@@ -0,0 +1,12 @@ 
+! { dg-do compile }
+! { dg-options "-fsecond-underscore" }
+! PR fortran/95106
+
+module m2345678901234567890123456789012345678901234567890123456789_123
+  implicit none
+  real :: a(4), u(3,2)
+  real :: b(4), v(4,2)
+  equivalence (a(1),u(1,1)), (b(1),v(1,1))
+end
+! { dg-final { scan-assembler {m2345678901234567890123456789012345678901234567890123456789_123.eq.0__} } }
+! { dg-final { scan-assembler {m2345678901234567890123456789012345678901234567890123456789_123.eq.1__} } }