diff options
| -rw-r--r-- | examples/targets/build_config_android_armeabi_v7a_neon_hard.rb | 28 | ||||
| -rw-r--r-- | include/mruby/numeric.h | 10 | ||||
| -rw-r--r-- | mrbgems/mruby-bin-mruby/bintest/mruby.rb | 4 | ||||
| -rw-r--r-- | mrbgems/mruby-compiler/core/parse.y | 74 | ||||
| -rw-r--r-- | mrbgems/mruby-eval/src/eval.c | 7 | ||||
| -rw-r--r-- | tasks/toolchains/android.rake | 78 |
6 files changed, 142 insertions, 59 deletions
diff --git a/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb b/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb new file mode 100644 index 000000000..3788bba7f --- /dev/null +++ b/examples/targets/build_config_android_armeabi_v7a_neon_hard.rb @@ -0,0 +1,28 @@ +MRuby::Build.new do |conf| + + # Gets set by the VS command prompts. + if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR'] + toolchain :visualcpp + else + toolchain :gcc + end + + enable_debug + + # include the default GEMs + conf.gembox 'default' +end + +# Requires Android NDK r13 or later. +MRuby::CrossBuild.new('android-armeabi-v7a-neon-hard') do |conf| + params = { + :arch => 'armeabi-v7a', + :mfpu => 'neon', + :mfloat_abi => 'hard', + :platform => 'android-24', + :toolchain => :clang, + } + toolchain :android, params + + conf.gembox 'default' +end diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index e4086487e..36489b1ce 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -42,6 +42,16 @@ mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y); # define MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS #endif +// Clang 3.8 and 3.9 have problem compiling mruby in 32-bit mode, when MRB_INT64 is set +// because of missing __mulodi4 and similar functions in its runtime. We need to use custom +// implementation for them. +#ifdef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS +#if defined(__clang__) && (__clang_major__ == 3) && (__clang_minor__ >= 8) && \ + defined(MRB_32BIT) && defined(MRB_INT64) +#undef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS +#endif +#endif + #ifdef MRB_HAVE_TYPE_GENERIC_CHECKED_ARITHMETIC_BUILTINS #ifndef MRB_WORD_BOXING diff --git a/mrbgems/mruby-bin-mruby/bintest/mruby.rb b/mrbgems/mruby-bin-mruby/bintest/mruby.rb index 72ac6586d..b6b090185 100644 --- a/mrbgems/mruby-bin-mruby/bintest/mruby.rb +++ b/mrbgems/mruby-bin-mruby/bintest/mruby.rb @@ -2,9 +2,9 @@ require 'tempfile' assert('regression for #1564') do o = `#{cmd('mruby')} -e #{shellquote('<<')} 2>&1` - assert_equal o, "-e:1:2: syntax error, unexpected tLSHFT\n" + assert_include o, "-e:1:2: syntax error" o = `#{cmd('mruby')} -e #{shellquote('<<-')} 2>&1` - assert_equal o, "-e:1:3: syntax error, unexpected tLSHFT\n" + assert_include o, "-e:1:3: syntax error" end assert('regression for #1572') do diff --git a/mrbgems/mruby-compiler/core/parse.y b/mrbgems/mruby-compiler/core/parse.y index f8e4eb72f..5be8bdc7f 100644 --- a/mrbgems/mruby-compiler/core/parse.y +++ b/mrbgems/mruby-compiler/core/parse.y @@ -3327,7 +3327,7 @@ none : /* none */ } ; %% -#define yylval (*((YYSTYPE*)(p->ylval))) +#define pylval (*((YYSTYPE*)(p->ylval))) static void yyerror(parser_state *p, const char *s) @@ -3962,7 +3962,7 @@ parse_string(parser_state *p) yyerror(p, buf); return 0; } - yylval.nd = new_str(p, tok(p), toklen(p)); + pylval.nd = new_str(p, tok(p), toklen(p)); return tHD_STRING_MID; } if (c < 0) { @@ -4035,7 +4035,7 @@ parse_string(parser_state *p) tokfix(p); p->lstate = EXPR_BEG; p->cmd_start = TRUE; - yylval.nd = new_str(p, tok(p), toklen(p)); + pylval.nd = new_str(p, tok(p), toklen(p)); if (hinf) { hinf->line_head = FALSE; return tHD_STRING_PART; @@ -4065,7 +4065,7 @@ parse_string(parser_state *p) else { pushback(p, c); tokfix(p); - yylval.nd = new_str(p, tok(p), toklen(p)); + pylval.nd = new_str(p, tok(p), toklen(p)); return tSTRING_MID; } } @@ -4077,7 +4077,7 @@ parse_string(parser_state *p) end_strterm(p); if (type & STR_FUNC_XQUOTE) { - yylval.nd = new_xstr(p, tok(p), toklen(p)); + pylval.nd = new_xstr(p, tok(p), toklen(p)); return tXSTRING; } @@ -4127,11 +4127,11 @@ parse_string(parser_state *p) } else { encp = NULL; } - yylval.nd = new_regx(p, s, dup, encp); + pylval.nd = new_regx(p, s, dup, encp); return tREGEXP; } - yylval.nd = new_str(p, tok(p), toklen(p)); + pylval.nd = new_str(p, tok(p), toklen(p)); if (IS_LABEL_POSSIBLE()) { if (IS_LABEL_SUFFIX(0)) { p->lstate = EXPR_BEG; @@ -4209,7 +4209,7 @@ heredoc_identifier(parser_state *p) p->heredocs_from_nextline = push(p->heredocs_from_nextline, newnode); p->lstate = EXPR_END; - yylval.nd = newnode; + pylval.nd = newnode; return tHEREDOC_BEG; } @@ -4313,7 +4313,7 @@ parser_yylex(parser_state *p) case '*': if ((c = nextc(p)) == '*') { if ((c = nextc(p)) == '=') { - yylval.id = intern("**",2); + pylval.id = intern("**",2); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4322,7 +4322,7 @@ parser_yylex(parser_state *p) } else { if (c == '=') { - yylval.id = intern_c('*'); + pylval.id = intern_c('*'); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4438,7 +4438,7 @@ parser_yylex(parser_state *p) } if (c == '<') { if ((c = nextc(p)) == '=') { - yylval.id = intern("<<",2); + pylval.id = intern("<<",2); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4460,7 +4460,7 @@ parser_yylex(parser_state *p) } if (c == '>') { if ((c = nextc(p)) == '=') { - yylval.id = intern(">>",2); + pylval.id = intern(">>",2); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4557,7 +4557,7 @@ parser_yylex(parser_state *p) tokadd(p, c); } tokfix(p); - yylval.nd = new_str(p, tok(p), toklen(p)); + pylval.nd = new_str(p, tok(p), toklen(p)); p->lstate = EXPR_END; return tCHAR; @@ -4565,7 +4565,7 @@ parser_yylex(parser_state *p) if ((c = nextc(p)) == '&') { p->lstate = EXPR_BEG; if ((c = nextc(p)) == '=') { - yylval.id = intern("&&",2); + pylval.id = intern("&&",2); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4577,7 +4577,7 @@ parser_yylex(parser_state *p) return tANDDOT; } else if (c == '=') { - yylval.id = intern_c('&'); + pylval.id = intern_c('&'); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4604,7 +4604,7 @@ parser_yylex(parser_state *p) if ((c = nextc(p)) == '|') { p->lstate = EXPR_BEG; if ((c = nextc(p)) == '=') { - yylval.id = intern("||",2); + pylval.id = intern("||",2); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4612,7 +4612,7 @@ parser_yylex(parser_state *p) return tOROP; } if (c == '=') { - yylval.id = intern_c('|'); + pylval.id = intern_c('|'); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4636,7 +4636,7 @@ parser_yylex(parser_state *p) return '+'; } if (c == '=') { - yylval.id = intern_c('+'); + pylval.id = intern_c('+'); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4664,7 +4664,7 @@ parser_yylex(parser_state *p) return '-'; } if (c == '=') { - yylval.id = intern_c('-'); + pylval.id = intern_c('-'); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4738,7 +4738,7 @@ parser_yylex(parser_state *p) no_digits(); } else if (nondigit) goto trailing_uc; - yylval.nd = new_int(p, tok(p), 16); + pylval.nd = new_int(p, tok(p), 16); return tINTEGER; } if (c == 'b' || c == 'B') { @@ -4762,7 +4762,7 @@ parser_yylex(parser_state *p) no_digits(); } else if (nondigit) goto trailing_uc; - yylval.nd = new_int(p, tok(p), 2); + pylval.nd = new_int(p, tok(p), 2); return tINTEGER; } if (c == 'd' || c == 'D') { @@ -4786,7 +4786,7 @@ parser_yylex(parser_state *p) no_digits(); } else if (nondigit) goto trailing_uc; - yylval.nd = new_int(p, tok(p), 10); + pylval.nd = new_int(p, tok(p), 10); return tINTEGER; } if (c == '_') { @@ -4819,7 +4819,7 @@ parser_yylex(parser_state *p) pushback(p, c); tokfix(p); if (nondigit) goto trailing_uc; - yylval.nd = new_int(p, tok(p), 8); + pylval.nd = new_int(p, tok(p), 8); return tINTEGER; } if (nondigit) { @@ -4836,7 +4836,7 @@ parser_yylex(parser_state *p) } else { pushback(p, c); - yylval.nd = new_int(p, "0", 10); + pylval.nd = new_int(p, "0", 10); return tINTEGER; } } @@ -4920,10 +4920,10 @@ parser_yylex(parser_state *p) yywarning_s(p, "float %s out of range", tok(p)); errno = 0; } - yylval.nd = new_float(p, tok(p)); + pylval.nd = new_float(p, tok(p)); return tFLOAT; } - yylval.nd = new_int(p, tok(p), 10); + pylval.nd = new_int(p, tok(p), 10); return tINTEGER; } @@ -4965,7 +4965,7 @@ parser_yylex(parser_state *p) return tREGEXP_BEG; } if ((c = nextc(p)) == '=') { - yylval.id = intern_c('/'); + pylval.id = intern_c('/'); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -4984,7 +4984,7 @@ parser_yylex(parser_state *p) case '^': if ((c = nextc(p)) == '=') { - yylval.id = intern_c('^'); + pylval.id = intern_c('^'); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5158,7 +5158,7 @@ parser_yylex(parser_state *p) } } if ((c = nextc(p)) == '=') { - yylval.id = intern_c('%'); + pylval.id = intern_c('%'); p->lstate = EXPR_BEG; return tOP_ASGN; } @@ -5212,7 +5212,7 @@ parser_yylex(parser_state *p) tokadd(p, '$'); tokadd(p, c); tokfix(p); - yylval.id = intern_cstr(tok(p)); + pylval.id = intern_cstr(tok(p)); return tGVAR; case '-': @@ -5222,7 +5222,7 @@ parser_yylex(parser_state *p) pushback(p, c); gvar: tokfix(p); - yylval.id = intern_cstr(tok(p)); + pylval.id = intern_cstr(tok(p)); return tGVAR; case '&': /* $&: last match */ @@ -5234,7 +5234,7 @@ parser_yylex(parser_state *p) tokadd(p, c); goto gvar; } - yylval.nd = new_back_ref(p, c); + pylval.nd = new_back_ref(p, c); return tBACK_REF; case '1': case '2': case '3': @@ -5253,7 +5253,7 @@ parser_yylex(parser_state *p) yyerror_i(p, "capture group index must be <= %d", INT_MAX); return 0; } - yylval.nd = new_nth_ref(p, (int)n); + pylval.nd = new_nth_ref(p, (int)n); } return tNTH_REF; @@ -5381,7 +5381,7 @@ parser_yylex(parser_state *p) p->lstate = EXPR_BEG; nextc(p); tokfix(p); - yylval.id = intern_cstr(tok(p)); + pylval.id = intern_cstr(tok(p)); return tLABEL; } } @@ -5392,10 +5392,10 @@ parser_yylex(parser_state *p) kw = mrb_reserved_word(tok(p), toklen(p)); if (kw) { enum mrb_lex_state_enum state = p->lstate; - yylval.num = p->lineno; + pylval.num = p->lineno; p->lstate = kw->state; if (state == EXPR_FNAME) { - yylval.id = intern_cstr(kw->name); + pylval.id = intern_cstr(kw->name); return kw->id[0]; } if (p->lstate == EXPR_BEG) { @@ -5442,7 +5442,7 @@ parser_yylex(parser_state *p) { mrb_sym ident = intern_cstr(tok(p)); - yylval.id = ident; + pylval.id = ident; #if 0 if (last_state != EXPR_DOT && islower(tok(p)[0]) && lvar_defined(ident)) { p->lstate = EXPR_END; diff --git a/mrbgems/mruby-eval/src/eval.c b/mrbgems/mruby-eval/src/eval.c index 81bc80280..907e3f666 100644 --- a/mrbgems/mruby-eval/src/eval.c +++ b/mrbgems/mruby-eval/src/eval.c @@ -131,6 +131,10 @@ patch_irep(mrb_state *mrb, mrb_irep *irep, int bnest) } } break; + + case OP_STOP: + irep->iseq[i] = MKOP_AB(OP_RETURN, irep->nlocals, OP_R_NORMAL); + break; } } } @@ -194,7 +198,8 @@ create_proc_from_string(mrb_state *mrb, char *s, int len, mrb_value binding, con e->cioff = c->ci - c->cibase - 1; e->stack = c->ci->stackent; MRB_SET_ENV_STACK_LEN(e, c->ci[-1].proc->body.irep->nlocals); - c->ci->env = e; + c->ci->target_class = proc->target_class; + c->ci->env = 0; proc->env = e; patch_irep(mrb, proc->body.irep, 0); diff --git a/tasks/toolchains/android.rake b/tasks/toolchains/android.rake index 7759a3f9c..e69dbf5a6 100644 --- a/tasks/toolchains/android.rake +++ b/tasks/toolchains/android.rake @@ -186,6 +186,22 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter @platform end + def armeabi_v7a_mfpu + @armeabi_v7a_mfpu ||= (params[:mfpu] || 'vfpv3-d16').to_s + end + + def armeabi_v7a_mfloat_abi + @armeabi_v7a_mfloat_abi ||= (params[:mfloat_abi] || 'softfp').to_s + end + + def no_warn_mismatch + if %W(soft softfp).include? armeabi_v7a_mfloat_abi + '' + else + ',--no-warn-mismatch' + end + end + def cc case toolchain when :gcc then bin_gcc('gcc') @@ -200,36 +216,56 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter end end - def cflags + def ctarget flags = [] - flags += %W(-MMD -MP) - flags += %W(-D__android__ -DANDROID --sysroot="#{sysroot}") case toolchain when :gcc case arch - when /armeabi-v7a/ then flags += %W(-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -fpic) - when /armeabi/ then flags += %W(-march=armv5te -mtune=xscale -msoft-float -fpic) - when /arm64-v8a/ then flags += %W(-march=armv8-a -fpic) + when /armeabi-v7a/ then flags += %W(-march=armv7-a) + when /armeabi/ then flags += %W(-march=armv5te) + when /arm64-v8a/ then flags += %W(-march=armv8-a) when /x86_64/ then flags += %W(-march=x86-64) when /x86/ then flags += %W(-march=i686) - when /mips64/ then flags += %W(-march=mips64r6 -fmessage-length=0 -fpic) - when /mips/ then flags += %W(-march=mips32 -fmessage-length=0 -fpic) + when /mips64/ then flags += %W(-march=mips64r6) + when /mips/ then flags += %W(-march=mips32) end when :clang - flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}") case arch - when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi -fpic) - when /armeabi/ then flags += %W(-target armv5te-none-linux-androideabi -fpic) - when /arm64-v8a/ then flags += %W(-target aarch64-none-linux-android -fpic) - when /x86_64/ then flags += %W(-target x86_64-none-linux-android -fPIC) - when /x86/ then flags += %W(-target i686-none-linux-android -fPIC) - when /mips64/ then flags += %W(-target mips64el-none-linux-android -fmessage-length=0 -fpic) - when /mips/ then flags += %W(-target mipsel-none-linux-android -fmessage-length=0 -fpic) + when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi) + when /armeabi/ then flags += %W(-target armv5te-none-linux-androideabi) + when /arm64-v8a/ then flags += %W(-target aarch64-none-linux-android) + when /x86_64/ then flags += %W(-target x86_64-none-linux-android) + when /x86/ then flags += %W(-target i686-none-linux-android) + when /mips64/ then flags += %W(-target mips64el-none-linux-android) + when /mips/ then flags += %W(-target mipsel-none-linux-android) end - flags += %W(-Wno-invalid-command-line-argument -Wno-unused-command-line-argument) end - flags += %W(-ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes) + + case arch + when /armeabi-v7a/ then flags += %W(-mfpu=#{armeabi_v7a_mfpu} -mfloat-abi=#{armeabi_v7a_mfloat_abi}) + when /armeabi/ then flags += %W(-mtune=xscale -msoft-float) + when /arm64-v8a/ then flags += %W() + when /x86_64/ then flags += %W() + when /x86/ then flags += %W() + when /mips64/ then flags += %W(-fmessage-length=0) + when /mips/ then flags += %W(-fmessage-length=0) + end + + flags + end + + def cflags + flags = [] + + flags += %W(-MMD -MP -D__android__ -DANDROID --sysroot="#{sysroot}") + flags += ctarget + case toolchain + when :gcc + when :clang + flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}" -Wno-invalid-command-line-argument -Wno-unused-command-line-argument) + end + flags += %W(-fpic -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes) flags end @@ -246,10 +282,14 @@ Set ANDROID_PLATFORM environment variable or set :platform parameter flags = [] case toolchain + when :gcc + case arch + when /armeabi-v7a/ then flags += %W(-Wl#{no_warn_mismatch}) + end when :clang flags += %W(-gcc-toolchain "#{gcc_toolchain_path.to_s}") case arch - when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi -Wl,--fix-cortex-a8) + when /armeabi-v7a/ then flags += %W(-target armv7-none-linux-androideabi -Wl,--fix-cortex-a8#{no_warn_mismatch}) when /armeabi/ then flags += %W(-target armv5te-none-linux-androideabi) when /arm64-v8a/ then flags += %W(-target aarch64-none-linux-android) when /x86_64/ then flags += %W(-target x86_64-none-linux-android) |
