gdc or ldc for faster programs?

Siarhei Siamashka siarhei.siamashka at gmail.com
Fri Jan 28 22:31:29 UTC 2022


On Friday, 28 January 2022 at 18:02:27 UTC, Iain Buclaw wrote:
> For example, druntime depends on this behaviour.
>
> Template: 
> https://github.com/dlang/druntime/blob/a0ad8c42c15942faeeafb016e81a360113ae1b6b/src/rt/config.d#L46-L58

Ouch. From where I stand, this looks like some really ugly hack 
abusing both the template keyword and mangle pragma. Presumably 
intended to implement this part of the spec: 
https://dlang.org/library/rt/config.html

Moreover, these are even global variables rather than functions. 
Wouldn't it make more sense to use a special "weak" attribute for 
this particular use case? I see that there was a related 
discussion here: 
https://forum.dlang.org/post/rgmp5d$198g$1@digitalmars.com

> Regular symbol: 
> https://github.com/dlang/druntime/blob/a17bb23b418405e1ce8e4a317651039758013f39/test/config/src/test19433.d#L1
>
> If we can rely on instantiated symbols to not violate ODR, then 
> you would be able to put symbols in the .link-once section.  
> However all duplicates must also be in the .link-once section, 
> else you'll get duplicate definition errors.

Duplicate definition errors are surely better than something 
fishy silently happening under the hood. They can be solved 
when/if we encounter them. That said, I can confirm that GDC 10 
indeed fails with `multiple definition of 'rt_cmdline_enabled'` 
linker error when trying to compile:

```D
extern(C) __gshared bool rt_cmdline_enabled = false;
void main() { }
```

But can't GDC just use something like this in `rt/config.d` to 
solve the problem?
```D
version(GNU) {
     import gcc.attribute;
     pragma(mangle, "rt_envvars_enabled") @attribute("weak") 
__gshared bool rt_envvars_enabled_ = false;
     pragma(mangle, "rt_cmdline_enabled") @attribute("weak") 
__gshared bool rt_cmdline_enabled_ = true;
     pragma(mangle, "rt_options") @attribute("weak") __gshared 
string[] rt_options_ = [];
     bool rt_envvars_enabled()() { return rt_envvars_enabled_; }
     bool rt_cmdline_enabled()() { return rt_cmdline_enabled_; }
     bool rt_options()() { return rt_options_; }
} else {
     // put each variable in its own COMDAT by making them 
template instances
     template rt_envvars_enabled()
     {
         pragma(mangle, "rt_envvars_enabled") __gshared bool 
rt_envvars_enabled = false;
     }
     template rt_cmdline_enabled()
     {
         pragma(mangle, "rt_cmdline_enabled") __gshared bool 
rt_cmdline_enabled = true;
     }
     template rt_options()
     {
         pragma(mangle, "rt_options") __gshared string[] 
rt_options = [];
     }
}
```


More information about the Digitalmars-d-learn mailing list