File 2151-HiPE-Don-t-fail-the-compilation-for-unimplemented-in.patch of Package erlang

From 4e0430638635083c199f81375a6c14f2ffb726fb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Mon, 11 Mar 2019 13:15:02 +0100
Subject: [PATCH] HiPE: Don't fail the compilation for unimplemented
 instructions

---
 erts/configure.in                     | 26 ++++++++++++++++++++++++++
 lib/compiler/src/Makefile             |  3 ++-
 lib/compiler/src/compile.erl          | 12 ++++++++++--
 lib/dialyzer/src/Makefile             |  4 +++-
 lib/hipe/cerl/Makefile                |  5 ++++-
 lib/hipe/icode/hipe_beam_to_icode.erl | 18 ++++++++++++++++++
 lib/hipe/llvm/Makefile                |  5 ++++-
 lib/hipe/main/hipe.erl                | 12 +++++++-----
 lib/hipe/rtl/Makefile                 |  5 ++++-
 lib/kernel/src/Makefile               |  4 +++-
 lib/stdlib/src/Makefile               |  4 +++-
 11 files changed, 84 insertions(+), 14 deletions(-)

diff --git a/erts/configure.in b/erts/configure.in
index b070ad0649..5f969a0a8b 100644
--- a/erts/configure.in
+++ b/erts/configure.in
@@ -2783,6 +2783,32 @@ AC_SUBST(HIPE_ENABLED)
 NATIVE_LIBS_ENABLED=
 if test X${enable_native_libs} = Xyes -a X${HIPE_ENABLED} = Xyes; then
   NATIVE_LIBS_ENABLED=yes
+  cat >> $ERL_TOP/erts/CONF_INFO <<EOF
+
+                 WARNING: In OTP 22, HiPE (the native code compiler) is
+		 not fully functional. The reasons for this are:
+
+		 1. There are new BEAM instructions for binary
+		 matching that the HiPE native code compiler does not
+		 support. 
+
+		 2. The new optimizations in the Erlang compiler create
+		 new combination of instructions that HiPE currently
+		 does not handle correctly.
+
+		 If erlc is invoked like so:
+
+		     erlc +native some_file.erl
+
+                 or like so:
+
+                     erlc +native some_file.beam
+
+		 and if any of the new binary matching instructions
+		 are used, the compiler will issue a warning and
+		 produce a BEAM file without native code.
+
+EOF
 fi
 AC_SUBST(NATIVE_LIBS_ENABLED)
 
diff --git a/lib/compiler/src/Makefile b/lib/compiler/src/Makefile
index c971e8844d..9f8d63baa1 100644
--- a/lib/compiler/src/Makefile
+++ b/lib/compiler/src/Makefile
@@ -129,9 +129,10 @@ APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
 
 ifeq ($(NATIVE_LIBS_ENABLED),yes)
 ERL_COMPILE_FLAGS += +native
+else
+ERL_COMPILE_FLAGS += -Werror
 endif
 ERL_COMPILE_FLAGS += +inline +warn_unused_import \
- -Werror \
  -I../../stdlib/include -I$(EGEN) -W +warn_missing_spec
 
 # ----------------------------------------------------
diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl
index 11dea9524b..28db8986ff 100644
--- a/lib/compiler/src/compile.erl
+++ b/lib/compiler/src/compile.erl
@@ -290,6 +290,10 @@ format_error(bad_crypto_key) ->
     "invalid crypto key.";
 format_error(no_crypto_key) ->
     "no crypto key supplied.";
+format_error({unimplemented_instruction,Instruction}) ->
+    io_lib:fwrite("native-code compilation failed because of an "
+                  "unimplemented instruction (~s).",
+		  [Instruction]);
 format_error({native, E}) ->
     io_lib:fwrite("native-code compilation failed with reason: ~tP.",
 		  [E, 25]);
