[mercury-users] Conditional compilation

Ralph Becket rafe at cs.mu.OZ.AU
Tue Aug 16 14:57:29 AEST 2005


Peter Hawkins, Tuesday, 16 August 2005:
> Hi...
> 
> Is there a way of having conditionally compiled debugging code in Mercury?
> 
> I tried this:
> 
> :- pred debugging is semidet.
> debugging :- semidet_fail.
> or
> debugging :- semidet_succeed.
> 
> main(!IO) :-
>    (if debugging then
>       do stuff
>     else
>       true
>    )
> 
> Unfortunately the mercury compiler doesn't optimize away the 
> if-then-else, even if I add a :- pragma inline to the debugging 
> predicate. The only way to avoid a runtime slowdown is to declare the 
> debugging predicate like this:
> :- pred debugging is failure.
> or
> :- pred debugging is det.
> but this leads to a compiler warning whenever you actually use it.
> 
> Does anyone have any suggestions as to how I can have debugging code 
> that I can turn off?

C code is inlined by default, so you should do the following:

:- pragma foreign_proc("C",
	debugging,
	[will_not_call_mercury, promise_pure],
"
#ifdef WITH_DEBUGGING
	SUCCESS_INDICATOR = MR_TRUE;
#else
	SUCCESS_INDICATOR = MR_FALSE;
#endif
").

then the C compiler will optimize away the if-then-else test and
non-taken branch.  You can then select debugging by compiling with
`--cflags -DWITH_DEBUGGING' (this is how array bounds checking is
handled in array.m).

-- Ralph
--------------------------------------------------------------------------
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe
--------------------------------------------------------------------------



More information about the users mailing list