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 <obji...@gmail.com> 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 <wangshuai...@gmail.com> 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
> Users-prolog@gnu.org
> 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);
  }
}
}

Attachment: Makefile.bak
Description: Binary data

_______________________________________________
Users-prolog mailing list
Users-prolog@gnu.org
https://lists.gnu.org/mailman/listinfo/users-prolog

Reply via email to