For the lulz: ddmd vs libdparse lexer timings

David Nadlinger via Digitalmars-d digitalmars-d at puremagic.com
Tue Jan 6 07:06:39 PST 2015


On Monday, 5 January 2015 at 17:44:31 UTC, Daniel Murphy wrote:
> I think I've got a handle on this, sort of.  I've moved the 
> declaration of __va_argsave into the glue layer, and added 
> intrinsic detection for va_start/va_end/va_arg (the two-arg 
> form).
>
> I've implemented them in the backend for win32 and they have 
> passed a simple test!

I'd suggest you have a look at Posix x86_64 first before 
finalizing the "easy" x86 implementation. The former comes with 
two extra niceties compared to the simple "pointer to 
stack-allocated arguments" model:

  1) You need to copy the registers to the stack on function entry 
(in case the arguments are later accessed using va_arg, they are 
just regular functions on the caller side), and then be able to 
access the address of this area in va_start. This is what 
va_argsave is currently used for in DMD.

  2) The issue with passing va_list as a parameter (especially 
regarding C ABI compatibility) vs. allocating the struct storage 
allocation. If you simply make it a pointer on x86_64, it's hard 
to implement va_copy correctly. The DMD implementation of the 
latter is currently broken, which is the reason for some of the 
vararg-related version(X86_64) blocks.

> Do you think we can change _all_ the druntime and phobos code 
> to just use va_arg directly?  It would be nice to have it all 
> portable like that.

Yes. Some parts might need a bit of rework, though. This job 
would be quite a bit easier if we could finally ditch the old 
vararg-based std.format stuff before.

Be sure to let me know if you have any specific questions.

David


More information about the Digitalmars-d mailing list