I've been working on getting MPIR to compile on Sun CC with --enable-
cxx. I've fixed the attribute errors by only defining ATTRIBUTE_* when
__GNUC__ is defined. This fixes lots of build warnings actually,
though if __GNUC__ is not defined for a compiler which supports
attributes, then MPIR could potentially be slightly slower (probably
infinitesimally).

But I'm stuck with the following:

/* this is much the same as gmp_allocated_string in gmp-impl.h
   since gmp-impl.h is not publicly available, I redefine it here
   I use a different name to avoid possible clashes */
struct __gmp_alloc_cstring
{
  char *str;
  __gmp_alloc_cstring(char *s) { str = s; }
  ~__gmp_alloc_cstring()
  {
    void (*freefunc) (void *, size_t);
    mp_get_memory_functions (NULL, NULL, &freefunc);
    (*freefunc) (str, std::strlen(str)+1);
  }
};

The Sun CC compiler says:

"../../gmpxx.h", line 1303: Error: Formal argument 3 of type extern
"C" void(*)(void*,unsigned long)* in call to __gmp_get_memory_functions
(extern "C" void*(*)(unsigned long)*, extern "C" void*(*)
(void*,unsigned long,unsigned long)*, extern "C" void(*)
(void*,unsigned long)*) is being passed void(*)(void*,unsigned long)*.
"../../gmpxx.h", line 1304: Warning: The variable freefunc has not yet
been assigned a value.

It took me a while to figure out what the code is trying to do.
Basically __gmp_free_func is the default function for freeing memory
allocated by GMP internally. But the user can actually define their
own memory management functions if they want. There's an interface for
that, and GMP stores function pointers for the memory managment
functions the user specifies.

Now if you want to free space allocated by the current memory
management function, then you better not call __gmp_free_func, as the
user may have replaced it as the current memory management function.
Instead you want to call the function the user defined for this
purpose. So you need to retrieve the function pointer GMP has stored
for this user defined deallocation function.

That's what the function mp_get_memory_functions does. If you pass it
a reference to a function pointer as the third argument, it will set
that function pointer to point to the user defined deallocation
function.

So in the destructor for this struct, it first declares a function
pointer, called freefunc. Then it calls mp_get_memory_functions with a
reference to freefunc as its third argument, and this sets that
function pointer to be the user defined allocation function. Then it
actually calls this deallocation function to deallocate the space
allocated by the initialiser for the struct.

Now the problem is, for some stupid reason, the sun CC thinks
mp_get_memory_functions doesn't take a reference to a function
pointer, but a reference to an extern "C" function pointer. I've no
idea where it gets that from. The function mp_get_memory_functions is
defines in mp_get_gns.c and its prototype is actually:

void
mp_get_memory_functions (void *(**alloc_func) (size_t),
                         void *(**realloc_func) (void *, size_t, size_t),
                         void (**free_func) (void *, size_t))

Does anyone see how to fix this problem?

I'm stumped.

Bill.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"mpir-devel" group.
To post to this group, send email to mpir-devel@googlegroups.com
To unsubscribe from this group, send email to 
mpir-devel+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/mpir-devel?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to