| Thread overview | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
January 13, 2014 [Issue 11910] New: Writes to extern (C) struct have no effect | ||||
|---|---|---|---|---|
| ||||
https://d.puremagic.com/issues/show_bug.cgi?id=11910 Summary: Writes to extern (C) struct have no effect Product: D Version: D2 Platform: x86_64 OS/Version: Windows Status: NEW Severity: major Priority: P2 Component: DMD AssignedTo: nobody@puremagic.com ReportedBy: turkeyman@gmail.com --- Comment #0 from Manu <turkeyman@gmail.com> 2014-01-12 19:08:24 PST --- Is this bad codegen, or have I done something wrong? extern (C) struct MFDefaults { extern (C) struct InputDefaults { bool allowMultipleMice; bool mouseZeroIsSystemMouse; bool systemMouseUseWindowsCursor; bool useDirectInputKeyboard; bool useXInput; } InputDefaults input; } extern (C) __gshared MFDefaults gDefaults; void f() { gDefaults.input.useXInput = false; // assignment has no effect } This code builds and links successfully. In the debugger I can inspect the values of the struct and they are correct, consistent with the struct in the C code. But when I assign to anything, it simply has no effect... -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- | ||||
January 13, 2014 [Issue 11910] Writes to extern (C) struct have no effect | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Manu | https://d.puremagic.com/issues/show_bug.cgi?id=11910 David Nadlinger <code@klickverbot.at> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |code@klickverbot.at --- Comment #1 from David Nadlinger <code@klickverbot.at> 2014-01-12 19:18:57 PST --- I checked the generated code on Linux x86_64 and it seems fine (store immediate zero in gDefaults at offset 4). So, more details and instructions to reproduce, please. ;) -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- | |||
January 13, 2014 [Issue 11910] Writes to extern (C) struct have no effect | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Manu | https://d.puremagic.com/issues/show_bug.cgi?id=11910 --- Comment #2 from Manu <turkeyman@gmail.com> 2014-01-12 19:53:36 PST --- I'm building with DMD-Win64. Digging further, I see this instruction in the debugger: mov byte ptr [gDefaults+9Ch (7F685FBF01Ch)],1 Which looks correct... But note, the debugger helpfully shows the calculated store address: 7F685FBF01Ch &gDefaults.input.useXInput == 7F685FEBC7Ch It should write to ...FEBC7Ch, but instead it writes to ...FBF01Ch, which is WAY before where it should be writing. If I inspect the memory surrounding the address that it actually writes to, it is filled with things like fully justified D symbols (with module name and everything), path strings, lots of zeroes and float 1.0's. Not the structure I expect to see. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- | |||
January 13, 2014 [Issue 11910] Writes to extern (C) struct have no effect | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Manu | https://d.puremagic.com/issues/show_bug.cgi?id=11910 --- Comment #3 from Manu <turkeyman@gmail.com> 2014-01-12 20:00:13 PST --- (In reply to comment #2) > I'm building with DMD-Win64. > > Digging further, I see this instruction in the debugger: mov byte ptr [gDefaults+9Ch (7F685FBF01Ch)],1 Note: +9C in mine is because my structure is actually much larger, I trimmed it down to log the bug. The offset 9C looks right. The debugger also illustrated 'gDefaults' as the store address, which I guess means the address it writes to does match the symbol record in the debug info. I guess the address emitted for gDefaults is wrong somehow? But... that symbol should come from the external C library :/ -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- | |||
January 13, 2014 [Issue 11910] Writes to extern (C) struct have no effect | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Manu | https://d.puremagic.com/issues/show_bug.cgi?id=11910 Jacob Carlborg <doob@me.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |doob@me.com --- Comment #4 from Jacob Carlborg <doob@me.com> 2014-01-13 02:43:57 PST --- (In reply to comment #3) > Note: +9C in mine is because my structure is actually much larger, I trimmed it down to log the bug. The offset 9C looks right. > > The debugger also illustrated 'gDefaults' as the store address, which I guess > means the address it writes to does match the symbol record in the debug info. > I guess the address emitted for gDefaults is wrong somehow? > But... that symbol should come from the external C library :/ What is "gDefaults" supposed to be? A symbol from a C library? In that case you forgot "extern", the correct declaration should be: extern (C) extern __gshared MFDefaults gDefaults; Have a look at: http://dlang.org/interfaceToC.html#C%20Globals -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- | |||
January 13, 2014 [Issue 11910] Writes to extern (C) struct have no effect | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Manu | https://d.puremagic.com/issues/show_bug.cgi?id=11910 --- Comment #5 from Manu <turkeyman@gmail.com> 2014-01-13 03:31:27 PST --- (In reply to comment #4) > > What is "gDefaults" supposed to be? A symbol from a C library? Yes, I thought that was clear from the 'extern (C)'. > In that case you forgot "extern", the correct declaration should be: > > extern (C) extern __gshared MFDefaults gDefaults; Umm... I think you need to look at the OP again. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- | |||
January 13, 2014 [Issue 11910] Writes to extern (C) struct have no effect | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Manu | https://d.puremagic.com/issues/show_bug.cgi?id=11910 --- Comment #6 from Manu <turkeyman@gmail.com> 2014-01-13 03:34:12 PST --- (In reply to comment #4) > > In that case you forgot "extern", the correct declaration should be: > > extern (C) extern __gshared MFDefaults gDefaults; > > Have a look at: http://dlang.org/interfaceToC.html#C%20Globals ... oh Crap, where's that edit button! Wow, I have no words. I never would have spotted that a mile off, even when you said it! That seems extremely redundant :/ -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- | |||
January 13, 2014 [Issue 11910] Writes to extern (C) struct have no effect | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Manu | https://d.puremagic.com/issues/show_bug.cgi?id=11910 --- Comment #7 from Jacob Carlborg <doob@me.com> 2014-01-13 04:20:35 PST --- (In reply to comment #6) > ... oh > Crap, where's that edit button! > > Wow, I have no words. > I never would have spotted that a mile off, even when you said it! > > That seems extremely redundant :/ If you don't specify "extern" you get the storage of the variable in the D code. -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- | |||
January 13, 2014 [Issue 11910] Writes to extern (C) struct have no effect | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Manu | https://d.puremagic.com/issues/show_bug.cgi?id=11910 Manu <turkeyman@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |FIXED --- Comment #8 from Manu <turkeyman@gmail.com> 2014-01-13 04:40:25 PST --- (In reply to comment #7) > If you don't specify "extern" you get the storage of the variable in the D code. Right, but shouldn't I have gotten a multiply defined symbols link error in that case? * Marked resolved, user error! >_< -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- | |||
January 13, 2014 [Issue 11910] Writes to extern (C) struct have no effect | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Manu | https://d.puremagic.com/issues/show_bug.cgi?id=11910 Manu <turkeyman@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|FIXED |INVALID -- Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply