Thread overview | |||||
---|---|---|---|---|---|
|
July 12, 2012 stdarg x86_64 problems... | ||||
---|---|---|---|---|
| ||||
When I compile the following code with -m32 and -m64 i get a totally different result, the documentation suggests that they should be the same... import core.stdc.stdarg, std.stdio; void main() { foo(0,5,4,3); } void foo(int dummy, ...) { va_list ap; for(int i; i<10; ++i) { version(X86_64) { va_start(ap, __va_argsave); } else version(X86) { va_start(ap, dummy); } else static assert(false, "Unsupported platform"); int tmp; va_arg!(int)(ap,tmp); writeln(ap," ", tmp); } } when compiled with -m32 I get: FF960278 5 FF960278 5 FF960278 5 FF960278 5 FF960278 5 and with -m64 I get: 7FFFCDF941D0 5 7FFFCDF941D0 4 7FFFCDF941D0 3 7FFFCDF941D0 38 7FFFCDF941D0 -839302560 (the end stuff is garbage, different every time) I'm uncertain, even after looking over the stdarg src, why this would happen. The correct output is all 5s obviously. |
July 12, 2012 Re: stdarg x86_64 problems... | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Thursday, July 12, 2012 11:12:08 John Colvin wrote: > When I compile the following code with -m32 and -m64 i get a totally different result, the documentation suggests that they should be the same... > > import core.stdc.stdarg, std.stdio; > > void main() { > foo(0,5,4,3); > } > > void foo(int dummy, ...) { > va_list ap; > > for(int i; i<10; ++i) { > version(X86_64) { > va_start(ap, __va_argsave); > } > else version(X86) { > va_start(ap, dummy); > } > else > static assert(false, "Unsupported platform"); > > int tmp; > va_arg!(int)(ap,tmp); > writeln(ap," ", tmp); > } > } > > when compiled with -m32 I get: > > FF960278 5 > FF960278 5 > FF960278 5 > FF960278 5 > FF960278 5 > > and with -m64 I get: > > 7FFFCDF941D0 5 > 7FFFCDF941D0 4 > 7FFFCDF941D0 3 > 7FFFCDF941D0 38 > 7FFFCDF941D0 -839302560 > > (the end stuff is garbage, different every time) > > I'm uncertain, even after looking over the stdarg src, why this would happen. The correct output is all 5s obviously. I expect that it's a bug. Please report it: http://d.puremagic.com/issues 64-bit support is relatively new, and while it works well overall, there _are_ a few serious bugs with it - particularly with regards to interacting with C (e.g. http://d.puremagic.com/issues/show_bug.cgi?id=5570 ). It's being worked on, but it's obviously still buggy in the interim, and it sounds like you found another bug with it. - Jonathan M Davis |
July 12, 2012 Re: stdarg x86_64 problems... | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On 12/07/12 11:12, John Colvin wrote:
> When I compile the following code with -m32 and -m64 i get a totally
> different result, the documentation suggests that they should be the
> same...
>
> import core.stdc.stdarg, std.stdio;
>
> void main() {
> foo(0,5,4,3);
> }
>
> void foo(int dummy, ...) {
> va_list ap;
>
> for(int i; i<10; ++i) {
> version(X86_64) {
> va_start(ap, __va_argsave);
> }
> else version(X86) {
> va_start(ap, dummy);
> }
> else
> static assert(false, "Unsupported platform");
>
> int tmp;
> va_arg!(int)(ap,tmp);
> writeln(ap," ", tmp);
> }
> }
>
> when compiled with -m32 I get:
>
> FF960278 5
> FF960278 5
> FF960278 5
> FF960278 5
> FF960278 5
>
> and with -m64 I get:
>
> 7FFFCDF941D0 5
> 7FFFCDF941D0 4
> 7FFFCDF941D0 3
> 7FFFCDF941D0 38
> 7FFFCDF941D0 -839302560
>
> (the end stuff is garbage, different every time)
>
> I'm uncertain, even after looking over the stdarg src, why this would
> happen. The correct output is all 5s obviously.
Known bug, already fixed in git for a couple of months.
|
Copyright © 1999-2021 by the D Language Foundation