Bug #9692
closed__builtin_longjmp is called with a value greater than 1 (GCC compilation error)
Description
Hello,
during testing of LTO on a gentoo machine:
Linux qemubox 3.12.13-gentoo #2 SMP Fri Mar 28 22:30:38 Local time zone must be set--see zic x86_64 Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz GenuineIntel GNU/Linux
Configure detects:
checking for __builtin_setjmp... yes
checking for setjmp type... __builtin_setjmp
Problem is that ruby calls longjmp with value greater than 1, e.g. TAG_RAISE
(0x6). With -flto
compiler proves that __builtin_longjmp
is always called with such a value and following errors are displayed:
eval.c: In function ‘rb_jump_tag’:
eval.c:668:5: error: ‘__builtin_longjmp’ second argument must be 1
JUMP_TAG(tag);
^
thread.c: In function ‘rb_threadptr_to_kill’:
thread.c:1887:5: error: ‘__builtin_longjmp’ second argument must be 1
TH_JUMP_TAG(th, TAG_FATAL);
^
vm.c: In function ‘vm_exec’:
vm.c:1413:3: error: ‘__builtin_longjmp’ second argument must be 1
JUMP_TAG(state);
^
eval.c: In function ‘setup_exception’:
eval.c:437:34: error: ‘__builtin_longjmp’ second argument must be 1
if (INTERNAL_EXCEPTION_P(mesg)) JUMP_TAG(TAG_FATAL);
^
eval.c:502:2: error: ‘__builtin_longjmp’ second argument must be 1
JUMP_TAG(TAG_FATAL);
^
eval.c: In function ‘rb_raise_jump’:
eval.c:662:5: error: ‘__builtin_longjmp’ second argument must be 1
JUMP_TAG(TAG_RAISE);
^
eval.c: In function ‘rb_longjmp’:
eval.c:521:5: error: ‘__builtin_longjmp’ second argument must be 1
JUMP_TAG(tag);
^
gc.c: In function ‘rb_memerror’:
gc.c:3417:2: error: ‘__builtin_longjmp’ second argument must be 1
JUMP_TAG(TAG_RAISE);
^
gcc --version:
gcc (GCC) 4.9.0 20140331 (experimental)
Files
Updated by marxin (Martin Liška) over 10 years ago
I found the problem in configuration:
without LTO:
configure:15773: checking for __builtin_setjmp
configure:15790: x86_64-pc-linux-gnu-gcc -o conftest -march=native -O2 -pipe -flto=9 -fno-lto -fno-use-linker-plugin -fno-strict-aliasing -fno-lto -fno-use-linker-plugin -fstack-protector conftest.c -lrt -ldl -lcrypt -lm >&5
conftest.c: In function 't':
conftest.c:274:35: error: '__builtin_longjmp' second argument must be 1
jmp_buf jb; void t(v) int v; {__builtin_longjmp(jb, v);}
with LTO:
configure:15773: checking for __builtin_setjmp
configure:15790: x86_64-pc-linux-gnu-gcc -o conftest -march=native -O2 -pipe -flto=9 -fno-strict-aliasing -fstack-protector conftest.c -lrt -ldl -lcrypt -lm >&5
configure:15790: $? = 0
configure:15799: result: yes
configure:15804: checking for setjmp type
confdefs.h:
#include <setjmp.h>
jmp_buf jb; void t(v) int v; {__builtin_longjmp(jb, v);}
int
main ()
{
__builtin_setjmp(jb);
;
return 0;
}
In LTO the compiler proves that function t
is never used and so that the function is discarded. That introduces problem in configuration, because __builtin_longjmp
must be always called with 1 constant.
Updated by marxin (Martin Liška) over 10 years ago
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Description updated (diff)
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
I think JUMP_TAG
in the trunk doesn't use a variable.
Updated by nobu (Nobuyoshi Nakada) over 10 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r45503.
configure.in: do not use a variable for longjmp
- configure.in (
ac_cv_func___builtin_setjmp
): gcc 4.9 disallows a
variable as the second argument of__builtin_longjmp()
.
[ruby-core:61800] [Bug #9692]
Updated by ngoto (Naohisa Goto) over 10 years ago
- Related to Bug #9698: r45509以降、Solarisにて configureが thread model is missing でエラー added
Updated by wanabe (_ wanabe) over 10 years ago
- Related to Bug #9710: __builtin_setjmp/longjmp causes SEGV with mingw added
Updated by wanabe (_ wanabe) over 10 years ago
- Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED
I guess it should be backported.
Updated by usa (Usaku NAKAMURA) about 10 years ago
I'm troubled about how to write a substitute of r45504 for ruby_2_0_0.
Nobu, do you have any idea?
Updated by nagachika (Tomoyuki Chikanaga) about 10 years ago
- Related to Bug #9818: __builtin_setjmp and __builtin_longjmp caused a build failure on PPC Linux with gcc 4.4.0 added
Updated by nobu (Nobuyoshi Nakada) about 10 years ago
Usaku NAKAMURA wrote:
I'm troubled about how to write a substitute of r45504 for ruby_2_0_0.
r43522 (and r43536) introduced rb_threadptr_tag_jump()
, and r45516 may be needed too.
Updated by usa (Usaku NAKAMURA) about 10 years ago
Thank you. I'll check it.
Updated by nagachika (Tomoyuki Chikanaga) almost 10 years ago
- Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED to 2.0.0: REQUIRED, 2.1: DONE
r45503, r45504, r45508, r45509 and r47275 were backported into ruby_2_1
branch at r47276.