1998-01-16 07:13:05 -05:00
|
|
|
/************************************************
|
|
|
|
|
|
|
|
defines.h -
|
|
|
|
|
|
|
|
$Author$
|
|
|
|
created at: Wed May 18 00:21:44 JST 1994
|
|
|
|
|
|
|
|
************************************************/
|
2007-06-09 23:06:15 -04:00
|
|
|
|
|
|
|
#ifndef RUBY_DEFINES_H
|
|
|
|
#define RUBY_DEFINES_H 1
|
|
|
|
|
|
|
|
#if defined(__cplusplus)
|
|
|
|
extern "C" {
|
|
|
|
#if 0
|
|
|
|
} /* satisfy cc-mode */
|
|
|
|
#endif
|
|
|
|
#endif
|
1998-01-16 07:13:05 -05:00
|
|
|
|
2010-07-27 05:33:55 -04:00
|
|
|
#include "ruby/config.h"
|
|
|
|
#ifdef RUBY_EXTCONF_H
|
|
|
|
#include RUBY_EXTCONF_H
|
|
|
|
#endif
|
|
|
|
|
2016-05-08 18:20:05 -04:00
|
|
|
/* function attributes */
|
|
|
|
#ifndef CONSTFUNC
|
|
|
|
# define CONSTFUNC(x) x
|
|
|
|
#endif
|
|
|
|
#ifndef PUREFUNC
|
|
|
|
# define PUREFUNC(x) x
|
|
|
|
#endif
|
|
|
|
#ifndef DEPRECATED
|
|
|
|
# define DEPRECATED(x) x
|
|
|
|
#endif
|
|
|
|
#ifndef DEPRECATED_BY
|
|
|
|
# define DEPRECATED_BY(n,x) DEPRECATED(x)
|
|
|
|
#endif
|
|
|
|
#ifndef DEPRECATED_TYPE
|
|
|
|
# define DEPRECATED_TYPE(mesg, decl) decl
|
|
|
|
#endif
|
|
|
|
#ifndef NOINLINE
|
|
|
|
# define NOINLINE(x) x
|
|
|
|
#endif
|
2016-08-24 07:08:30 -04:00
|
|
|
#ifndef ALWAYS_INLINE
|
|
|
|
# define ALWAYS_INLINE(x) x
|
|
|
|
#endif
|
2016-05-24 04:18:47 -04:00
|
|
|
#ifndef ERRORFUNC
|
|
|
|
# define HAVE_ATTRIBUTE_ERRORFUNC 0
|
|
|
|
# define ERRORFUNC(mesg, x) x
|
|
|
|
#else
|
|
|
|
# define HAVE_ATTRIBUTE_ERRORFUNC 1
|
|
|
|
#endif
|
|
|
|
#ifndef WARNINGFUNC
|
|
|
|
# define HAVE_ATTRIBUTE_WARNINGFUNC 0
|
|
|
|
# define WARNINGFUNC(mesg, x) x
|
|
|
|
#else
|
|
|
|
# define HAVE_ATTRIBUTE_WARNINGFUNC 1
|
|
|
|
#endif
|
2016-05-08 18:20:05 -04:00
|
|
|
|
2016-05-12 19:35:20 -04:00
|
|
|
#ifndef GCC_VERSION_SINCE
|
2016-12-09 17:45:38 -05:00
|
|
|
# if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__)
|
|
|
|
# define GCC_VERSION_SINCE(major, minor, patchlevel) \
|
|
|
|
((__GNUC__ > (major)) || \
|
|
|
|
((__GNUC__ == (major) && \
|
|
|
|
((__GNUC_MINOR__ > (minor)) || \
|
|
|
|
(__GNUC_MINOR__ == (minor) && __GNUC_PATCHLEVEL__ >= (patchlevel))))))
|
|
|
|
# else
|
|
|
|
# define GCC_VERSION_SINCE(major, minor, patchlevel) 0
|
|
|
|
# endif
|
2016-05-12 19:35:20 -04:00
|
|
|
#endif
|
2017-12-23 11:17:57 -05:00
|
|
|
#ifndef GCC_VERSION_BEFORE
|
|
|
|
# if defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__clang__)
|
|
|
|
# define GCC_VERSION_BEFORE(major, minor, patchlevel) \
|
|
|
|
((__GNUC__ < (major)) || \
|
|
|
|
((__GNUC__ == (major) && \
|
|
|
|
((__GNUC_MINOR__ < (minor)) || \
|
|
|
|
(__GNUC_MINOR__ == (minor) && __GNUC_PATCHLEVEL__ <= (patchlevel))))))
|
|
|
|
# else
|
|
|
|
# define GCC_VERSION_BEFORE(major, minor, patchlevel) 0
|
|
|
|
# endif
|
|
|
|
#endif
|
2016-05-12 14:12:47 -04:00
|
|
|
|
2016-05-08 18:20:05 -04:00
|
|
|
/* likely */
|
|
|
|
#if __GNUC__ >= 3
|
|
|
|
#define RB_LIKELY(x) (__builtin_expect(!!(x), 1))
|
|
|
|
#define RB_UNLIKELY(x) (__builtin_expect(!!(x), 0))
|
|
|
|
#else /* __GNUC__ >= 3 */
|
|
|
|
#define RB_LIKELY(x) (x)
|
|
|
|
#define RB_UNLIKELY(x) (x)
|
|
|
|
#endif /* __GNUC__ >= 3 */
|
|
|
|
|
|
|
|
#ifdef __GNUC__
|
|
|
|
#define PRINTF_ARGS(decl, string_index, first_to_check) \
|
|
|
|
decl __attribute__((format(printf, string_index, first_to_check)))
|
|
|
|
#else
|
|
|
|
#define PRINTF_ARGS(decl, string_index, first_to_check) decl
|
|
|
|
#endif
|
|
|
|
|
Use RB_GNUC_EXTENSION_BLOCK instead of __extension__
* include/ruby/defines.h (RB_GNUC_EXTENSION, RB_GNUC_EXTENSION_BLOCK):
macros for skipping __extension__ on non-GCC compilers.
* eval_error.c (warn_print): use RB_GNUC_EXTENSION_BLOCK instead of
__extension__ because __extension__ is a GNU extension.
Fix compile error on Solaris 10 with Oracle Solaris Studio 12.x.
[Bug #12397] [ruby-dev:49629].
* internal.h (rb_fstring_cstr, rb_fstring_enc_cstr): ditto
* include/ruby/encoding.h (rb_enc_str_new, rb_enc_str_new_cstr): ditto
* include/ruby/intern.h (rb_str_new, rb_str_new_cstr,
rb_usascii_str_new, rb_utf8_str_new, rb_tainted_str_new_cstr,
rb_usascii_str_new_cstr, rb_utf8_str_new_cstr,
rb_external_str_new_cstr, rb_locale_str_new_cstr,
rb_str_buf_new_cstr, rb_str_cat_cstr, rb_exc_new_cstr): ditto
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55082 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2016-05-20 08:29:06 -04:00
|
|
|
#ifdef __GNUC__
|
|
|
|
#define RB_GNUC_EXTENSION __extension__
|
|
|
|
#define RB_GNUC_EXTENSION_BLOCK(x) __extension__ ({ x; })
|
|
|
|
#else
|
|
|
|
#define RB_GNUC_EXTENSION
|
|
|
|
#define RB_GNUC_EXTENSION_BLOCK(x) (x)
|
|
|
|
#endif
|
|
|
|
|
2013-03-27 17:56:20 -04:00
|
|
|
/* AC_INCLUDES_DEFAULT */
|
|
|
|
#include <stdio.h>
|
|
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
|
|
# include <sys/types.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_SYS_STAT_H
|
|
|
|
# include <sys/stat.h>
|
|
|
|
#endif
|
|
|
|
#ifdef STDC_HEADERS
|
|
|
|
# include <stdlib.h>
|
|
|
|
# include <stddef.h>
|
|
|
|
#else
|
|
|
|
# ifdef HAVE_STDLIB_H
|
|
|
|
# include <stdlib.h>
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_STRING_H
|
|
|
|
# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
|
|
|
|
# include <memory.h>
|
|
|
|
# endif
|
|
|
|
# include <string.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_STRINGS_H
|
|
|
|
# include <strings.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_INTTYPES_H
|
|
|
|
# include <inttypes.h>
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_STDINT_H
|
|
|
|
# include <stdint.h>
|
|
|
|
#endif
|
2018-04-08 22:40:12 -04:00
|
|
|
#ifdef HAVE_STDALIGN_H
|
|
|
|
# include <stdalign.h>
|
|
|
|
#endif
|
2013-03-27 17:56:20 -04:00
|
|
|
#ifdef HAVE_UNISTD_H
|
|
|
|
# include <unistd.h>
|
|
|
|
#endif
|
|
|
|
|
2013-04-06 22:00:46 -04:00
|
|
|
#ifdef HAVE_SYS_SELECT_H
|
|
|
|
# include <sys/select.h>
|
|
|
|
#endif
|
|
|
|
|
2016-06-20 11:22:04 -04:00
|
|
|
#ifdef RUBY_USE_SETJMPEX
|
2013-05-18 10:57:59 -04:00
|
|
|
#include <setjmpex.h>
|
|
|
|
#endif
|
|
|
|
|
2013-08-19 08:39:09 -04:00
|
|
|
#include "ruby/missing.h"
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
#define RUBY
|
|
|
|
|
2002-02-18 04:52:48 -05:00
|
|
|
#ifdef __cplusplus
|
|
|
|
# ifndef HAVE_PROTOTYPES
|
|
|
|
# define HAVE_PROTOTYPES 1
|
|
|
|
# endif
|
|
|
|
# ifndef HAVE_STDARG_PROTOTYPES
|
|
|
|
# define HAVE_STDARG_PROTOTYPES 1
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#undef _
|
|
|
|
#ifdef HAVE_PROTOTYPES
|
|
|
|
# define _(args) args
|
|
|
|
#else
|
|
|
|
# define _(args) ()
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#undef __
|
|
|
|
#ifdef HAVE_STDARG_PROTOTYPES
|
|
|
|
# define __(args) args
|
|
|
|
#else
|
|
|
|
# define __(args) ()
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#define ANYARGS ...
|
|
|
|
#else
|
|
|
|
#define ANYARGS
|
|
|
|
#endif
|
|
|
|
|
2013-04-05 06:29:38 -04:00
|
|
|
#ifndef RUBY_SYMBOL_EXPORT_BEGIN
|
|
|
|
# define RUBY_SYMBOL_EXPORT_BEGIN /* begin */
|
|
|
|
# define RUBY_SYMBOL_EXPORT_END /* end */
|
2010-07-21 17:38:25 -04:00
|
|
|
#endif
|
|
|
|
|
2013-04-05 06:29:38 -04:00
|
|
|
RUBY_SYMBOL_EXPORT_BEGIN
|
|
|
|
|
2002-02-18 04:52:48 -05:00
|
|
|
#define xmalloc ruby_xmalloc
|
2005-10-05 12:15:16 -04:00
|
|
|
#define xmalloc2 ruby_xmalloc2
|
2002-02-18 04:52:48 -05:00
|
|
|
#define xcalloc ruby_xcalloc
|
|
|
|
#define xrealloc ruby_xrealloc
|
2005-10-05 12:15:16 -04:00
|
|
|
#define xrealloc2 ruby_xrealloc2
|
2002-02-18 04:52:48 -05:00
|
|
|
#define xfree ruby_xfree
|
|
|
|
|
2016-05-12 14:12:47 -04:00
|
|
|
#if GCC_VERSION_SINCE(4,3,0)
|
2016-05-12 14:27:05 -04:00
|
|
|
# define RUBY_ATTR_ALLOC_SIZE(params) __attribute__ ((alloc_size params))
|
2013-05-03 17:03:58 -04:00
|
|
|
#else
|
|
|
|
# define RUBY_ATTR_ALLOC_SIZE(params)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
void *xmalloc(size_t) RUBY_ATTR_ALLOC_SIZE((1));
|
|
|
|
void *xmalloc2(size_t,size_t) RUBY_ATTR_ALLOC_SIZE((1,2));
|
|
|
|
void *xcalloc(size_t,size_t) RUBY_ATTR_ALLOC_SIZE((1,2));
|
|
|
|
void *xrealloc(void*,size_t) RUBY_ATTR_ALLOC_SIZE((2));
|
|
|
|
void *xrealloc2(void*,size_t,size_t) RUBY_ATTR_ALLOC_SIZE((2,3));
|
* bignum.c: changed `foo _((boo))' to `foo(boo)`. [ruby-dev:27056]
* defines.h, dir.c, dln.h, enumerator.c, env.h, error.c, eval.c, file.c,
gc.c, hash.c, inits.c, intern.h, io.c, lex.c, marshal.c, missing.h,
node.h, numeric.c, pack.c, process.c, re.h, ruby.c, ruby.h, rubyio.h,
rubysig.h, signal.c, sprintf.c, st.h, string.c, struct.c, time.c,
util.c, util.h, variable.c: ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9155 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-09-14 02:32:32 -04:00
|
|
|
void xfree(void*);
|
2002-02-18 04:52:48 -05:00
|
|
|
|
2007-12-22 01:14:50 -05:00
|
|
|
#define STRINGIZE(expr) STRINGIZE0(expr)
|
|
|
|
#ifndef STRINGIZE0
|
|
|
|
#define STRINGIZE0(expr) #expr
|
|
|
|
#endif
|
|
|
|
|
2013-04-05 07:57:59 -04:00
|
|
|
#ifdef HAVE_LONG_LONG
|
2013-04-05 07:44:56 -04:00
|
|
|
# define HAVE_TRUE_LONG_LONG 1
|
|
|
|
#endif
|
|
|
|
|
2001-05-02 00:22:21 -04:00
|
|
|
#if SIZEOF_LONG_LONG > 0
|
|
|
|
# define LONG_LONG long long
|
|
|
|
#elif SIZEOF___INT64 > 0
|
2002-03-14 01:23:46 -05:00
|
|
|
# define HAVE_LONG_LONG 1
|
2001-05-02 00:22:21 -04:00
|
|
|
# define LONG_LONG __int64
|
|
|
|
# undef SIZEOF_LONG_LONG
|
|
|
|
# define SIZEOF_LONG_LONG SIZEOF___INT64
|
|
|
|
#endif
|
|
|
|
|
2004-01-17 12:39:05 -05:00
|
|
|
#ifdef __CYGWIN__
|
|
|
|
#undef _WIN32
|
|
|
|
#endif
|
|
|
|
|
2015-10-17 21:18:34 -04:00
|
|
|
#if defined(_WIN32)
|
2015-10-17 21:17:50 -04:00
|
|
|
/*
|
|
|
|
DOSISH mean MS-Windows style filesystem.
|
|
|
|
But you should use more precise macros like DOSISH_DRIVE_LETTER, PATH_SEP,
|
|
|
|
ENV_IGNORECASE or CASEFOLD_FILESYSTEM.
|
|
|
|
*/
|
* configure.in, defines.h, dir.c, dir.h, dln.c, error.c,
eval.c, file.c, hash.c, io.c, main.c, missing.c,
process.c, ruby.c, rubysig.h, signal.c, st.c, util.c, util.h,
bcc/Makefile.sub, win32/Makefile.sub, win32/win32.h,
ext/Win32API/Win32API.c, ext/socket/getaddrinfo.c,
ext/socket/getnameinfo.c, ext/socket/socket.c,
ext/tcltklib/stubs.c
: replace "NT" with "_WIN32", add DOSISH_DRIVE_LETTER
* wince/exe.mak : delete \r at the end of lines.
* wince/mswince-ruby17.def : delete rb_obj_become
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3148 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-12-14 22:18:08 -05:00
|
|
|
#define DOSISH 1
|
|
|
|
# define DOSISH_DRIVE_LETTER
|
|
|
|
#endif
|
|
|
|
|
2009-02-07 04:02:50 -05:00
|
|
|
#ifdef AC_APPLE_UNIVERSAL_BUILD
|
2008-01-10 21:57:38 -05:00
|
|
|
#undef WORDS_BIGENDIAN
|
|
|
|
#ifdef __BIG_ENDIAN__
|
|
|
|
#define WORDS_BIGENDIAN
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
* configure.in, defines.h, dir.c, dir.h, dln.c, error.c,
eval.c, file.c, hash.c, io.c, main.c, missing.c,
process.c, ruby.c, rubysig.h, signal.c, st.c, util.c, util.h,
bcc/Makefile.sub, win32/Makefile.sub, win32/win32.h,
ext/Win32API/Win32API.c, ext/socket/getaddrinfo.c,
ext/socket/getnameinfo.c, ext/socket/socket.c,
ext/tcltklib/stubs.c
: replace "NT" with "_WIN32", add DOSISH_DRIVE_LETTER
* wince/exe.mak : delete \r at the end of lines.
* wince/mswince-ruby17.def : delete rb_obj_become
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3148 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-12-14 22:18:08 -05:00
|
|
|
#ifdef _WIN32
|
2007-06-09 23:06:15 -04:00
|
|
|
#include "ruby/win32.h"
|
1998-01-16 07:13:05 -05:00
|
|
|
#endif
|
|
|
|
|
2005-10-25 13:00:03 -04:00
|
|
|
#ifdef RUBY_EXPORT
|
2003-03-04 09:12:19 -05:00
|
|
|
#undef RUBY_EXTERN
|
2009-07-18 03:03:15 -04:00
|
|
|
|
|
|
|
#ifndef FALSE
|
|
|
|
# define FALSE 0
|
|
|
|
#elif FALSE
|
|
|
|
# error FALSE must be false
|
|
|
|
#endif
|
|
|
|
#ifndef TRUE
|
|
|
|
# define TRUE 1
|
|
|
|
#elif !TRUE
|
|
|
|
# error TRUE must be true
|
|
|
|
#endif
|
|
|
|
|
2000-05-09 00:53:16 -04:00
|
|
|
#endif
|
|
|
|
|
2010-08-14 02:33:06 -04:00
|
|
|
#ifndef RUBY_FUNC_EXPORTED
|
|
|
|
#define RUBY_FUNC_EXPORTED
|
|
|
|
#endif
|
|
|
|
|
2018-02-08 08:54:37 -05:00
|
|
|
/* These macros are used for functions which are exported only for MJIT
|
mjit_compile.c: merge initial JIT compiler
which has been developed by Takashi Kokubun <takashikkbn@gmail> as
YARV-MJIT. Many of its bugs are fixed by wanabe <s.wanabe@gmail.com>.
This JIT compiler is designed to be a safe migration path to introduce
JIT compiler to MRI. So this commit does not include any bytecode
changes or dynamic instruction modifications, which are done in original
MJIT.
This commit even strips off some aggressive optimizations from
YARV-MJIT, and thus it's slower than YARV-MJIT too. But it's still
fairly faster than Ruby 2.5 in some benchmarks (attached below).
Note that this JIT compiler passes `make test`, `make test-all`, `make
test-spec` without JIT, and even with JIT. Not only it's perfectly safe
with JIT disabled because it does not replace VM instructions unlike
MJIT, but also with JIT enabled it stably runs Ruby applications
including Rails applications.
I'm expecting this version as just "initial" JIT compiler. I have many
optimization ideas which are skipped for initial merging, and you may
easily replace this JIT compiler with a faster one by just replacing
mjit_compile.c. `mjit_compile` interface is designed for the purpose.
common.mk: update dependencies for mjit_compile.c.
internal.h: declare `rb_vm_insn_addr2insn` for MJIT.
vm.c: exclude some definitions if `-DMJIT_HEADER` is provided to
compiler. This avoids to include some functions which take a long time
to compile, e.g. vm_exec_core. Some of the purpose is achieved in
transform_mjit_header.rb (see `IGNORED_FUNCTIONS`) but others are
manually resolved for now. Load mjit_helper.h for MJIT header.
mjit_helper.h: New. This is a file used only by JIT-ed code. I'll
refactor `mjit_call_cfunc` later.
vm_eval.c: add some #ifdef switches to skip compiling some functions
like Init_vm_eval.
win32/mkexports.rb: export thread/ec functions, which are used by MJIT.
include/ruby/defines.h: add MJIT_FUNC_EXPORTED macro alis to clarify
that a function is exported only for MJIT.
array.c: export a function used by MJIT.
bignum.c: ditto.
class.c: ditto.
compile.c: ditto.
error.c: ditto.
gc.c: ditto.
hash.c: ditto.
iseq.c: ditto.
numeric.c: ditto.
object.c: ditto.
proc.c: ditto.
re.c: ditto.
st.c: ditto.
string.c: ditto.
thread.c: ditto.
variable.c: ditto.
vm_backtrace.c: ditto.
vm_insnhelper.c: ditto.
vm_method.c: ditto.
I would like to improve maintainability of function exports, but I
believe this way is acceptable as initial merging if we clarify the
new exports are for MJIT (so that we can use them as TODO list to fix)
and add unit tests to detect unresolved symbols.
I'll add unit tests of JIT compilations in succeeding commits.
Author: Takashi Kokubun <takashikkbn@gmail.com>
Contributor: wanabe <s.wanabe@gmail.com>
Part of [Feature #14235]
---
* Known issues
* Code generated by gcc is faster than clang. The benchmark may be worse
in macOS. Following benchmark result is provided by gcc w/ Linux.
* Performance is decreased when Google Chrome is running
* JIT can work on MinGW, but it doesn't improve performance at least
in short running benchmark.
* Currently it doesn't perform well with Rails. We'll try to fix this
before release.
---
* Benchmark reslts
Benchmarked with:
Intel 4.0GHz i7-4790K with 16GB memory under x86-64 Ubuntu 8 Cores
- 2.0.0-p0: Ruby 2.0.0-p0
- r62186: Ruby trunk (early 2.6.0), before MJIT changes
- JIT off: On this commit, but without `--jit` option
- JIT on: On this commit, and with `--jit` option
** Optcarrot fps
Benchmark: https://github.com/mame/optcarrot
| |2.0.0-p0 |r62186 |JIT off |JIT on |
|:--------|:--------|:--------|:--------|:--------|
|fps |37.32 |51.46 |51.31 |58.88 |
|vs 2.0.0 |1.00x |1.38x |1.37x |1.58x |
** MJIT benchmarks
Benchmark: https://github.com/benchmark-driver/mjit-benchmarks
(Original: https://github.com/vnmakarov/ruby/tree/rtl_mjit_branch/MJIT-benchmarks)
| |2.0.0-p0 |r62186 |JIT off |JIT on |
|:----------|:--------|:--------|:--------|:--------|
|aread |1.00 |1.09 |1.07 |2.19 |
|aref |1.00 |1.13 |1.11 |2.22 |
|aset |1.00 |1.50 |1.45 |2.64 |
|awrite |1.00 |1.17 |1.13 |2.20 |
|call |1.00 |1.29 |1.26 |2.02 |
|const2 |1.00 |1.10 |1.10 |2.19 |
|const |1.00 |1.11 |1.10 |2.19 |
|fannk |1.00 |1.04 |1.02 |1.00 |
|fib |1.00 |1.32 |1.31 |1.84 |
|ivread |1.00 |1.13 |1.12 |2.43 |
|ivwrite |1.00 |1.23 |1.21 |2.40 |
|mandelbrot |1.00 |1.13 |1.16 |1.28 |
|meteor |1.00 |2.97 |2.92 |3.17 |
|nbody |1.00 |1.17 |1.15 |1.49 |
|nest-ntimes|1.00 |1.22 |1.20 |1.39 |
|nest-while |1.00 |1.10 |1.10 |1.37 |
|norm |1.00 |1.18 |1.16 |1.24 |
|nsvb |1.00 |1.16 |1.16 |1.17 |
|red-black |1.00 |1.02 |0.99 |1.12 |
|sieve |1.00 |1.30 |1.28 |1.62 |
|trees |1.00 |1.14 |1.13 |1.19 |
|while |1.00 |1.12 |1.11 |2.41 |
** Discourse's script/bench.rb
Benchmark: https://github.com/discourse/discourse/blob/v1.8.7/script/bench.rb
NOTE: Rails performance was somehow a little degraded with JIT for now.
We should fix this.
(At least I know opt_aref is performing badly in JIT and I have an idea
to fix it. Please wait for the fix.)
*** JIT off
Your Results: (note for timings- percentile is first, duration is second in millisecs)
categories_admin:
50: 17
75: 18
90: 22
99: 29
home_admin:
50: 21
75: 21
90: 27
99: 40
topic_admin:
50: 17
75: 18
90: 22
99: 32
categories:
50: 35
75: 41
90: 43
99: 77
home:
50: 39
75: 46
90: 49
99: 95
topic:
50: 46
75: 52
90: 56
99: 101
*** JIT on
Your Results: (note for timings- percentile is first, duration is second in millisecs)
categories_admin:
50: 19
75: 21
90: 25
99: 33
home_admin:
50: 24
75: 26
90: 30
99: 35
topic_admin:
50: 19
75: 20
90: 25
99: 30
categories:
50: 40
75: 44
90: 48
99: 76
home:
50: 42
75: 48
90: 51
99: 89
topic:
50: 49
75: 55
90: 58
99: 99
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62197 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-04 06:22:28 -05:00
|
|
|
and NOT ensured to be exported in future versions. */
|
|
|
|
#define MJIT_FUNC_EXPORTED RUBY_FUNC_EXPORTED
|
2018-02-08 08:54:37 -05:00
|
|
|
#define MJIT_SYMBOL_EXPORT_BEGIN RUBY_SYMBOL_EXPORT_BEGIN
|
|
|
|
#define MJIT_SYMBOL_EXPORT_END RUBY_SYMBOL_EXPORT_END
|
mjit_compile.c: merge initial JIT compiler
which has been developed by Takashi Kokubun <takashikkbn@gmail> as
YARV-MJIT. Many of its bugs are fixed by wanabe <s.wanabe@gmail.com>.
This JIT compiler is designed to be a safe migration path to introduce
JIT compiler to MRI. So this commit does not include any bytecode
changes or dynamic instruction modifications, which are done in original
MJIT.
This commit even strips off some aggressive optimizations from
YARV-MJIT, and thus it's slower than YARV-MJIT too. But it's still
fairly faster than Ruby 2.5 in some benchmarks (attached below).
Note that this JIT compiler passes `make test`, `make test-all`, `make
test-spec` without JIT, and even with JIT. Not only it's perfectly safe
with JIT disabled because it does not replace VM instructions unlike
MJIT, but also with JIT enabled it stably runs Ruby applications
including Rails applications.
I'm expecting this version as just "initial" JIT compiler. I have many
optimization ideas which are skipped for initial merging, and you may
easily replace this JIT compiler with a faster one by just replacing
mjit_compile.c. `mjit_compile` interface is designed for the purpose.
common.mk: update dependencies for mjit_compile.c.
internal.h: declare `rb_vm_insn_addr2insn` for MJIT.
vm.c: exclude some definitions if `-DMJIT_HEADER` is provided to
compiler. This avoids to include some functions which take a long time
to compile, e.g. vm_exec_core. Some of the purpose is achieved in
transform_mjit_header.rb (see `IGNORED_FUNCTIONS`) but others are
manually resolved for now. Load mjit_helper.h for MJIT header.
mjit_helper.h: New. This is a file used only by JIT-ed code. I'll
refactor `mjit_call_cfunc` later.
vm_eval.c: add some #ifdef switches to skip compiling some functions
like Init_vm_eval.
win32/mkexports.rb: export thread/ec functions, which are used by MJIT.
include/ruby/defines.h: add MJIT_FUNC_EXPORTED macro alis to clarify
that a function is exported only for MJIT.
array.c: export a function used by MJIT.
bignum.c: ditto.
class.c: ditto.
compile.c: ditto.
error.c: ditto.
gc.c: ditto.
hash.c: ditto.
iseq.c: ditto.
numeric.c: ditto.
object.c: ditto.
proc.c: ditto.
re.c: ditto.
st.c: ditto.
string.c: ditto.
thread.c: ditto.
variable.c: ditto.
vm_backtrace.c: ditto.
vm_insnhelper.c: ditto.
vm_method.c: ditto.
I would like to improve maintainability of function exports, but I
believe this way is acceptable as initial merging if we clarify the
new exports are for MJIT (so that we can use them as TODO list to fix)
and add unit tests to detect unresolved symbols.
I'll add unit tests of JIT compilations in succeeding commits.
Author: Takashi Kokubun <takashikkbn@gmail.com>
Contributor: wanabe <s.wanabe@gmail.com>
Part of [Feature #14235]
---
* Known issues
* Code generated by gcc is faster than clang. The benchmark may be worse
in macOS. Following benchmark result is provided by gcc w/ Linux.
* Performance is decreased when Google Chrome is running
* JIT can work on MinGW, but it doesn't improve performance at least
in short running benchmark.
* Currently it doesn't perform well with Rails. We'll try to fix this
before release.
---
* Benchmark reslts
Benchmarked with:
Intel 4.0GHz i7-4790K with 16GB memory under x86-64 Ubuntu 8 Cores
- 2.0.0-p0: Ruby 2.0.0-p0
- r62186: Ruby trunk (early 2.6.0), before MJIT changes
- JIT off: On this commit, but without `--jit` option
- JIT on: On this commit, and with `--jit` option
** Optcarrot fps
Benchmark: https://github.com/mame/optcarrot
| |2.0.0-p0 |r62186 |JIT off |JIT on |
|:--------|:--------|:--------|:--------|:--------|
|fps |37.32 |51.46 |51.31 |58.88 |
|vs 2.0.0 |1.00x |1.38x |1.37x |1.58x |
** MJIT benchmarks
Benchmark: https://github.com/benchmark-driver/mjit-benchmarks
(Original: https://github.com/vnmakarov/ruby/tree/rtl_mjit_branch/MJIT-benchmarks)
| |2.0.0-p0 |r62186 |JIT off |JIT on |
|:----------|:--------|:--------|:--------|:--------|
|aread |1.00 |1.09 |1.07 |2.19 |
|aref |1.00 |1.13 |1.11 |2.22 |
|aset |1.00 |1.50 |1.45 |2.64 |
|awrite |1.00 |1.17 |1.13 |2.20 |
|call |1.00 |1.29 |1.26 |2.02 |
|const2 |1.00 |1.10 |1.10 |2.19 |
|const |1.00 |1.11 |1.10 |2.19 |
|fannk |1.00 |1.04 |1.02 |1.00 |
|fib |1.00 |1.32 |1.31 |1.84 |
|ivread |1.00 |1.13 |1.12 |2.43 |
|ivwrite |1.00 |1.23 |1.21 |2.40 |
|mandelbrot |1.00 |1.13 |1.16 |1.28 |
|meteor |1.00 |2.97 |2.92 |3.17 |
|nbody |1.00 |1.17 |1.15 |1.49 |
|nest-ntimes|1.00 |1.22 |1.20 |1.39 |
|nest-while |1.00 |1.10 |1.10 |1.37 |
|norm |1.00 |1.18 |1.16 |1.24 |
|nsvb |1.00 |1.16 |1.16 |1.17 |
|red-black |1.00 |1.02 |0.99 |1.12 |
|sieve |1.00 |1.30 |1.28 |1.62 |
|trees |1.00 |1.14 |1.13 |1.19 |
|while |1.00 |1.12 |1.11 |2.41 |
** Discourse's script/bench.rb
Benchmark: https://github.com/discourse/discourse/blob/v1.8.7/script/bench.rb
NOTE: Rails performance was somehow a little degraded with JIT for now.
We should fix this.
(At least I know opt_aref is performing badly in JIT and I have an idea
to fix it. Please wait for the fix.)
*** JIT off
Your Results: (note for timings- percentile is first, duration is second in millisecs)
categories_admin:
50: 17
75: 18
90: 22
99: 29
home_admin:
50: 21
75: 21
90: 27
99: 40
topic_admin:
50: 17
75: 18
90: 22
99: 32
categories:
50: 35
75: 41
90: 43
99: 77
home:
50: 39
75: 46
90: 49
99: 95
topic:
50: 46
75: 52
90: 56
99: 101
*** JIT on
Your Results: (note for timings- percentile is first, duration is second in millisecs)
categories_admin:
50: 19
75: 21
90: 25
99: 33
home_admin:
50: 24
75: 26
90: 30
99: 35
topic_admin:
50: 19
75: 20
90: 25
99: 30
categories:
50: 40
75: 44
90: 48
99: 76
home:
50: 42
75: 48
90: 51
99: 89
topic:
50: 49
75: 55
90: 58
99: 99
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62197 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-02-04 06:22:28 -05:00
|
|
|
|
2003-03-04 09:12:19 -05:00
|
|
|
#ifndef RUBY_EXTERN
|
|
|
|
#define RUBY_EXTERN extern
|
|
|
|
#endif
|
|
|
|
|
1999-01-19 23:59:39 -05:00
|
|
|
#ifndef EXTERN
|
2017-10-13 04:29:52 -04:00
|
|
|
# if defined __GNUC__
|
|
|
|
# define EXTERN _Pragma("message \"EXTERN is deprecated, use RUBY_EXTERN instead\""); \
|
|
|
|
RUBY_EXTERN
|
|
|
|
# elif defined _MSC_VER
|
|
|
|
# define EXTERN __pragma(message(__FILE__"("STRINGIZE(__LINE__)"): warning: "\
|
|
|
|
"EXTERN is deprecated, use RUBY_EXTERN instead")); \
|
|
|
|
RUBY_EXTERN
|
|
|
|
# else
|
|
|
|
# define EXTERN <-<-"EXTERN is deprecated, use RUBY_EXTERN instead"->->
|
|
|
|
# endif
|
1999-01-19 23:59:39 -05:00
|
|
|
#endif
|
|
|
|
|
2004-01-21 10:26:11 -05:00
|
|
|
#ifndef RUBY_MBCHAR_MAXSIZE
|
|
|
|
#define RUBY_MBCHAR_MAXSIZE INT_MAX
|
|
|
|
/* MB_CUR_MAX will not work well in C locale */
|
|
|
|
#endif
|
|
|
|
|
2011-10-25 08:54:21 -04:00
|
|
|
#if defined(__sparc)
|
2011-11-15 00:05:35 -05:00
|
|
|
void rb_sparc_flush_register_windows(void);
|
2011-11-14 23:42:31 -05:00
|
|
|
# define FLUSH_REGISTER_WINDOWS rb_sparc_flush_register_windows()
|
2006-01-22 08:34:41 -05:00
|
|
|
#elif defined(__ia64)
|
2005-12-27 00:40:04 -05:00
|
|
|
void *rb_ia64_bsp(void);
|
|
|
|
void rb_ia64_flushrs(void);
|
|
|
|
# define FLUSH_REGISTER_WINDOWS rb_ia64_flushrs()
|
2003-01-21 08:52:21 -05:00
|
|
|
#else
|
|
|
|
# define FLUSH_REGISTER_WINDOWS ((void)0)
|
2004-04-13 22:03:41 -04:00
|
|
|
#endif
|
1998-01-16 07:13:05 -05:00
|
|
|
|
* configure.in, defines.h, dir.c, dir.h, dln.c, error.c,
eval.c, file.c, hash.c, io.c, main.c, missing.c,
process.c, ruby.c, rubysig.h, signal.c, st.c, util.c, util.h,
bcc/Makefile.sub, win32/Makefile.sub, win32/win32.h,
ext/Win32API/Win32API.c, ext/socket/getaddrinfo.c,
ext/socket/getnameinfo.c, ext/socket/socket.c,
ext/tcltklib/stubs.c
: replace "NT" with "_WIN32", add DOSISH_DRIVE_LETTER
* wince/exe.mak : delete \r at the end of lines.
* wince/mswince-ruby17.def : delete rb_obj_become
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3148 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2002-12-14 22:18:08 -05:00
|
|
|
#if defined(DOSISH)
|
1999-08-13 01:45:20 -04:00
|
|
|
#define PATH_SEP ";"
|
1999-01-19 23:59:39 -05:00
|
|
|
#else
|
1999-08-13 01:45:20 -04:00
|
|
|
#define PATH_SEP ":"
|
1999-01-19 23:59:39 -05:00
|
|
|
#endif
|
1999-08-13 01:45:20 -04:00
|
|
|
#define PATH_SEP_CHAR PATH_SEP[0]
|
1999-01-19 23:59:39 -05:00
|
|
|
|
2003-06-20 02:22:50 -04:00
|
|
|
#define PATH_ENV "PATH"
|
|
|
|
|
2015-10-17 21:18:34 -04:00
|
|
|
#if defined(DOSISH)
|
2003-06-20 02:22:50 -04:00
|
|
|
#define ENV_IGNORECASE
|
|
|
|
#endif
|
|
|
|
|
2008-05-15 02:34:02 -04:00
|
|
|
#ifndef CASEFOLD_FILESYSTEM
|
2011-05-22 21:04:07 -04:00
|
|
|
# if defined DOSISH
|
2008-05-15 02:34:02 -04:00
|
|
|
# define CASEFOLD_FILESYSTEM 1
|
|
|
|
# else
|
|
|
|
# define CASEFOLD_FILESYSTEM 0
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2007-05-03 09:19:11 -04:00
|
|
|
#ifndef DLEXT_MAXLEN
|
|
|
|
#define DLEXT_MAXLEN 4
|
|
|
|
#endif
|
|
|
|
|
1998-01-16 07:13:05 -05:00
|
|
|
#ifndef RUBY_PLATFORM
|
|
|
|
#define RUBY_PLATFORM "unknown-unknown"
|
|
|
|
#endif
|
|
|
|
|
2014-04-16 22:41:39 -04:00
|
|
|
#ifndef FUNC_MINIMIZED
|
|
|
|
#define FUNC_MINIMIZED(x) x
|
|
|
|
#endif
|
2015-11-30 20:05:48 -05:00
|
|
|
#ifndef FUNC_UNOPTIMIZED
|
|
|
|
#define FUNC_UNOPTIMIZED(x) x
|
|
|
|
#endif
|
2009-01-19 03:28:28 -05:00
|
|
|
#ifndef RUBY_ALIAS_FUNCTION_TYPE
|
|
|
|
#define RUBY_ALIAS_FUNCTION_TYPE(type, prot, name, args) \
|
2015-08-13 00:41:51 -04:00
|
|
|
FUNC_MINIMIZED(type prot) {return (type)name args;}
|
2009-01-19 03:24:10 -05:00
|
|
|
#endif
|
|
|
|
#ifndef RUBY_ALIAS_FUNCTION_VOID
|
|
|
|
#define RUBY_ALIAS_FUNCTION_VOID(prot, name, args) \
|
2015-08-13 00:41:51 -04:00
|
|
|
FUNC_MINIMIZED(void prot) {name args;}
|
2009-01-19 03:24:10 -05:00
|
|
|
#endif
|
2008-08-14 02:27:50 -04:00
|
|
|
#ifndef RUBY_ALIAS_FUNCTION
|
2009-01-19 03:24:10 -05:00
|
|
|
#define RUBY_ALIAS_FUNCTION(prot, name, args) \
|
2009-01-19 03:28:28 -05:00
|
|
|
RUBY_ALIAS_FUNCTION_TYPE(VALUE, prot, name, args)
|
2008-08-14 02:27:50 -04:00
|
|
|
#endif
|
|
|
|
|
2014-07-23 10:50:02 -04:00
|
|
|
#ifndef UNALIGNED_WORD_ACCESS
|
|
|
|
# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
|
|
|
|
defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
|
2014-07-23 10:50:12 -04:00
|
|
|
defined(__powerpc64__) || \
|
2014-07-23 10:50:02 -04:00
|
|
|
defined(__mc68020__)
|
|
|
|
# define UNALIGNED_WORD_ACCESS 1
|
|
|
|
# else
|
|
|
|
# define UNALIGNED_WORD_ACCESS 0
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
#ifndef PACKED_STRUCT
|
|
|
|
# define PACKED_STRUCT(x) x
|
|
|
|
#endif
|
|
|
|
#ifndef PACKED_STRUCT_UNALIGNED
|
|
|
|
# if UNALIGNED_WORD_ACCESS
|
|
|
|
# define PACKED_STRUCT_UNALIGNED(x) PACKED_STRUCT(x)
|
|
|
|
# else
|
|
|
|
# define PACKED_STRUCT_UNALIGNED(x) x
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
2018-01-14 21:35:16 -05:00
|
|
|
#ifndef RUBY_ALIGNAS
|
2018-01-16 00:49:01 -05:00
|
|
|
#define RUBY_ALIGNAS(x) /* x */
|
2018-01-14 21:35:16 -05:00
|
|
|
#endif
|
|
|
|
|
2018-01-14 21:35:17 -05:00
|
|
|
#ifdef RUBY_ALIGNOF
|
|
|
|
/* OK, take that definition */
|
|
|
|
#elif defined(__cplusplus) && (__cplusplus >= 201103L)
|
|
|
|
#define RUBY_ALIGNOF alignof
|
|
|
|
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
|
|
|
|
#define RUBY_ALIGNOF _Alignof
|
|
|
|
#else
|
2018-01-16 00:49:01 -05:00
|
|
|
#define RUBY_ALIGNOF(type) ((size_t)offsetof(struct { char f1; type f2; }, f2))
|
2018-01-14 21:35:17 -05:00
|
|
|
#endif
|
|
|
|
|
2018-01-14 21:35:20 -05:00
|
|
|
#define NORETURN_STYLE_NEW 1
|
|
|
|
#ifdef NORETURN
|
|
|
|
/* OK, take that definition */
|
|
|
|
#elif defined(__cplusplus) && (__cplusplus >= 201103L)
|
|
|
|
#define NORETURN(x) [[ noreturn ]] x
|
|
|
|
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
|
|
|
|
#define NORETURN(x) _Noreturn x
|
|
|
|
#else
|
|
|
|
#define NORETURN(x) x
|
|
|
|
#endif
|
|
|
|
|
2013-04-05 06:29:38 -04:00
|
|
|
RUBY_SYMBOL_EXPORT_END
|
2010-07-21 17:38:25 -04:00
|
|
|
|
2007-06-09 23:06:15 -04:00
|
|
|
#if defined(__cplusplus)
|
|
|
|
#if 0
|
|
|
|
{ /* satisfy cc-mode */
|
|
|
|
#endif
|
|
|
|
} /* extern "C" { */
|
1998-01-16 07:13:05 -05:00
|
|
|
#endif
|
2007-06-09 23:06:15 -04:00
|
|
|
|
|
|
|
#endif /* RUBY_DEFINES_H */
|