summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Franzmann2014-06-14 22:25:14 +0200
committerRemko van der Vossen2019-05-17 23:32:57 +0200
commit1a19e90d3d3775648889f5def5bb4196acf387b0 (patch)
treec6ee5c603dd6223ecd4eaf4b328043094fbaa342
parent8f46c99d6f1c5bf04ea8e2e0c21c7e0bd9751740 (diff)
gnu/gcc: add bugfixes from upstream
-rw-r--r--gnu/gcc/HISTORY6
-rwxr-xr-xgnu/gcc/PRE_BUILD8
-rw-r--r--gnu/gcc/gcc-4.8-filename-output.patch17
-rw-r--r--gnu/gcc/gcc-4.9-tree-ssa-threadedge.patch38
-rw-r--r--gnu/gcc/gcc-4.9.0-upstream_fixes-1.patch64
5 files changed, 131 insertions, 2 deletions
diff --git a/gnu/gcc/HISTORY b/gnu/gcc/HISTORY
index 59a73fd184..16006e3272 100644
--- a/gnu/gcc/HISTORY
+++ b/gnu/gcc/HISTORY
@@ -5,6 +5,12 @@
* PRE_BUILD: patch for freetype2 headers
* classpath-ft2include.patch: added said patch
+2014-06-14 Florian Franzmann <siflfran@hawo.stw.uni-erlangen.de>
+ * PRE_BUILD,
+ gcc-4.8-filename-output.patch,
+ gcc-4.9.0-upstream_fixes-1.patch,
+ gcc-4.9-tree-ssa-threadedge.patch: add bugfixes from upstream
+
2014-04-29 Florian Franzmann <siflfran@hawo.stw.uni-erlangen.de>
* DETAILS: version 4.9.0
diff --git a/gnu/gcc/PRE_BUILD b/gnu/gcc/PRE_BUILD
index b9d00c9659..06b2340163 100755
--- a/gnu/gcc/PRE_BUILD
+++ b/gnu/gcc/PRE_BUILD
@@ -54,5 +54,9 @@ if list_find "$GCC_COMPILER" "go"; then
patch -p1 < "$SPELL_DIRECTORY/0003-fix-header-generation-for-libgo.patch"
fi &&
-patch -p1 < "$SPELL_DIRECTORY/0002-4.8.0-ffast-math.patch" &&
-patch -p1 < "$SPELL_DIRECTORY/0001-remove-libffi.patch"
+patch -p1 < "$SPELL_DIRECTORY/0002-4.8.0-ffast-math.patch" &&
+patch -p1 < "$SPELL_DIRECTORY/0001-remove-libffi.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.8-filename-output.patch b/gnu/gcc/gcc-4.8-filename-output.patch
new file mode 100644
index 0000000000..6951eb239b
--- /dev/null
+++ b/gnu/gcc/gcc-4.8-filename-output.patch
@@ -0,0 +1,17 @@
+--- gcc/c-family/c-opts.c (revision 200330)
++++ gcc/c-family/c-opts.c (working copy)
+@@ -1338,10 +1338,14 @@ c_finish_options (void)
+
+ /* Give CPP the next file given by -include, if any. */
+ static void
+ push_command_line_include (void)
+ {
++ // This can happen if disabled by -imacros for example.
++ if (include_cursor > deferred_count)
++ return;
++
+ if (!done_preinclude)
+ {
+ done_preinclude = true;
+ if (flag_hosted && std_inc && !cpp_opts->preprocessed)
+ {
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" } } */