http://d.puremagic.com/issues/show_bug.cgi?id=9028
--- Comment #3 from Maxim Fomin <[email protected]> 2012-11-15 03:11:18 PST --- Ok, I see the problem now: ------------------------- import std.stdio; void main(string[] args) { dain(args); if(!args.length) return; foreach(i; 0 .. 2) { size_t esp; main(null); // ok, C linkage used asm { mov esp, ESP; } writeln("main"); writefln("%X", esp); } foreach(i; 0 .. 2) { size_t esp; (&main)(null); // also ok asm { mov esp, ESP; } writeln("&main"); writefln("%X", esp); } foreach(i; 0 .. 2) { size_t esp; auto p = &main; // D linkage used p(null); // stack corruption, results in Access Violation //asm { add ESP, 0x8; } // uncomment to fix asm { mov esp, ESP; } writeln("p-main"); writefln("%X", esp); } } void dain(string[] args) { if(!args.length) return; foreach(i; 0 .. 2) { size_t esp; dain(null); // ok, C linkage used asm { mov esp, ESP; } writeln("dain"); writefln("%X", esp); } foreach(i; 0 .. 2) { size_t esp; (&dain)(null); // also ok asm { mov esp, ESP; } writeln("&dain"); writefln("%X", esp); } foreach(i; 0 .. 2) { size_t esp; auto p = &dain; // D linkage used p(null); // stack corruption, results in Access Violation //asm { add ESP, 0x8; } // uncomment to fix asm { mov esp, ESP; } writeln("p-dain"); writefln("%X", esp); } } ---------------------------------- dain 18FDC4 dain 18FDC4 &dain 18FDC4 &dain 18FDC4 p-dain 18FDC4 p-dain 18FDC4 main 18FE10 main 18FE10 &main 18FE10 &main 18FE10 p-main 18FE08 p-main 18FE00 This is windows output. Note in main %esp is decreasing in last loop. Same code on linux is fine (http://dpaste.dzfl.pl/6aa48fed), so this is specific to windows codegen/calling conventions. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
