lang/ruby/3.0 fails to build on mips64. It looks that the peephole
optimizer still has issues on this architecture. The following patch
disables it.

In addition, there is an alignment problem with the handling of builtins.
compiler.c assumes that bytecode arrays are properly aligned. However,
this assumption does not always hold on mips64, and the interpreter
crashes. The issue is similar to what was recently fixed in perl(1).

#0  ibf_load_setup_bytes ()  <-- unaligned load
#1  rb_iseq_ibf_load_bytes ()
#2  rb_load_with_builtin_functions ()
#3  Init_builtin_gc ()
#4  rb_call_builtin_inits ()
#5  ruby_opt_init ()
#6  load_file_internal ()
#7  rb_ensure ()
#8  ruby_process_options ()
#9  ruby_options ()
#10 main ()

The patch fixes the problem by forcing 8-byte alignment, though 4-byte
alignment should be enough. However, there probably are better ways to
fix this.

Index: patches/patch-compile_c
===================================================================
RCS file: ports/lang/ruby/3.0/patches/patch-compile_c,v
retrieving revision 1.1.1.1
diff -u -p -r1.1.1.1 patch-compile_c
--- patches/patch-compile_c     28 Dec 2020 16:45:27 -0000      1.1.1.1
+++ patches/patch-compile_c     21 Mar 2021 13:13:37 -0000
@@ -1,6 +1,7 @@
 $OpenBSD: patch-compile_c,v 1.1.1.1 2020/12/28 16:45:27 jeremy Exp $
 
-Disable peephole optimizer on sparc64, since it occasionally segfaults.
+Disable peephole optimizer on mips64 and sparc64, since it occasionally
+segfaults.
 
 Index: compile.c
 --- compile.c.orig
@@ -9,7 +10,7 @@ Index: compile.c
  iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int 
do_tailcallopt)
  {
      INSN *const iobj = (INSN *)list;
-+#ifdef __sparc64__
++#if defined(__mips64__) || defined(__sparc64__)
 +    return COMPILE_OK;
 +#endif
 +
Index: patches/patch-template_builtin_binary_inc_tmpl
===================================================================
RCS file: patches/patch-template_builtin_binary_inc_tmpl
diff -N patches/patch-template_builtin_binary_inc_tmpl
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-template_builtin_binary_inc_tmpl      21 Mar 2021 13:13:37 
-0000
@@ -0,0 +1,17 @@
+$OpenBSD$
+
+Ensure proper alignment of builtin binary arrays to fix crash on mips64.
+compile.c accesses the start of these arrays as struct ibf_header.
+
+Index: template/builtin_binary.inc.tmpl
+--- template/builtin_binary.inc.tmpl.orig
++++ template/builtin_binary.inc.tmpl
+@@ -6,7 +6,7 @@
+ %   ary = RubyVM.enum_for(:each_builtin).to_a
+ %   ary.each{|feature, iseq|
+ 
+-static const unsigned char <%= feature %>_bin[] = {
++static const unsigned char <%= feature %>_bin[] __attribute__((aligned(8))) = 
{
+ %     iseq                   \
+ %     . to_binary            \
+ %     . each_byte            \

Reply via email to