[Aldor-l] Dangerous use of GMP

Pippijn van Steenhoven pip88nl at gmail.com
Thu Jun 26 16:33:21 EDT 2008


Hi List,

in libaldor, the file sal_fltgmp.as uses GMP functions in 'coerce' as
follows:

struct Fmt13 {
        FiWord X0_pr;
        FiWord X1_sz;
        FiWord X2_expo;
        FiWord X3_lmbs;
};
[...]
struct Fmt32 {
        FiDFlo X0_float;
};
[...]
static FiWord
CF24_coerce(FiEnv e1, FiWord P0_a)
{
        [...]
        PFmt13 T2, T3;
        PFmt32 T1;
        [...]
        T1 = fi0RecNew(struct Fmt32 , CENSUS_Rec);
        [...]
        T3 = fi0RecNew(struct Fmt13 , CENSUS_Rec);
        [...]
        T2 = T3;
L1:     __gmpf_init((FiWord) T2);
        __gmpf_set_d((FiWord) T2, T1);
        [...]
}

1) Fmt13 is not what __gmpf_init expects. What the function expects is
   more like
   struct mpf_struct {
        int X0_pr;
        int X1_sz;
        int X2_expo;
        Pointer X3_lmbs;
   };
   This is fine on 32 bit platforms, but on 64 bit platforms with the
   LP64 data model, this breaks horribly.
2) __gmpf_set_d expects the same struct as above as first argument and a
   plain double as second argument. T1, however, is a pointer to a struct
   containing a plain double. It will *always* receive garbage. Passing
   T1->X0_float would work, but currently, there is no support for
   something like that.

This seems to be an inherent problem with the way Aldor generates C code.
How should this be solved? I really don't have many ideas on this one.
The compiler expects the functions to nicely work with those arguments,
but they don't. The only solution I can think of is wrapping all foreign
functions.

-- 
Pippijn van Steenhoven
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://aldor.org/pipermail/aldor-l_aldor.org/attachments/20080626/a5efac60/attachment.bin 


More information about the Aldor-l mailing list