File 0045-erts-Add-notsup-error-for-load_nif-2-from-hipe-code.patch of Package erlang

From 24485c421f15b00d0b5c97633d701373b53897a5 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Tue, 1 Nov 2016 11:40:48 +0100
Subject: [PATCH] erts: Add notsup error for load_nif/2 from hipe code

---
 erts/doc/src/erlang.xml                             |  4 ++++
 erts/emulator/beam/erl_nif.c                        |  6 ++++++
 erts/emulator/test/nif_SUITE.erl                    | 18 ++++++++++++++++++
 erts/emulator/test/nif_SUITE_data/hipe_compiled.erl |  6 ++++++
 4 files changed, 34 insertions(+)
 create mode 100644 erts/emulator/test/nif_SUITE_data/hipe_compiled.erl

diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml
index 3d1775e..a7ac77d 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -2618,6 +2618,10 @@ os_prompt%</pre>
             code of a module that has been upgraded; this is not
             allowed.
           </item>
+	  <tag><c>notsup</c></tag>
+          <item>Lack of support. Such as loading NIF library for a
+	    HiPE compiled module.
+	  </item>
         </taglist>
       </desc>
     </func>
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c
index c5606f7..9872a3a 100644
--- a/erts/emulator/beam/erl_nif.c
+++ b/erts/emulator/beam/erl_nif.c
@@ -3166,6 +3166,12 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2)
     struct erl_module_instance* this_mi;
     struct erl_module_instance* prev_mi;
 
+    if (BIF_P->flags & F_HIPE_MODE) {
+	ret = load_nif_error(BIF_P, "notsup", "Calling load_nif from HiPE compiled "
+			     "modules not supported");
+	BIF_RET(ret);
+    }
+
     encoding = erts_get_native_filename_encoding();
     if (encoding == ERL_FILENAME_WIN_WCHAR) {
         /* Do not convert the lib name to utf-16le yet, do that in win32 specific code */
diff --git a/erts/emulator/test/nif_SUITE.erl b/erts/emulator/test/nif_SUITE.erl
index 306f209..3a76ee6 100644
--- a/erts/emulator/test/nif_SUITE.erl
+++ b/erts/emulator/test/nif_SUITE.erl
@@ -30,6 +30,7 @@
 	 init_per_testcase/2, end_per_testcase/2,
          basic/1, reload/1, upgrade/1, heap_frag/1,
          t_on_load/1,
+         hipe/1,
 	 types/1, many_args/1, binaries/1, get_string/1, get_atom/1,
 	 maps/1,
 	 api_macros/1,
@@ -70,6 +71,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}].
 all() -> 
     [basic, reload, upgrade, heap_frag, types, many_args,
      t_on_load,
+     hipe,
      binaries, get_string, get_atom, maps, api_macros, from_array,
      iolist_as_binary, resource, resource_binary,
      resource_takeover, threading, send, send2, send3,
@@ -88,6 +90,11 @@ all() ->
 init_per_testcase(t_on_load, Config) ->
     ets:new(nif_SUITE, [named_table]),
     Config;
+init_per_testcase(hipe, Config) ->
+    case erlang:system_info(hipe_architecture) of
+	undefined -> {skip, "HiPE is disabled"};
+	_ -> Config
+    end;
 init_per_testcase(_Case, Config) ->
     Config.
 
@@ -411,6 +418,17 @@ t_on_load(Config) when is_list(Config) ->
     verify_tmpmem(TmpMem),
     ok.
 
+hipe(Config) when is_list(Config) ->
+    Data = proplists:get_value(data_dir, Config),
+    Priv = proplists:get_value(priv_dir, Config),
+    Src = filename:join(Data, "hipe_compiled"),
+    {ok,hipe_compiled} = c:c(Src, [{outdir,Priv},native]),
+    true = code:is_module_native(hipe_compiled),
+    {error, {notsup,_}} = hipe_compiled:try_load_nif(),
+    true = code:delete(hipe_compiled),
+    false = code:purge(hipe_compiled),
+    ok.
+
 
 %% Test NIF building heap fragments
 heap_frag(Config) when is_list(Config) ->    
diff --git a/erts/emulator/test/nif_SUITE_data/hipe_compiled.erl b/erts/emulator/test/nif_SUITE_data/hipe_compiled.erl
new file mode 100644
index 0000000..84ddbc8
--- /dev/null
+++ b/erts/emulator/test/nif_SUITE_data/hipe_compiled.erl
@@ -0,0 +1,6 @@
+-module(hipe_compiled).
+
+-export([try_load_nif/0]).
+
+try_load_nif() ->
+    erlang:load_nif("doesn't matter", 0).
-- 
2.10.2

openSUSE Build Service is sponsored by