Thread overview
[Issue 670] New: _argptr is char *
Dec 09, 2006
d-bugmail
Sep 18, 2007
d-bugmail
Sep 18, 2007
d-bugmail
Sep 18, 2007
d-bugmail
Sep 18, 2007
d-bugmail
Sep 18, 2007
d-bugmail
Nov 09, 2010
Walter Bright
Jan 16, 2011
Iain Buclaw
Mar 27, 2011
Iain Buclaw
December 09, 2006
http://d.puremagic.com/issues/show_bug.cgi?id=670

           Summary: _argptr is char *
           Product: GDC
           Version: unspecified
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: minor
          Priority: P2
         Component: glue layer
        AssignedTo: dvdfrdmn@users.sf.net
        ReportedBy: akaquinn@hotmail.com


On DMD, _argptr is a void *, on GDC it's a char *. This is fairly minor, but I've ended up having to add casts for it in all sorts of code to make it compile on GDC. Because AFAIK there's no compelling reason for it to be a char * instead of a void *, I think it should be changed.

Yes, people should use std.stdarg's va_list ... but they don't X_X


-- 

September 18, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=670


smjg@iname.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |smjg@iname.com
           Keywords|                            |wrong-code




------- Comment #1 from smjg@iname.com  2007-09-17 20:56 -------
Please remember to assign keywords to bug reports.  To everybody reading this: Please look through issues you've reported and check for missing keywords.

It definitely should be changed:
- according to the spec, void* is the correct type of _argptr
- it makes no sense to assume that the data pointed to by it has character
semantics.


-- 

September 18, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=670





------- Comment #2 from afb@algonet.se  2007-09-18 01:38 -------
According to the spec, only DMD exists. It doesn't mention portability.

va_list is not a char* always, it's a "target-specific type". Don't cast. It needs the builtin va_list and the va_arg template for it to work...

I'm not sure how it could be rewritten to support DMD's direct access ? But David can probably give a much better explanation of the va_lists.


-- 

September 18, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=670





------- Comment #3 from smjg@iname.com  2007-09-18 07:07 -------
  (In reply to comment #2)
> According to the spec, only DMD exists. It doesn't mention portability.

Where is this bit of the spec that states that no other compiler exists?

> va_list is not a char* always, it's a "target-specific type". Don't cast. It needs the builtin va_list and the va_arg template for it to work...
std.stdarg, in DMD's implementation, defines va_list to be an alias of void*.
This is consistent with
http://www.digitalmars.com/d/function.html
- "These variadic functions have a special local variable declared for them,
_argptr, which is a void* pointer to the first of the variadic arguments."
- the code example on that page using std.stdarg

> I'm not sure how it could be rewritten to support DMD's direct access ? But David can probably give a much better explanation of the va_lists.

What do you mean by this?


-- 

September 18, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=670


larsivar@igesund.net changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |larsivar@igesund.net




------- Comment #4 from larsivar@igesund.net  2007-09-18 07:50 -------
(In reply to comment #2)
> According to the spec, only DMD exists. It doesn't mention portability.
> 
> va_list is not a char* always, it's a "target-specific type". Don't cast. It needs the builtin va_list and the va_arg template for it to work...
> 
> I'm not sure how it could be rewritten to support DMD's direct access ? But David can probably give a much better explanation of the va_lists.
> 

Considering that the target-specific type usually is based on some C specification, it is not particularly useful for D, as has been shown with Tango's use of indexing into the vararg list on platforms like x86_64. For this feature to be useful, it needs to be defined in a way that makes it portable, and afaik, David tries to fix this. The reason it wasn't implemented this way before, was that the C version already present in gcc was used.


-- 

September 18, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=670





------- Comment #5 from afb@algonet.se  2007-09-18 08:05 -------
(In reply to comment #3)

> > According to the spec, only DMD exists. It doesn't mention portability.
> 
> Where is this bit of the spec that states that no other compiler exists?

I'm just ticked that it's nigh impossible to add the predefined versions.

> > I'm not sure how it could be rewritten to support DMD's direct access ? But David can probably give a much better explanation of the va_lists.
> 
> What do you mean by this?

I'm not sure that std.c.stdarg can be done much better. But std.stdarg can probably be, as larsivi is mentioning. Especially for x86_64, it's needed.


-- 

November 09, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=670


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bugzilla@digitalmars.com


--- Comment #6 from Walter Bright <bugzilla@digitalmars.com> 2010-11-08 16:12:09 PST ---
va_list is a void* on 64 bit targets, too. I originally had it as a pointer to that wacky struct required for the 64 bit C ABI, but it works better to treat it as a void*, and in the implementation of va_arg do the casting as necessary. This helps preserve encapsulation.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
January 16, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=670



--- Comment #7 from Iain Buclaw <ibuclaw@ubuntu.com> 2011-01-16 06:45:15 PST ---
(In reply to comment #6)
> va_list is a void* on 64 bit targets, too. I originally had it as a pointer to that wacky struct required for the 64 bit C ABI, but it works better to treat it as a void*, and in the implementation of va_arg do the casting as necessary. This helps preserve encapsulation.

I'm currently at the point where I'm prototyping passing varargs in a packed structure (generated on the fly by the caller) on the stack. And using C varargs to get the address to assign to _argptr.


Think:

foo (parm, ...)
{
    va_start(__cargptr, parm);
    _argptr = va_arg(__cargptr, void*);
}

foo(&__argstruct);


So far it seems to be working well on 32bit architectures for simple datatypes...


Needs more testing though before I'd consider it fit for pushing out there.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
March 27, 2011
http://d.puremagic.com/issues/show_bug.cgi?id=670


Iain Buclaw <ibuclaw@ubuntu.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED


--- Comment #8 from Iain Buclaw <ibuclaw@ubuntu.com> 2011-03-27 07:35:26 PDT ---
https://bitbucket.org/goshawk/gdc/changeset/9a8cbe47da29 https://bitbucket.org/goshawk/gdc/changeset/521dce459f71#chg-d/d-builtins2.cc https://bitbucket.org/goshawk/gdc/changeset/d553b62db8e6#chg-d/d-builtins2.cc https://bitbucket.org/goshawk/gdc/changeset/ae8524183c6f

Required some nasty frontend hacks to trick the GCC backend into thinking it was dealing with a C ABI va_list type (and to not ICE it's way to Budapest and back), but pretty much done now.


- va_list treated is as void*
- __va_list is the C ABI va_list.


I'd not be too surprised if architectures where va_list is neither a pointer or array are broken now (such as ARM, where I'd imagine there'd be a nop cast from void* to struct) - but see how it goes when it hits the Debian repository...

Closing this report as fixed, and *don't* raise a bug about 64bit va_args, va_argsave, or whatever. As that ugly mess will never be implemented ( on my watch :)

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------