[Issue 9028] `main` is trated sometimes as having C calling convention and sometimes as having D convention
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Thu Nov 15 03:11:21 PST 2012
http://d.puremagic.com/issues/show_bug.cgi?id=9028
--- Comment #3 from Maxim Fomin <maxim at maxim-fomin.ru> 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: -------
More information about the Digitalmars-d-bugs
mailing list