[Issue 11740] New: [64-bit] Struct with constructor incorrectly passed on stack

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Dec 14 09:22:14 PST 2013


https://d.puremagic.com/issues/show_bug.cgi?id=11740

           Summary: [64-bit] Struct with constructor incorrectly passed on
                    stack
           Product: D
           Version: D2
          Platform: x86_64
        OS/Version: All
            Status: NEW
          Keywords: wrong-code
          Severity: critical
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: yebblies at gmail.com


--- Comment #0 from yebblies <yebblies at gmail.com> 2013-12-15 04:22:12 EST ---
In func, 's' is passed on the stack instead of in a register pair, only when
the constructor is present.  This blocks DDMD on linux64.

extern(C++)
class C
{
extern(C++) static void func(S s, C c)
{
    assert(c);
    assert(s.filename);
    assert(s.linnum);
}

}

struct S
{
    const(char)* filename;
    uint linnum;
    this(const(char)* filename, uint linnum) {}
}

int main()
{
    C.func(S(null, 0), null);
    return 0;
}


0000000000000000 <_ZN1C4funcE1SPS_>:
   0:   55                      push   %rbp
   1:   48 8b ec                mov    %rsp,%rbp
   4:   48 83 ec 10             sub    $0x10,%rsp
   8:   48 89 7d f8             mov    %rdi,-0x8(%rbp) (should be in rdx, not
rdi)
   c:   48 83 7d f8 00          cmpq   $0x0,-0x8(%rbp)
  11:   75 0a                   jne    1d <_ZN1C4funcE1SPS_+0x1d>
  13:   bf 07 00 00 00          mov    $0x7,%edi
  18:   e8 00 00 00 00          callq  1d <_ZN1C4funcE1SPS_+0x1d>
                        19: R_X86_64_PC32       _D4test8__assertFiZv-0x4
  1d:   48 83 7d 10 00          cmpq   $0x0,0x10(%rbp)
  22:   75 0a                   jne    2e <_ZN1C4funcE1SPS_+0x2e>
  24:   bf 08 00 00 00          mov    $0x8,%edi
  29:   e8 00 00 00 00          callq  2e <_ZN1C4funcE1SPS_+0x2e>
                        2a: R_X86_64_PC32       _D4test8__assertFiZv-0x4
  2e:   83 7d 18 00             cmpl   $0x0,0x18(%rbp)
  32:   75 0a                   jne    3e <_ZN1C4funcE1SPS_+0x3e>
  34:   bf 09 00 00 00          mov    $0x9,%edi
  39:   e8 00 00 00 00          callq  3e <_ZN1C4funcE1SPS_+0x3e>
                        3a: R_X86_64_PC32       _D4test8__assertFiZv-0x4
  3e:   c9                      leaveq
  3f:   c3                      retq

It works correctly if StructDeclaration::isPOD is changed to not reject all
structs with constructors, but there is a comment warning against that.

-- 
Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list