Re: --min-bips omits necessary library

Daniel Diaz <[email protected]> Thu, 13 Jul 2023 11:35:51 +0200
Newsgroups gmane.comp.gnu.prolog.bugs
Message-ID <[email protected]>
Hi Jasper,

First the solution ! Add the following directive:

:- ensure_linked((=)/2).

When compiling a meta-predicate (here \+), the compiler does not know 
the final goal that will be called (it will be known at run-time). If it 
is not "statically" referenced (like q is in p:-q.), it will not be 
linked with --min-bips. The directive explicitly asks for the link of a 
given predicate. This is needed if a meta-predicate can call a predicate 
which is not elsewhere statically referenced.

Here, for =/2 it is because it is inlined.

This case seems obvious for several reasons: it is the well-known 
negation \+, its goal is known, its goal is the most obvious predicate: 
unification.

I admit, the compiler could be optimized for meta-predicates and, in 
this case, detect the called goal is =/2 and so force its link (or 
better it could also inline it). But this is more difficult with complex 
goals (\+ (a,b ; c)). And, in any case, we can have variables (\+ X). 
The directive is unavoidable.

A solution to mimic the optimization: put the meta-called goal inside a 
sub-predicate.

main :-
     \+ sub_goal,
     write(hello), nl.

sub_goal :-
     [1,_,3] = [_,2,4].

:- initialization(main).

Btw: you can now report a problem/bug by opening an issue at 
https://github.com/didoudiaz/gprolog/issues.

Daniel


Le 10/07/2023 à 12:44, Jasper Taylor a écrit :
> The following produces an error when built with --min-bips but not 
> otherwise...
>
>
> cat hello.pl
>
> main :-
>     \+ [1,_,3] = [_,2,4],
>     write(hello), nl.
> :- initialization(main).
>
> jaspert@barbie:~/Build/Test$ gplc --no-top-level hello.pl
> jaspert@barbie:~/Build/Test$ ./hello
> hello
>
> jaspert@barbie:~/Build/Test$ gplc -v --no-top-level --min-bips hello.pl
> Prolog compiler (GNU Prolog) 1.6.0
> Copyright (C) 1999-2023 Daniel Diaz
>
> GNU Prolog comes with ABSOLUTELY NO WARRANTY.
> This is free software; see the source or the file
> named COPYING for copying conditions.
>
> Path used: /usr/local/gprolog-1.6.0
>
> *** Compiling
>
> --- file: hello.pl
> pl2wam -o /tmp/gplcwgQv0b.wam hello.pl
> wam2ma -o /tmp/gplcSmwRQd.ma /tmp/gplcwgQv0b.wam
> delete /tmp/gplcwgQv0b.wam
> ma2asm -o /tmp/gplcetcdHf.s /tmp/gplcSmwRQd.ma
> delete /tmp/gplcSmwRQd.ma
> as  -o /tmp/gplcAzSyxh.o /tmp/gplcetcdHf.s
> delete /tmp/gplcetcdHf.s
>
> *** Linking
>
> gcc  -fno-strict-aliasing -fcommon  -o hello /tmp/gplcAzSyxh.o 
> /usr/local/gprolog-1.6.0/lib/libbips_pl.a 
> /usr/local/gprolog-1.6.0/lib/libengine_pl.a 
> /usr/local/gprolog-1.6.0/lib/liblinedit.a -lm
> delete /tmp/gplcAzSyxh.o
>
> jaspert@barbie:~/Build/Test$ ./hello
>
> system_error(cannot_catch_throw(error(existence_error(procedure,(=)/2),(\+)/1))) 
>
> hello
>
> Regards
>
>     Jasper
>
>