]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Backport r259265
authorMartin Liska <mliska@suse.cz>
Tue, 24 Apr 2018 15:18:25 +0000 (17:18 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 24 Apr 2018 15:18:25 +0000 (15:18 +0000)
2018-04-24  Martin Liska  <mliska@suse.cz>

Backport from mainline
2018-04-10  Richard Biener  <rguenther@suse.de>
    Martin Liska  <mliska@suse.cz>

PR lto/85248
* lto-symtab.c (lto_symtab_merge_p): Handle noreturn attribute.
2018-04-24  Martin Liska  <mliska@suse.cz>

Backport from mainline
2018-04-10  Jakub Jelinek  <jakub@redhat.com>

PR lto/85248
* gcc.dg/lto/pr85248_0.c: New test.
* gcc.dg/lto/pr85248_1.c: New test.

From-SVN: r259600

gcc/lto/ChangeLog
gcc/lto/lto-symtab.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/pr85248_0.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/lto/pr85248_1.c [new file with mode: 0644]

index 1ebbb907ec1a0b30da94cfdca71a95c6117aa4a1..fd37c1118103d3707d97d98b3aa38902316580e0 100644 (file)
@@ -1,3 +1,12 @@
+2018-04-24  Martin Liska  <mliska@suse.cz>
+
+       Backport from mainline
+       2018-04-10  Richard Biener  <rguenther@suse.de>
+                   Martin Liska  <mliska@suse.cz>
+
+       PR lto/85248
+       * lto-symtab.c (lto_symtab_merge_p): Handle noreturn attribute.
+
 2018-03-06  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
index 4cef26897fe47e7af38c02a13b27a55b39cc6268..2e7493fc539af33fb5b4b334113fb1ec450d2b67 100644 (file)
@@ -571,6 +571,9 @@ lto_symtab_merge_p (tree prevailing, tree decl)
          return false;
        }
     }
+
+  /* FIXME: after MPX is removed, use flags_from_decl_or_type
+     function instead.  PR lto/85248.  */
   if (DECL_ATTRIBUTES (prevailing) != DECL_ATTRIBUTES (decl))
     {
       tree prev_attr = lookup_attribute ("error", DECL_ATTRIBUTES (prevailing));
@@ -598,6 +601,19 @@ lto_symtab_merge_p (tree prevailing, tree decl)
                     "warning attribute mismatch\n");
          return false;
        }
+
+      prev_attr = lookup_attribute ("noreturn", DECL_ATTRIBUTES (prevailing));
+      attr = lookup_attribute ("noreturn", DECL_ATTRIBUTES (decl));
+      if ((prev_attr == NULL) != (attr == NULL)
+         || (prev_attr
+             && TREE_VALUE (TREE_VALUE (prev_attr))
+                != TREE_VALUE (TREE_VALUE (attr))))
+       {
+          if (symtab->dump_file)
+           fprintf (symtab->dump_file, "Not merging decls; "
+                    "noreturn attribute mismatch\n");
+         return false;
+       }
     }
   return true;
 }
index d7be0a0295ad31a88335effaaf7f73aa809506bd..4606425436a9c627a698e2581ffab3782085ac51 100644 (file)
@@ -1,3 +1,12 @@
+2018-04-24  Martin Liska  <mliska@suse.cz>
+
+       Backport from mainline
+       2018-04-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR lto/85248
+       * gcc.dg/lto/pr85248_0.c: New test.
+       * gcc.dg/lto/pr85248_1.c: New test.
+
 2018-04-24  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
diff --git a/gcc/testsuite/gcc.dg/lto/pr85248_0.c b/gcc/testsuite/gcc.dg/lto/pr85248_0.c
new file mode 100644 (file)
index 0000000..df61ac9
--- /dev/null
@@ -0,0 +1,45 @@
+/* PR lto/85248 */
+/* { dg-lto-do run } */
+/* { dg-lto-options { { -flto -O2 } } } */
+
+extern void test_alias (int s, int e) __asm__ (__USER_LABEL_PREFIX__ "test");
+extern void test_noreturn (int s, int e) __asm__ (__USER_LABEL_PREFIX__ "test")
+  __attribute__ ((__noreturn__));
+
+extern inline __attribute__ ((__always_inline__, __gnu_inline__)) void
+test (int s, int e)
+{
+  if (__builtin_constant_p (s) && s != 0)
+    test_noreturn (s, e);
+  else
+    test_alias (s, e);
+}
+
+int
+foo (void)
+{
+  static volatile int a;
+  return a;
+}
+
+static void
+bar (void)
+{
+  test (0, 1);
+  __builtin_exit (0);
+}
+
+static void
+baz ()
+{
+  test (1, 0);
+}
+
+int
+main ()
+{
+  if (foo ())
+    baz ();
+  bar ();
+  __builtin_abort ();
+}
diff --git a/gcc/testsuite/gcc.dg/lto/pr85248_1.c b/gcc/testsuite/gcc.dg/lto/pr85248_1.c
new file mode 100644 (file)
index 0000000..5ce2571
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-options "-fno-lto" } */
+
+void
+test (int s, int e)
+{
+  asm volatile ("" : "+g" (s), "+g" (e) : : "memory");
+  if (s)
+    __builtin_abort ();
+}