aboutsummaryrefslogtreecommitdiffstats
path: root/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99303.patch
diff options
context:
space:
mode:
Diffstat (limited to 'toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99303.patch')
-rw-r--r--toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99303.patch131
1 files changed, 131 insertions, 0 deletions
diff --git a/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99303.patch b/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99303.patch
new file mode 100644
index 0000000000..53d1d08d52
--- /dev/null
+++ b/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99303.patch
@@ -0,0 +1,131 @@
+ Merge from Sourcery G++ 4.4:
+
+ 2009-05-21 Sandra Loosemore <sandra@codesourcery.com>
+
+ Merge from Sourcery G++ 4.3:
+
+ 2009-04-04 Sandra Loosemore <sandra@codesourcery.com>
+
+ Issue #5104
+ PR tree-optimization/39604
+
+ gcc/testsuite
+ * g++.dg/tree-ssa/sink-1.C: New.
+
+ gcc/
+ * tree_ssa-sink.c (sink_code_in_bb): Do not sink statements out
+ of a lexical block containing variable definitions.
+
+2010-07-09 Sandra Loosemore <sandra@codesourcery.com>
+
+ Backport from mainline (originally on Sourcery G++ 4.4):
+
+ 2010-07-02 Julian Brown <julian@codesourcery.com>
+
+=== added file 'gcc/testsuite/g++.dg/tree-ssa/sink-1.C'
+--- old/gcc/testsuite/g++.dg/tree-ssa/sink-1.C 1970-01-01 00:00:00 +0000
++++ new/gcc/testsuite/g++.dg/tree-ssa/sink-1.C 2010-07-30 12:14:18 +0000
+@@ -0,0 +1,50 @@
++/* { dg-do run } */
++/* { dg-options "-O1" } */
++
++class A {
++ public:
++ A() {}
++ virtual ~A() {}
++ void * dostuff();
++
++ virtual int dovirtual() = 0;
++};
++
++
++class B : public A {
++ public:
++ B() {}
++ int dovirtual() { return 0;}
++ virtual ~B() {};
++};
++
++class C : public B {
++ public:
++ C() {}
++ virtual ~C() {};
++};
++
++void* A::dostuff()
++{
++ return (void*)dovirtual();
++}
++
++/* tree-ssa-sink was sinking the inlined destructor for STUFF out of
++ the first inner block and into the second one, where it was ending up
++ after the inlined constructor for STUFF2. This is bad because
++ cfgexpand aliases STUFF and STUFF2 to the same storage at -O1
++ (i.e., without -fstrict-aliasing), with the result that STUFF2's
++ vtable was getting trashed. */
++
++int main() {
++ {
++ B stuff;
++ stuff.dostuff();
++ }
++ {
++ C stuff2;
++ stuff2.dostuff();
++ }
++ return 0;
++}
++
+
+=== modified file 'gcc/tree-ssa-sink.c'
+--- old/gcc/tree-ssa-sink.c 2009-11-28 16:21:00 +0000
++++ new/gcc/tree-ssa-sink.c 2010-07-30 12:14:18 +0000
+@@ -470,6 +470,47 @@
+ last = false;
+ continue;
+ }
++
++ /* We cannot move statements that contain references to block-scope
++ variables out of that block, as this may lead to incorrect aliasing
++ when we lay out the stack frame in cfgexpand.c.
++ In lieu of more sophisticated analysis, be very conservative here
++ and prohibit moving any statement that references memory out of a
++ block with variables. */
++ if (gimple_references_memory_p (stmt))
++ {
++ tree fromblock = gimple_block (stmt);
++ while (fromblock
++ && fromblock != current_function_decl
++ && !BLOCK_VARS (fromblock))
++ fromblock = BLOCK_SUPERCONTEXT (fromblock);
++ if (fromblock && fromblock != current_function_decl)
++ {
++ gimple tostmt;
++ tree toblock;
++
++ if (gsi_end_p (togsi))
++ tostmt = gimple_seq_last_stmt (gsi_seq (togsi));
++ else
++ tostmt = gsi_stmt (togsi);
++ if (tostmt)
++ toblock = gimple_block (tostmt);
++ else
++ toblock = NULL;
++ while (toblock
++ && toblock != current_function_decl
++ && toblock != fromblock)
++ toblock = BLOCK_SUPERCONTEXT (toblock);
++ if (!toblock || toblock != fromblock)
++ {
++ if (!gsi_end_p (gsi))
++ gsi_prev (&gsi);
++ last = false;
++ continue;
++ }
++ }
++ }
++
+ if (dump_file)
+ {
+ fprintf (dump_file, "Sinking ");
+