[MLton] x86_64 branch on AIX

Matthew Fluet fluet@cs.cornell.edu
Thu, 6 Jul 2006 07:26:36 -0400 (EDT)

> On PowerPC/AIX, `char' is unsigned.  GCC treats this correctly, and
> `char' is unsigned also with GCC.  I was mistaken to claim that GCC
> treats `char' as signed on AIX.
> The remaining problem then is that MLton seems to want that `char' is
> signed.  At least cenv.h checks for this, and signals a compiler error
> if CHAR_MIN is zero.
> I can certainly coerce the runtime to compile on AIX by removing the
> check for char signedness, but will something break?  The regression
> tests pass, which leads me to suspect that the check is superfluous.

The check probably is superfluous.  I added the check because it is an 
unspecified characteristic of C environments.

However, note that MLton treats the ML type 'char' as signed.  So, if you 
   val f = _import "f": char -> char;
then MLton will generate the following C prototype:
   int8_t f(int8_t);
and will compile the call to 'f' according to the C calling convention for 
this prototype.  That might (but usually doesn't) disagree with the C 
calling convention for the implemenation of 'f', which one might naturally 
write as:
   char f(char) { ... }

In any case, the C functions used by the runtime (basis-ffi.h) only pass 
character indirectly in vectors or arrays, so there shouldn't be much of a 
problem.  But, we might point out on the FFI documentation page that the 
ML type 'char' is the C type 'signed char'.  The default C type 'char' is 
available as C_Char.t, under either an INTEGER or WORD signature 
(depending on the signedness).