diff options
author | Florian Franzmann | 2014-06-14 22:25:14 +0200 |
---|---|---|
committer | Remko van der Vossen | 2019-05-17 23:34:23 +0200 |
commit | ce020449b30a09fc27d436f3bd9ae043be90e911 (patch) | |
tree | 30ed8e6b4d8989e47b9fb4d1fef70fbe36207dc8 | |
parent | fa27bb02b415198da130705e4df3ad0fff66e7e7 (diff) |
gnu/gcc: add bugfixes from upstream
-rwxr-xr-x | gnu/gcc/PRE_BUILD | 5 | ||||
-rw-r--r-- | gnu/gcc/gcc-4.9-tree-ssa-threadedge.patch | 38 | ||||
-rw-r--r-- | gnu/gcc/gcc-4.9.0-upstream_fixes-1.patch | 64 |
3 files changed, 105 insertions, 2 deletions
diff --git a/gnu/gcc/PRE_BUILD b/gnu/gcc/PRE_BUILD index 3e69cdb2ec..7e19e125ee 100755 --- a/gnu/gcc/PRE_BUILD +++ b/gnu/gcc/PRE_BUILD @@ -48,5 +48,6 @@ if list_find "$GCC_COMPILER" "go"; then fi && patch -p1 < "$SPELL_DIRECTORY/0001-remove-libffi.patch" && -patch -p0 < "$SPELL_DIRECTORY/gcc-4.8-filename-output.patch" - +patch -p0 < "$SPELL_DIRECTORY/gcc-4.8-filename-output.patch" && +patch -p1 < "$SPELL_DIRECTORY/gcc-4.9-tree-ssa-threadedge.patch" && +patch -p1 < "$SPELL_DIRECTORY/gcc-4.9.0-upstream_fixes-1.patch" diff --git a/gnu/gcc/gcc-4.9-tree-ssa-threadedge.patch b/gnu/gcc/gcc-4.9-tree-ssa-threadedge.patch new file mode 100644 index 0000000000..8827427e4d --- /dev/null +++ b/gnu/gcc/gcc-4.9-tree-ssa-threadedge.patch @@ -0,0 +1,38 @@ +--- trunk/gcc/tree-ssa-threadedge.c 2014/04/23 17:53:56 209715 ++++ trunk/gcc/tree-ssa-threadedge.c 2014/04/23 18:04:46 209716 +@@ -387,7 +387,34 @@ + && (gimple_code (stmt) != GIMPLE_CALL + || gimple_call_lhs (stmt) == NULL_TREE + || TREE_CODE (gimple_call_lhs (stmt)) != SSA_NAME)) +- continue; ++ { ++ /* STMT might still have DEFS and we need to invalidate any known ++ equivalences for them. ++ ++ Consider if STMT is a GIMPLE_ASM with one or more outputs that ++ feeds a conditional inside a loop. We might derive an equivalence ++ due to the conditional. */ ++ tree op; ++ ssa_op_iter iter; ++ ++ if (backedge_seen) ++ FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF) ++ { ++ /* This call only invalidates equivalences created by ++ PHI nodes. This is by design to keep the cost of ++ of invalidation reasonable. */ ++ invalidate_equivalences (op, stack, src_map, dst_map); ++ ++ /* However, conditionals can imply values for real ++ operands as well. And those won't be recorded in the ++ maps. In fact, those equivalences may be recorded totally ++ outside the threading code. We can just create a new ++ temporary NULL equivalence here. */ ++ record_temporary_equivalence (op, NULL_TREE, stack); ++ } ++ ++ continue; ++ } + + /* The result of __builtin_object_size depends on all the arguments + of a phi node. Temporarily using only one edge produces invalid diff --git a/gnu/gcc/gcc-4.9.0-upstream_fixes-1.patch b/gnu/gcc/gcc-4.9.0-upstream_fixes-1.patch new file mode 100644 index 0000000000..c3d80e8042 --- /dev/null +++ b/gnu/gcc/gcc-4.9.0-upstream_fixes-1.patch @@ -0,0 +1,64 @@ +Submitted By: Armin K. <krejzi at email dot com> +Date: 2014-05-10 +Initial Package Version: 4.9.0 +Upstream Status: Fixed Upstream +Origin: Upstream VCS +Description: Prevents compiler from generating broken code that would cause + some programs to segfault or behave incorrectly when compiled + with gcc-4.9.0 + +--- a/gcc/ipa-devirt.c 2014-04-08 07:35:11.000000000 +0200 ++++ b/gcc/ipa-devirt.c 2014-05-10 16:46:14.502859179 +0200 +@@ -987,6 +987,17 @@ + context->outer_type = expected_type; + context->offset = 0; + context->maybe_derived_type = true; ++ context->maybe_in_construction = true; ++ /* POD can be changed to an instance of a polymorphic type by ++ placement new. Here we play safe and assume that any ++ non-polymorphic type is POD. */ ++ if ((TREE_CODE (type) != RECORD_TYPE ++ || !TYPE_BINFO (type) ++ || !polymorphic_type_binfo_p (TYPE_BINFO (type))) ++ && (TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST ++ || (offset + tree_to_uhwi (TYPE_SIZE (expected_type)) <= ++ tree_to_uhwi (TYPE_SIZE (type))))) ++ return true; + return false; + } + +--- a/gcc/testsuite/g++.dg/ipa/devirt-11.C 2013-09-08 18:42:21.000000000 +0200 ++++ b/gcc/testsuite/g++.dg/ipa/devirt-11.C 2014-05-10 16:46:14.503859198 +0200 +@@ -45,5 +45,5 @@ + /* While inlining function called once we should devirtualize a new call to fn2 + and two to fn3. While doing so the new symbol for fn2 needs to be + introduced. */ +-/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 3 "inline" } } */ ++/* { dg-final { scan-ipa-dump-times "Discovered a virtual call to a known target" 1 "inline" } } */ + /* { dg-final { cleanup-ipa-dump "inline" } } */ +--- a/gcc/testsuite/g++.dg/ipa/devirt-31.C 1970-01-01 01:00:00.000000000 +0100 ++++ b/gcc/testsuite/g++.dg/ipa/devirt-31.C 2014-05-10 16:46:14.503859198 +0200 +@@ -0,0 +1,23 @@ ++/* { dg-options "-O2 -std=c++11 -fdump-ipa-inline" } */ ++#include <new> ++ ++class EmbeddedObject { ++public: ++ virtual int val() { return 2; } ++}; ++ ++class Container { ++ alignas(EmbeddedObject) char buffer[sizeof(EmbeddedObject)]; ++public: ++ EmbeddedObject *obj() { return (EmbeddedObject*)buffer; } ++ Container() { new (buffer) EmbeddedObject(); } ++}; ++ ++Container o; ++ ++int main() ++{ ++ __builtin_printf("%d\n", o.obj()->val()); ++} ++/* { dg-final { scan-ipa-dump-not "__builtin_unreachable" "inline" } } */ ++/* { dg-final { cleanup-ipa-dump "inline" } } */ |