@@ -1651,18 +1655,22 @@ native_compile_1(Code, St) ->
 	    case IgnoreErrors of
 		true ->
 		    Ws = [{St#compile.ifile,[{none,?MODULE,{native,R}}]}],
-		    {ok,St#compile{warnings=St#compile.warnings ++ Ws}};
+		    {ok,Code,St#compile{warnings=St#compile.warnings ++ Ws}};
 		false ->
 		    Es = [{St#compile.ifile,[{none,?MODULE,{native,R}}]}],
 		    {error,St#compile{errors=St#compile.errors ++ Es}}
 	    end
     catch
+        exit:{unimplemented_instruction,_}=Unimplemented ->
+            Ws = [{St#compile.ifile,
+                   [{none,?MODULE,Unimplemented}]}],
+            {ok,Code,St#compile{warnings=St#compile.warnings ++ Ws}};
 	Class:R:Stack ->
 	    case IgnoreErrors of
 		true ->
 		    Ws = [{St#compile.ifile,
 			   [{none,?MODULE,{native_crash,R,Stack}}]}],
-		    {ok,St#compile{warnings=St#compile.warnings ++ Ws}};
+		    {ok,Code,St#compile{warnings=St#compile.warnings ++ Ws}};
 		false ->
 		    erlang:raise(Class, R, Stack)
 	    end
diff --git a/lib/dialyzer/src/Makefile b/lib/dialyzer/src/Makefile
index fc08e7ca2f..bddd761705 100644
--- a/lib/dialyzer/src/Makefile
+++ b/lib/dialyzer/src/Makefile
@@ -91,8 +91,10 @@ APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
 ERL_COMPILE_FLAGS += +inline +inline_list_funcs
 ifeq ($(NATIVE_LIBS_ENABLED),yes)
 ERL_COMPILE_FLAGS += +native
+else
+ERL_COMPILE_FLAGS += -Werror
 endif
-ERL_COMPILE_FLAGS += +warn_export_vars +warn_unused_import +warn_untyped_record +warn_missing_spec +warnings_as_errors
+ERL_COMPILE_FLAGS += +warn_export_vars +warn_unused_import +warn_untyped_record +warn_missing_spec
 
 # ----------------------------------------------------
 # Targets
diff --git a/lib/hipe/cerl/Makefile b/lib/hipe/cerl/Makefile
index f653dce36f..5c367b5b77 100644
--- a/lib/hipe/cerl/Makefile
+++ b/lib/hipe/cerl/Makefile
@@ -66,7 +66,10 @@ DOC_FILES= $(MODULES:%=$(DOCS)/%.html)
 
 include ../native.mk
 
-ERL_COMPILE_FLAGS += +inline -Werror +warn_export_vars +warn_unused_import +warn_missing_spec #+warn_untyped_record
+ERL_COMPILE_FLAGS += +inline +warn_export_vars +warn_unused_import +warn_missing_spec #+warn_untyped_record
+ifneq ($(NATIVE_LIBS_ENABLED),yes)
+ERL_COMPILE_FLAGS += -Werror
+endif
 
 # ----------------------------------------------------
 # Targets
diff --git a/lib/hipe/icode/hipe_beam_to_icode.erl b/lib/hipe/icode/hipe_beam_to_icode.erl
index ffe81ef9b8..8e7e56b6c4 100644
--- a/lib/hipe/icode/hipe_beam_to_icode.erl
+++ b/lib/hipe/icode/hipe_beam_to_icode.erl
@@ -1189,6 +1189,21 @@ trans_fun([raw_raise|Instructions], Env) ->
   [hipe_icode:mk_primop(Dst,raw_raise,Vars) |
    trans_fun(Instructions, Env)];
 %%--------------------------------------------------------------------
+%% New binary matching added in OTP 22.
+%%--------------------------------------------------------------------
+%%--- bs_get_tail ---
+trans_fun([{bs_get_tail=Name,_,_,_}|_Instructions], _Env) ->
+  nyi(Name);
+%%--- bs_start_match3 ---
+trans_fun([{bs_start_match3=Name,_,_,_,_}|_Instructions], _Env) ->
+  nyi(Name);
+%%--- bs_get_position ---
+trans_fun([{bs_get_position=Name,_,_,_}|_Instructions], _Env) ->
+  nyi(Name);
+%%--- bs_set_position ---
+trans_fun([{bs_set_position=Name,_,_}|_Instructions], _Env) ->
+  nyi(Name);
+%%--------------------------------------------------------------------
 %%--- ERROR HANDLING ---
 %%--------------------------------------------------------------------
 trans_fun([X|_], _) ->
@@ -1196,6 +1211,9 @@ trans_fun([X|_], _) ->
 trans_fun([], _) ->
   [].
 
+nyi(Name) ->
+  throw({unimplemented_instruction,Name}).
+
 %%--------------------------------------------------------------------
 %% trans_call and trans_enter generate correct Icode calls/tail-calls,
 %% recognizing explicit fails.
diff --git a/lib/hipe/llvm/Makefile b/lib/hipe/llvm/Makefile
index 817ff67dcd..9f7a2def6d 100644
--- a/lib/hipe/llvm/Makefile
+++ b/lib/hipe/llvm/Makefile
@@ -70,7 +70,10 @@ TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR))
 
 include ../native.mk
 
-ERL_COMPILE_FLAGS += -Werror +inline +warn_export_vars #+warn_missing_spec
+ERL_COMPILE_FLAGS += +inline +warn_export_vars #+warn_missing_spec
+ifneq ($(NATIVE_LIBS_ENABLED),yes)
+ERL_COMPILE_FLAGS += -Werror
+endif
 
 # if in 32 bit backend define BIT32 symbol
 ifneq ($(BITS64),yes)
diff --git a/lib/hipe/main/hipe.erl b/lib/hipe/main/hipe.erl
index 2348e9b1f6..094b7bc508 100644
--- a/lib/hipe/main/hipe.erl
+++ b/lib/hipe/main/hipe.erl
@@ -583,9 +583,8 @@ fix_beam_exports([], Exports) ->
   Exports.
 
 get_beam_icode(Mod, {BeamCode, Exports}, File, Options) ->
-  {ok, Icode} =
-    ?option_time((catch {ok, hipe_beam_to_icode:module(BeamCode, Options)}),
-	         "BEAM-to-Icode", Options),
+  Icode = ?option_time(hipe_beam_to_icode:module(BeamCode, Options),
+                       "BEAM-to-Icode", Options),
   BeamBin = get_beam_code(File),
   {{Mod, Exports, Icode}, BeamBin}.
 
@@ -662,9 +661,12 @@ run_compiler_1(Name, DisasmFun, IcodeFun, Options) ->
 	    {Icode, WholeModule} = IcodeFun(Code, Opts),
 	    CompRes = compile_finish(Icode, WholeModule, Opts),
 	    compiler_return(CompRes, Parent)
-	  catch error:Error:StackTrace ->
+	  catch
+            error:Error:StackTrace ->
 	      print_crash_message(Name, Error, StackTrace),
-	      exit(Error)
+	      exit(Error);
+            throw:{unimplemented_instruction,_Instruction}=Error ->
+              exit(Error)
 	  end
       end),
   Timeout = case proplists:get_value(timeout, Options) of
diff --git a/lib/hipe/rtl/Makefile b/lib/hipe/rtl/Makefile
index becdd0b7d8..0c0f6e24f5 100644
--- a/lib/hipe/rtl/Makefile
+++ b/lib/hipe/rtl/Makefile
@@ -75,7 +75,10 @@ TARGET_FILES= $(MODULES:%=$(EBIN)/%.$(EMULATOR))
 
 include ../native.mk
 
-ERL_COMPILE_FLAGS += -Werror +inline +warn_unused_import +warn_export_vars
+ERL_COMPILE_FLAGS += +inline +warn_unused_import +warn_export_vars
+ifneq ($(NATIVE_LIBS_ENABLED),yes)
+ERL_COMPILE_FLAGS += -Werror
+endif
 
 # ----------------------------------------------------
 # Targets
diff --git a/lib/kernel/src/Makefile b/lib/kernel/src/Makefile
index 43b776f37e..fcb599859b 100644
--- a/lib/kernel/src/Makefile
+++ b/lib/kernel/src/Makefile
@@ -175,8 +175,10 @@ APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
 
 ifeq ($(NATIVE_LIBS_ENABLED),yes)
 ERL_COMPILE_FLAGS += +native
+else
+ERL_COMPILE_FLAGS += -Werror
 endif
-ERL_COMPILE_FLAGS += -I../include -Werror
+ERL_COMPILE_FLAGS += -I../include
 
 # ----------------------------------------------------
 # Targets
diff --git a/lib/stdlib/src/Makefile b/lib/stdlib/src/Makefile
index c95f7637f7..86003c953d 100644
--- a/lib/stdlib/src/Makefile
+++ b/lib/stdlib/src/Makefile
@@ -155,8 +155,10 @@ APPUP_TARGET= $(EBIN)/$(APPUP_FILE)
 
 ifeq ($(NATIVE_LIBS_ENABLED),yes)
 ERL_COMPILE_FLAGS += +native
+else
+ERL_COMPILE_FLAGS += -Werror
 endif
-ERL_COMPILE_FLAGS += -I../include -I../../kernel/include -Werror
+ERL_COMPILE_FLAGS += -I../include -I../../kernel/include
 
 # ----------------------------------------------------
 # Targets
-- 
2.16.4

openSUSE Build Service is sponsored by