From fe14832ebff7b4ef1ec9ded348c77e8779098c36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Sun, 24 Jan 2010 16:51:54 +0100 Subject: Teach the compiler the no_native option Implement the 'no_native' option to disable native-code compilation. If given in a module like this: -compile(no_native). it will override a 'native' option given on the command line. --- lib/compiler/src/compile.erl | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl index 58e147d508..f0f962f3ef 100644 --- a/lib/compiler/src/compile.erl +++ b/lib/compiler/src/compile.erl @@ -717,7 +717,7 @@ read_beam_file(St) -> case file:read_file(St#compile.ifile) of {ok,Beam} -> Infile = St#compile.ifile, - case is_too_old(Infile) of + case no_native_compilation(Infile, St) of true -> {ok,St#compile{module=none,code=none}}; false -> @@ -730,12 +730,15 @@ read_beam_file(St) -> {error,St#compile{errors=St#compile.errors ++ Es}} end. -is_too_old(BeamFile) -> +no_native_compilation(BeamFile, #compile{options=Opts0}) -> case beam_lib:chunks(BeamFile, ["CInf"]) of {ok,{_,[{"CInf",Term0}]}} -> Term = binary_to_term(Term0), - Opts = proplists:get_value(options, Term, []), - lists:member(no_new_funs, Opts); + + %% Compiler options in the beam file will override + %% options passed to the compiler. + Opts = proplists:get_value(options, Term, []) ++ Opts0, + member(no_new_funs, Opts) orelse not is_native_enabled(Opts); _ -> false end. @@ -1046,7 +1049,14 @@ beam_asm(#compile{ifile=File,code=Code0,abstract_code=Abst,options=Opts0}=St) -> test_native(#compile{options=Opts}) -> %% This test is done late, in case some other option has turned off native. - member(native, Opts). + %% 'native' given on the command line can be overridden by + %% 'no_native' in the module itself. + is_native_enabled(Opts). + +is_native_enabled([native|_]) -> true; +is_native_enabled([no_native|_]) -> false; +is_native_enabled([H|T]) -> is_native_enabled(T); +is_native_enabled([]) -> false. native_compile(#compile{code=none}=St) -> {ok,St}; native_compile(St) -> -- cgit v1.2.1 From 24e2773f82975b6d7f88512c5f73777edc9522c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Sun, 24 Jan 2010 17:04:12 +0100 Subject: re tests: disable native-code compilation for huge modules Two generated modules contains too big functions for the native-code compiler to handle (even the BEAM compiler struggles when compiling them). --- lib/stdlib/test/re_testoutput1_replacement_test.erl | 1 + lib/stdlib/test/re_testoutput1_split_test.erl | 1 + lib/stdlib/test/run_pcre_tests.erl | 2 ++ 3 files changed, 4 insertions(+) diff --git a/lib/stdlib/test/re_testoutput1_replacement_test.erl b/lib/stdlib/test/re_testoutput1_replacement_test.erl index fcd57f8f24..69cb140e0d 100644 --- a/lib/stdlib/test/re_testoutput1_replacement_test.erl +++ b/lib/stdlib/test/re_testoutput1_replacement_test.erl @@ -18,6 +18,7 @@ %% -module(re_testoutput1_replacement_test). -compile(export_all). +-compile(no_native). -include("test_server.hrl"). %% This file is generated by running run_pcre_tests:gen_repl_test("re_SUITE_data/testoutput1") run() -> diff --git a/lib/stdlib/test/re_testoutput1_split_test.erl b/lib/stdlib/test/re_testoutput1_split_test.erl index 294cfc33c4..e86a04b008 100644 --- a/lib/stdlib/test/re_testoutput1_split_test.erl +++ b/lib/stdlib/test/re_testoutput1_split_test.erl @@ -18,6 +18,7 @@ %% -module(re_testoutput1_split_test). -compile(export_all). +-compile(no_native). -include("test_server.hrl"). %% This file is generated by running run_pcre_tests:gen_split_test("re_SUITE_data/testoutput1") join([]) -> []; diff --git a/lib/stdlib/test/run_pcre_tests.erl b/lib/stdlib/test/run_pcre_tests.erl index 8c6424e708..78b4803fc8 100644 --- a/lib/stdlib/test/run_pcre_tests.erl +++ b/lib/stdlib/test/run_pcre_tests.erl @@ -987,6 +987,7 @@ gen_split_test(OneFile) -> {ok,F}= file:open(ErlFileName,[write]), io:format(F,"-module(~s).~n",[ErlModule]), io:format(F,"-compile(export_all).~n",[]), + io:format(F,"-compile(no_native).~n",[]), io:format(F,"-include(\"test_server.hrl\").~n",[]), %io:format(F,"-define(line,erlang:display(?LINE),).~n",[]), io:format(F,"%% This file is generated by running ~w:gen_split_test(~p)~n", @@ -1068,6 +1069,7 @@ gen_repl_test(OneFile) -> {ok,F}= file:open(ErlFileName,[write]), io:format(F,"-module(~s).~n",[ErlModule]), io:format(F,"-compile(export_all).~n",[]), + io:format(F,"-compile(no_native).~n",[]), io:format(F,"-include(\"test_server.hrl\").~n",[]), io:format(F,"%% This file is generated by running ~w:gen_repl_test(~p)~n", [?MODULE,OneFile]), -- cgit v1.2.1 From 9e2ac0d0bd27a8bf2c309d038b95e7925dbf67aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= Date: Mon, 25 Jan 2010 09:21:03 +0100 Subject: compiler: make ignore_native_errors also handle internal hipe errors We must also catch exits, not only errors, since the hipe compilers does an exit/1 if an internal error is found. --- lib/compiler/src/compile.erl | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl index f0f962f3ef..d73c9cd762 100644 --- a/lib/compiler/src/compile.erl +++ b/lib/compiler/src/compile.erl @@ -187,9 +187,9 @@ format_error(no_crypto_key) -> format_error({native, E}) -> io_lib:fwrite("native-code compilation failed with reason: ~P.", [E, 25]); -format_error({native_crash, E}) -> - io_lib:fwrite("native-code compilation crashed with reason: ~P.", - [E, 25]); +format_error({native_crash,E,Stk}) -> + io_lib:fwrite("native-code compilation crashed with reason: ~P.\n~P\n", + [E,25,Stk,25]); format_error({open,E}) -> io_lib:format("open error '~s'", [file:format_error(E)]); format_error({epp,E}) -> @@ -1080,25 +1080,27 @@ native_compile_1(St) -> St#compile.core_code, St#compile.code, Opts) of - {ok, {_Type,Bin} = T} when is_binary(Bin) -> - {ok, embed_native_code(St, T)}; - {error, R} -> + {ok,{_Type,Bin}=T} when is_binary(Bin) -> + {ok,embed_native_code(St, T)}; + {error,R} -> case IgnoreErrors of true -> - Ws = [{St#compile.ifile,[{none,?MODULE,{native,R}}]}], - {ok, St#compile{warnings=St#compile.warnings ++ Ws}}; + Ws = [{St#compile.ifile,[{?MODULE,{native,R}}]}], + {ok,St#compile{warnings=St#compile.warnings ++ Ws}}; false -> - Es = [{St#compile.ifile,[{none,?MODULE,{native,R}}]}], - {error, St#compile{errors=St#compile.errors ++ Es}} + Es = [{St#compile.ifile,[{?MODULE,{native,R}}]}], + {error,St#compile{errors=St#compile.errors ++ Es}} end catch - error:R -> + Class:R -> + Stk = erlang:get_stacktrace(), case IgnoreErrors of true -> - Ws = [{St#compile.ifile,[{none,?MODULE,{native_crash,R}}]}], - {ok, St#compile{warnings=St#compile.warnings ++ Ws}}; + Ws = [{St#compile.ifile, + [{?MODULE,{native_crash,R,Stk}}]}], + {ok,St#compile{warnings=St#compile.warnings ++ Ws}}; false -> - exit(R) + erlang:raise(Class, R, Stk) end end. -- cgit v1.2.1