On 12 February 2013 17:45, Johannes Pfau <nos...@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';