aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2016-09-28 20:55:40 +0200
committerSverker Eriksson <[email protected]>2016-10-14 14:29:16 +0200
commite77d7a8417368617c4c228af9556a7f6a8f3e84c (patch)
treeb2c2cf66838e1c8492246ef0321e921e93bced0e /lib
parent966098ceb9dd9d18e9bcd37cd06b96045903e320 (diff)
downloadotp-e77d7a8417368617c4c228af9556a7f6a8f3e84c.tar.gz
otp-e77d7a8417368617c4c228af9556a7f6a8f3e84c.tar.bz2
otp-e77d7a8417368617c4c228af9556a7f6a8f3e84c.zip
erts: Fix early hipe patch loading
by introducing hipe_bifs:commit_patch_load/1 that creates the HipeModule.
Diffstat (limited to 'lib')
-rw-r--r--lib/hipe/cerl/erl_bif_types.erl5
-rw-r--r--lib/kernel/src/hipe_unified_loader.erl4
2 files changed, 7 insertions, 2 deletions
diff --git a/lib/hipe/cerl/erl_bif_types.erl b/lib/hipe/cerl/erl_bif_types.erl
index f53f6d5816..42a038f2d1 100644
--- a/lib/hipe/cerl/erl_bif_types.erl
+++ b/lib/hipe/cerl/erl_bif_types.erl
@@ -1094,6 +1094,9 @@ type(hipe_bifs, remove_refs_from, 1, Xs, Opaques) ->
type(hipe_bifs, set_funinfo_native_address, 3, Xs, Opaques) ->
strict(hipe_bifs, set_funinfo_native_address, 3, Xs,
fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, commit_patch_load, 1, Xs, Opaques) ->
+ strict(hipe_bifs, commit_patch_load, 1, Xs,
+ fun (_) -> t_atom() end, Opaques);
type(hipe_bifs, set_native_address, 3, Xs, Opaques) ->
strict(hipe_bifs, set_native_address, 3, Xs,
fun (_) -> t_nil() end, Opaques);
@@ -2531,6 +2534,8 @@ arg_types(hipe_bifs, remove_refs_from, 1) ->
[t_sup([t_mfa(), t_atom('all')])];
arg_types(hipe_bifs, set_funinfo_native_address, 3) ->
arg_types(hipe_bifs, set_native_address, 3);
+arg_types(hipe_bifs, commit_patch_load, 1) ->
+ [t_binary()];
arg_types(hipe_bifs, set_native_address, 3) ->
[t_mfa(), t_integer(), t_boolean()];
arg_types(hipe_bifs, set_native_address_in_fe, 2) ->
diff --git a/lib/kernel/src/hipe_unified_loader.erl b/lib/kernel/src/hipe_unified_loader.erl
index cde2eb059a..03116758de 100644
--- a/lib/kernel/src/hipe_unified_loader.erl
+++ b/lib/kernel/src/hipe_unified_loader.erl
@@ -225,6 +225,7 @@ load_common(Mod, Bin, Beam, Architecture) ->
lists:foreach(fun({FE, DestAddress}) ->
hipe_bifs:set_native_address_in_fe(FE, DestAddress)
end, erase(closures_to_patch)),
+ ok = hipe_bifs:commit_patch_load(LoaderState),
set_beam_call_traps(FunDefs),
ok;
BeamBinary when is_binary(BeamBinary) ->
@@ -556,7 +557,7 @@ patch_sdesc(?STACK_DESC(SymExnRA, FSize, Arity, Live),
end,
?ASSERT(assert_local_patch(Address)),
MFA = address_to_mfa_lth(Address, FunDefs),
- hipe_bifs:enter_sdesc({Address, ExnRA, FSize, Arity, Live, MFA, get(hipe_patch_closures)},
+ hipe_bifs:enter_sdesc({Address, ExnRA, FSize, Arity, Live, MFA},
get(hipe_loader_state)).
@@ -778,7 +779,6 @@ add_ref(CalleeMFA, Address, FunDefs, RefType, Trampoline, RemoteOrLocal) ->
{M,_,_} = CallerMFA;
remote ->
hipe_bifs:add_ref(CalleeMFA, {CallerMFA,Address,RefType,Trampoline,
- get(hipe_patch_closures),
get(hipe_loader_state)})
end,
ok.