[SAoC 2022] Replace druntime Hooks with Templates: Milestone 3, Week 3

Teodor Dutu teodor.dutu at gmail.com
Mon Dec 5 22:23:32 UTC 2022


Hi,

This week my mentors and I came up with a new lowering logic for 
`_d_newitemT`.
We were having trouble initialising the context pointer for 
nested structs. The lowering has to perform 3 or 4 steps:

1. call `_d_newitemT`
1. initialise the `struct` (either with 0 or using the default 
initialiser)
1. (if the struct is nested) copy the context pointer
1. call the struct's ctor

Step #3 is difficult to perform in the frontend as it does not 
have any information about the stack. The old lowering did not 
have this problem because it took place in the glue layer, where 
there is specific machinery for finding and setting the right 
context pointer.

Therefore, our solution was to split the lowering between 
semantic analysis and the glue layer. Step 2 will be handled by 
the runtime hook itself, by calling 
[`emplaceInitializer`](https://github.com/dlang/dmd/blob/06295374255a31fa167de781bddcf70034e95e0e/druntime/src/core/internal/lifetime.d#L92). Now only step 1 takes place in the frontend, while steps 3 and 4 are still performed by the glue layer. Additionally, according to the feedback we received from [Johan](https://forum.dlang.org/post/wrtfsjheteinguxmfprv@forum.dlang.org), [Iain and Dennis](https://github.com/dlang/dmd/pull/14550#discussion_r1034661632), I have also kept the original expression from the frontend, instead of replacing it altogether with its lowering. This adds at least 2 benefits:

- not having to handle the call to `_d_newitemT` separately 
during CTFE
- leveraging some optimisations in LDC and GDC that [Iain pointed 
out](https://forum.dlang.org/post/lncqlesvnjjtxxlydxbw@forum.dlang.org)

I created [this PR](https://github.com/dlang/dmd/pull/14664/) 
that encompasses all of the insights above. This week I plan on 
getting the last failing test working and have it merged. One of 
the failing tests was due to [this 
bug](https://issues.dlang.org/show_bug.cgi?id=23534) which has 
already been fixed. I will follow the same logic for 
`_d_newclass` and `_d_newarray*`.

I also fixed the final bugs with 
[`_d_arraycatnTX`](https://github.com/dlang/dmd/pull/14550). 
However, moving the lowering to a new field in the `CatExp` class 
currently causes a bug in the compiler's backend that I am 
currently trying to fix.

Thanks,
Teodor



More information about the Digitalmars-d mailing list