re PR middle-end/71876 (longjmp is miscompiled with -ffreestanding)
authorBernd Edlinger <bernd.edlinger@hotmail.de>
Wed, 3 Aug 2016 19:05:45 +0000 (19:05 +0000)
committerBernd Edlinger <edlinger@gcc.gnu.org>
Wed, 3 Aug 2016 19:05:45 +0000 (19:05 +0000)
2016-08-03  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR middle-end/71876
        * calls.c (special_function_p): Remove special handling of
        "setjmp_syscall", "qsetjmp", "longjmp", "siglongjmp" and the
        prefix "__x".  Recognize "savectx", "vfork" and "getcontext" only
        without prefix.  Remove potentially unsafe ECF_LEAF and ECF_NORETURN.

From-SVN: r239092

gcc/ChangeLog
gcc/calls.c

index 8dcd430a6c7a9474700588d15ab66384b21ea063..fd09ec1c96c45562024f84b11b8dcaf6b6b6c3f0 100644 (file)
@@ -1,3 +1,11 @@
+2016-08-03  Bernd Edlinger  <bernd.edlinger@hotmail.de>
+
+       PR middle-end/71876
+       * calls.c (special_function_p): Remove special handling of
+       "setjmp_syscall", "qsetjmp", "longjmp", "siglongjmp" and the
+       prefix "__x".  Recognize "savectx", "vfork" and "getcontext" only
+       without prefix.  Remove potentially unsafe ECF_LEAF and ECF_NORETURN.
+
 2016-08-03  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR middle-end/72778
index c04d00f7f445fc363d144aa27eee15fd3abcc4fb..949a92e3fe3417e77b339bf55abd57e7c34ecbac 100644 (file)
@@ -468,15 +468,13 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU
     anti_adjust_stack (GEN_INT (n_popped));
 }
 
-/* Determine if the function identified by NAME and FNDECL is one with
-   special properties we wish to know about.
+/* Determine if the function identified by FNDECL is one with
+   special properties we wish to know about.  Modify FLAGS accordingly.
 
    For example, if the function might return more than one time (setjmp), then
-   set RETURNS_TWICE to a nonzero value.
+   set ECF_RETURNS_TWICE.
 
-   Similarly set NORETURN if the function is in the longjmp family.
-
-   Set MAY_BE_ALLOCA for any memory allocation function that might allocate
+   Set ECF_MAY_BE_ALLOCA for any memory allocation function that might allocate
    space from the stack such as alloca.  */
 
 static int
@@ -491,7 +489,7 @@ special_function_p (const_tree fndecl, int flags)
     name_decl = DECL_NAME (cgraph_node::get (fndecl)->orig_decl);
 
   if (fndecl && name_decl
-      && IDENTIFIER_LENGTH (name_decl) <= 17
+      && IDENTIFIER_LENGTH (name_decl) <= 11
       /* Exclude functions not at the file scope, or not `extern',
         since they are not the magic functions we would otherwise
         think they are.
@@ -514,43 +512,22 @@ special_function_p (const_tree fndecl, int flags)
          && ! strcmp (name, "alloca"))
        flags |= ECF_MAY_BE_ALLOCA;
 
-      /* Disregard prefix _, __ or __x.  */
+      /* Disregard prefix _ or __.  */
       if (name[0] == '_')
        {
-         if (name[1] == '_' && name[2] == 'x')
-           tname += 3;
-         else if (name[1] == '_')
+         if (name[1] == '_')
            tname += 2;
          else
            tname += 1;
        }
 
-      if (tname[0] == 's')
-       {
-         if ((tname[1] == 'e'
-              && (! strcmp (tname, "setjmp")
-                  || ! strcmp (tname, "setjmp_syscall")))
-             || (tname[1] == 'i'
-                 && ! strcmp (tname, "sigsetjmp"))
-             || (tname[1] == 'a'
-                 && ! strcmp (tname, "savectx")))
-           flags |= ECF_RETURNS_TWICE | ECF_LEAF;
-
-         if (tname[1] == 'i'
-             && ! strcmp (tname, "siglongjmp"))
-           flags |= ECF_NORETURN;
-       }
-      else if ((tname[0] == 'q' && tname[1] == 's'
-               && ! strcmp (tname, "qsetjmp"))
-              || (tname[0] == 'v' && tname[1] == 'f'
-                  && ! strcmp (tname, "vfork"))
-              || (tname[0] == 'g' && tname[1] == 'e'
-                  && !strcmp (tname, "getcontext")))
-       flags |= ECF_RETURNS_TWICE | ECF_LEAF;
-
-      else if (tname[0] == 'l' && tname[1] == 'o'
-              && ! strcmp (tname, "longjmp"))
-       flags |= ECF_NORETURN;
+      /* ECF_RETURNS_TWICE is safe even for -ffreestanding.  */
+      if (! strcmp (tname, "setjmp")
+         || ! strcmp (tname, "sigsetjmp")
+         || ! strcmp (name, "savectx")
+         || ! strcmp (name, "vfork")
+         || ! strcmp (name, "getcontext"))
+       flags |= ECF_RETURNS_TWICE;
     }
 
   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)