GHC FFI Return Type Bug

Sigbjorn Finne sof@galconn.com
Mon, 6 Aug 2001 14:42:28 -0700


"Julian Seward (Intl Vendor)" <v-julsew@microsoft.com> writes:
> 
> Hmm, we're looking at this.  However, I don't really know what
> C is or is not supposed to do here.  Given
> 
> char fooble ( ... )
> {
>    return 'z';
> }
> 
> on an x86, 'z' will be returned at the lowest 8 bits in %eax.
> What I don't know is, is the C compiler obliged to clear the
> upper 24 bits of %eax, or does that onus fall on the callee?

Yes, the callee is required to narrow <expr> in 'return <expr>;' to
fit that of the specified return type -- see 9.8 of Harbison and
Steele. So, a C compiler that cause f() to return 0x7fffffff for
the following,

unsigned char g()
{
    return 0x7fffffff;
}

unsigned int f()
{
    return g();
}

is in the wrong. [Notice that narrowing for signed integral types
is undefined in ISO C, but most current-day compilers implement
such narrowing ops the same way, i.e., by masking off excess bits.]

> Also, I don't even know where to look for the specification of
> details of the C calling conventions.  Anyone got a clue?
> 

Harbison & Steele Chapters 6 and 9 cover the conversion rules that
apply to functions (and other expressions). As you no doubt already
know, lower-level details are the domain of a platform's ABI.

Sounds to me like unboxed sized Words and Ints is the (unavoidable)
way to go.

--sigbjorn