[Issue 10634] New: Win64: wrong codegen with .int of small structs

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sat Jul 13 10:45:23 PDT 2013


http://d.puremagic.com/issues/show_bug.cgi?id=10634

           Summary: Win64: wrong codegen with .int of small structs
           Product: D
           Version: D1 & D2
          Platform: x86_64
        OS/Version: Windows
            Status: NEW
          Keywords: wrong-code
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody at puremagic.com
        ReportedBy: r.sagitario at gmx.de


--- Comment #0 from Rainer Schuetze <r.sagitario at gmx.de> 2013-07-13 10:45:22 PDT ---
This extract from datetime fires the assertion:

struct TimeOfDay
{
    ubyte h, m, s;
}

__gshared byte glob;

struct DateTime
{
    this(ubyte _d, ubyte _m, ubyte _y, TimeOfDay _tod = TimeOfDay.init)
    {
        d = _d;
        m = _m;
        y = _y;
        tod = _tod;
    }
    TimeOfDay tod;
    ubyte d, m, y;
}

void main()
{
    glob = 123;
    DateTime date1 = DateTime(0, 0, 0);
    DateTime date2;
    assert(date1 == date2);
}

Here is the disassembly:

_D4test8DateTime6__ctorMFNchhhS4test9TimeOfDayZS4test8DateTime:
  0000000000000000: 55                 push        rbp
  0000000000000001: 48 8B EC           mov         rbp,rsp
  0000000000000004: 8A 45 30           mov         al,byte ptr [rbp+30h]
  0000000000000007: 88 41 03           mov         byte ptr [rcx+3],al
  000000000000000A: 44 88 49 04        mov         byte ptr [rcx+4],r9b
  000000000000000E: 44 88 41 05        mov         byte ptr [rcx+5],r8b
  0000000000000012: 89 11              mov         dword ptr [rcx],edx
  0000000000000014: 48 89 C8           mov         rax,rcx
  0000000000000017: 5D                 pop         rbp
  0000000000000018: C3                 ret

_Dmain:
  0000000000000000: 55                 push        rbp
  0000000000000001: 48 8B EC           mov         rbp,rsp
  0000000000000004: 48 83 EC 20        sub         rsp,20h
  0000000000000008: 56                 push        rsi
  0000000000000009: 57                 push        rdi
  000000000000000A: C6 05 00 00 00 00  mov         byte ptr [_D4test4globg],7Bh
                    7B
  0000000000000011: 48 8D 45 E8        lea         rax,[rbp-18h]
  0000000000000015: 48 31 C9           xor         rcx,rcx
  0000000000000018: 89 08              mov         dword ptr [rax],ecx
  000000000000001A: 66 89 48 04        mov         word ptr [rax+4],cx
  000000000000001E: 48 83 EC 08        sub         rsp,8
  0000000000000022: 51                 push        rcx
  0000000000000023: 44 8A C9           mov         r9b,cl
  0000000000000026: 4D 89 C8           mov         r8,r9
  0000000000000029: 44 88 45 F0        mov         byte ptr [rbp-10h],r8b
  000000000000002D: 44 88 45 F1        mov         byte ptr [rbp-0Fh],r8b
  0000000000000031: 44 88 45 F2        mov         byte ptr [rbp-0Eh],r8b
  0000000000000035: 8B 55 F0           mov         edx,dword ptr [rbp-10h]
  0000000000000038: 48 89 C1           mov         rcx,rax
  000000000000003B: 48 83 EC 20        sub         rsp,20h
  000000000000003F: E8 00 00 00 00     call       
_D4test8DateTime6__ctorMFNchh
hS4test9TimeOfDayZS4test8DateTime
  0000000000000044: 48 83 C4 30        add         rsp,30h
  0000000000000048: 48 8D 45 F8        lea         rax,[rbp-8]
  000000000000004C: 4D 31 C9           xor         r9,r9
  000000000000004F: 44 89 08           mov         dword ptr [rax],r9d
  0000000000000052: 66 44 89 48 04     mov         word ptr [rax+4],r9w
  0000000000000057: 48 8D 75 E8        lea         rsi,[rbp-18h]
  000000000000005B: 48 89 C7           mov         rdi,rax
  000000000000005E: 48 B9 06 00 00 00  mov         rcx,6
                    00 00 00 00
  0000000000000068: 33 C0              xor         eax,eax
  000000000000006A: F3 A6              repe cmps   byte ptr [rsi],byte ptr
[rdi]

  000000000000006C: 74 12              je          0000000000000080
  000000000000006E: B9 1B 00 00 00     mov         ecx,1Bh
  0000000000000073: 48 83 EC 20        sub         rsp,20h
  0000000000000077: E8 00 00 00 00     call        _D4test8__assertFiZv
  000000000000007C: 48 83 C4 20        add         rsp,20h
  0000000000000080: 31 C0              xor         eax,eax
  0000000000000082: 5F                 pop         rdi
  0000000000000083: 5E                 pop         rsi
  0000000000000084: 48 8D 65 00        lea         rsp,[rbp]
  0000000000000088: 5D                 pop         rbp
  0000000000000089: C3                 ret

it shows that the init-value is prepared with 3 byte writes, but a 32-bit word
is read to be passed in edx. It then writes all 4 bytes into the DateTime
struct overwriting the following element with garbage.
If the initializer is taking from the BSS segment, it is the global variable
that is read as the 4th byte.

-- 
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