How can we make it easier to experiment with the compiler?

Iain Buclaw ibuclaw at gdcproject.org
Mon May 24 22:48:36 UTC 2021


On Monday, 24 May 2021 at 22:18:35 UTC, Walter Bright wrote:
> On 5/24/2021 3:51 AM, Iain Buclaw wrote:
>> For instance, how else would we be able to infer 
>> `isReturnOnStack` without a `TypeFunction`?
> Challenge accepted!
>
> Let's see. The only things the TypeFunction for are:
>
> 1. the return type
> 2. the function linkage
> 3. if the function returns a ref
>
> Pass those in instead, and the need for TypeFunction goes away.
>

I still see a Type though. :-)

On my side, in pseudo-code this would become:

```
   tree type = build_gcc_type (return_type);
   if (isref)
     type = build_reference_type (type);
   return targetm.calls.return_in_memory (type);
```

Or alternatively, I could just abandon all accuracy and go with:

```
   return (return_type.ty == Tstruct || return_type.ty == Tsarray) 
&& !isref;
```

Because I know that this function doesn't affect the code 
generator, though users won't be able to reliably do 
introspection.

>
> Notice how isReturnOnStack depends on several random global 
> variables like os, is64bit, and isPOSIX. They can be passed in 
> as arguments, too (or passed in as a const ref to a struct 
> containing those as members).
>

They have been moved to the internal state of Target, so no 
longer random globals.

Information such as the target OS or CPU should not be floating 
around the front-end.  It should all be constrained to either the 
dmd.target interface or dmd.backend, leaving the front-end to 
only handle matters relating to language semantics.

> isReturnOnStack() then becomes a pure function! (and safe, 
> nogc, nothrow, all that good stuff)
>
> Those initialize() functions go away, too.
>
> The beauty now becomes that we can (at last!) easily and 
> correctly write unittests for it. target.d now becomes 
> INDEPENDENT of the rest of the compiler.
>
> How sweet it will be!

I think target.d could instead benefit from breaking out into 
per-backend modules though, such as target_linux.d, 
target_freebsd.d, target_x86.d, target_x86_64.d, ... to separate 
out concerns of the OS with concerns of the CPU.  It would be 
something completely dmd-specific though, as I don't use/re-use 
any part of what's present in dmd's source tree around this 
module.


More information about the Digitalmars-d mailing list