Comment # 1 on bug 215 from
OK, found the problem:

We should never set DECL_OFFSET_ALIGN to 0. The backend divides by
DECL_OFFSET_ALIGN. If it divides by zero the result is a null tree which will
then likely lead to a segfault.

In types.cc(visit(TypeStruct *t)) we set TYPE_SIZE, TYPE_ALIGN etc. But for the
union in the test case 'structsize' and 'alignsize' are 0. This is probably
because of the string mixin in the union? I guess setting TYPE_SIZE and
TYPE_ALIGN to 0 could not cause other issues as well.

Anyway, we then have a struct with this union as a field. For this struct we
call layout_aggregate_type which calls layout_aggregate_members,
layout_aggregate_members again and finally insert_aggregate_field. There we set
DECL_OFFSET_ALIGN to 0:

SET_DECL_OFFSET_ALIGN (field, TYPE_ALIGN (TREE_TYPE (field)));

Always fascinating how such issues only show up on some architectures. It's
clearly not architecture specific code, it just seems to be different
optimizations can completely hide such problems.



@Iain would be great if you could have a look at this. Once this is fixed we'll
have master/ updated gdc-5 working 100% on ARM again.

-----------------------------------------------------------------
 <field_decl 0x769baf00 D.3859
    type <union_type 0x769bade0 ._1 type_1 BLK
        size <integer_cst 0x7686b240 constant 0>
        unit size <integer_cst 0x7686b1e0 constant 0>
        align 0 symtab 0 alias set -1 canonical type 0x769bade0
        fields <field_decl 0x769baea0 y type <pointer_type 0x76876a20>
            unsigned SI file ../../test.d line 5 col 7
            size <integer_cst 0x7686b1b0 constant 32>
            unit size <integer_cst 0x7686b1c8 constant 4>
            align 32 offset_align 32 offset <integer_cst 0x7686b1e0 0> bit
offset <integer_cst 0x7686b240 0> context <union_type 0x769bade0 ._1>> context
<record_type 0x769bac00>
        chain <type_decl 0x769bae40 ._1>>
    VOID file (null) line 0 col 0
    align 1 offset_align 0 context <record_type 0x769bac00>>
-----------------------------------------------------------------


-----------------------------------------------------------------
#0  insert_aggregate_field (loc=..., type=0x769bac00, field=0x769baf00,
offset=4)
    at ../../gcc-5.3.0/gcc/d/d-codegen.cc:4483
#1  0x002ccaa4 in layout_aggregate_members (members=0x7683ec38,
context=0x769bac00, inherited_p=false)
    at ../../gcc-5.3.0/gcc/d/d-codegen.cc:4374
#2  0x002ccbcc in layout_aggregate_members (members=0x7676e918,
context=0x769bac00, inherited_p=false)
    at ../../gcc-5.3.0/gcc/d/d-codegen.cc:4397
#3  0x002ccf2c in layout_aggregate_type (decl=0x7676e7b8, type=0x769bac00,
base=0x7676e7b8)
    at ../../gcc-5.3.0/gcc/d/d-codegen.cc:4447
#4  0x002fb548 in TypeVisitor::visit (this=<optimized out>, t=0x7676e8c8)
    at ../../gcc-5.3.0/gcc/d/types.cc:262
#5  0x002fb11c in build_ctype (t=0x7676e8c8) at
../../gcc-5.3.0/gcc/d/types.cc:498
#6  0x002ba89c in AggregateDeclaration::toInitializer
(this=this@entry=0x7676e7b8)
    at ../../gcc-5.3.0/gcc/d/d-decls.cc:718
#7  0x002d3894 in StructDeclaration::toObjFile (this=0x7676e7b8) at
../../gcc-5.3.0/gcc/d/d-objfile.cc:238
#8  0x002d8668 in Module::genobjfile (this=this@entry=0x7676e218) at
../../gcc-5.3.0/gcc/d/d-objfile.cc:1424
#9  0x002b8288 in d_parse_file () at ../../gcc-5.3.0/gcc/d/d-lang.cc:1214
#10 0x00772c34 in compile_file () at ../../gcc-5.3.0/gcc/toplev.c:594
#11 0x0019e148 in do_compile () at ../../gcc-5.3.0/gcc/toplev.c:2067
#12 toplev::main (this=this@entry=0x7efff284, argc=0, argc@entry=13,
argv=0x7efff5b8, argv@entry=0x7efff3f4)
    at ../../gcc-5.3.0/gcc/toplev.c:2165
#13 0x0019ed68 in main (argc=13, argv=0x7efff3f4) at
../../gcc-5.3.0/gcc/main.c:39
-----------------------------------------------------------------


You are receiving this mail because: