www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Bug in DMD?

reply ryuukk_ <ryuukk.dev gmail.com> writes:
Hello,

I encountered a weird issue, my program segfault when i feed DMD 
with my files and static libs

It doesn't when i compile with LDC

If i split the compile/link in 2 different steps, then all works 
correctly


DMD (1step: ⛔): 
https://gist.github.com/ryuukk/f0ae2ae0c8980219c04d0c6d8678940d

LDC (1step: ✅): 
https://gist.github.com/ryuukk/4c7706697583431389d5e2074548f7c4

DMD (2step: ✅): 
https://gist.github.com/ryuukk/a0373339e590ecdae91e3f05b2d81bf4


Looks like DMD is messing things up when mixing code with static 
libraries?



Toolchains:
   - DMD32 D Compiler v2.102.1
   - LDC - the LLVM D compiler (1.32.0-beta1):
Mar 02 2023
next sibling parent ryuukk_ <ryuukk.dev gmail.com> writes:
It crashes with a weird message, address doesn't match the 
mangled name:

``C:\dev\kdom\projects\dawn\gl\glad\loader.d``

inside: ``module dawn.gl.glad.loader;``

![screenshot](https://i.imgur.com/sY2KcgR.png)
Mar 02 2023
prev sibling parent reply "Richard (Rikki) Andrew Cattermole" <richard cattermole.co.nz> writes:
There isn't anything we can do without source.

But here is what I would do in this situation:

1. Look at the assembly at the point of debug break, from here it should 
give you hints as to why its trying to write to dawn.assets.Resource 
init array.
2. Dustmite, so we have something we can work with.
Mar 02 2023
parent reply ryuukk_ <ryuukk.dev gmail.com> writes:
On Thursday, 2 March 2023 at 21:21:14 UTC, Richard (Rikki) Andrew 
Cattermole wrote:
 There isn't anything we can do without source.

 But here is what I would do in this situation:

 1. Look at the assembly at the point of debug break, from here 
 it should give you hints as to why its trying to write to 
 dawn.assets.Resource init array.
 2. Dustmite, so we have something we can work with.
I have no idea what does 1. mean, as for 2. do you have a link for a guide how to setup "dustmite"?
Mar 02 2023
next sibling parent reply ryuukk_ <ryuukk.dev gmail.com> writes:
On Thursday, 2 March 2023 at 21:38:23 UTC, ryuukk_ wrote:
 On Thursday, 2 March 2023 at 21:21:14 UTC, Richard (Rikki) 
 Andrew Cattermole wrote:
 There isn't anything we can do without source.

 But here is what I would do in this situation:

 1. Look at the assembly at the point of debug break, from here 
 it should give you hints as to why its trying to write to 
 dawn.assets.Resource init array.
 2. Dustmite, so we have something we can work with.
I have no idea what does 1. mean, as for 2. do you have a link for a guide how to setup "dustmite"?
Better, can i send you a zip of my project? i'm not sure i'm willing to waste any more time trying to figure out what is wrong That's is not something i like doing, it should just work, i shouldn't have to debug DMD, that aint my job
Mar 02 2023
parent reply "H. S. Teoh" <hsteoh qfbox.info> writes:
On Thu, Mar 02, 2023 at 09:55:55PM +0000, ryuukk_ via Digitalmars-d-learn wrote:
 On Thursday, 2 March 2023 at 21:38:23 UTC, ryuukk_ wrote:
 On Thursday, 2 March 2023 at 21:21:14 UTC, Richard (Rikki) Andrew
 Cattermole wrote:
[...]
 2. Dustmite, so we have something we can work with.
[...] 2. do you have a link for a guide how to setup "dustmite"?
https://dlang.org/blog/2020/04/13/dustmite-the-general-purpose-data-reduction-tool/ Dustmite automatically reduces your code to a minimal example that still exhibits the same problem, good for bug reports that are easily reproducible. Also useful if you don't want to publicly share the code for whatever reason, but still want to provide enough information so that the dmd devs can find the problem and fix it. [...]
 That's is not something i like doing, it should just work, i shouldn't
 have to debug DMD, that aint my job
Dustmite can run in the background on a temporary copy of your code, you don't have to babysit it and can work on other things while it's doing its thing. T -- Written on the window of a clothing store: No shirt, no shoes, no service.
Mar 02 2023
parent reply ryuukk_ <ryuukk.dev gmail.com> writes:
On Thursday, 2 March 2023 at 22:24:11 UTC, H. S. Teoh wrote:
 On Thu, Mar 02, 2023 at 09:55:55PM +0000, ryuukk_ via 
 Digitalmars-d-learn wrote:
 On Thursday, 2 March 2023 at 21:38:23 UTC, ryuukk_ wrote:
 On Thursday, 2 March 2023 at 21:21:14 UTC, Richard (Rikki) 
 Andrew
 Cattermole wrote:
[...]
 2. Dustmite, so we have something we can work with.
[...] 2. do you have a link for a guide how to setup "dustmite"?
https://dlang.org/blog/2020/04/13/dustmite-the-general-purpose-data-reduction-tool/ Dustmite automatically reduces your code to a minimal example that still exhibits the same problem, good for bug reports that are easily reproducible. Also useful if you don't want to publicly share the code for whatever reason, but still want to provide enough information so that the dmd devs can find the problem and fix it. [...]
 That's is not something i like doing, it should just work, i 
 shouldn't have to debug DMD, that aint my job
Dustmite can run in the background on a temporary copy of your code, you don't have to babysit it and can work on other things while it's doing its thing. T
the problem is not that it can run in the background, the problem is figuring out 1. how to install 2. how to setup 3. how to run i was initially working on my game, i shouldn't have to take a 1 week break to debug dmd
Mar 02 2023
next sibling parent reply "Richard (Rikki) Andrew Cattermole" <richard cattermole.co.nz> writes:
On 03/03/2023 12:34 PM, ryuukk_ wrote:
 1. how to install
Already is. Comes with dmd and ldc. You can also just do ``$ dub run digger -- args``.
 2. how to setup > 3. how to run
It is a bit of a pain but the basics is you need some sort of compilation command, list of sources and a test to confirm if it still fails. https://github.com/CyberShadow/DustMite/wiki#how-to-use-it
Mar 02 2023
parent reply ryuukk_ <ryuukk.dev gmail.com> writes:
I couldn't figure out dustmite, so i started from 0 and managed 
to hit something:

https://github.com/ryuukk/dmd_bug

``Assertion failed: array index out of bounds, file game\app.d, 
line 5``

Wich indicates probably TLS problem?

This now reminds me of: 
https://issues.dlang.org/show_bug.cgi?id=23310

I am clueless what to do next, but at least now there is a small 
repro available for knowledgeable people
Mar 02 2023
next sibling parent reply Vladimir Panteleev <thecybershadow.lists gmail.com> writes:
On Friday, 3 March 2023 at 01:07:07 UTC, ryuukk_ wrote:
 I couldn't figure out dustmite, so i started from 0 and managed 
 to hit something:

 https://github.com/ryuukk/dmd_bug

 ``Assertion failed: array index out of bounds, file game\app.d, 
 line 5``

 Wich indicates probably TLS problem?
Yeah... `rt.a.stuffs` is a TLS variable. The D runtime manages TLS. `extern(C) main` bypasses D runtime initialization.
Mar 02 2023
parent reply ryuukk_ <ryuukk.dev gmail.com> writes:
On Friday, 3 March 2023 at 01:11:06 UTC, Vladimir Panteleev wrote:
 On Friday, 3 March 2023 at 01:07:07 UTC, ryuukk_ wrote:
 I couldn't figure out dustmite, so i started from 0 and 
 managed to hit something:

 https://github.com/ryuukk/dmd_bug

 ``Assertion failed: array index out of bounds, file 
 game\app.d, line 5``

 Wich indicates probably TLS problem?
Yeah... `rt.a.stuffs` is a TLS variable. The D runtime manages TLS. `extern(C) main` bypasses D runtime initialization.
I have some questions: 1. why does it work with LDC? 2. why does it work with DMD when build/link in 2 step? 3. why it doesn't work when DMD is invoked once for build/link 4. is this a bug in DMD or my code is wrong? 5. if it's wrong, then why does it compile/no error? ```sh set -e build_dmd() { echo "build dmd" dmd \ -debug -g \ -m64 -vcolumns -betterC -w -i -i=-std -i=-core \ -Igame \ -Istuff/ \ stuff/rt/object.d \ game/app.d \ -of=game.exe } build_ldc() { echo "build ldc" ldc2 \ -d-debug -g \ -m64 -vcolumns -betterC -w -i -i=-std -i=-core \ -Igame \ -Istuff/ \ stuff/rt/object.d \ game/app.d \ -of=game.exe } build_dmd_and_link() { echo "build dmd and link (2step)" dmd \ -debug -g -c \ -m64 -vcolumns -betterC -w -i -i=-std -i=-core \ -Igame \ -Istuff/ \ stuff/rt/object.d \ game/app.d \ -of=game.obj dmd \ -debug -g \ -m64 -vcolumns -betterC -w -i -i=-std -i=-core \ -Igame \ -Istuff/ \ game.obj \ -of=game.exe } build_ldc ./game.exe rm game.obj game.exe build_dmd_and_link ./game.exe rm game.obj game.exe build_dmd ./game.exe rm game.obj game.exe ```
Mar 02 2023
parent Vladimir Panteleev <thecybershadow.lists gmail.com> writes:
On Friday, 3 March 2023 at 01:21:52 UTC, ryuukk_ wrote:
 I have some questions:

 1. why does it work with LDC?
 2. why does it work with DMD when build/link in 2 step?
 3. why it doesn't work when DMD is invoked once for build/link
I think these are probably coincidences and the answer can be summarized as "that's what ends up happening due to the details of the implementation".
 4. is this a bug in DMD or my code is wrong?
I would say the code is wrong in principle, though as you've noted it can still work in some specific circumstances.
 5. if it's wrong, then why does it compile/no error?
`extern(C) main` is a low-level feature, because it effectively turns off parts of the language. However, the rest of the program doesn't know that this is the case - currently the compiler simply assumes you know what you're doing. Maybe it's not OK that it's easy to use it by accident.
Mar 02 2023
prev sibling parent reply "Richard (Rikki) Andrew Cattermole" <richard cattermole.co.nz> writes:
This works:

```d
extern(C) void main()
{
     Stuff[5] temp = [
	Stuff(),
	Stuff(),
	Stuff(),
	Stuff(),
	Stuff(),
];
     stuffs = temp[];
	stuffs[0].do_something();
}
```

```d
Stuff[] stuffs;
```

The problem here is dmd isn't initializing TLS with a value, but TLS 
itself is working.
Mar 02 2023
parent reply ryuukk_ <ryuukk.dev gmail.com> writes:
On Friday, 3 March 2023 at 01:24:42 UTC, Richard (Rikki) Andrew 
Cattermole wrote:
 This works:

 ```d
 extern(C) void main()
 {
     Stuff[5] temp = [
 	Stuff(),
 	Stuff(),
 	Stuff(),
 	Stuff(),
 	Stuff(),
 ];
     stuffs = temp[];
 	stuffs[0].do_something();
 }
 ```

 ```d
 Stuff[] stuffs;
 ```

 The problem here is dmd isn't initializing TLS with a value, 
 but TLS itself is working.
So it is a DMD bug?
Mar 02 2023
parent reply "Richard (Rikki) Andrew Cattermole" <richard cattermole.co.nz> writes:
On 03/03/2023 2:33 PM, ryuukk_ wrote:
 So it is a DMD bug?
Yes and thanks to you I can now say that we can absolutely get rid of DllMain requirement for DLLs!
Mar 02 2023
next sibling parent "Richard (Rikki) Andrew Cattermole" <richard cattermole.co.nz> writes:
I added a note here: https://issues.dlang.org/show_bug.cgi?id=20737
Mar 02 2023
prev sibling parent ryuukk_ <ryuukk.dev gmail.com> writes:
On Friday, 3 March 2023 at 01:37:42 UTC, Richard (Rikki) Andrew 
Cattermole wrote:
 On 03/03/2023 2:33 PM, ryuukk_ wrote:
 So it is a DMD bug?
Yes and thanks to you I can now say that we can absolutely get rid of DllMain requirement for DLLs!
glad the outcome is positive, and i apologies about earlier comments, i may have sounded a little bit rude
Mar 02 2023
prev sibling parent =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
On 3/2/23 15:34, ryuukk_ wrote:

 the problem is not that it can run in the background, the problem is
 figuring out

 1. how to install
 2. how to setup
 3. how to run
I haven't used it myself but dustmite seems to be integrated into dub. 'dub dustmite <...>' Ali
Mar 02 2023
prev sibling parent "Richard (Rikki) Andrew Cattermole" <richard cattermole.co.nz> writes:
On 03/03/2023 10:38 AM, ryuukk_ wrote:
 On Thursday, 2 March 2023 at 21:21:14 UTC, Richard (Rikki) Andrew 
 Cattermole wrote:
 There isn't anything we can do without source.

 But here is what I would do in this situation:

 1. Look at the assembly at the point of debug break, from here it 
 should give you hints as to why its trying to write to 
 dawn.assets.Resource init array.
 2. Dustmite, so we have something we can work with.
I have no idea what does 1. mean, as for 2. do you have a link for a guide how to setup "dustmite"?
When debugging, native debuggers i.e. Visual Studio, will provide you with the disassembly of the function currently being executed. Between this and other entries in the call stack, you can generally figure out what the statement is being executed just by looking at things like call instructions. The symbols there will be accurate.
Mar 02 2023