From: "cfis (Charlie Savage) via ruby-core" <ruby-core@...>
Date: 2022-12-28T01:24:56+00:00
Subject: [ruby-core:111464] [Ruby master Bug#19267] Compile fails when enabling YJIT on x64-mingw-ucrt

Issue #19267 has been updated by cfis (Charlie Savage).


Yes, I will disable yjit.

----------------------------------------
Bug #19267: Compile fails when enabling YJIT on x64-mingw-ucrt
https://bugs.ruby-lang.org/issues/19267#change-100836

* Author: cfis (Charlie Savage)
* Status: Feedback
* Priority: Normal
* ruby -v: ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e) [x64-mingw-ucrt]
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN
----------------------------------------
Ruby fails to compile with msys2/ucrt64 when enabling yjit. 

Error:
``` c
In file included from ./include/ruby/defines.h:72,
                 from ./include/ruby/ruby.h:25,
                 from eval_intern.h:4,
                 from vm.c:13:
vm.c: In function 'mjit_check_iseq':
vm.c:393:12: warning: implicit declaration of function 'MJIT_FUNC_STATE_P' [-Wimplicit-function-declaration]
  393 |     ASSUME(MJIT_FUNC_STATE_P(mjit_state));
      |            ^~~~~~~~~~~~~~~~~
./include/ruby/backward/2/assume.h:43:46: note: in definition of macro 'RB_LIKELY'
   43 | # define RB_LIKELY(x)   (__builtin_expect(!!(x), 1))
      |                                              ^
./include/ruby/backward/2/assume.h:27:28: note: in expansion of macro 'RBIMPL_ASSUME'
   27 | #define ASSUME             RBIMPL_ASSUME             /**< @old{RBIMPL_ASSUME} */
      |                            ^~~~~~~~~~~~~
vm.c:393:5: note: in expansion of macro 'ASSUME'
  393 |     ASSUME(MJIT_FUNC_STATE_P(mjit_state));
      |     ^~~~~~
vm.c:394:19: error: conversion to incomplete type
  394 |     switch ((enum rb_mjit_func_state)mjit_state) {
      |                   ^~~~~~~~~~~~~~~~~~
vm.c:395:12: error: 'MJIT_FUNC_NOT_COMPILED' undeclared (first use in this function)
  395 |       case MJIT_FUNC_NOT_COMPILED:
```

The problem:

In ruby-3.2.0\.ext\include\x64-mingw-ucrt\ruby\config.h

``` c
#define USE_MJIT 0
#define USE_YJIT 1
```

But in mjit.h:

``` c
# if USE_MJIT
...
// Return true if jit_func is part of enum rb_mjit_func_state
#define MJIT_FUNC_STATE_P(jit_func) ((uintptr_t)(jit_func) <= (uintptr_t)MJIT_FUNC_FAILED)
...
# end
```

So MJIT_FUNC_STATE_P is never defined.

Then in vm.c:

``` c
#if USE_MJIT || USE_YJIT
# ifdef MJIT_HEADER
NOINLINE(static COLDFUNC VALUE mjit_check_iseq(rb_execution_context_t *ec, const rb_iseq_t *iseq, struct rb_iseq_constant_body *body));
# else
static inline VALUE mjit_check_iseq(rb_execution_context_t *ec, const rb_iseq_t *iseq, struct rb_iseq_constant_body *body);
# endif
static VALUE
mjit_check_iseq(rb_execution_context_t *ec, const rb_iseq_t *iseq, struct rb_iseq_constant_body *body)
{
    uintptr_t mjit_state = (uintptr_t)(body->jit_func);
    ASSUME(MJIT_FUNC_STATE_P(mjit_state));
 etc
```

Note that MJIT_HEADER is not defined.

Note this is just the first of many errors that you will encounter.

To get Ruby 3.2.0 to compile, I had to do a significant rearrangement of mjit.h which I have attached.

However, when yjit.c then compiles:

``` c
yjit.c: In function 'rb_yjit_mark_unused':
yjit.c:93:5: warning: implicit declaration of function 'madvise'; did you mean 'raise'? [-Wimplicit-function-declaratio
]
   93 |     madvise(mem_block, mem_size, MADV_DONTNEED);
      |     ^~~~~~~
      |     raise
yjit.c:93:34: error: 'MADV_DONTNEED' undeclared (first use in this function)
   93 |     madvise(mem_block, mem_size, MADV_DONTNEED);
```

This is because the check in yjit.c (line 32) is:

``` c
// For mmapp(), sysconf()
#if defined _WIN32
#include <unistd.h>
#include <sys/mman.h>
#endif
```

UCRT doesn't define _WIN32, it defines _WIN64


However, then the next issue - there is no sys/mman.h header with mingw.

So enabling yjit on mingw breaks the compile and is apparently unsupported.


---Files--------------------------------
mjit.h (5.71 KB)


-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/