[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