To POD or not to POD

Iain Buclaw ibuclaw at ubuntu.com
Tue Feb 12 10:16:31 PST 2013


On 12 February 2013 17:45, Johannes Pfau <nospam at example.com> wrote:

> I've started debugging the unit test failures in std.datetime:
>
> We have this Date struct:
> -----
> struct Date
> {
>     this(int a){}
>     short _year  = 2;
>     ubyte _month = 1;
>     ubyte _day   = 1;
> }
> -----
>
> It's passed to D runtime variadic functions. It's 4 bytes in total so
> GCC passes this struct in registers on x86_64 and it's therefore saved
> in reg_save_area.
>
> But our va_arg implementation using TypeInfo calls TypeInfo.argTypes()
> to check if the type can be passed in parameters. This check returns
> false as it depends on the dmd check sym->isPOD. Therefore our va_arg
> tries to load the Date instance from the overflow_arg / stack save area
> instead of the register save area.
>
> What would be the correct way to tell the gcc backend not to pass !isPOD
> structs in registers? Using TREE_ADDRESSABLE?
>
>
TREE_ADDRESSABLE should be sufficient.  I can't think any reason off the
top of my head why not.

-- 
Iain Buclaw

*(p < e ? p++ : p) = (c & 0x0f) + '0';
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/d.gnu/attachments/20130212/9796b74e/attachment.html>


More information about the D.gnu mailing list