Bug #9692

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

Added by Martin Liška about 1 year ago. Updated 9 months ago.

[ruby-core:61796]
Status:Closed
Priority:Normal
Assignee:-
ruby -v:2.0.0-p353 Backport:2.0.0: REQUIRED, 2.1: DONE

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)

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


Related issues

Related to Ruby trunk - Bug #9698: r45509以降、Solarisにて configureが thread model is missing でエラー Closed 04/03/2014
Related to Ruby trunk - Bug #9710: __builtin_setjmp/longjmp causes SEGV with mingw Closed 04/07/2014
Related to Ruby trunk - Bug #9818: __builtin_setjmp and __builtin_longjmp caused a build failure on PPC Linux with gcc 4.4.0 Closed 05/08/2014

Associated revisions

Revision 45503
Added by Nobuyoshi Nakada about 1 year ago

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(). [Bug #9692]

Revision 45503
Added by Nobuyoshi Nakada about 1 year ago

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(). [Bug #9692]

Revision 45504
Added by Nobuyoshi Nakada about 1 year ago

eval_intern.h: __builtin_longjmp requires literal 1 on gcc 4.9

  • eval_intern.h (rb_threadptr_tag_jump): gcc 4.9 disallows other than literal 1 as the second argument of __builtin_longjmp(). [Bug #9692]

Revision 45504
Added by Nobuyoshi Nakada about 1 year ago

eval_intern.h: __builtin_longjmp requires literal 1 on gcc 4.9

  • eval_intern.h (rb_threadptr_tag_jump): gcc 4.9 disallows other than literal 1 as the second argument of __builtin_longjmp(). [Bug #9692]

Revision 45508
Added by Nobuyoshi Nakada about 1 year ago

configure.in: fix for clang 5.1 __builtin_longjmp

  • configure.in (ac_cv_func__builtin_setjmp): __builtin_longjmp() in clang 5.1 uses void**, not `jmpbuf`. [Bug #9692]

Revision 45508
Added by Nobuyoshi Nakada about 1 year ago

configure.in: fix for clang 5.1 __builtin_longjmp

  • configure.in (ac_cv_func__builtin_setjmp): __builtin_longjmp() in clang 5.1 uses void**, not `jmpbuf`. [Bug #9692]

Revision 45509
Added by Nobuyoshi Nakada about 1 year ago

configure.in: use the first candidate

  • configure.in (ac_cv_func__builtin_setjmp): use the first cast which works with _builtin_longjmp(). [Bug #9692]

Revision 45509
Added by Nobuyoshi Nakada about 1 year ago

configure.in: use the first candidate

  • configure.in (ac_cv_func__builtin_setjmp): use the first cast which works with _builtin_longjmp(). [Bug #9692]

Revision 47276
Added by Tomoyuki Chikanaga 9 months ago

merge revision(s) r45503,r45504,r45508,r45509,r47275: [Backport #9692]

* configure.in (ac_cv_func___builtin_setjmp): gcc 4.9 disallows a
  variable as the second argument of __builtin_longjmp().
   [Bug #9692]

* configure.in (ac_cv_func___builtin_setjmp): __builtin_longjmp() in
  clang 5.1 uses `void**`, not `jmp_buf`.  [Bug #9692]

* configure.in (ac_cv_func___builtin_setjmp): __builtin_longjmp()
  in Apple LLVM 5.1 (LLVM 3.4svn) uses `void**`, not `jmp_buf`.
  [Bug #9692]

History

#1 Updated by Martin Liška about 1 year 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.

#3 Updated by Nobuyoshi Nakada about 1 year ago

  • Description updated (diff)

#4 Updated by Nobuyoshi Nakada about 1 year ago

I think JUMP_TAG in the trunk doesn't use a variable.

#5 Updated by Nobuyoshi Nakada about 1 year 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(). [Bug #9692]

#6 Updated by Naohisa Goto about 1 year ago

  • Related to Bug #9698: r45509以降、Solarisにて configureが thread model is missing でエラー added

#7 Updated by _ wanabe about 1 year ago

  • Related to Bug #9710: __builtin_setjmp/longjmp causes SEGV with mingw added

#8 Updated by _ wanabe about 1 year 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.

#9 Updated by Usaku NAKAMURA 12 months ago

I'm troubled about how to write a substitute of r45504 for ruby_2_0_0.
Nobu, do you have any idea?

#10 Updated by Tomoyuki Chikanaga 12 months ago

  • Related to Bug #9818: __builtin_setjmp and __builtin_longjmp caused a build failure on PPC Linux with gcc 4.4.0 added

#11 Updated by Nobuyoshi Nakada 12 months 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.

#12 Updated by Usaku NAKAMURA 12 months ago

Thank you. I'll check it.

#13 Updated by Tomoyuki Chikanaga 9 months 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.

Also available in: Atom PDF