[GDC] Evaluation order: Please update the dmd backend

Kenji Hara via Digitalmars-d digitalmars-d at puremagic.com
Wed Oct 1 07:39:40 PDT 2014


Now I'm working to fix issue 6620

https://issues.dlang.org/show_bug.cgi?id=6620
https://github.com/D-Programming-Language/dmd/pull/4035

Kenji Hara

2014-04-01 20:49 GMT+09:00 Johannes Pfau <nospam at example.com>:

> I started fixing GDC bug #8 (*) which is basically that array op
> evaluation order currently depends on the target architecture. Consider
> this example:
> a()[] = b()[] + c()[];
> The order in which c,a,b are called is currently architecture specific.
> As stated in that bug report by Andrei we want this to evaluate LTR, so
> a() first, then b(), then c().
>
> These operations are actually rewritten to calls to extern(C)
> functions. Arguments to C function should be evaluated LTR as well, but
> dmd currently evaluates them RTL (GDC: architecture dependent). In order
> to fix the array op bug in gdc we have to define the evaluation order
> for extern(C) function parameters.
>
> So I've changed extern(C) functions to evaluate LTR in GDC and then had
> to change the array op code, cause that assumed extern(C) function
> evaluate RTL. Now I'd like to push these array op changes into dmd as we
> want to keep as few gdc specific changes as possible and dmd (and ldc)
> will need these changes anyway as soon as they implement extern(C)
> functions as LTR. This is required by dmd issue #6620 (**) and the
> language spec (***).
>
> However, if we apply only these changes the array op order reverses for
> DMD as it evaluates extern(C) function arguments RTL.
>
> So I need someone with dmd backend knowledge to fix the evaluation
> order of extern(C) function parameters to be LTR.
> Evaluation order of assignments should also be fixed to be LTR in the
> dmd backend. Although not strictly required for the array op changes
> it'd be inconsistent to have array op assignments execute LTR but
> normal assignments RTL:
> a()[] = b()[] + c()[]; //Array op assignment
> a() = b() + c();       //Normal assignment
>  |      |    |
>  1      2    3
>
> The frontend changes for dmd are here:
> https://github.com/jpf91/dmd/tree/fixOrder
> Frontend:
>
> https://github.com/jpf91/dmd/commit/5d61b812977dbdc1f99100e2fbaf1f45e9d25b03
> Test cases:
>
> https://github.com/jpf91/dmd/commit/82bffe0862b272f02c27cc428b22a7dd113b4a07
>
> Druntime changes (need to be applied at the same time as dmd changes)
> https://github.com/jpf91/druntime/tree/fixOrder
>
> https://github.com/jpf91/druntime/commit/f3f6f49c595d4fb25fb298e435ad1874abac516d
>
>
> (*)   http://bugzilla.gdcproject.org/show_bug.cgi?id=8
> (**)  https://d.puremagic.com/issues/show_bug.cgi?id=6620
> (***) https://github.com/D-Programming-Language/dlang.org/pull/6
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20141001/189cc8d1/attachment.html>


More information about the Digitalmars-d mailing list