Re: Why failed in process of Prolog call C call Prolog?

Shuai Wang <[email protected]>
Newsgroups gmane.comp.gnu.prolog.general
Message-ID <CAEQMQom6FWmn97612m=a4zdCDrCvkoHvchpX8K++uCG+oEi1KA@mail.gmail.com>
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
>
>
>

_______________________________________________
Users-prolog mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/users-prolog
test_c.c (text/x-csrc, 2.5 KB)
#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;
}
test_pl.pl (text/x-perl-script, 5.8 KB)
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).
ssa_c.cil.c (text/x-csrc, 12.6 KB)
/* 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 (application/octet-stream, 65 B) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.