ipa-icf.c (sem_function::merge): Do not create a wrapper also if the original functio...
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 13 Nov 2016 17:23:13 +0000 (17:23 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 13 Nov 2016 17:23:13 +0000 (17:23 +0000)
* ipa-icf.c (sem_function::merge): Do not create a wrapper also if the
original function needs a static chain.

From-SVN: r242354

gcc/ChangeLog
gcc/ipa-icf.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/lto21.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/lto21_pkg1.ads [new file with mode: 0644]
gcc/testsuite/gnat.dg/lto21_pkg2.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/lto21_pkg2.ads [new file with mode: 0644]

index 68cc9c6..0be6661 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-13  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * ipa-icf.c (sem_function::merge): Do not create a wrapper also if the
+       original function needs a static chain.
+
 2016-11-13  David Edelsohn  <dje.gcc@gmail.com>
 
        PR target/78336
index e8880cb..1ab67f3 100644 (file)
@@ -1186,11 +1186,12 @@ sem_function::merge (sem_item *alias_item)
            fprintf (dump_file,
                     "Wrapper cannot be created because of COMDAT\n");
        }
-      else if (DECL_STATIC_CHAIN (alias->decl))
+      else if (DECL_STATIC_CHAIN (alias->decl)
+              || DECL_STATIC_CHAIN (original->decl))
         {
          if (dump_file)
            fprintf (dump_file,
-                    "Can not create wrapper of nested functions.\n");
+                    "Cannot create wrapper of nested function.\n");
         }
       /* TODO: We can also deal with variadic functions never calling
         VA_START.  */
index 99bb0d4..37ddec7 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-13  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/lto21.adb: New test.
+       * gnat.dg/lto21_pkg1.ads: New helper.
+       * gnat.dg/lto21_pkg2.ad[sb]: Likewise.
+
 2016-11-13  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/60952
diff --git a/gcc/testsuite/gnat.dg/lto21.adb b/gcc/testsuite/gnat.dg/lto21.adb
new file mode 100644 (file)
index 0000000..fe6fb27
--- /dev/null
@@ -0,0 +1,10 @@
+-- { dg-do run }
+-- { dg-options "-O3 -flto" { target lto } }
+
+with Lto21_Pkg1;
+with Lto21_Pkg2; use Lto21_Pkg2;
+
+procedure Lto21 is
+begin
+   Proc;
+end;
diff --git a/gcc/testsuite/gnat.dg/lto21_pkg1.ads b/gcc/testsuite/gnat.dg/lto21_pkg1.ads
new file mode 100644 (file)
index 0000000..000a568
--- /dev/null
@@ -0,0 +1,10 @@
+with Ada.Containers.Vectors;
+with Lto21_Pkg2;
+
+package Lto21_Pkg1 is
+
+   pragma Suppress (Tampering_Check);
+
+   package Vect1 is new Ada.Containers.Vectors (Positive, Natural);
+
+end Lto21_Pkg1;
diff --git a/gcc/testsuite/gnat.dg/lto21_pkg2.adb b/gcc/testsuite/gnat.dg/lto21_pkg2.adb
new file mode 100644 (file)
index 0000000..5d38102
--- /dev/null
@@ -0,0 +1,30 @@
+with Ada.Containers; use Ada.Containers;
+with Ada.Containers.Hashed_Maps;
+with Ada.Containers.Vectors;
+
+package body Lto21_Pkg2 is
+
+   pragma Suppress (Tampering_Check);
+
+   procedure Proc is
+
+      function Hash (Syd : Natural) return Hash_Type is (Hash_Type'Mod (Syd));
+
+      package Vect2 is new Vectors (Positive, Natural);
+
+      package Maps is
+        new Hashed_Maps (Natural, Vect2.Vector, Hash, "=", Vect2."=");
+
+      procedure Nested (M : Maps.Map) is
+         use Maps;
+         procedure Inner (Position : Cursor) is null;
+      begin
+         Iterate (M, Inner'Access);
+      end;
+
+      M : Maps.Map;
+   begin
+      Nested (M);
+   end;
+
+end Lto21_Pkg2;
diff --git a/gcc/testsuite/gnat.dg/lto21_pkg2.ads b/gcc/testsuite/gnat.dg/lto21_pkg2.ads
new file mode 100644 (file)
index 0000000..935b3b7
--- /dev/null
@@ -0,0 +1,5 @@
+package Lto21_Pkg2 is
+
+   procedure Proc;
+
+end Lto21_Pkg2;