From: mliska@... Date: 2014-04-01T14:57:32+00:00 Subject: [ruby-core:61800] [ruby-trunk - Bug #9692] __builtin_longjmp is called with a value greater than 1 (GCC compilation error) Issue #9692 has been updated by Martin Li��ka. 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 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. ---------------------------------------- Bug #9692: __builtin_longjmp is called with a value greater than 1 (GCC compilation error) https://bugs.ruby-lang.org/issues/9692#change-46035 * Author: Martin Li��ka * Status: Open * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: 2.0.0-p353 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- 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) -- https://bugs.ruby-lang.org/