[SAoC 2023] Replace DRuntime Hooks with Templates Weekly Update #8
Teodor Dutu
teodor.dutu at gmail.com
Thu Nov 16 00:21:29 UTC 2023
Hi,
Last week I fixed [this
bug](https://issues.dlang.org/show_bug.cgi?id=24159) introduced
by `_d_arrayappendcTX`. The fix meant first storing the lowering
to a new field inside `CatAssignExp` instead of modifying the
original array.
This in turn caused `vthis`s for some functions because of the
inliner. The solution was to [inline the
lowering](https://github.com/teodutu/dmd/blob/71518bee8b2779a9cd6064537470582dae4c29c1/compiler/src/dmd/optimize.d#L931-L937) when present.
After this, I ran into a familiar error: the lowering needs no
codegen at CTFE. In fact, the lowering shouldn't even be
introduced during semantic if the `CatAssignExp` is only needed
at CTFE. However, this problem is familiar because I ran into it
in the past. The same restrictions hold for `CatExp`s, but
because telling if an expression needs codegen or not is a mess
during semantic, I couldn't figure out when not to perform the
lowering to `_d_arraycatnTX`. The solution in both cases was to
handle this case during IR generation. Therefore, unfortunately,
both lowerings are made even in some situations when they're not
required and then `e2ir.d` checks of using the GC is enabled. If
not, [it outputs an
error](https://github.com/dlang/dmd/blob/3d552df287d0b836861f760701b16569311e4dd7/compiler/src/dmd/e2ir.d#L2796-L2802). I'd love to do this more nicely in the future and I'm looking for advice on how to figure out when to not generate lowerings during semantic analysis. If you have any advice on the topic, please let me know.
Furthermore, I'm almost done converting `_d_newarray{mTX, miTX,
Op}` to a single template. I created [this draft
PR](https://github.com/dlang/dmd/pull/15819) with my changes. I
still need to fix some final tests in dmd and Phobos before
turning it into a legit PR. I need to say that the previous
implementations of `_d_newarraym{,i}TX` were really messy because
they called `_d_newarrayOp` with a funcion argument with which to
initialise the arrays (one of `_d_newarray{,i}T`). But now that
[I've converted these 2 to a single
template](https://github.com/dlang/dmd/pull/15299) as well, I was
able to coalesce all hooks for multi-dimensional arrays into a
single one much more smoothly.
Thanks,
Teodor
More information about the Digitalmars-d
mailing list