[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