Strange error in DGC for Arm (2.0.59 with gcc 4.7.2)

Johannes Pfau nospam at example.com
Fri Aug 23 00:46:13 PDT 2013


Am Wed, 07 Aug 2013 00:05:35 +0200
schrieb "Timofei Bolshakov" <tbolsh at gmail.com>:

> Hello!
> 
> I got strange problem.
> When I am trying to send a message containing a struct of size 30 
> I am getting a strange exception:
> 
> core.exception.AssertError@/home/tbolshakov/x-tools/arm-unknown-linux-gnueabi-gdc/lib/gcc/arm-unknown-linux-gnueabi/4.7.2/include/d/std/variant.d(280): 
> target must be non-null
> 
> The code looks like:
> //         enum ove the byte     string     string                
>      uint ushort    struct
> send( tid, MessageTag.SPTRecord, gwmac_str, 
> mac2HexString(t[0].idup), utc, ms, aStruct );
> 
> Does anybody have an idea why? Does anybody have an idea hw to 
> fix it?
> 
> I have DGC version 2.0.59 made with gcc 4.7.2 (crosstool-ng 
> 1.18.0).

There are bugs in std.variant on ARM.

But in this case it might have a different cause: std.concurrency
stores data in a Variant (see std.variant). A variant can only store
things with a maximum size of creal.sizeof. On x86 creal is a pair of 2
reals, so 12/16bytes + alignment = 32 bytes.

On ARM real == double = 8 bytes, so creal.sizeof is 16 bytes. So the
max size of a struct which can be stored in a Variant is 16 on ARM.
This is basically a problem in Variant's design, it's not really meant
to support struct types. It's for basic types only. This is why
VariantN exists where you can define your own max size. But you can't
access that functionality through std.concurrency.

I'd say file a bug report on std.concurrency that big structs are not
supported and mention the issue that on non-x86 the max size is 16 byte
only.


More information about the D.gnu mailing list