Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 1 | libguile/vm-i-system.c: workaround ice ssa corruption while compiling with option -g -O |
| 2 | |
| 3 | While compiling with option -g -O, there was a ssa corruption: |
| 4 | .. |
| 5 | Unable to coalesce ssa_names 48 and 3476 which are marked as MUST COALESCE. |
| 6 | sp_48(ab) and sp_3476(ab) |
| 7 | guile-2.0.11/libguile/vm-engine.c: In function 'vm_debug_engine': |
| 8 | guile-2.0.11/libguile/vm.c:673:19: internal compiler error: SSA corruption |
| 9 | #define VM_NAME vm_debug_engine |
| 10 | ^ |
| 11 | guile-2.0.11/libguile/vm-engine.c:39:1: note: in expansion of macro 'VM_NAME' |
| 12 | VM_NAME (SCM vm, SCM program, SCM *argv, int nargs) |
| 13 | ^ |
| 14 | Please submit a full bug report, |
| 15 | with preprocessed source if appropriate. |
| 16 | See <http://gcc.gnu.org/bugs.html> for instructions. |
| 17 | ... |
| 18 | |
| 19 | Tweak libguile/vm-i-system.c to add boundary value check to workaround it. |
| 20 | |
| 21 | Upstream-Status: Pending |
| 22 | |
| 23 | Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com> |
| 24 | --- |
| 25 | libguile/vm-i-system.c | 20 ++++++++++++++++---- |
| 26 | 1 file changed, 16 insertions(+), 4 deletions(-) |
| 27 | |
| 28 | diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c |
| 29 | --- a/libguile/vm-i-system.c |
| 30 | +++ b/libguile/vm-i-system.c |
| 31 | @@ -625,10 +625,22 @@ VM_DEFINE_INSTRUCTION (47, bind_optionals_shuffle, "bind-optionals/shuffle", 6, |
| 32 | /* now shuffle up, from walk to ntotal */ |
| 33 | { |
| 34 | scm_t_ptrdiff nshuf = sp - walk + 1, i; |
| 35 | - sp = (fp - 1) + ntotal + nshuf; |
| 36 | - CHECK_OVERFLOW (); |
| 37 | - for (i = 0; i < nshuf; i++) |
| 38 | - sp[-i] = walk[nshuf-i-1]; |
| 39 | + /* check the value of nshuf to workaround ice ssa corruption */ |
| 40 | + /* while compiling with -O -g */ |
| 41 | + if (nshuf > 0) |
| 42 | + { |
| 43 | + sp = (fp - 1) + ntotal + nshuf; |
| 44 | + CHECK_OVERFLOW (); |
| 45 | + for (i = 0; i < nshuf; i++) |
| 46 | + sp[-i] = walk[nshuf-i-1]; |
| 47 | + } |
| 48 | + else |
| 49 | + { |
| 50 | + sp = (fp - 1) + ntotal + nshuf; |
| 51 | + CHECK_OVERFLOW (); |
| 52 | + for (i = 0; i < nshuf; i++) |
| 53 | + sp[-i] = walk[nshuf-i-1]; |
| 54 | + } |
| 55 | } |
| 56 | /* and fill optionals & keyword args with SCM_UNDEFINED */ |
| 57 | while (walk <= (fp - 1) + ntotal) |
| 58 | -- |
| 59 | 1.9.1 |
| 60 | |