[erlang-questions] Hipe and memory alignment (Yikes! erts_alloc() returned misaligned address)

Paul Guyot pguyot@REDACTED
Wed Aug 4 23:50:53 CEST 2010


Le 4 août 2010 à 23:19, Mikael Pettersson a écrit :

> Now, it is possible that the alignment is wrong, esp. if the data
> segment for whatever reason turns out to be tiny.  Please rebuild
> the erlang VM with the following patch and do what you normally do
> to trigger the Yikes! message.  It should tell us a little bit more
> about the allocation parameters.
> 
> FWIW, I've never heard of anyone being able to trigger this warning
> before.

Mikael,

Thank you for your quick reply.
I just invoke erl on FreeBSD 8.0 GENERIC running on amd64 with erlang configured with --enable-native-libs.

Apprently, it's quite common with FreeBSD:
http://www.erlang.org/cgi-bin/ezmlm-cgi/4/41055
http://www.erlang.org/cgi-bin/ezmlm-cgi/4/41237

Your patch reveals that the hipe loader tries to allocate 0 byte, which FreeBSD optimizes by giving only 2 bytes (where MacOS X 10.6 gives 16).

> ./bin/erl
Yikes! erts_alloc() returned 0x80169917e for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169917c for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169917a for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699176 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699174 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699172 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169916e for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169916c for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169916a for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699166 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699164 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699162 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169915e for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169915c for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169915a for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699156 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699154 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699152 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169914e for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169914c for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169914a for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699146 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699144 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699142 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169913e for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169913c for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169913a for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699136 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699134 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699132 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169912e for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169912c for align 8 nrbytes 0
Erlang R14A (erts-5.8) [source] [64-bit] [smp:8:8] [rq:8] [async-threads:0] [hipe] [kernel-poll:false]

Yikes! erts_alloc() returned 0x80169912a for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699126 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699124 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x801699122 for align 8 nrbytes 0
Yikes! erts_alloc() returned 0x80169911e for align 8 nrbytes 0
Eshell V5.8  (abort with ^G)
Yikes! erts_alloc() returned 0x80169911c for align 8 nrbytes 0
1> 


Avoiding the allocation when data size is 0 (which means there are only terms in the constants map, I guess), just removes the warning.

Paul

diff --git a/lib/kernel/src/hipe_unified_loader.erl b/lib/kernel/src/hipe_unified_loader.erl
index f289b81..d7747f6 100644
--- a/lib/kernel/src/hipe_unified_loader.erl
+++ b/lib/kernel/src/hipe_unified_loader.erl
@@ -654,7 +654,10 @@ bif_address(Name) when is_atom(Name) ->
 %%
 create_data_segment(DataAlign, DataSize, DataList) ->
   %%io:format("create_data_segment: \nDataAlign: ~p\nDataSize: ~p\nDataList: ~p\n",[DataAlign,DataSize,DataList]),
-  DataAddress = hipe_bifs:alloc_data(DataAlign, DataSize),
+  DataAddress = case DataSize of
+    0 -> 0;
+    _ -> hipe_bifs:alloc_data(DataAlign, DataSize)
+  end,
   enter_data(DataList, [], DataAddress, DataSize).
 
 enter_data(List, ConstMap2, DataAddress, DataSize) ->




More information about the erlang-questions mailing list