Problems understanding Spineless Tagless G-Machine

Simon Marlow simonmarhaskell at gmail.com
Wed May 24 08:43:11 EDT 2006


I didn't see the message that started this thread, but I'll reply anyway...

Esa Ilari Vuokko wrote:
> 
>>Monday, May 22, 2006, 12:35:21 AM, you wrote:
>>
>>
>>>I am still puzzled by function arities, only thing I can see is that
>>>IO-function seems to have arity one too big.
>>
>>from GHC/IOBase.lhs:
>>
>>newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
> 
> Yeah, that should explain it partly.  For example putStrLn's
> InfoTable says arity 2 Ok, expanded:
> String -> (State# RealWorld) -> (# State# ReadWorld, () #)
> But the function type is ARG_P.   Which means one parameter in stack
> (and it's a pointer).  This might be due to RealWorld getting
> optimised away, but it still makes function arity-field pretty
> useless as far as I can see.  Well, useless and pretty misleading :)

The arity field and the function type have different meanings.  The 
difference is subtle but very important.

A function of arity 2 must be applied to two arguments, even if one of 
them is void (eg. State# RealWorld).  A function of type (State# 
RealWorld -> T) is very different from a value of type T: doing seq on 
it is a nop, for example.  The arity is used by the generic apply 
machinery in the RTS (AutoApply.hc, generated by genapply).

The function type (I presume you mean field f.fun_type in 
StgFunInfoTable, also called the "argument descriptor") is a value that 
has two uses:

  - it tells the RTS how to call the function; that is, which args
    to put in which registers or stack slots, and

  - it describes the layout of the stack when the function returns to
    the RTS for some reason (eg. to garbage collect)

In our calling convention, void arguments are ignored: no code is 
generated for passing a void argument, and no stack space is reserved. 
So a function taking two arguments, one pointer and one void, has 
exactly the same argument descriptor as a function that just takes a 
single pointer argument.

For more info you could take a look at compiler/codeGen/CgCallConv.hs. 
Hope this helps, let me know if there's anything else you need.

Cheers,
	Simon


More information about the Cvs-ghc mailing list