summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/guile/files/workaround-ice-ssa-corruption.patch
blob: 6c348384a56c98e5f0ee7de7fcad7d45c28e74a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
libguile/vm-i-system.c: workaround ice ssa corruption while compiling with option -g -O

While compiling with option -g -O, there was a ssa corruption:
..
Unable to coalesce ssa_names 48 and 3476 which are marked as MUST COALESCE.
sp_48(ab) and  sp_3476(ab)
guile-2.0.11/libguile/vm-engine.c: In function 'vm_debug_engine':
guile-2.0.11/libguile/vm.c:673:19: internal compiler error: SSA corruption
 #define VM_NAME   vm_debug_engine
                   ^
guile-2.0.11/libguile/vm-engine.c:39:1: note: in expansion of macro 'VM_NAME'
 VM_NAME (SCM vm, SCM program, SCM *argv, int nargs)
 ^
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
...

Tweak libguile/vm-i-system.c to add boundary value check to workaround it.

Upstream-Status: Pending

Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
 libguile/vm-i-system.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c
--- a/libguile/vm-i-system.c
+++ b/libguile/vm-i-system.c
@@ -625,10 +625,22 @@ VM_DEFINE_INSTRUCTION (47, bind_optionals_shuffle, "bind-optionals/shuffle", 6,
   /* now shuffle up, from walk to ntotal */
   {
     scm_t_ptrdiff nshuf = sp - walk + 1, i;
-    sp = (fp - 1) + ntotal + nshuf;
-    CHECK_OVERFLOW ();
-    for (i = 0; i < nshuf; i++)
-      sp[-i] = walk[nshuf-i-1];
+    /* check the value of nshuf to workaround ice ssa corruption */
+    /* while compiling with -O -g */
+    if (nshuf > 0)
+    {
+      sp = (fp - 1) + ntotal + nshuf;
+      CHECK_OVERFLOW ();
+      for (i = 0; i < nshuf; i++)
+        sp[-i] = walk[nshuf-i-1];
+    }
+    else
+    {
+      sp = (fp - 1) + ntotal + nshuf;
+      CHECK_OVERFLOW ();
+      for (i = 0; i < nshuf; i++)
+        sp[-i] = walk[nshuf-i-1];
+    }
   }
   /* and fill optionals & keyword args with SCM_UNDEFINED */
   while (walk <= (fp - 1) + ntotal)
-- 
1.9.1