Hello Sean,
I attached all the source code and Makefile here. The Prolog function* foo* is called by ssa_c.c function, (babel_foo_wrapper) Then at line 57 of* test_pl.pl <http://test_pl.pl>*, it calls function *foo3* through* c wrapper*. The program can never reach line 58 of *test_pl.pl <http://test_pl.pl>*, even though I am sure it successfully return from *foo3*, as well as* babel_c_0* (which is line 63 of* test_c.c*) Yes, I myself also write several Prolog call C, C call prolog code before, and it could work.. That's why I feel so weird this time.. Thank you! Best, Shuai On Thu, Jul 24, 2014 at 2:13 AM, Sean Charles <[email protected]> wrote: > Hi, > > It would greatly help if you could attach *ALL* source code and the > commands you are using to compile and link. > > I have written C extensions that are called from Prolog and they work just > fine so there must be something in your code that’s not right yet! > > Show us your code and we will try to help! > > Sean. > > > > On 24 Jul 2014, at 03:26, Shuai Wang <[email protected]> wrote: > > Hello gnu-prolog users, > > > On my 64bit x86 Linux, I am trying to implement this process. > > I have two source code, written in C and Prolog. > In the Prolog code, I have two functions foo and foo1. > > So basically inside Prolog function foo, it calls function foo1 *through > a C wrapper,* then after function foo1 finished, it will return through > wrapper back to foo > > it is something like : > > --------------------------------------------------- > Prolog | C > --------------------------------------------------- > > foo ----- call ---- > foo1_wrapper normal > foo1 <-----call ----- foo1_wrapper normal > foo1 -------return---> foo1_wrapper normal > foo <-----return---- foo1_wrapper *fail!* > > > The problem is that, it can never return back to function foo after > foo1_wrapper returns.. > > I have done several test(printf, write, valgrind and others...), and I am > pretty sure that foo1 returns right value, and foo1_wrapper returns foo1's > return value as well. > > I am really confused right now, I should be able to look into the details, > however, I just don't know which way to go... > > Has anyone have certain problems like this...? > > > Best Regards, > Shuai > _______________________________________________ > Users-prolog mailing list > [email protected] > https://lists.gnu.org/mailman/listinfo/users-prolog > > >
#include <gprolog.h>
#include <stdio.h>
#include <stdlib.h>
PlBool babel_ptrR(PlLong* p, PlLong* star_p, PlLong len)
{
if (star_p == NULL)
return PL_FALSE;
else
{
switch(len)
{
case 1:
*p = *(char*)star_p;
break;
case 2:
*p = *(short*)star_p;
break;
case 4:
*p = *(int*)star_p;
break;
case 8:
*p = *(long long*)star_p;
break;
default :
printf("undefined exp length in babel_ptrR\n");
}
}
*p = 0x7fffffffffff&*p;
return PL_TRUE;
}
PlBool babel_ptrE(PlLong* p, PlLong e, PlLong len)
{
if (p == NULL)
return PL_FALSE;
switch(len)
{
case 1:
*(char*)p = (char)e;
break;
case 2:
*(short*) p = (short)e;
break;
case 4:
*(int*)p = (int)e;
break;
case 8:
*(long long*)p = (long long)e;
break;
default :
printf("undefined exp length in babel_ptrL\n");
}
return PL_TRUE;
}
PlBool babel_c_0(int arg_0, int * babel_ret)
{
*babel_ret = foo3(arg_0);
return PL_TRUE;
}
PlBool babel_c_1(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_2(int * arg_0, int * arg_1, int arg_2, int arg_3)
{
foo_cil_lr_1(arg_0, arg_1, arg_2, arg_3);
return PL_TRUE;
}
PlBool babel_c_3(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_4(int * arg_0, int arg_1, int arg_2)
{
foo3_cil_lr_1(arg_0, arg_1, arg_2);
return PL_TRUE;
}
PlBool babel_c_5(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_6(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_7(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_8(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_9(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_10(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_11(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_12(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_13(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_14(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_15(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
PlBool babel_c_16(char* arg_0, int arg_1)
{
printf(arg_0, arg_1);
return PL_TRUE;
}
babelJcc(OP, L, R) :-
( OP =:= 12 -> L =:= R
; OP =:= 13 -> L \= R
; OP =:= 14 -> L > R
; OP =:= 15 -> L =< R
; OP =:= 16 -> L < R
; OP =:= 17 -> L >= R
).
:-foreign(babel_ptrR(-integer, +integer, +integer)).
:-foreign(babel_ptrE(+integer, +integer, +integer)).
babelPtrR(E, P, L) :- babel_ptrR(T, P, L), E is T.
babelPtrL(P, E, L) :- babel_ptrE(P, E, L).
babelAssign(Var, Val) :- Var is Val.
babelAssignStr(Var, Val) :- Var = Val.
babelAssignBool(Var, Val) :- Var = Val.
babelArrayL([_|T], 0, X, [X|T]).
babelArrayL([H|T], I, X, [H|R]):- I > -1, NI is I-1, babelArrayL(T, NI, X, R), !.
babelArrayL(L, _, _, L).
babelArrayR(X, [X|_], 0).
babelArrayR(X, [_|T], I):- I > 0, NI is I-1, babelArrayR(X, T, NI), !.
:- foreign(babel_c_0(+integer, -integer)).
:- foreign(babel_c_1(+string, +integer)).
:- foreign(babel_c_2(+integer, +integer, +integer, +integer)).
:- foreign(babel_c_3(+string, +integer)).
foo(__CIL_FP_A, __CIL_FP_FACT, __CIL_PP_A, __CIL_PP_FACT, N, __RETRES23) :-
babelAssign(A, 0),
babelAssign(FACT, 0),
babelAssign(C, 0),
babelAssign(R, 0),
babelAssign(TMP, 0),
babelAssign(__CIL_TMP11, 0),
babelAssign(A_SSA_1, 1),
babelAssign(FACT_SSA_1, 1),
BabelExp_0 is A_SSA_1 + 1,
babelAssign(A_SSA_2, BabelExp_0),
(babelJcc(14, A_SSA_2, 2) ->
babelAssign(__CIL_TMP11_SSA_1, 1)
; babelAssign(__CIL_TMP11_SSA_1, 0)),
(babelJcc(13, __CIL_TMP11_SSA_1, 0) ->
BabelExp_1 is A_SSA_2 + 2,
babelAssign(A_SSA_3, BabelExp_1)
; babelAssign(A_SSA_3, 4)),
babel_c_0(4 , TMP_SSA_1),
babelAssign(R_SSA_1, TMP_SSA_1),
babel_c_1('%d\n', R_SSA_1),
babelAssign(C_SSA_1, 1),
BabelExp_2 is A_SSA_3,
babelPtrL(__CIL_FP_A, BabelExp_2, 4),
BabelExp_3 is FACT_SSA_1,
babelPtrL(__CIL_FP_FACT, BabelExp_3, 4),
babel_c_2(__CIL_PP_A, __CIL_PP_FACT, N, C_SSA_1),
BabelExp_4 is __CIL_FP_A,
babelPtrR(A_SSA_4, BabelExp_4, 4),
BabelExp_5 is __CIL_FP_FACT,
babelPtrR(FACT_SSA_2, BabelExp_5, 4),
babel_c_3('%d\n', FACT_SSA_2),
BabelExp_6 is A_SSA_4 + 3,
babelAssign(A_SSA_5, BabelExp_6),babelAssign(__RETRES23, 0).
:- foreign(babel_c_4(+integer, +integer, +integer)).
foo3(__CIL_FP_FACT, __CIL_PP_FACT, N, FACT_SSA_2) :-
babelAssign(FACT, 0),
babelAssign(C, 0),
babelAssign(FACT_SSA_1, 0),
babelAssign(C_SSA_1, 0),
babelAssign(C_SSA_2, 1),
BabelExp_7 is FACT_SSA_1,
babelPtrL(__CIL_FP_FACT, BabelExp_7, 4),
babel_c_4(__CIL_PP_FACT, N, C_SSA_2),
BabelExp_8 is __CIL_FP_FACT,
babelPtrR(FACT_SSA_2, BabelExp_8, 4).
:- foreign(babel_c_5(+string, +integer)).
:- foreign(babel_c_6(+string, +integer)).
:- foreign(babel_c_7(+string, +integer)).
:- foreign(babel_c_8(+string, +integer)).
foo4(__CIL_FP_A, __CIL_PP_A, __RETRES28) :-
babelAssign(A, 0),
babelAssign(B, 0),
babelAssign(C, 0),
BabelExp_9 is 0,
babelAssign(P, BabelExp_9),
babelAssign(FACT, 0),
babelAssign(N, 0),
babelAssign(__CIL_TMP9, 0),
babelAssign(__CIL_TMP10, 0),
babelAssign(__CIL_TMP11, 0),
babelAssign(__CIL_TMP12, 0),
babelAssign(A_SSA_1, 2),
babelAssign(B_SSA_1, 1),
babelAssign(C_SSA_1, 3),
babelAssign(P_SSA_1, __CIL_PP_A),
babelAssign(FACT_SSA_1, 1),
babelAssign(N_SSA_1, 10),
(babelJcc(12, B_SSA_1, 1) ->
babelAssign(__CIL_TMP9_SSA_1, 1)
; babelAssign(__CIL_TMP9_SSA_1, 0)),
(babelJcc(13, __CIL_TMP9_SSA_1, 0) ->
babelAssign(A_SSA_2, 3),
(babelJcc(12, C_SSA_1, 2) ->
babelAssign(__CIL_TMP10_SSA_1, 1)
; babelAssign(__CIL_TMP10_SSA_1, 0)),
(babelJcc(13, __CIL_TMP10_SSA_1, 0) ->
babelAssign(B_SSA_2, 2)
; babelAssign(B_SSA_2, 4)),
BabelExp_10 is 2,
babelPtrL(P_SSA_1, BabelExp_10, 4),
BabelExp_11 is __CIL_FP_A,
babelPtrR(A_SSA_3, BabelExp_11, 4),
babelAssign(A_SSA_4, 5),
babelAssign(__CIL_TMP11_SSA_1, __CIL_TMP11)
; babelAssign(A_SSA_2, 4),
(babelJcc(12, C_SSA_1, 2) ->
babelAssign(__CIL_TMP11_SSA_1, 1)
; babelAssign(__CIL_TMP11_SSA_1, 0)),
(babelJcc(13, __CIL_TMP11_SSA_1, 0) ->
babelAssign(B_SSA_2, 5)
; babelAssign(B_SSA_2, 6)),
BabelExp_12 is 3,
babelPtrL(P_SSA_1, BabelExp_12, 4),
BabelExp_13 is __CIL_FP_A,
babelPtrR(A_SSA_3, BabelExp_13, 4),
babelAssign(A_SSA_4, 7),
babelAssign(__CIL_TMP10_SSA_1, __CIL_TMP10)),
babelAssign(B_SSA_3, A_SSA_4),
babel_c_5('a : %d\n', A_SSA_4),
babel_c_6('b : %d\n', B_SSA_3),
babel_c_7('c : %d\n', C_SSA_1),
BabelExp_14 is A_SSA_4,
babelPtrL(__CIL_FP_A, BabelExp_14, 4),
BabelExp_15 is P_SSA_1,
babelPtrR(__CIL_TMP12_SSA_1, BabelExp_15, 4),
babel_c_8('p : %d\n', __CIL_TMP12_SSA_1),babelAssign(__RETRES28, 0).
:- foreign(babel_c_9(+string, +integer)).
:- foreign(babel_c_10(+string, +integer)).
:- foreign(babel_c_11(+string, +integer)).
:- foreign(babel_c_12(+string, +integer)).
:- foreign(babel_c_13(+string, +integer)).
:- foreign(babel_c_14(+string, +integer)).
:- foreign(babel_c_15(+string, +integer)).
:- foreign(babel_c_16(+string, +integer)).
foo1(__CIL_FP_B, __CIL_PP_B, A, B_SSA_3) :-
babelAssign(B, 0),
BabelExp_16 is 0,
babelAssign(P, BabelExp_16),
babelAssign(C, 0),
babelAssign(__CIL_TMP7, 0),
babelAssign(__CIL_TMP8, 0),
babelAssign(B_SSA_1, A),
BabelExp_17 is B_SSA_1,
babelPtrL(__CIL_FP_B, BabelExp_17, 4),
babelAssign(P_SSA_1, __CIL_PP_B),
BabelExp_18 is B_SSA_1,
babelPtrL(__CIL_FP_B, BabelExp_18, 4),
BabelExp_19 is P_SSA_1,
babelPtrR(C_SSA_1, BabelExp_19, 4),
BabelExp_20 is B_SSA_1,
babelPtrL(__CIL_FP_B, BabelExp_20, 4),
BabelExp_21 is 5,
babelPtrL(P_SSA_1, BabelExp_21, 4),
BabelExp_22 is __CIL_FP_B,
babelPtrR(B_SSA_2, BabelExp_22, 4),
babel_c_9('a : %d\n', A),
babel_c_10('b : %d\n', B_SSA_2),
babel_c_11('c : %d\n', C_SSA_1),
BabelExp_23 is B_SSA_2,
babelPtrL(__CIL_FP_B, BabelExp_23, 4),
BabelExp_24 is P_SSA_1,
babelPtrR(__CIL_TMP7_SSA_1, BabelExp_24, 4),
babel_c_12('p : %d\n', __CIL_TMP7_SSA_1),
babelAssign(B_SSA_3, 6),
babelAssign(C_SSA_2, 7),
babel_c_13('a : %d\n', A),
babel_c_14('b : %d\n', B_SSA_3),
babel_c_15('c : %d\n', C_SSA_2),
BabelExp_25 is B_SSA_3,
babelPtrL(__CIL_FP_B, BabelExp_25, 4),
BabelExp_26 is P_SSA_1,
babelPtrR(__CIL_TMP8_SSA_1, BabelExp_26, 4),
babel_c_16('p : %d\n', __CIL_TMP8_SSA_1).
/* Generated by CIL v. 1.5.1 */
/* print_CIL_Input is true */
#include <gprolog.h>
int babel_wrapper_foo1(int * __cil_fp_b, int * __cil_pp_b, int a) // function name insert
{
// wrapper for function foo1 // function name insert
int return_value; // return value type (how about array type)
//rountine code
int func;
PlTerm arg[4]; // function variable + return value insert
PlBool res;
func = Pl_Find_Atom("foo1"); // function name insert
//routine code
Pl_Query_Begin(PL_FALSE);
//prepare parameters
//partial routine code, pass in parameter // we need to init arguments and return value
// arg[0] = Pl_Mk_Integer(n);
arg[0] = Pl_Mk_Integer(__cil_fp_b);
arg[1] = Pl_Mk_Integer(__cil_pp_b);
arg[2] = Pl_Mk_Integer(a);
//routine code, reserve a place for return value
arg[3] = Pl_Mk_Variable();
//partial routine code, 2 is not routine. (number of arguments) + 1
res = Pl_Query_Call(func, 4, arg); // insert (variable+return value)
//get return value, partial routine code, 1 is not routine
return_value = Pl_Rd_Integer(arg[3]); // insert ()
//routine code
Pl_Query_End(PL_KEEP_FOR_PROLOG);
//routine code
return return_value;
}
int babel_wrapper_foo4(int * __cil_fp_a, int * __cil_pp_a) // function name insert
{
// wrapper for function foo4 // function name insert
int return_value; // return value type (how about array type)
//rountine code
int func;
PlTerm arg[3]; // function variable + return value insert
PlBool res;
func = Pl_Find_Atom("foo4"); // function name insert
//routine code
Pl_Query_Begin(PL_FALSE);
//prepare parameters
//partial routine code, pass in parameter // we need to init arguments and return value
// arg[0] = Pl_Mk_Integer(n);
arg[0] = Pl_Mk_Integer(__cil_fp_a);
arg[1] = Pl_Mk_Integer(__cil_pp_a);
//routine code, reserve a place for return value
arg[2] = Pl_Mk_Variable();
//partial routine code, 2 is not routine. (number of arguments) + 1
res = Pl_Query_Call(func, 3, arg); // insert (variable+return value)
//get return value, partial routine code, 1 is not routine
return_value = Pl_Rd_Integer(arg[2]); // insert ()
//routine code
Pl_Query_End(PL_KEEP_FOR_PROLOG);
//routine code
return return_value;
}
int babel_wrapper_foo3(int * __cil_fp_fact, int * __cil_pp_fact, int n) // function name insert
{
// wrapper for function foo3 // function name insert
int return_value; // return value type (how about array type)
//rountine code
int func;
PlTerm arg[4]; // function variable + return value insert
PlBool res;
func = Pl_Find_Atom("foo3"); // function name insert
//routine code
Pl_Query_Begin(PL_FALSE);
//prepare parameters
//partial routine code, pass in parameter // we need to init arguments and return value
// arg[0] = Pl_Mk_Integer(n);
arg[0] = Pl_Mk_Integer(__cil_fp_fact);
arg[1] = Pl_Mk_Integer(__cil_pp_fact);
arg[2] = Pl_Mk_Integer(n);
//routine code, reserve a place for return value
arg[3] = Pl_Mk_Variable();
//partial routine code, 2 is not routine. (number of arguments) + 1
res = Pl_Query_Call(func, 4, arg); // insert (variable+return value)
//get return value, partial routine code, 1 is not routine
return_value = Pl_Rd_Integer(arg[3]); // insert ()
//routine code
Pl_Query_End(PL_KEEP_FOR_PROLOG);
//routine code
return return_value;
}
int babel_wrapper_foo(int * __cil_fp_a, int * __cil_fp_fact, int * __cil_pp_a, int * __cil_pp_fact, int n) // function name insert
{
// wrapper for function foo // function name insert
int return_value; // return value type (how about array type)
//rountine code
int func;
PlTerm arg[6]; // function variable + return value insert
PlBool res;
func = Pl_Find_Atom("foo"); // function name insert
//routine code
Pl_Query_Begin(PL_FALSE);
//prepare parameters
//partial routine code, pass in parameter // we need to init arguments and return value
// arg[0] = Pl_Mk_Integer(n);
arg[0] = Pl_Mk_Integer(__cil_fp_a);
arg[1] = Pl_Mk_Integer(__cil_fp_fact);
arg[2] = Pl_Mk_Integer(__cil_pp_a);
arg[3] = Pl_Mk_Integer(__cil_pp_fact);
arg[4] = Pl_Mk_Integer(n);
//routine code, reserve a place for return value
arg[5] = Pl_Mk_Variable();
//partial routine code, 2 is not routine. (number of arguments) + 1
res = Pl_Query_Call(func, 6, arg); // insert (variable+return value)
//get return value, partial routine code, 1 is not routine
return_value = Pl_Rd_Integer(arg[5]); // insert ()
//routine code
Pl_Query_End(PL_KEEP_FOR_PROLOG);
//routine code
return return_value;
}
#line 4 "ssa_c.c"
void foo3_cil_lr_1(int *__cil_ap_fact , int n , int c )
{
int __cil_tmp4 ;
int __cil_tmp5 ;
int __cil_tmp4_ssa_1 ;
int __cil_tmp5_ssa_1 ;
int c_ssa_1 ;
{
#line 6
__cil_tmp4 = 0;
#line 7
__cil_tmp5 = 0;
#line 39 "ssa_condition.c"
__cil_tmp4_ssa_1 = c <= n;
#line 39
if (__cil_tmp4_ssa_1 == 0) {
#line 40
goto return_label;
} else {
}
#line 40
__cil_tmp5_ssa_1 = *__cil_ap_fact;
#line 40
*__cil_ap_fact = __cil_tmp5_ssa_1 + c;
#line 39
c_ssa_1 = c + 1;
#line 42
foo3_cil_lr_1(__cil_ap_fact, n, c_ssa_1);
return_label: /* CIL Label */
#line 4 "ssa_c.c"
return;
}
}
#line 47 "ssa_condition.c"
void foo_cil_lr_1(int *__cil_ap_a , int *__cil_ap_fact , int n , int c )
{
int __cil_tmp5 ;
int __cil_tmp6 ;
int __cil_tmp5_ssa_1 ;
int __cil_tmp6_ssa_1 ;
int c_ssa_1 ;
{
#line 49
__cil_tmp5 = 0;
#line 50
__cil_tmp6 = 0;
#line 21
__cil_tmp5_ssa_1 = c <= n;
#line 21
if (__cil_tmp5_ssa_1 == 0) {
#line 22
goto return_label;
} else {
}
#line 22
__cil_tmp6_ssa_1 = *__cil_ap_fact;
#line 22
*__cil_ap_fact = __cil_tmp6_ssa_1 + c;
#line 21
c_ssa_1 = c + 1;
#line 24
foo_cil_lr_1(__cil_ap_a, __cil_ap_fact, n, c_ssa_1);
return_label: /* CIL Label */
#line 47
return;
}
}
#line 17
int foo3(int n ) ;
#line 19
extern int printf() ;
#line 1 "ssa_condition.c"
int foo(int n )
{
int a ;
int fact ;
int c ;
int r ;
int tmp ;
int *__cil_fp_a ;
int *__cil_fp_fact ;
int *__cil_pp_a ;
int *__cil_pp_fact ;
int __cil_tmp11 ;
int a_ssa_1 ;
int fact_ssa_1 ;
int a_ssa_2 ;
int __cil_tmp11_ssa_1 ;
int a_ssa_3 ;
int tmp_ssa_1 ;
int r_ssa_1 ;
int c_ssa_1 ;
int a_ssa_4 ;
int fact_ssa_2 ;
int a_ssa_5 ;
int __retres23 ;
{
#line 3
__cil_pp_fact = & fact;
#line 3
__cil_pp_a = & a;
#line 3
__cil_fp_fact = & fact;
#line 3
__cil_fp_a = & a;
#line 3
return babel_wrapper_foo(__cil_fp_a, __cil_fp_fact, __cil_pp_a, __cil_pp_fact, n);
#line 3
a = 0;
#line 4
fact = 0;
#line 5
c = 0;
#line 6
r = 0;
#line 7
tmp = 0;
#line 8
__cil_fp_a = & a;
#line 9
__cil_fp_fact = & fact;
#line 10
__cil_pp_a = & a;
#line 11
__cil_pp_fact = & fact;
#line 12
__cil_tmp11 = 0;
#line 3
a_ssa_1 = 1;
#line 4
fact_ssa_1 = 1;
#line 5
a_ssa_2 = a_ssa_1 + 1;
#line 8
__cil_tmp11_ssa_1 = a_ssa_2 > 2;
#line 8
if (__cil_tmp11_ssa_1 != 0) {
#line 10
a_ssa_3 = a_ssa_2 + 2;
} else {
#line 14
a_ssa_3 = 4;
}
#line 17
tmp_ssa_1 = foo3(4);
#line 17
r_ssa_1 = tmp_ssa_1;
#line 19
printf("%d\n", r_ssa_1);
#line 21
c_ssa_1 = 1;
#line 24
*__cil_fp_a = a_ssa_3;
#line 25
*__cil_fp_fact = fact_ssa_1;
#line 21
foo_cil_lr_1(__cil_pp_a, __cil_pp_fact, n, c_ssa_1);
#line 22
a_ssa_4 = *__cil_fp_a;
#line 23
fact_ssa_2 = *__cil_fp_fact;
#line 24
printf("%d\n", fact_ssa_2);
#line 26
a_ssa_5 = a_ssa_4 + 3;
#line 28
__retres23 = 0;
#line 1
return (__retres23);
}
}
#line 34 "ssa_condition.c"
int foo3(int n )
{
int fact ;
int c ;
int *__cil_fp_fact ;
int *__cil_pp_fact ;
int fact_ssa_1 ;
int c_ssa_1 ;
int c_ssa_2 ;
int fact_ssa_2 ;
{
#line 36
__cil_pp_fact = & fact;
#line 36
__cil_fp_fact = & fact;
#line 36
return babel_wrapper_foo3(__cil_fp_fact, __cil_pp_fact, n);
#line 36
fact = 0;
#line 37
c = 0;
#line 38
__cil_fp_fact = & fact;
#line 39
__cil_pp_fact = & fact;
#line 36
fact_ssa_1 = 0;
#line 37
c_ssa_1 = 0;
#line 39
c_ssa_2 = 1;
#line 42
*__cil_fp_fact = fact_ssa_1;
#line 39
foo3_cil_lr_1(__cil_pp_fact, n, c_ssa_2);
#line 40
fact_ssa_2 = *__cil_fp_fact;
#line 43
return (fact_ssa_2);
}
}
#line 49 "ssa_condition.c"
int foo4(void)
{
int a ;
int b ;
int c ;
int *p ;
int fact ;
int n ;
int *__cil_fp_a ;
int *__cil_pp_a ;
int __cil_tmp9 ;
int __cil_tmp10 ;
int __cil_tmp11 ;
int __cil_tmp12 ;
int a_ssa_1 ;
int b_ssa_1 ;
int c_ssa_1 ;
int *p_ssa_1 ;
int fact_ssa_1 ;
int n_ssa_1 ;
int __cil_tmp9_ssa_1 ;
int a_ssa_2 ;
int __cil_tmp10_ssa_1 ;
int b_ssa_2 ;
int a_ssa_3 ;
int a_ssa_4 ;
int __cil_tmp11_ssa_1 ;
int b_ssa_3 ;
int __cil_tmp12_ssa_1 ;
int __retres28 ;
{
#line 51
__cil_pp_a = & a;
#line 51
__cil_fp_a = & a;
#line 51
return babel_wrapper_foo4(__cil_fp_a, __cil_pp_a);
#line 51
a = 0;
#line 52
b = 0;
#line 53
c = 0;
#line 54
p = (int *)0;
#line 55
fact = 0;
#line 56
n = 0;
#line 57
__cil_fp_a = & a;
#line 58
__cil_pp_a = & a;
#line 59
__cil_tmp9 = 0;
#line 60
__cil_tmp10 = 0;
#line 61
__cil_tmp11 = 0;
#line 62
__cil_tmp12 = 0;
#line 53
a_ssa_1 = 2;
#line 54
b_ssa_1 = 1;
#line 55
c_ssa_1 = 3;
#line 57
p_ssa_1 = __cil_pp_a;
#line 59
fact_ssa_1 = 1;
#line 61
n_ssa_1 = 10;
#line 63
__cil_tmp9_ssa_1 = b_ssa_1 == 1;
#line 63
if (__cil_tmp9_ssa_1 != 0) {
#line 65
a_ssa_2 = 3;
#line 67
__cil_tmp10_ssa_1 = c_ssa_1 == 2;
#line 67
if (__cil_tmp10_ssa_1 != 0) {
#line 68
b_ssa_2 = 2;
} else {
#line 70
b_ssa_2 = 4;
}
#line 71
*p_ssa_1 = 2;
#line 72
a_ssa_3 = *__cil_fp_a;
#line 72
a_ssa_4 = 5;
#line 73
__cil_tmp11_ssa_1 = __cil_tmp11;
} else {
#line 76
a_ssa_2 = 4;
#line 77
__cil_tmp11_ssa_1 = c_ssa_1 == 2;
#line 77
if (__cil_tmp11_ssa_1 != 0) {
#line 78
b_ssa_2 = 5;
} else {
#line 80
b_ssa_2 = 6;
}
#line 81
*p_ssa_1 = 3;
#line 82
a_ssa_3 = *__cil_fp_a;
#line 82
a_ssa_4 = 7;
#line 83
__cil_tmp10_ssa_1 = __cil_tmp10;
}
#line 86
b_ssa_3 = a_ssa_4;
#line 89
printf("a : %d\n", a_ssa_4);
#line 90
printf("b : %d\n", b_ssa_3);
#line 91
printf("c : %d\n", c_ssa_1);
#line 92
*__cil_fp_a = a_ssa_4;
#line 92
__cil_tmp12_ssa_1 = *p_ssa_1;
#line 92
printf("p : %d\n", __cil_tmp12_ssa_1);
#line 94
__retres28 = 0;
#line 49
return (__retres28);
}
}
#line 98 "ssa_condition.c"
int foo1(int a )
{
int b ;
int *p ;
int c ;
int *__cil_fp_b ;
int *__cil_pp_b ;
int __cil_tmp7 ;
int __cil_tmp8 ;
int b_ssa_1 ;
int *p_ssa_1 ;
int c_ssa_1 ;
int b_ssa_2 ;
int __cil_tmp7_ssa_1 ;
int b_ssa_3 ;
int c_ssa_2 ;
int __cil_tmp8_ssa_1 ;
{
#line 100
__cil_pp_b = & b;
#line 100
__cil_fp_b = & b;
#line 100
return babel_wrapper_foo1(__cil_fp_b, __cil_pp_b, a);
#line 100
b = 0;
#line 101
p = (int *)0;
#line 102
c = 0;
#line 103
__cil_fp_b = & b;
#line 104
__cil_pp_b = & b;
#line 105
__cil_tmp7 = 0;
#line 106
__cil_tmp8 = 0;
#line 100
b_ssa_1 = a;
#line 101
*__cil_fp_b = b_ssa_1;
#line 101
p_ssa_1 = __cil_pp_b;
#line 102
*__cil_fp_b = b_ssa_1;
#line 103
c_ssa_1 = *p_ssa_1;
#line 104
*__cil_fp_b = b_ssa_1;
#line 105
*p_ssa_1 = 5;
#line 106
b_ssa_2 = *__cil_fp_b;
#line 106
printf("a : %d\n", a);
#line 107
printf("b : %d\n", b_ssa_2);
#line 108
printf("c : %d\n", c_ssa_1);
#line 109
*__cil_fp_b = b_ssa_2;
#line 109
__cil_tmp7_ssa_1 = *p_ssa_1;
#line 109
printf("p : %d\n", __cil_tmp7_ssa_1);
#line 112
b_ssa_3 = 6;
#line 113
c_ssa_2 = 7;
#line 115
printf("a : %d\n", a);
#line 116
printf("b : %d\n", b_ssa_3);
#line 117
printf("c : %d\n", c_ssa_2);
#line 118
*__cil_fp_b = b_ssa_3;
#line 118
__cil_tmp8_ssa_1 = *p_ssa_1;
#line 118
printf("p : %d\n", __cil_tmp8_ssa_1);
#line 124
return (b_ssa_3);
}
}
#line 129 "ssa_condition.c"
int main(int argc , char **argv )
{
int __retres3 ;
{
Pl_Start_Prolog(argc, argv);
#line 131
foo1(1);
#line 133
foo(5);
#line 135
__retres3 = 0;
{
Pl_Stop_Prolog();
#line 129
return (__retres3);
}
}
}
Makefile.bak
Description: Binary data
_______________________________________________ Users-prolog mailing list [email protected] https://lists.gnu.org/mailman/listinfo/users-prolog
