Hi Iain,
> My first suspect here would be 'struct UnionExp', see d/dmd/expression.h
>
> Upstream dmd use a poor man's alignment, from what I recall to be
> compatible with the dmc compiler.
>
> // Ensure that the union is suitably aligned.
> real_t for_alignment_only;
>
> What happens if you were to replace that with marking the type as
> __attribute__ ((aligned (8))) ?
thanks for the suggestion: this worked just fine. After a couple more
libphobos adjustments (described below), I was able to finish the build
on both sparc-sun-solaris2.11 and i386-pc-solaris2.11.
The link tests still all fail as before, but sparc and x86 are now on
par here :-)
Here are the new issues I saw while completing the sparc build:
* math.d has two problems on 32-bit sparc:
/vol/gcc/src/hg/trunk/local/libphobos/src/std/math.d:5278:18: error: undefined
identifier 'ControlState'
5278 | ControlState savedState;
| ^
/vol/gcc/src/hg/trunk/local/libphobos/src/std/math.d:5325:25: error: undefined
identifier 'ControlState'
5325 | static ControlState getControlState() @trusted nothrow @nogc
| ^
/vol/gcc/src/hg/trunk/local/libphobos/src/std/math.d:5390:17: error: undefined
identifier 'ControlState'
5390 | static void setControlState(ControlState newState) @trusted nothrow
@nogc
| ^
Fixed by using the ControlState alias on both SPARC64 and SPARC.
/vol/gcc/src/hg/trunk/local/libphobos/src/std/math.d:5211:9: error: static
assert "Not implemented for this architecture"
5211 | static assert(false, "Not implemented for this architecture");
| ^
Similarly, ExceptionMask was only defined for SPARC64. However,
looking closer it seems that the current definition only matches Linux
resp. Glibc fenv.h (FE_*). The Solaris values are different on sparc.
This seems to be a recurring theme, unfortunately: definitions guarded
by version ($CPU) are really CRuntime_Glibc && $CPU. I fear libphobos
has to be way more careful to distinguish between definitions that
only depend on the target cpu and those that are (also) OS-dependent.
Instead of hardcoding all this, it may be worth having a look at how
Go handles this: they dump the definitions with gcc
-fdump-go-spec=tmp-gen-sysinfo.go and postprocess them in
libgo/mksysinfo.sh. This way, such errors and potential
inconsistencies are avoided from the start. This would also massivly
simplify work for potential porters.
* My previous patch had a typo, now also fixed:
/vol/gcc/src/hg/trunk/local/libphobos/libdruntime/core/sys/posix/ucontext.d:984:20:
error: undefined identifier 'uint32_t'
984 | uint32_t[32] fpu_regs;
| ^
While those were enough to finish the build, I noticed a couple of
additional issues:
* During make check, part (or all) of libphobos was rebuilt. I strongly
suspect that this happens because contrib/gcc_update doesn't handle
libphobos yet: it needs to touch generated files to avoid exactly this
sort of problem. I'll post a separate patch once tested.
* Unlike the gdc.dg tests, many gdc.test tests appear as UNRESOLVED like
this:
UNRESOLVED: runnable/A16.d compilation failed to produce executable
There's no preceding FAIL for the link failure itself. Besides, the
testname needs to include the gdc.test prefix.
* One issue I forgot last time: when defining the SPARC64 struct
fpregset_t in libdruntime/core/sys/posix/ucontext.d, one field
couldn't be represented: the structure contains a union
union fpu_fr
{
uint[32] fpu_regs;
double[32] fpu_dregs;
/* long double[16] fpu_qregs; */
but there's no D type corresponding to long double: the D real type
represents the biggest floating-point type implemented in hardware,
and AFAIK no SPARC CPU ever implemented 128-bit floating point.
Still, with this missing the alignment of the union is wrong.
Rainer
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University