From 4cc2a6b1b1d54617f8582a524101b669a2366b47 Mon Sep 17 00:00:00 2001 From: naruse Date: Wed, 27 Feb 2013 03:22:50 +0000 Subject: * vm_exec.h (END_INSN): llvm-gcc may optimize out reg_cfp and cause Stack/cfp consistency error when the instruction doesn't use reg_cfp. Usually instructions use PUSH() but for example trace doesn't. This hack cause speed down but you shouldn't use llvm-gcc, use clang. [Bug #7938] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39517 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_exec.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'vm_exec.h') diff --git a/vm_exec.h b/vm_exec.h index 1853be9c2d..d371054bc9 100644 --- a/vm_exec.h +++ b/vm_exec.h @@ -116,9 +116,21 @@ error ! #endif /* DISPATCH_DIRECT_THREADED_CODE */ +#if defined(__llvm__) && !defined(__clang__) + /* llvm-gcc may optimize out reg_cfp and cause Stack/cfp consistency error + * when the instruction doesn't use reg_cfp. + * Usually instructions use PUSH() but for example trace doesn't. + * This hack cause speed down but you shouldn't use llvm-gcc, use clang. + */ #define END_INSN(insn) \ + { rb_control_frame_t *volatile RB_UNUSED_VAR(tmpcfp) = reg_cfp; } \ DEBUG_END_INSN(); \ - TC_DISPATCH(insn); \ + TC_DISPATCH(insn); +#else +#define END_INSN(insn) \ + DEBUG_END_INSN(); \ + TC_DISPATCH(insn); +#endif #define INSN_DISPATCH() \ TC_DISPATCH(__START__) \ -- cgit v1.2.1