Project

General

Profile

Actions

Bug #9692

closed

__builtin_longjmp is called with a value greater than 1 (GCC compilation error)

Added by marxin (Martin Liška) over 10 years ago. Updated about 10 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
2.0.0-p353
[ruby-core:61796]

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

ruby-configure-builtin_longjmp.patch (573 Bytes) ruby-configure-builtin_longjmp.patch marxin (Martin Liška), 04/01/2014 03:05 PM

Related issues 3 (0 open3 closed)

Related to Ruby master - Bug #9698: r45509以降、Solarisにて configureが thread model is missing でエラーClosednobu (Nobuyoshi Nakada)04/03/2014Actions
Related to Ruby master - Bug #9710: __builtin_setjmp/longjmp causes SEGV with mingwClosed04/07/2014Actions
Related to Ruby master - Bug #9818: __builtin_setjmp and __builtin_longjmp caused a build failure on PPC Linux with gcc 4.4.0Closed05/08/2014Actions

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 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) over 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) over 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) over 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) over 10 years ago

Thank you. I'll check it.

Updated by nagachika (Tomoyuki Chikanaga) about 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.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0