[m-users.] Mercury macro trouble

Volker Wysk post at volker-wysk.de
Fri May 24 22:31:06 AEST 2024


Hi!

Some quotes from this list:

M. McDonough on 2023-07-19: 
"After some debugging, I now suspect that I know the answer, and it's that
MR_list_cons isn't safe to call directly outside of a foreign_proc because
it can interact with the Mercury register usage."

Peter Wang on 2023-07-20: 
"The problem is that the argument of MR_list_cons(), the call to
CreateNode(), is not evaluated before MR_list_cons() starts doing
anything. You should make the call CreateNode() first, assign the
result to a variable, then perform the MR_list_cons()."

M. McDonough on 2024-04-27: 
"I just want to note this, as it's caused me issues in the past. It's a
bad idea to have anything other than a variable or integral expression
(no function calls, no macros, etc) as the argument to MR_list_cons
(and I would generally say any of the MR_* macros unless you've read
them carefully). You can end up with issues where things are executed
in an unexpected order, and in particular on the low-level C grades,
this can cause big issues with Mercury registers being clobbered
leading to very hard to debug issues with seemingly impossible
behavior."

I think, this is bad and should be addressed.

The obvious solution would be to use inline C functions with the same names
as the macros, instead. Gcc's statement expressions aren't needed.

So I'm asking the Mercury team to scrap all those macros and use inline
functions instead. :-)

No, seriously, I can understand that the Mercury team is reluctant to touch
those long-proven macros.

This leads to the second best solution: Wrap those macros in inline
functions. And instruct the user to use them instead of the macros. For
instance, like this:

static inline MR_Word mr_list_cons(MR_Word head, MR_Word tail)
{
   MR_Word result = MR_list_cons(head, tail);
   return result;
}

This should amend the problem. Or am I missing something? It seems odd to me
that this obvious solution hasn't been implemented already.

Cheers,
Volker


More information about the users mailing list