Jump to page: 1 2
Thread overview
[Issue 11310] New: Alignment failure in test42.d
Oct 21, 2013
Walter Bright
Oct 21, 2013
safety0ff.bugz
Oct 21, 2013
safety0ff.bugz
Oct 21, 2013
safety0ff.bugz
Oct 21, 2013
safety0ff.bugz
Oct 21, 2013
safety0ff.bugz
Oct 21, 2013
safety0ff.bugz
Oct 23, 2013
safety0ff.bugz
Oct 23, 2013
safety0ff.bugz
Oct 23, 2013
safety0ff.bugz
Oct 25, 2013
Walter Bright
October 21, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11310

           Summary: Alignment failure in test42.d
           Product: D
           Version: D2
          Platform: x86_64
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: bugzilla@digitalmars.com


--- Comment #0 from Walter Bright <bugzilla@digitalmars.com> 2013-10-20 22:43:57 PDT ---
Here's the code that fails in test/runnable/test42.d:
-----------------------------
align(16) struct S41
{
    int[4] a;
}

shared int x41;
shared S41 s41;

void test41()
{
    printf("&x = %p\n", &x41);
    printf("&s = %p\n", &s41);
    assert((cast(int)&s41 & 0xF) == 0);
}
----------------------------
when compiled on Linux with:

   -O -fPIC

Curiously, it prints:

   &x = 0x7fef00
   &s = 0x7fef10

which shows it is aligned correctly - so why does the assert fail?

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 21, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11310


safety0ff.bugz <safety0ff.bugz@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |safety0ff.bugz@gmail.com


--- Comment #1 from safety0ff.bugz <safety0ff.bugz@gmail.com> 2013-10-21 00:01:04 PDT ---
I noticed importing random stuff (e.g. std.string, std.stdio, std.algorithm) made it run without error, then I looked at the assembly code:

Disassembly of section .text._D6_113106test41FZv:

0000000000000000 <_D6_113106test41FZv>:
   0:    55                       push   %rbp
   1:    48 8b ec                 mov    %rsp,%rbp
   4:    f6 05 00 00 00 00 0f     testb  $0xf,0x0(%rip)
   b:    74 0a                    je     17 <_D6_113106test41FZv+0x17>
   d:    bf 11 00 00 00           mov    $0x11,%edi
  12:    e8 00 00 00 00           callq  17 <_D6_113106test41FZv+0x17>
  17:    5d                       pop    %rbp
  18:    c3                       retq
  19:    0f 1f 80 00 00 00 00     nopl   0x0(%rax)

Looks like it is and'ing the instruction pointer with 0xf.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 21, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11310



--- Comment #2 from safety0ff.bugz <safety0ff.bugz@gmail.com> 2013-10-21 00:03:26 PDT ---
That is the assembly without printf's, btw.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 21, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11310



--- Comment #3 from safety0ff.bugz <safety0ff.bugz@gmail.com> 2013-10-21 12:13:18 PDT ---
Created an attachment (id=1273)
Edb screenshot for second printf

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 21, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11310



--- Comment #4 from safety0ff.bugz <safety0ff.bugz@gmail.com> 2013-10-21 12:13:49 PDT ---
Created an attachment (id=1274)
Edb screenshot for assert test

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 21, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11310



--- Comment #5 from safety0ff.bugz <safety0ff.bugz@gmail.com> 2013-10-21 12:20:33 PDT ---
As you can see in the first screen shot, the address for s41 is calculated properly, whereas in the second screenshot the is a mistake.

rip for the printf calculation: 0x419c84
rip for the assert calculation: 0x419c99
difference: 0x15
offset for the printf calculation: 0x21e35c
offset for the assert calculation: 0x21e344
difference: 0x18

Looking at the relocation section of the executable, printf seems to be giving the correct location (0x63cdd0.)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 21, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11310



--- Comment #6 from safety0ff.bugz <safety0ff.bugz@gmail.com> 2013-10-21 12:59:27 PDT ---
Looking at the non-optimized version of the code, the test instruction operates on dwords, which makes the constant 3 bytes longer (i.e. the difference noted in comment 5,) the constant off of rip is the same as before.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 23, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11310



--- Comment #7 from safety0ff.bugz <safety0ff.bugz@gmail.com> 2013-10-22 22:25:39 PDT ---
Created an attachment (id=1279)
Edb screenshot for unoptimized version

Just to make it more clear what the issue is (I was quite sick when I wrote the
other comment):
The code responsible for calculating the offsets from the IP to the offset
table is calculating an offset that is off by 3 bytes. This offset is
appropriate for the instruction present in the unoptimized version which
operates on dword.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 23, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11310



--- Comment #8 from safety0ff.bugz <safety0ff.bugz@gmail.com> 2013-10-23 05:52:16 PDT ---
Created an attachment (id=1280)
This hack makes the program run properly for me

I don't know if there are cases where this will produce invalid code, I'll pull out the 64 bit architecture manual tonight and figure it out.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 23, 2013
http://d.puremagic.com/issues/show_bug.cgi?id=11310


safety0ff.bugz <safety0ff.bugz@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |pull


--- Comment #9 from safety0ff.bugz <safety0ff.bugz@gmail.com> 2013-10-23 11:52:46 PDT ---
After checking manuals, I've concluded that this is the correct fix and I've submitted a pull request: https://github.com/D-Programming-Language/dmd/pull/2691

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
« First   ‹ Prev
1 2