[commit: testsuite] master: Fix capi_value on Windows (832fa64)

Simon Marlow marlowsd at gmail.com
Tue May 29 11:17:25 CEST 2012


On 27/05/2012 15:10, Ian Lynagh wrote:
> On Tue, May 01, 2012 at 04:52:37AM -0500, Gabriel Dos Reis wrote:
>> On Tue, May 1, 2012 at 3:05 AM, Simon Marlow<marlowsd at gmail.com>  wrote:
>>
>>>     This appears to be a bug in the gcc that we're currently using.
>>>
>>>     Compiling this, with -O:
>>>
>>>     const int i;
>>>     int f(void) {return i;}
>>>
>>>     results in this assembly:
>>>
>>>             pushl   %ebp
>>>             movl    %esp, %ebp
>>>             movl    $0, %eax<--- the $0 is wrong, should be _i
>>>             leave
>>>             ret
>
> I think the asm is actually correct. We've declared a variable 'i',
> which either can or must (I don't know what the standard says OTTOMH) be
> initialised to 0. We can't change it as it's const, so as long as it's
> being initialised to 0, returning 0 is right.

AIUI, a declaration like

   const int i;

is a "common" declaration, such that if in another compilation unit there is

   const int i = 3;

then the two things refer to the same entity.  So even though we can't 
change i, we also can't assume that it has the value zero.

I did try to look it up in the C standard but failed to find the right 
bit amongst all the stuff about "linkage", so maybe I'm wrong here.

Cheers,
	Simon



>>>     Turning off -O makes it work.
>>>
>>>     Maybe time to update our mingw gcc bundles?
>>
>> yes, it is a bug in that version of GCC/gcc.  Does explicit use of 'extern'
>> makes the bug go away? E.g.
>>
>>      extern const int i;
>>
>> (that should be semantically equivalent to the original program.)
>
> extern does both give the behaviour that Simon expected, and fix
> capi_value on Windows.
>
>
> Thanks
> Ian
>
>
> _______________________________________________
> Cvs-ghc mailing list
> Cvs-ghc at haskell.org
> http://www.haskell.org/mailman/listinfo/cvs-ghc




More information about the Cvs-ghc mailing list