[Issue 6758] std.c.stdarg problems with 8 or more integer arguments on x86_64

d-bugmail at puremagic.com d-bugmail at puremagic.com
Fri Apr 13 03:23:34 PDT 2012


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


Don <clugdbug at yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code
                 CC|                            |clugdbug at yahoo.com.au
          Component|druntime                    |DMD
         OS/Version|Linux                       |All
           Severity|normal                      |critical


--- Comment #8 from Don <clugdbug at yahoo.com.au> 2012-04-13 03:24:19 PDT ---
> Perhaps somebody can tell me if D-style variadic functions really should be
using the __va_argsave structure on x86_64 code or should that only be
applicable to C-style variadic functions (as the documentation still implies at
the moment).

Yes, they should. The documentation is completely wrong -- that's bug 7893.


Here's what's happening. In 32 bit code, the glue layer sends dynamic arrays {
size_t length, void * ptr} into the backend as if they were integers, of type
ulong. That's basically a hack.

In 64 bit, the hack was extended: dynamic arrays are of type ucent.
Also delegates are of type cent. These are the only two cases where you can
create a variable of type cent or ucent.

Then, they get aligned *as if they were of type of cent or ucent* -- ie, 16
bytes, whereas they should only be aligned to 8 bytes.
I believe that inside structs, dynamic arrays and delegates are aligned to only
8 bytes, so we have an inconsistency.

Normally, you don't see this bug because: (1) if the number of arguments is
small, they get passed in registers, so the alignment is ignored. There are 6
registers available for passing integer arguments (RDI RSI RDX RCX R8 R9), so
the simplest case where this happens is 5 integers + a dynamic array. This is
why the problem only shows up when a large number of variadic arguments are
used;
(2) the other code generation also uses the cent/ucent alignment.

Workaround is to special-case delegates and arrays in stdc.stdarg. But really
the compiler should be fixed.

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