is this an instance of the 16-byte struct bug
deadalnix
deadalnix at gmail.com
Mon Nov 4 16:16:09 PST 2013
On Monday, 4 November 2013 at 23:14:08 UTC, jerro wrote:
> On Monday, 4 November 2013 at 23:07:27 UTC, deadalnix wrote:
>> On Monday, 4 November 2013 at 22:56:48 UTC, jerro wrote:
>>>> Then it look like a dmd backend bug. Can you post the
>>>> generated assembly ?
>>>
>>> 000000000043050c <_Dmain>:
>>> 43050c: push %rbp
>>> 43050d: mov %rsp,%rbp
>>> 430510: sub $0x40,%rsp
>>> 430514: movabs $0x3ff0000000000000,%rax
>>> 43051b:
>>> 43051e: mov %rax,-0x40(%rbp)
>>> 430522: movsd -0x40(%rbp),%xmm0
>>> 430527: rex.W movsd %xmm0,-0x30(%rbp)
>>> 43052d: xor %edx,%edx
>>> 43052f: mov %rax,-0x10(%rbp)
>>> 430533: mov %rdx,-0x8(%rbp)
>>> 430537: mov %rax,-0x28(%rbp)
>>> 43053b: mov %rdx,-0x20(%rbp)
>>
>>> 43053f: mov 0x28022(%rip),%rdx
>>> 430546: mov 0x28013(%rip),%rsi
>>
>> What are these ? What are they referering to
>
> My guess is they are refering to length and
> ptr for "%x" string literal, which is passed to writefln.
>
>>
>>> 43054d: mov -0x28(%rbp),%rdi
>>> 430551: callq 430874 <void
>>> std.stdio.writefln!(immutable(char)[],
>>> ulong).writefln(immutable(char)[], ulong)>
>>> 430556: xor %eax,%eax
>>> 430558: leaveq
>>> 430559: retq
>>
>> This calls writefln, this is not what your code does just
>> above. Are you sure you are posting the right assembly ? Do
>> you use the inline flag ?
>
> I think you are confusing my post with some other post (I am not
> OP).
OK, my mistake.
> My code sample was:
>
> import std.stdio;
>
> struct Y {
> int[] _data;
> }
>
> struct CFS {
> double x;
> Y growth;
> }
>
> void main() {
> auto s = CFS(1.0);
> writefln("%x", s.growth._data.length); // prints
> 3ff0000000000000
> }
>
> The constructor's argument was 2.0 in my previous sample, but it
> should have been 1.0.
I'm not sure what DMD is trying to do, but the function call to
writefln is clearly wrong.
More information about the Digitalmars-d
mailing list