This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug d/88462] All D execution tests FAIL on Solaris/SPARC
- From: "ibuclaw at gdcproject dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 13 Dec 2018 23:31:56 +0000
- Subject: [Bug d/88462] All D execution tests FAIL on Solaris/SPARC
- Auto-submitted: auto-generated
- References: <bug-88462-4@http.gcc.gnu.org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88462
--- Comment #8 from Iain Buclaw <ibuclaw at gdcproject dot org> ---
(In reply to ro@CeBiTec.Uni-Bielefeld.DE from comment #7)
> > --- Comment #6 from Iain Buclaw <ibuclaw at gdcproject dot org> ---
> >> 8, but that let the constructor already fail the first time through
> >> where _d_arraycopy checks that the right amount of data is copied:
> >>
> >> _d_arraycopy -> rt.util.array.enforceRawArraysConformable ->
> >> rt.util.array._enforceSameLength
> >
> > What you're doing rounding up the array size is correct. The bit you're
> > missing is fixing up the slice assignment as well.
> >
> > lock[0 .. __traits(classInstanceSize, Mutex)] = typeid(Mutex).initializer[];
>
> That got me over this issue indeed, thanks.
>
> However, I now hit the next issue: a SIGBUS (which gdb incorrectly
> reports as SIGSEGV) due to an alignement issue:
>
> Thread 2 received signal SIGSEGV, Segmentation fault.
> [Switching to Thread 1 (LWP 1)]
> 0x0007c970 in object.ModuleInfo.flags() const (this=...)
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/object.d:1541
> 1541 @property uint flags() nothrow pure @nogc { return _flags; }
> (gdb) where
> #0 0x0007c970 in object.ModuleInfo.flags() const (this=...)
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/object.d:1541
> #1 0x0007d118 in object.ModuleInfo.importedModules() const (this=...)
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/object.d:1580
> #2 0x0008ed74 in rt.minfo.ModuleGroup.sortCtors(immutable(char)[])
> (this=...,
> cycleHandling=...)
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/minfo.d:259
> #3 0x00091110 in rt.minfo.ModuleGroup.sortCtors() (this=...)
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/minfo.d:533
> #4 0x00092d24 in __foreachbody1 (this=0x0, sg=...)
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/minfo.d:795
> #5 0x00097a08 in rt.sections_elf_shared.DSO.opApply(scope int(ref
> rt.sections_elf_shared.DSO) delegate) (dg=...)
> at
> /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/sections_elf_shared.d:
> 68
> #6 0x00092ce8 in rt_moduleCtor ()
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/minfo.d:793
> #7 0x00085dbc in rt_init ()
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/dmain2.d:190
> #8 0x000867e8 in runAll (this=0xffbfe78c)
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/dmain2.d:485
> #9 0x00086740 in tryExec (this=0xffbfe78c, dg=...)
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/dmain2.d:461
> #10 0x0008664c in _d_run_main (argc=1, argv=0xffbfe8bc,
> mainFunc=0x6c164 <D main>)
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/rt/dmain2.d:494
> #11 0x0006b7e4 in main (argc=1, argv=0xffbfe8bc)
> at /vol/gcc/src/hg/trunk/solaris/libphobos/libdruntime/__entrypoint.di:44
> #12 0x0006b5d4 in _start ()
> Backtrace stopped: previous frame identical to this frame (corrupt stack?)
> (gdb) p this
> $5 = (const object.ModuleInfo &) @0x12ab33: {_flags = 4100, _index = 0}
> (gdb) x/i $pc
> => 0x7c970 <_D6object10ModuleInfo5flagsMxFNaNbNdNiZk+152>:
> ld [ %g1 ], %g1
> (gdb) p/x $g1
> $6 = 0x12ab33
>
> Trying to load 32 bits from a non-4 byte aligned pointer is a no-no on a
> strict-alignment target like sparc...
I saw that on HPPA as well when testing under QEMU.
ModuleInfo is a variably-sized packed struct - what is in the variable part is
determined by the value of _flags.
This is compiler generated, so I'll have a look into giving it proper alignment
on the compiler side.