aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Edlinger <bernd.edlinger@hotmail.de>2016-08-03 19:05:45 +0000
committerBernd Edlinger <edlinger@gcc.gnu.org>2016-08-03 19:05:45 +0000
commit25f0609b21fe75b1e4b4a20ddee8c8f936318b81 (patch)
tree1df4a1a5f069e959429b836f860cb5433edf8479
parent73c77563c6409ad46357e083f378716defd9b1a7 (diff)
downloadgcc-25f0609b21fe75b1e4b4a20ddee8c8f936318b81.zip
gcc-25f0609b21fe75b1e4b4a20ddee8c8f936318b81.tar.gz
gcc-25f0609b21fe75b1e4b4a20ddee8c8f936318b81.tar.bz2
re PR middle-end/71876 (longjmp is miscompiled with -ffreestanding)
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
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/calls.c51
2 files changed, 22 insertions, 37 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8dcd430..fd09ec1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/calls.c b/gcc/calls.c
index c04d00f..949a92e 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -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)