Thread overview
Weird DMD codegen issue
Nov 04, 2021
Stanislav Blinov
Nov 04, 2021
Temtaime
Nov 04, 2021
user1234
Nov 04, 2021
max haughton
Nov 05, 2021
Stanislav Blinov
November 04, 2021

So I have a function:

auto foo(C, K)(Strukt1* s, Strukt2 a, uint b, scope C c, scope K k, out Strukt3 r)
{ /* ... */ }

Where return type is Strukt4. dmd borks the first argument on call (at least on Linux). Workarounds so far I found:

  1. adding extern(C)
  2. reducing number of parameters - five is fine, as soon as I add the sixth or more - it breaks (but not with extern(C)).

Problem is, I tried reproducing it outside of codebase, with no success :( Does that sound familiar to anyone? Maybe there's already a report about this on bugzilla? Any pointers on tracking this down?

November 04, 2021

On Thursday, 4 November 2021 at 16:32:54 UTC, Stanislav Blinov wrote:

>

So I have a function:

auto foo(C, K)(Strukt1* s, Strukt2 a, uint b, scope C c, scope K k, out Strukt3 r)
{ /* ... */ }

Where return type is Strukt4. dmd borks the first argument on call (at least on Linux). Workarounds so far I found:

  1. adding extern(C)
  2. reducing number of parameters - five is fine, as soon as I add the sixth or more - it breaks (but not with extern(C)).

Problem is, I tried reproducing it outside of codebase, with no success :( Does that sound familiar to anyone? Maybe there's already a report about this on bugzilla? Any pointers on tracking this down?

Just don't use dmd, go with ldc

November 04, 2021

On Thursday, 4 November 2021 at 16:32:54 UTC, Stanislav Blinov wrote:

>

So I have a function:

auto foo(C, K)(Strukt1* s, Strukt2 a, uint b, scope C c, scope K k, out Strukt3 r)
{ /* ... */ }

Where return type is Strukt4. dmd borks the first argument on call (at least on Linux). Workarounds so far I found:

  1. adding extern(C)
  2. reducing number of parameters - five is fine, as soon as I add the sixth or more - it breaks (but not with extern(C)).

Problem is, I tried reproducing it outside of codebase, with no success :( Does that sound familiar to anyone? Maybe there's already a report about this on bugzilla? Any pointers on tracking this down?

As you cannot reduce I suggest to try with every .0 DMD version, degressively, to see if it's a regression.

Is it only with -O and are the structure very small? that could be a SROA problem then.

Otherwise I have a specific PR in mind, that is the big backend one that fixed system V ABI. If it's the culprit, manually checking with different DMD version will be useful (unless it did work previously either)

November 04, 2021

On Thursday, 4 November 2021 at 16:32:54 UTC, Stanislav Blinov wrote:

>

So I have a function:

auto foo(C, K)(Strukt1* s, Strukt2 a, uint b, scope C c, scope K k, out Strukt3 r)
{ /* ... */ }

Where return type is Strukt4. dmd borks the first argument on call (at least on Linux). Workarounds so far I found:

  1. adding extern(C)
  2. reducing number of parameters - five is fine, as soon as I add the sixth or more - it breaks (but not with extern(C)).

Problem is, I tried reproducing it outside of codebase, with no success :( Does that sound familiar to anyone? Maybe there's already a report about this on bugzilla? Any pointers on tracking this down?

Dustmite?
At very least can you give the definitions of the types used at the call site where it breaks.

November 05, 2021

On Thursday, 4 November 2021 at 17:46:02 UTC, max haughton wrote:

>

At very least can you give the definitions of the types used at the call site where it breaks.

Narrowed it down somewhat. Thanks guys!

https://issues.dlang.org/show_bug.cgi?id=22484