gdc master is broken for arm cross-compilers
Johannes Pfau via D.gnu
d.gnu at puremagic.com
Tue Jun 16 13:05:44 PDT 2015
Am Thu, 11 Jun 2015 22:30:39 +0200
schrieb "Iain Buclaw via D.gnu" <d.gnu at puremagic.com>:
> On 11 June 2015 at 20:27, Johannes Pfau via D.gnu
> <d.gnu at puremagic.com> wrote:
>
> > Some recent change in GDC broke ARM cross compiler builds. Same
> > error with gcc-5.1 and gcc-4.9:
> >
> > https://gist.github.com/jpf91/1de81d6ff55587d702ae
> >
> > I'm not sure if this only happens for ARM cross compilers or for all
> > cross compilers. But it doesn't seem to happen with native builds
> > (or maybe it's target specific and it doesn't happen for x86
> > builds).
> >
> >
> > Iain, any clue what could cause this? Otherwise I'll have to debug
> > this later on.
> >
>
> The comment above says:
>
> If the DECL isn't in memory, then the DECL wasn't properly
> marked TREE_ADDRESSABLE, which will be either a front-end
> or a tree optimizer bug.
>
> Peek returns a ubyte[4] - so my initial guess would be the recent NRVO
> change. Perhaps it wasn't quite as bullet-proof as I hoped.
>
Small update: It's indeed the NRVO changes, reduced test case:
------------------
private union EndianSwapper
{
uint value;
ubyte[4] array;
}
struct CRC32
{
public:
@trusted pure nothrow finish()
{
auto tmp = peek();
return tmp;
}
@trusted pure nothrow peek()
{
EndianSwapper es;
es.value = 0;
return es.array;
}
}
------------------
Only happens with certain optimizations (-O or higher). Using -O
-fno-tree-sra or -O -tree-no-inline hides the problem.
Tree dump before crash:
------------------
finish (struct CRC32 & this)
{
union EndianSwapper es.0;
<bb 2>:
es.0 ={v} {CLOBBER};
MEM[(ubyte[4] *)&<retval>] = 0;
return <retval>;
}
More information about the D.gnu
mailing list