[SAoC 2023] Replace DRuntime Hooks with Templates Weekly Update #2
Teodor Dutu
teodor.dutu at gmail.com
Mon Oct 2 21:08:02 UTC 2023
Hi,
Last week I started working on converting `_d_newarraym{i,}T` to
templates starting from the `_d_newarray{i,}T` implementations
from [my previous PR](https://github.com/dlang/dmd/pull/15299/).
So far I have implemented the new hooks and updated the lowering
but ran into some test failures in the compiler.
Before fixing them, [this
bug](https://issues.dlang.org/show_bug.cgi?id=24159) showed up
and it was caused by my [lackluster lowering to
`_d_arrayappend{T,cTX}`](https://github.com/dlang/dmd/pull/13495). I worked on these hooks some time ago and replaced the `~=` with the call to the hook in the AST itself. This created issues during CTFE as hooks are generally not interpretable because they often call `libc` functions.
The solution that I'm implementing now is to store the lowering
of `~=` in a `lowering` field inside `CatAssignExp`. Then CTFE
can evaluate the original expression and ignore the lowering and
the glue layer can generate its IR from the lowering and not the
`CatAssignExp`. The lowered expression of `arr ~= elem` remains
the same `_d_arrayappendcTX(arr, 1), arr[$ - 1] = elem`.
However, now this is causing a backend error when `arr` is a
function call, say `foo()`. To avoid calling `foo()` twice, I
save its return value to a temporary variable and use that
instead in the `CommaExp` as follows:
```d
foo() ~= elem;
// is lowered to:
_tmp = foo(), _d_arrayappendcTX(_tmp, 1), _tmp[$ - 1] = elem
```
Somehow the backend cannot find the `_tmp` symbol. I am still
investigating this and how moving the lowering to another
expression causes it.
Thanks,
Teodor
More information about the Digitalmars-d
mailing list