lestes::lang::cplus::sem::ss_expr2pi Class Reference

Visitor for converting expressions into pseudoinstructions. More...

#include <ss_ss2pi_base.g.hh>

Inheritance diagram for lestes::lang::cplus::sem::ss_expr2pi:

lestes::lang::cplus::sem::ss_expression_visitor lestes::std::visitor_base lestes::std::object lestes::std::mem::keystone List of all members.

Public Member Functions

ptr< ss_stmt2picaller_get () const
 The method caller_get returns the value of the field ss_expr2pi::caller.
void caller_set (const ptr< ss_stmt2pi > &)
 The method caller_set sets the field ss_expr2pi::caller to the given value.
ptr< ::lestes::backend_v2::intercode::pi_operandresult_get () const
 The method result_get returns the value of the field ss_expr2pi::result.
void result_set (const ptr< ::lestes::backend_v2::intercode::pi_operand > &)
 The method result_set sets the field ss_expr2pi::result to the given value.
ptr< ss_sppsp_get () const
 The method psp_get returns the value of the field ss_expr2pi::psp.
void psp_set (const ptr< ss_sp > &)
 The method psp_set sets the field ss_expr2pi::psp to the given value.
ptr< ss_destructor_tabletemporaries_get () const
 The method temporaries_get returns the value of the field ss_expr2pi::temporaries.
void temporaries_set (const ptr< ss_destructor_table > &)
 The method temporaries_set sets the field ss_expr2pi::temporaries to the given value.
ptr< expression_results_map_typeexpr2operand_map_get () const
 The method expr2operand_map_get returns the value of the field ss_expr2pi::expr2operand_map.
void expr2operand_map_set (const ptr< expression_results_map_type > &)
 The method expr2operand_map_set sets the field ss_expr2pi::expr2operand_map to the given value.
bool returned_pointer_get () const
 The method returned_pointer_get returns the value of the field ss_expr2pi::returned_pointer.
void returned_pointer_set (bool)
 The method returned_pointer_set sets the field ss_expr2pi::returned_pointer to the given value.
bool evaluated (ptr< ss_expression >)
 Check whether given expression was yet transformed.
ptr< ::lestes::backend_v2::intercode::pi_picompute_origin (ptr< ::lestes::backend_v2::intercode::pi_mem_factory >, ptr< ss_sp >)
 Computes an origin of a given pi_mem_factory inside fullexpression settled bye ss_sp.
ptr< ::lestes::backend_v2::intercode::pi_pregreturns_preg (const ptr< ss_expression > &)
ptr< ::lestes::backend_v2::intercode::pi_memreturns_mem (const ptr< ss_expression > &)
ptr< ::lestes::backend_v2::intercode::pi_mem_ptr_derefreturns_mem_pointer (const ptr< ss_expression > &)
bool is_returned_pointer (ptr< ss_expression >)
virtual void visit_ss_assign (ptr< ::lestes::lang::cplus::sem::ss_assign >)
virtual void visit_ss_add (ptr< ::lestes::lang::cplus::sem::ss_add >)
virtual void visit_ss_sub (ptr< ::lestes::lang::cplus::sem::ss_sub >)
virtual void visit_ss_mul (ptr< ::lestes::lang::cplus::sem::ss_mul >)
virtual void visit_ss_div (ptr< ::lestes::lang::cplus::sem::ss_div >)
virtual void visit_ss_mod (ptr< ::lestes::lang::cplus::sem::ss_mod >)
virtual void visit_ss_shr (ptr< ::lestes::lang::cplus::sem::ss_shr >)
virtual void visit_ss_shl (ptr< ::lestes::lang::cplus::sem::ss_shl >)
virtual void visit_ss_sbg (ptr< ::lestes::lang::cplus::sem::ss_sbg >)
virtual void visit_ss_sbl (ptr< ::lestes::lang::cplus::sem::ss_sbl >)
virtual void visit_ss_sbng (ptr< ::lestes::lang::cplus::sem::ss_sbng >)
virtual void visit_ss_sbnl (ptr< ::lestes::lang::cplus::sem::ss_sbnl >)
virtual void visit_ss_sbne (ptr< ::lestes::lang::cplus::sem::ss_sbne >)
virtual void visit_ss_sbe (ptr< ::lestes::lang::cplus::sem::ss_sbe >)
virtual void visit_ss_band (ptr< ::lestes::lang::cplus::sem::ss_band >)
virtual void visit_ss_bor (ptr< ::lestes::lang::cplus::sem::ss_bor >)
virtual void visit_ss_bxor (ptr< ::lestes::lang::cplus::sem::ss_bxor >)
virtual void visit_ss_land (ptr< ::lestes::lang::cplus::sem::ss_land >)
virtual void visit_ss_lor (ptr< ::lestes::lang::cplus::sem::ss_lor >)
virtual void visit_ss_arr_acc (ptr< ::lestes::lang::cplus::sem::ss_arr_acc >)
virtual void visit_ss_pfuncall (ptr< ::lestes::lang::cplus::sem::ss_pfuncall >)
virtual void visit_ss_funcall (ptr< ::lestes::lang::cplus::sem::ss_funcall >)
virtual void visit_ss_ifuncall (ptr< ::lestes::lang::cplus::sem::ss_ifuncall >)
virtual void visit_ss_mfuncall (ptr< ::lestes::lang::cplus::sem::ss_mfuncall >)
virtual void visit_ss_vfuncall (ptr< ::lestes::lang::cplus::sem::ss_vfuncall >)
virtual void visit_ss_dereference (ptr< ::lestes::lang::cplus::sem::ss_dereference >)
virtual void visit_ss_conversion (ptr< ::lestes::lang::cplus::sem::ss_conversion >)
virtual void visit_ss_array_to_pointer (ptr< ::lestes::lang::cplus::sem::ss_array_to_pointer >)
virtual void visit_ss_bind_reference (ptr< ::lestes::lang::cplus::sem::ss_bind_reference >)
virtual void visit_ss_bind_to_temporary (ptr< ::lestes::lang::cplus::sem::ss_bind_to_temporary >)
virtual void visit_ss_get (ptr< ::lestes::lang::cplus::sem::ss_get >)
virtual void visit_ss_vol_get (ptr< ::lestes::lang::cplus::sem::ss_vol_get >)
virtual void visit_ss_gat (ptr< ::lestes::lang::cplus::sem::ss_gat >)
virtual void visit_ss_neg (ptr< ::lestes::lang::cplus::sem::ss_neg >)
virtual void visit_ss_lnot (ptr< ::lestes::lang::cplus::sem::ss_lnot >)
virtual void visit_ss_bnot (ptr< ::lestes::lang::cplus::sem::ss_bnot >)
virtual void visit_ss_address_of (ptr< ::lestes::lang::cplus::sem::ss_address_of >)
virtual void visit_ss_this_expr (ptr< ::lestes::lang::cplus::sem::ss_this_expr >)
virtual void visit_ss_literal (ptr< ::lestes::lang::cplus::sem::ss_literal >)
virtual void visit_ss_ternary (ptr< ::lestes::lang::cplus::sem::ss_ternary >)
virtual void visit_ss_var_ref_by_qname (ptr< ::lestes::lang::cplus::sem::ss_var_ref_by_qname >)
virtual void visit_ss_var_ref (ptr< ::lestes::lang::cplus::sem::ss_var_ref >)
virtual void visit_ss_throw (ptr< ::lestes::lang::cplus::sem::ss_throw >)
virtual void visit_ss_member_ptr (ptr< ::lestes::lang::cplus::sem::ss_member_ptr >)
virtual void visit_ss_ptr_member_ptr (ptr< ::lestes::lang::cplus::sem::ss_ptr_member_ptr >)
virtual void visit_ss_access (ptr< ::lestes::lang::cplus::sem::ss_access >)
virtual void visit_ss_ptr_access (ptr< ::lestes::lang::cplus::sem::ss_ptr_access >)
ptr< ::lestes::backend_v2::intercode::pi_operandreturns (const ptr< ::lestes::lang::cplus::sem::ss_expression > &)
 "visit-return" method
virtual ptr< reflection_listreflection_get () const
 for purposes of dumping
virtual ptr< field_list_listfield_values_get () const
 for purposes of dumping

Static Public Member Functions

static ptr< ss_expr2picreate (ptr< ss_stmt2pi > a__ss_expr2pi__caller, ptr< ::lestes::backend_v2::intercode::pi_operand > a__ss_expr2pi__result, ptr< ss_sp > a__ss_expr2pi__psp, ptr< ss_destructor_table > a__ss_expr2pi__temporaries, ptr< expression_results_map_type > a__ss_expr2pi__expr2operand_map, bool a__ss_expr2pi__returned_pointer)
 First generated factory method for class ss_expr2pi.
static ptr< ss_expr2picreate (ptr< ss_stmt2pi > a__ss_expr2pi__caller, ptr< ss_sp > a__ss_expr2pi__psp, ptr< ss_destructor_table > a__ss_expr2pi__temporaries, ptr< expression_results_map_type > a__ss_expr2pi__expr2operand_map)
 Second generated factory method for class ss_expr2pi.

Protected Member Functions

 ss_expr2pi (ptr< ss_stmt2pi > a__ss_expr2pi__caller, ptr< ::lestes::backend_v2::intercode::pi_operand > a__ss_expr2pi__result, ptr< ss_sp > a__ss_expr2pi__psp, ptr< ss_destructor_table > a__ss_expr2pi__temporaries, ptr< expression_results_map_type > a__ss_expr2pi__expr2operand_map, bool a__ss_expr2pi__returned_pointer)
 Generated constructor for class ss_expr2pi.
virtual void gc_mark ()
 Marking routine for class ss_expr2pi.

Private Attributes

srp< ss_stmt2picaller
 Nearest statement visitor caller(needed for variable access).
srp< ::lestes::backend_v2::intercode::pi_operandresult
 Result of evaluating current expression.
srp< ss_sppsp
 Previous full-expression sequence point.
srp< ss_destructor_tabletemporaries
 Destructor table for temporary variables.
srp< expression_results_map_typeexpr2operand_map
 Map for result of subexpressions inside fullexpression.
bool returned_pointer
 Temporary variable used by is_returned_pointer method.

Static Private Attributes

static ptr< reflection_listreflection = reflection

Detailed Description

Visitor for converting expressions into pseudoinstructions.

Definition at line 439 of file ss_ss2pi_base.g.hh.


Constructor & Destructor Documentation

lestes::lang::cplus::sem::ss_expr2pi::ss_expr2pi ( ptr< ss_stmt2pi a__ss_expr2pi__caller,
ptr< ::lestes::backend_v2::intercode::pi_operand a__ss_expr2pi__result,
ptr< ss_sp a__ss_expr2pi__psp,
ptr< ss_destructor_table a__ss_expr2pi__temporaries,
ptr< expression_results_map_type a__ss_expr2pi__expr2operand_map,
bool  a__ss_expr2pi__returned_pointer 
) [protected]

Generated constructor for class ss_expr2pi.

Generated constructor for class ss_expr2pi.

Author:
lsg

Definition at line 662 of file ss_ss2pi_base.g.cc.

Referenced by create().

00668         : ss_expression_visitor(), caller(checked(a__ss_expr2pi__caller)), result(a__ss_expr2pi__result), psp(checked(a__ss_expr2pi__psp)), temporaries(checked(a__ss_expr2pi__temporaries)), expr2operand_map(checked(a__ss_expr2pi__expr2operand_map)), returned_pointer(a__ss_expr2pi__returned_pointer)
00669 {}


Member Function Documentation

ptr< ss_stmt2pi > lestes::lang::cplus::sem::ss_expr2pi::caller_get (  )  const

The method caller_get returns the value of the field ss_expr2pi::caller.

Returns:
The value of ss_expr2pi::caller.
Author:
lsg

Definition at line 523 of file ss_ss2pi_base.g.cc.

References caller.

00524 {
00525         return caller;
00526 }

void lestes::lang::cplus::sem::ss_expr2pi::caller_set ( const ptr< ss_stmt2pi > &  x  ) 

The method caller_set sets the field ss_expr2pi::caller to the given value.

Parameters:
[in] x The new value to set ss_expr2pi::caller to.
Author:
lsg

Definition at line 532 of file ss_ss2pi_base.g.cc.

References caller.

00533 {
00534         ss_expr2pi::caller = x;
00535 }

ptr<::lestes::backend_v2::intercode::pi_operand > lestes::lang::cplus::sem::ss_expr2pi::result_get (  )  const

The method result_get returns the value of the field ss_expr2pi::result.

Returns:
The value of ss_expr2pi::result.
Author:
lsg

Definition at line 541 of file ss_ss2pi_base.g.cc.

References result.

Referenced by returns().

00542 {
00543         return result;
00544 }

void lestes::lang::cplus::sem::ss_expr2pi::result_set ( const ptr< ::lestes::backend_v2::intercode::pi_operand > &  x  ) 

The method result_set sets the field ss_expr2pi::result to the given value.

Parameters:
[in] x The new value to set ss_expr2pi::result to.
Author:
lsg

Definition at line 550 of file ss_ss2pi_base.g.cc.

References result.

00551 {
00552         ss_expr2pi::result = x;
00553 }

ptr< ss_sp > lestes::lang::cplus::sem::ss_expr2pi::psp_get (  )  const

The method psp_get returns the value of the field ss_expr2pi::psp.

Returns:
The value of ss_expr2pi::psp.
Author:
lsg

Definition at line 559 of file ss_ss2pi_base.g.cc.

References psp.

00560 {
00561         return psp;
00562 }

void lestes::lang::cplus::sem::ss_expr2pi::psp_set ( const ptr< ss_sp > &  x  ) 

The method psp_set sets the field ss_expr2pi::psp to the given value.

Parameters:
[in] x The new value to set ss_expr2pi::psp to.
Author:
lsg

Definition at line 568 of file ss_ss2pi_base.g.cc.

References psp.

00569 {
00570         ss_expr2pi::psp = x;
00571 }

ptr< ss_destructor_table > lestes::lang::cplus::sem::ss_expr2pi::temporaries_get (  )  const

The method temporaries_get returns the value of the field ss_expr2pi::temporaries.

Returns:
The value of ss_expr2pi::temporaries.
Author:
lsg

Definition at line 577 of file ss_ss2pi_base.g.cc.

References temporaries.

00578 {
00579         return temporaries;
00580 }

void lestes::lang::cplus::sem::ss_expr2pi::temporaries_set ( const ptr< ss_destructor_table > &  x  ) 

The method temporaries_set sets the field ss_expr2pi::temporaries to the given value.

Parameters:
[in] x The new value to set ss_expr2pi::temporaries to.
Author:
lsg

Definition at line 586 of file ss_ss2pi_base.g.cc.

References temporaries.

00587 {
00588         ss_expr2pi::temporaries = x;
00589 }

ptr< expression_results_map_type > lestes::lang::cplus::sem::ss_expr2pi::expr2operand_map_get (  )  const

The method expr2operand_map_get returns the value of the field ss_expr2pi::expr2operand_map.

Returns:
The value of ss_expr2pi::expr2operand_map.
Author:
lsg

Definition at line 595 of file ss_ss2pi_base.g.cc.

References expr2operand_map.

00596 {
00597         return expr2operand_map;
00598 }

void lestes::lang::cplus::sem::ss_expr2pi::expr2operand_map_set ( const ptr< expression_results_map_type > &  x  ) 

The method expr2operand_map_set sets the field ss_expr2pi::expr2operand_map to the given value.

Parameters:
[in] x The new value to set ss_expr2pi::expr2operand_map to.
Author:
lsg

Definition at line 604 of file ss_ss2pi_base.g.cc.

References expr2operand_map.

00605 {
00606         ss_expr2pi::expr2operand_map = x;
00607 }

bool lestes::lang::cplus::sem::ss_expr2pi::returned_pointer_get (  )  const

The method returned_pointer_get returns the value of the field ss_expr2pi::returned_pointer.

Returns:
The value of ss_expr2pi::returned_pointer.
Author:
lsg

Definition at line 613 of file ss_ss2pi_base.g.cc.

References returned_pointer.

00614 {
00615         return returned_pointer;
00616 }

void lestes::lang::cplus::sem::ss_expr2pi::returned_pointer_set ( bool  x  ) 

The method returned_pointer_set sets the field ss_expr2pi::returned_pointer to the given value.

Parameters:
[in] x The new value to set ss_expr2pi::returned_pointer to.
Author:
lsg

Definition at line 622 of file ss_ss2pi_base.g.cc.

References returned_pointer.

00623 {
00624         ss_expr2pi::returned_pointer = x;
00625 }

bool lestes::lang::cplus::sem::ss_expr2pi::evaluated ( ptr< ss_expression x  ) 

Check whether given expression was yet transformed.

Check whether given expression was already transformed. In such a case result is set to according result of evaluated subexpression and returned TRUE.

Definition at line 337 of file ss_ss2pi_base.cc.

References expr2operand_map, outry, and result.

Referenced by visit_ss_address_of(), visit_ss_array_to_pointer(), visit_ss_assign(), visit_ss_bind_reference(), visit_ss_conversion(), visit_ss_dereference(), visit_ss_funcall(), visit_ss_get(), visit_ss_literal(), visit_ss_var_ref(), and visit_ss_vol_get().

00337                                                 {
00338         
00339         if ( expr2operand_map->find(x)!=expr2operand_map->end() ) {
00340                 result = (*expr2operand_map)[x]; 
00341                 outry("out - already evaluated");
00342                 return true;
00343          }
00344         return false;
00345 }

ptr< ::lestes::backend_v2::intercode::pi_pi > lestes::lang::cplus::sem::ss_expr2pi::compute_origin ( ptr< ::lestes::backend_v2::intercode::pi_mem_factory ,
ptr< ss_sp  
)

Computes an origin of a given pi_mem_factory inside fullexpression settled bye ss_sp.

Referenced by visit_ss_var_ref().

ptr<::lestes::backend_v2::intercode::pi_preg > lestes::lang::cplus::sem::ss_expr2pi::returns_preg ( const ptr< ss_expression > &  o  ) 

Returning value from transforming expression visitor.

Definition at line 279 of file ss_ss2pi_base.cc.

References lestes::lang::cplus::sem::pi_operand2pi_preg(), and returns().

Referenced by visit_ss_assign(), visit_ss_bind_reference(), visit_ss_conversion(), and visit_ss_dereference().

00279                                                                                                {
00280         ptr <pi_operand> res=this->returns(o);
00281         return pi_operand2pi_preg(res);
00282 }

ptr<::lestes::backend_v2::intercode::pi_mem > lestes::lang::cplus::sem::ss_expr2pi::returns_mem ( const ptr< ss_expression > &  o  ) 

Returning value from transforming expression visitor.

Definition at line 287 of file ss_ss2pi_base.cc.

References lestes::lang::cplus::sem::pi_operand2pi_mem(), and returns().

Referenced by visit_ss_address_of(), visit_ss_assign(), visit_ss_bind_reference(), and visit_ss_vol_get().

00287                                                                                              {
00288         ptr <pi_operand> res=this->returns(o);
00289         return pi_operand2pi_mem(res);
00290 }

ptr<::lestes::backend_v2::intercode::pi_mem_ptr_deref > lestes::lang::cplus::sem::ss_expr2pi::returns_mem_pointer ( const ptr< ss_expression > &  o  ) 

Returning value from transforming expression visitor.

Definition at line 295 of file ss_ss2pi_base.cc.

References lestes::lang::cplus::sem::pi_operand2pi_mem_pointer(), and returns().

Referenced by visit_ss_assign(), visit_ss_get(), and visit_ss_vol_get().

00295                                                                                                                {
00296         ptr <pi_operand> res=this->returns(o);
00297         return pi_operand2pi_mem_pointer(res);
00298 }

bool lestes::lang::cplus::sem::ss_expr2pi::is_returned_pointer ( ptr< ss_expression x  ) 

Transform given expression and check whether pointer for dereference is returned. Used by (vol)get and assign for identification of dereferenced pointer in operand,which cause load/store via returned pointer. This can happen via dereferience of ss_pointer or via var_ref of variable with ss_reference type.

Definition at line 565 of file ss_ss2pi_base.cc.

References plog, returned_pointer, and returns().

Referenced by visit_ss_assign(), visit_ss_bind_reference(), visit_ss_get(), and visit_ss_vol_get().

00565                                                           {
00566         returned_pointer=false;
00567         this->returns(x);
00568         if (returned_pointer) {
00569                 returned_pointer=false;
00570                 plog(gnl) << x->uid_get() << " returned pointer\n";
00571                 return true;
00572                 }
00573         return false;
00574 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_assign ( ptr< ::lestes::lang::cplus::sem::ss_assign x  )  [virtual]

Assignment transformation. It distinguishes between store and store via pointer dependently on returned result from subexpression.

pointer on destination type

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 351 of file ss_ss2pi_base.cc.

References entry, evaluated(), lestes::lang::cplus::sem::ss_pointer::instance(), is_returned_pointer(), lassert2, outry, result, returned_pointer, returns_mem(), returns_mem_pointer(), returns_preg(), and lestes::lang::cplus::sem::ss_sp2pi_sp().

00351                                                                       {entry("=");
00352         
00353                 
00354         if (evaluated(x)) { returned_pointer = (*expr2operand_map)[x]->kind_get()==pi_operand::MEM_PTR_DEREF; return; }
00355         
00356         ptr< pi_pi > res;       
00357         ptr< pi_preg > rt = this->returns_preg(x->right_get()); //rvalue which to store
00358 
00359         if (is_returned_pointer(x->left_get())){        //real evaluation of left operand
00360                                                         //store via pointer
00361                 ptr< pi_mem_ptr_deref > lft = this->returns_mem_pointer(x->left_get());         //pointer to be dereferenced
00362                 ptr< pi_mem_ptr_deref > new_lft = lft->factory_get()->get_mem(NULL).dncast<pi_mem_ptr_deref>();//pozn tohle ma byt v tmp.dest
00363                 
00364                 if (!lft || !rt) lassert2(false,"ss_assign operands incorrect.");
00365                 
00366                 lint level = max (                                              //get level for current pseudoinstruction
00367                                 max( x->psp_get()->level_get(), x->nsp_get()->level_get() ),
00368                                 rt->origin_get()->level_get() 
00369 //                              max( lft->origin_get()->level_get(), rt->origin_get()->level_get() )
00370                         );
00371         
00372                 //JAZ
00373                 level = 1 + max(level,(lint)new_lft->factory_get().dncast<pi_mf_ptr_deref>()->addr_get()->origin_get()->level_get());
00374                 
00375                 ptr< pi_stp > tmp = pi_stp::create(                                     //store equivalent to assignemnt
00376                                 ss_sp2pi_sp(x->psp_get()),
00377                                 ss_sp2pi_sp(x->nsp_get()),
00378                                 level,
00379                                 new_lft,
00380                                 //((lft->factory_get()).dncast<pi_mf_ptr_deref>())->addr_get(),
00381                                 rt,
00382                                 ss_type2tm_type_convertor::instance()->convert(         ///pointer on destination type
00383                                                                 ss_pointer::instance(x->type_get().dncast<ss_pseudoreference>()->what_get())
00384                                                                 ),
00385                                 rt->type_get()
00386                                 
00387                         ); 
00388                 
00389                 new_lft->origin_set(tmp);
00390                 res=tmp;
00391                 (*expr2operand_map)[x]=result=new_lft;//pozn1
00392                 returned_pointer = true; //jaz
00393          }
00394            else                 //store to usual lvalue
00395          {
00396                 ptr< pi_mem > lft = this->returns_mem(x->left_get());           //lvalue where to store
00397         
00398                 if (!lft || !rt) lassert2(false,"ss_assign operands incorrect.");
00399                 
00400                 lint level = 1+max (                                            //get level for current pseudoinstruction
00401                                 max( x->psp_get()->level_get(), x->nsp_get()->level_get() ),
00402                                 rt->origin_get()->level_get() 
00403                         );
00404         
00405                 ptr< pi_st > tmp = pi_st::create(                                       //store equivalent to assignemnt
00406                                 ss_sp2pi_sp(x->psp_get()),
00407                                 ss_sp2pi_sp(x->nsp_get()),
00408                                 level,
00409                                 lft,                    //this is only fake, new pi_mem for lft will be here
00410                                 rt,
00411                                 ss_type2tm_type_convertor::instance()->convert(x->type_get())
00412                         );
00413                 ptr< pi_mem > new_lft = lft->factory_get()->get_mem(tmp);
00414                 tmp->destination_set(new_lft);
00415                 
00416                 res=tmp;
00417                 (*expr2operand_map)[x]=result=new_lft;
00418          }//else
00419          
00420         backend_data_builder::instance()->add_pi(res);
00421         backend_data_builder::instance()->add_rail();
00422         
00423 
00424 outry("=");
00425 }

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_add ( ptr< ::lestes::lang::cplus::sem::ss_add  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_sub ( ptr< ::lestes::lang::cplus::sem::ss_sub  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_mul ( ptr< ::lestes::lang::cplus::sem::ss_mul  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_div ( ptr< ::lestes::lang::cplus::sem::ss_div  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_mod ( ptr< ::lestes::lang::cplus::sem::ss_mod  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_shr ( ptr< ::lestes::lang::cplus::sem::ss_shr  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_shl ( ptr< ::lestes::lang::cplus::sem::ss_shl  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_sbg ( ptr< ::lestes::lang::cplus::sem::ss_sbg  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_sbl ( ptr< ::lestes::lang::cplus::sem::ss_sbl  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_sbng ( ptr< ::lestes::lang::cplus::sem::ss_sbng  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_sbnl ( ptr< ::lestes::lang::cplus::sem::ss_sbnl  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_sbne ( ptr< ::lestes::lang::cplus::sem::ss_sbne  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_sbe ( ptr< ::lestes::lang::cplus::sem::ss_sbe  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_band ( ptr< ::lestes::lang::cplus::sem::ss_band  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_bor ( ptr< ::lestes::lang::cplus::sem::ss_bor  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_bxor ( ptr< ::lestes::lang::cplus::sem::ss_bxor  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_land ( ptr< ::lestes::lang::cplus::sem::ss_land  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1123 of file ss_ss2pi_base.cc.

References lassert2.

01123                                                                 {
01124 lassert2(false,"Visitor of && expression not implemented in ss2pi\n");
01125 //TODO
01126 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_lor ( ptr< ::lestes::lang::cplus::sem::ss_lor  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1128 of file ss_ss2pi_base.cc.

References lassert2.

01128                                                               {
01129 lassert2(false,"Visitor of || expression not implemented in ss2pi\n");
01130 //TODO
01131 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_arr_acc ( ptr< ::lestes::lang::cplus::sem::ss_arr_acc  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1133 of file ss_ss2pi_base.cc.

References lassert2.

01133                                                                       {
01134 lassert2(false,"Visitor of array access expression not implemented in ss2pi\n");
01135 //TODO
01136 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_pfuncall ( ptr< ::lestes::lang::cplus::sem::ss_pfuncall  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1138 of file ss_ss2pi_base.cc.

References lassert2.

01138                                                                         {
01139 lassert2(false,"Visitor of pfuncall expression not implemented in ss2pi\n");
01140 //TODO
01141 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_funcall ( ptr< ::lestes::lang::cplus::sem::ss_funcall  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 619 of file ss_ss2pi_base.cc.

References create(), entry, evaluated(), lestes::lang::cplus::sem::ss_destructor_tables::instance(), outry, pi_operand_void, result, lestes::lang::cplus::sem::ss_sp2pi_sp(), and temporaries.

00619                                                                        {entry("funcall");
00620 
00621         if (evaluated(x)) return;
00622         
00623         ptr<mem_alloc_manager> allocator = mem_alloc_manager::instance();
00624         
00625         ptr< ss_destructor_tables > dts = ss_destructor_tables::instance();
00626         ptr<backend_data_builder> builder = backend_data_builder::instance();
00627         
00628         ptr<pi_mem_factory> rv;         //return value
00629         ptr<pi_abstract_function_call> fcall;
00630 
00631         if (x->type_get()->is_void()) {
00632                 
00633                 rv=pi_operand_void;
00634                 fcall = pi_callv::create (
00635                         ss_sp2pi_sp(x->psp_get()), ss_sp2pi_sp(x->nsp_get()),
00636                         0,                              //level - will be filled later
00637                         //jaz list_mem_type::create(),                          //funcall args - will be filled later
00638                         list<srp<pi_operand> >::create(),
00639                         NULL,                           //this; this will be filled only through access operators
00640                         x->function_get()               //declaration
00641                         );                              
00642                 (*expr2operand_map)[x]=result=pi_operand_void;          //checked for return void funcall();
00643                 }
00644                 
00645         else                            //non void return
00646                 {
00647                 
00648                 
00649                 ptr<tm_data_type_base> trvt = ss_type2tm_type_convertor::instance()->convert(x->type_get());
00650                 ptr< pi_call > tmp = pi_call::create (                                  //tmp needed for access to fields
00651                         ss_sp2pi_sp(x->psp_get()), ss_sp2pi_sp(x->nsp_get()),
00652                         0,                              //level - will be filled later
00653                         list<srp<pi_operand> >::create(),
00654                         //list_mem_type::create(),                              //funcall args - will be filled later
00655                         NULL,                           //this; this will be filled only through acces operators
00656                         trvt,           //type  
00657                         NULL,                           //rv
00658                         x->function_get()               //declaration
00659                         );
00660                         
00661                 /* jaz  
00662                 rv = allocator->allocate_fcall_par_ret_val(
00663                                         caller->current_function_get(),         //caller
00664                                         tmp                                     //calee
00665                                 );
00666                 */
00667                 
00668                 if ( trvt->return_reg_get() ) {
00669                         //type is returned in register
00670                         rv = pi_mf_preg::create(NULL,trvt, pi_preg::create(tmp,trvt));  
00671                 } else {
00672                         //type is returned in memory 
00673                         rv = pi_mf_stack::create(NULL,trvt, 0); 
00674                 }
00675                                 
00676                 tmp->rv_set(rv->get_mem(tmp));
00677                 dts->destructor_add_to_destr(temporaries,x->type_get(),rv); 
00678                                 
00679                 fcall=tmp;
00680                 (*expr2operand_map)[x]=result=tmp->rv_get();
00681                 }//else
00682 
00683         //TODO ellipsis
00684         ulint level=max(fcall->psp_get()->level_get(),fcall->nsp_get()->level_get());           // max level from seqeuence points and argumets 
00685         
00686         /*              Parameters              */
00687         //ptr < list_mem_type > fc_args = fcall->args_get();            //args for pi_call
00688         ptr< list<srp<pi_operand> > > fc_args = fcall->args_get();              //args for pi_call
00689         lint i=1;                                               //index of function parameter
00690         ptr < pi_operand > eval_arg;                            //temporary for evaluation of the argument
00691         list < srp<ss_expression> >::iterator iss=x->args_get()->begin();       //argument of funcall in ss
00692 
00693         
00694         for ( ; iss != x->args_get()->end() ;  i++, iss++){             //setting args for pi_call
00695                 
00696                 eval_arg = this->returns(*iss);                         //transform argument expression into pi; evaluates just load of arg
00697                 fc_args->push_back(eval_arg);
00698                 
00699                 if ( eval_arg->origin_get() ) {
00700                         level = max(eval_arg->origin_get()->level_get(),level);
00701                 }
00702                 
00703                 //jaz - convert a pi_operand to pi_mem operand
00704                 /*
00705                 ptr<pi_mem> eval_arg_mem;
00706                 
00707                 switch ( eval_arg->kind_get() ) {
00708                         case pi_operand::PREG: {
00709                                 ptr<pi_mf_preg> mf = pi_mf_preg::create(eval_arg->origin_get(), eval_arg->type_get(), eval_arg.dncast<pi_preg>());
00710                                 eval_arg_mem = mf->get_mem(eval_arg->origin_get()); 
00711                         } break;
00712                         
00713                         case pi_operand::LIT: {
00714                                 ptr<pi_mf_lit> mf = pi_mf_lit::create(NULL, eval_arg->type_get(), eval_arg.dncast<pi_lit>());
00715                                 eval_arg_mem = mf->get_mem(eval_arg->origin_get()); 
00716                         } break;
00717                         
00718                         default:
00719                                 eval_arg_mem = eval_arg.dncast<pi_mem>();
00720                         
00721                 }
00722                 
00723                 fc_args->push_back(eval_arg_mem);
00724                 */
00725                 
00726                 /* jaz
00727                 ptr< pi_mem_factory > arg_alloc = allocator->allocate_fcall_par(caller->current_function_get(),fcall,(*iss)->type_get(), i);
00728                 fc_args->push_back(arg_alloc->get_mem(ss_sp2pi_sp(psp)));
00729                         //temporary for argument on stack; origin on psp of the whole expression
00730         
00731                 ptr < list < srp<pi_pi> > > 
00732                         pis =   copy_constructor_call_generator::instance()->                   //store arg to stack for the function
00733                                         generate(       fc_args->back(),
00734                                                         eval_arg,
00735                                                         ss_sp2pi_sp((*iss)->psp_get()),
00736                                                         ss_sp2pi_sp((*iss)->nsp_get())
00737                                                 );              
00738                 builder->add_pis(pis);
00739                 
00740                 
00741                 list < srp<pi_pi> >::iterator ipi=pis->begin();                 //we have to keep level on maximum of all the instruction levels used
00742                                                                                 //to store argument     
00743                 for ( ; ipi != pis->end() ; ipi++ ) level = max ((*ipi) -> level_get(),level);
00744                 
00745                 dts->destructor_add_to_destr(temporaries,(*iss)->type_get(),fc_args->back()->factory_get());
00746                 */
00747         }
00748 
00749         fcall->args_set(fc_args);
00750         fcall->level_set(level+1);
00751         
00752         builder->add_pi(fcall); 
00753         builder->add_rail();    
00754 
00755 outry("funcall");
00756 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_ifuncall ( ptr< ::lestes::lang::cplus::sem::ss_ifuncall  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1143 of file ss_ss2pi_base.cc.

References lassert2.

01143                                                                         {
01144 lassert2(false,"Visitor of ifuncall expression not implemented in ss2pi\n");
01145 //TODO
01146 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_mfuncall ( ptr< ::lestes::lang::cplus::sem::ss_mfuncall  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1148 of file ss_ss2pi_base.cc.

References lassert2.

01148                                                                         {
01149 lassert2(false,"Visitor of mfuncall expression not implemented in ss2pi\n");
01150 //TODO
01151 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_vfuncall ( ptr< ::lestes::lang::cplus::sem::ss_vfuncall  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1153 of file ss_ss2pi_base.cc.

References lassert2.

01153                                                                         {
01154 lassert2(false,"Visitor of vfuncall expression not implemented in ss2pi\n");
01155 //TODO
01156 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_dereference ( ptr< ::lestes::lang::cplus::sem::ss_dereference  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 576 of file ss_ss2pi_base.cc.

References entry, evaluated(), outry, result, returned_pointer, and returns_preg().

00576                                                                                {entry("deref");
00577 
00578 //      plog(gnl) << x->uid_get() << " returned pointer\n";
00579         
00580         if (evaluated(x)) {returned_pointer=true; return;}
00581                 
00582         ptr< pi_preg > val = this->returns_preg( x->expr_get() );
00583         
00584         ptr< pi_mf_ptr_deref > pointer_factory = pi_mf_ptr_deref::create(               //dereferenced memory placeholder
00585                                         NULL,
00586                                         ss_type2tm_type_convertor::instance()->convert(x->type_get()),
00587                                         val
00588                                 );
00589 
00590         (*expr2operand_map)[x] = result =  pointer_factory->get_mem(val->origin_get());
00591         returned_pointer=true;          //dereference have to be checked on higher level 
00592 
00593 outry("deref");
00594 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_conversion ( ptr< ::lestes::lang::cplus::sem::ss_conversion x  )  [virtual]

Conversion between types. Note, that frontend products conversions, where source type is equal destination type. These cases must be properly treated.

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1005 of file ss_ss2pi_base.cc.

References entry, evaluated(), outry, result, returns_preg(), and lestes::lang::cplus::sem::ss_sp2pi_sp().

01005                                                                              {entry("convert");
01006         if (evaluated(x)) return;
01007         
01008         if (x->type_get()==x->src_type_get()) {         //conversion is meaningful only on different types
01009                 ptr< pi_operand > src = this->returns(x->expr_get());
01010                 (*expr2operand_map)[x]=result=src; 
01011                 outry("convert(identity)");
01012                 return; 
01013          } 
01014         
01015         ptr < pi_preg > src = this->returns_preg(x->expr_get());        //pointer to be dereferenced
01016         ptr< pi_preg > dest = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->convert(x->type_get()));
01017 
01018         lint level = 1+max ( src->origin_get()->level_get(),
01019                         max( x->psp_get()->level_get(), x->nsp_get()->level_get() ));
01020                         
01021         ptr< pi_cvt > tmp = pi_cvt::create(
01022                                 ss_sp2pi_sp(x->psp_get()),
01023                                 ss_sp2pi_sp(x->nsp_get()),
01024                                 level,
01025                                 src,
01026                                 dest,
01027                                 ss_type2tm_type_convertor::instance()->convert(x->type_get()),
01028                                 ss_type2tm_type_convertor::instance()->convert(x->src_type_get())
01029                 );
01030         
01031         dest->origin_set(tmp);
01032 
01033         backend_data_builder::instance()->add_pi(tmp);
01034         backend_data_builder::instance()->add_rail();
01035 
01036         (*expr2operand_map)[x]=result=dest;
01037 
01038 outry("convert");
01039 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_array_to_pointer ( ptr< ::lestes::lang::cplus::sem::ss_array_to_pointer x  )  [virtual]

Up to now, there is nothing to be done for array->pointer conversion.

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 991 of file ss_ss2pi_base.cc.

References entry, evaluated(), outry, result, and returns().

00991                                                                                         {entry("array->pointer");
00992 
00993         if (evaluated(x)) return;
00994         
00995         (*expr2operand_map)[x] = result = this->returns(x->expr_get()) ;
00996         
00997 outry("array->pointer");        
00998 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_bind_reference ( ptr< ::lestes::lang::cplus::sem::ss_bind_reference x  )  [virtual]

Bind reference. It can occurs in initialization, function parameter passing and return value store. Its input value shall be lvalue - in case of dereference on pointer, only pointer shall be returned, in case of variable reference, its address shall be loaded.

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1081 of file ss_ss2pi_base.cc.

References entry, evaluated(), is_returned_pointer(), outry, result, returns_mem(), returns_preg(), and lestes::lang::cplus::sem::ss_sp2pi_sp().

01081                                                                                      {entry("bind_ref");
01082         
01083         if (evaluated(x)) return;
01084         
01085         if (is_returned_pointer(x->expr_get()))         //real evaluation run here
01086          {              //we got pointer dereference, so we simply return it
01087          
01088                 ptr < pi_preg > lval = this->returns_preg(x->expr_get());       //pointer
01089                 (*expr2operand_map)[x] = result = lval;
01090                 
01091          } else
01092          {              //var_ref address to load
01093          
01094                 ptr< pi_mem > var  = this->returns_mem(x->expr_get());
01095                 ptr< pi_preg > addr = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->convert(x->type_get()));
01096         
01097                 ulint level = max(x->psp_get()->level_get(),x->nsp_get()->level_get());
01098 
01099                 ptr< pi_lda > tmp = pi_lda::create (
01100                                 ss_sp2pi_sp(x->psp_get()), ss_sp2pi_sp(x->nsp_get()),
01101                                 1+max(level,var->origin_get()->level_get()),
01102                                 addr,
01103                                 var,
01104                                 addr->type_get(),
01105                                 var->type_get()
01106                         );
01107 
01108                 addr->origin_set(tmp);
01109                 (*expr2operand_map)[x] = result = addr;
01110                 
01111                 ptr<backend_data_builder> initial_structure_builder = backend_data_builder::instance();
01112                 initial_structure_builder->add_pi(tmp); 
01113                 initial_structure_builder->add_rail();
01114 
01115         } //else
01116         
01117 outry("bind_ref");
01118 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_bind_to_temporary ( ptr< ::lestes::lang::cplus::sem::ss_bind_to_temporary  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1158 of file ss_ss2pi_base.cc.

References lassert2.

01158                                                                                           {
01159 lassert2(false,"Visitor of bind-to-temporary expression not implemented in ss2pi\n");
01160 //TODO
01161 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_get ( ptr< ::lestes::lang::cplus::sem::ss_get x  )  [virtual]

lvalue->rvalue conversion or indirect load via pointer

pointer on source type

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 490 of file ss_ss2pi_base.cc.

References lestes::lang::cplus::sem::ss_type2info::create(), entry, evaluated(), lestes::lang::cplus::sem::ss_pointer::instance(), is_returned_pointer(), lassert, outry, result, returns(), returns_mem_pointer(), lestes::lang::cplus::sem::ss_type2info::SS_REFERENCE, and lestes::lang::cplus::sem::ss_sp2pi_sp().

00490                                                                {entry("get");
00491         
00492         if (evaluated(x)) return;
00493         ptr< pi_pi > res;
00494         
00495         //ptr< pi_operand > tmp_lval  = this->returns(x->expr_get());
00496         bool to_be_dereferenced=ss_type2info::create()->process(x->type_get()) == ss_type2info::SS_REFERENCE;
00497         
00498         if (is_returned_pointer(x->expr_get()) || to_be_dereferenced  /*tmp_lval->kind_get()==pi_operand::MEM_PTR_DEREF */ )            //real evaluation run here
00499          {              //we got pointer for dereference, so load will be via pointer
00500          
00501                 ptr < pi_mem_ptr_deref > lval = this->returns_mem_pointer(x->expr_get());       //pointer to be dereferenced
00502                 //ptr < pi_mem_ptr_deref > lval = tmp_lval.dncast<pi_mem_ptr_deref>();
00503                 
00504                 ptr< pi_preg > rval = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->convert(x->type_get()));
00505                 
00506                 ulint level = max(x->psp_get()->level_get(),x->nsp_get()->level_get());
00507 
00508                 ptr< pi_ldp > tmp = pi_ldp::create (
00509                                 ss_sp2pi_sp(x->psp_get()), ss_sp2pi_sp(x->nsp_get()),
00510                                 1+max(level,lval->origin_get()->level_get()),
00511                                 rval,
00512                                 //((lval->factory_get()).dncast<pi_mf_ptr_deref>())->addr_get(),
00513                                 lval,
00514                                 rval->type_get(),
00515                                 ss_type2tm_type_convertor::instance()->convert(         ///pointer on source type
00516                                                                 ss_pointer::instance(x->type_get())
00517                                                                 )
00518                         );
00519 
00520                 rval->origin_set(tmp);
00521                 res=tmp;
00522                 (*expr2operand_map)[x] = result = rval;
00523                 
00524          } else
00525          {              //standard rvalue_lvalue conversion
00526                 ptr< pi_operand > lval = this->returns(x->expr_get()); 
00527                 
00528                 lassert(lval->kind_get()!=pi_operand::MEM_PTR_DEREF);
00529                 
00530                 ptr< pi_preg > rval = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->convert(x->type_get()));
00531         
00532                 ulint level = max(x->psp_get()->level_get(),x->nsp_get()->level_get());
00533         
00534                 ptr< pi_ld > tmp = pi_ld::create (
00535                                 ss_sp2pi_sp(x->psp_get()), ss_sp2pi_sp(x->nsp_get()),
00536                                 1+max(level,lval->origin_get()->level_get()),
00537                                 rval,
00538                                 lval,
00539                                 rval->type_get()
00540                         );
00541                 
00542                 /*
00543                 if ( tmp->uid_get()==1638 ) {
00544                         lassert(false);
00545                 }
00546                 */      
00547 
00548                 rval->origin_set(tmp);
00549                 res=tmp;
00550                 (*expr2operand_map)[x] = result = rval;
00551         }
00552         
00553         ptr<backend_data_builder> initial_structure_builder = backend_data_builder::instance();
00554         initial_structure_builder->add_pi(res); 
00555         initial_structure_builder->add_rail();
00556 
00557 outry("get");
00558 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_vol_get ( ptr< ::lestes::lang::cplus::sem::ss_vol_get x  )  [virtual]

lvalue->rvalue conversion or indirect load via pointer on volatile variable

pointer on source type

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 913 of file ss_ss2pi_base.cc.

References entry, evaluated(), lestes::lang::cplus::sem::ss_pointer::instance(), is_returned_pointer(), lassert, outry, psp, result, returns_mem(), returns_mem_pointer(), and lestes::lang::cplus::sem::ss_sp2pi_sp().

00913                                                                        {entry("vol_get");
00914         
00915         if (evaluated(x)) return;
00916         ptr< pi_pi > res;
00917         
00918         if (is_returned_pointer(x->expr_get()))         //real evaluation run here
00919          {              //we got pointer for dereference, so load will be via pointer
00920          
00921                 ptr< pi_mem_ptr_deref > mem = this->returns_mem_pointer(x->expr_get());
00922                 
00923                 //ptr < pi_preg > lval = this->returns_preg(x->expr_get());     //pointer to be dereferenced
00924                 ptr< pi_preg > rval = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->convert(x->type_get()));
00925                 
00926                 //JAZ
00927                 ptr<pi_sp> psp = ss_sp2pi_sp(x->psp_get());
00928                 ptr<pi_sp> nsp = ss_sp2pi_sp(x->nsp_get());
00929                 
00930                 //ptr<pi_mf_ptr_deref> mf = pi_mf_ptr_deref::create(NULL, rval->type_get(),lval);
00931                 //ptr<pi_mem_ptr_deref> mem = mf->get_mem(compute_origin(mf,x->psp_get())).dncast<pi_mem_ptr_deref>();
00932                 
00933                 //ulint level = max(x->psp_get()->level_get(),x->nsp_get()->level_get());
00934                 ulint level = max(psp->level_get(),nsp->level_get());
00935 
00936                 ptr< pi_ldpv > tmp = pi_ldpv::create (
00937                                 psp, nsp,
00938                                 1+max(level,mem->origin_get()->level_get()),
00939                                 rval,
00940                                 mem,
00941                                 rval->type_get(),
00942                                 ss_type2tm_type_convertor::instance()->convert(         ///pointer on source type
00943                                                                 ss_pointer::instance(x->type_get().dncast<ss_pseudoreference>()->what_get())
00944                                                                 )
00945                         );
00946                 
00947                 rval->origin_set(tmp);
00948                 res=tmp;
00949                 (*expr2operand_map)[x] = result = rval;
00950                 
00951          } else
00952          {              //standard rvalue_lvalue conversion
00953          
00954                 ptr< pi_mem > lval  = this->returns_mem(x->expr_get());
00955                 lassert(lval->kind_get()!=pi_operand::MEM_PTR_DEREF);
00956                 
00957                 ptr< pi_preg > rval = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->convert(x->type_get()));
00958         
00959                 ulint level = max(x->psp_get()->level_get(),x->nsp_get()->level_get());
00960         
00961                 ptr< pi_ldv > tmp = pi_ldv::create (
00962                                 ss_sp2pi_sp(x->psp_get()), ss_sp2pi_sp(x->nsp_get()),
00963                                 1+max(level,lval->origin_get()->level_get()),
00964                                 rval,
00965                                 lval,
00966                                 rval->type_get()
00967                         );
00968                 
00969                 rval->origin_set(tmp);
00970                 res=tmp;
00971                 (*expr2operand_map)[x] = result = rval;
00972         }
00973         
00974         ptr<backend_data_builder> initial_structure_builder = backend_data_builder::instance();
00975         initial_structure_builder->add_pi(res); 
00976         initial_structure_builder->add_rail();
00977 
00978 outry("vol_get");
00979 }

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_gat ( ptr< ::lestes::lang::cplus::sem::ss_gat  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_neg ( ptr< ::lestes::lang::cplus::sem::ss_neg  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_lnot ( ptr< ::lestes::lang::cplus::sem::ss_lnot  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

virtual void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_bnot ( ptr< ::lestes::lang::cplus::sem::ss_bnot  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_address_of ( ptr< ::lestes::lang::cplus::sem::ss_address_of x  )  [virtual]

Load address of a given object (&x). Only lvalue can be the argument of this operator.

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1045 of file ss_ss2pi_base.cc.

References entry, evaluated(), outry, result, returns_mem(), and lestes::lang::cplus::sem::ss_sp2pi_sp().

01045                                                                              {entry("reference");
01046 
01047         if (evaluated(x)) return;
01048         
01049         ptr < pi_mem > src = this->returns_mem(x->expr_get());          //address to be loaded
01050         ptr< pi_preg > dest = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->convert(x->type_get()));
01051 
01052         lint level = 1+max ( src->origin_get()->level_get(),
01053                         max( x->psp_get()->level_get(), x->nsp_get()->level_get() ));
01054         
01055         ptr< pi_lda > tmp = pi_lda::create(
01056                                 ss_sp2pi_sp(x->psp_get()),
01057                                 ss_sp2pi_sp(x->nsp_get()),
01058                                 level,
01059                                 dest,
01060                                 src,
01061                                 dest->type_get(),
01062                                 src->type_get()
01063                 );
01064         
01065         dest->origin_set(tmp);
01066 
01067         backend_data_builder::instance()->add_pi(tmp);
01068         backend_data_builder::instance()->add_rail();
01069 
01070         (*expr2operand_map)[x]=result=dest;
01071 
01072 
01073 outry("reference");
01074 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_this_expr ( ptr< ::lestes::lang::cplus::sem::ss_this_expr  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1163 of file ss_ss2pi_base.cc.

References lassert2.

01163                                                                           {
01164 lassert2(false,"Visitor of 'this' expression not implemented in ss2pi\n");
01165 //TODO
01166 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_literal ( ptr< ::lestes::lang::cplus::sem::ss_literal  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 597 of file ss_ss2pi_base.cc.

References lestes::lang::cplus::sem::ss_linfo2pi_linfo::create(), entry, evaluated(), outry, result, and lestes::lang::cplus::sem::ss_sp2pi_sp().

00597                                                                        {entry("lit");
00598         
00599         if (evaluated(x)) return;
00600         ptr < ss_linfo2pi_linfo > cnv = ss_linfo2pi_linfo::create();
00601         ptr< literal_info_base > pinfo = cnv->get_pinfo(x->value_get());
00602         
00603         
00604         ptr < pi_lit > lit = pi_lit::create(NULL,pinfo->type_get(),pinfo);      //origin of literal is always NULL
00605         ptr< pi_preg > dest= pi_preg::create(NULL,pinfo->type_get());
00606         
00607         ptr<backend_data_builder> builder = backend_data_builder::instance();
00608         builder->add_pis( literal_loader::instance()->
00609                                 generate_load(dest, lit, ss_sp2pi_sp(x->psp_get()), ss_sp2pi_sp(x->nsp_get())));
00610         builder->add_rail();    
00611 
00612         (*expr2operand_map)[x]=result=dest;
00613         
00614 outry("lit");   
00615 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_ternary ( ptr< ::lestes::lang::cplus::sem::ss_ternary  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1168 of file ss_ss2pi_base.cc.

References lassert2.

01168                                                                       {
01169 lassert2(false,"Visitor of ternary expression not implemented in ss2pi\n");
01170 //TODO
01171 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_var_ref_by_qname ( ptr< ::lestes::lang::cplus::sem::ss_var_ref_by_qname  )  [virtual]

This time, templates should be instantiated.

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 984 of file ss_ss2pi_base.cc.

References lassert2.

00984                                                                                         {
00985         lassert2(false,"Reference to unistantiated template.");
00986 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_var_ref ( ptr< ::lestes::lang::cplus::sem::ss_var_ref x  )  [virtual]

Load proper pi_mem_factory for a given declaration. In case of & references, which are treated as pointers, pointer is read and flag for dereference is set. For referenced variables origin has to be computed, to determine correct data flow (e.g. in a=1+a, where a is used as both a load's source and a store's target).

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 435 of file ss_ss2pi_base.cc.

References caller, compute_origin(), lestes::lang::cplus::sem::ss_type2info::create(), entry, evaluated(), lassert, lassert2, outry, plog, result, returned_pointer, lestes::lang::cplus::sem::ss_type2info::SS_REFERENCE, and lestes::lang::cplus::sem::ss_sp2pi_sp().

00435                                                                        {entry("VR");
00436 
00437         bool to_be_dereferenced=ss_type2info::create()->process(x->type_get()) == ss_type2info::SS_REFERENCE;
00438         if  (to_be_dereferenced) { plog(gnl)<<x->uid_get()<<" pointer to be dereferenced\n"; }
00439         
00440         if (evaluated(x)) { returned_pointer=to_be_dereferenced;  return; }
00441         
00442         ptr< pi_mem_factory > var = caller->mem_variable_get(x->var_decl_get());
00443         lassert2(var,"Variable reference not found in variable map.");
00444 
00445         if (to_be_dereferenced) {                               //references shall be treated as pointers
00446 
00447                 ptr< pi_mem > lval  = var->get_mem(compute_origin(var,x->psp_get()));
00448                 lassert(lval->kind_get()!=pi_operand::MEM_PTR_DEREF);
00449                 
00450                 ptr< pi_preg > rval = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->convert(x->type_get()));
00451         
00452                 ulint level = max(x->psp_get()->level_get(),x->nsp_get()->level_get());
00453         
00454                 ptr< pi_ld > tmp = pi_ld::create (
00455                                 ss_sp2pi_sp(x->psp_get()), ss_sp2pi_sp(x->nsp_get()),
00456                                 1+max(level,lval->origin_get()->level_get()),
00457                                 rval,
00458                                 lval,
00459                                 rval->type_get()
00460                         );
00461                         
00462                 rval->origin_set(tmp);
00463                 
00464                 ptr<backend_data_builder> initial_structure_builder = backend_data_builder::instance();
00465                 initial_structure_builder->add_pi(tmp); 
00466                 initial_structure_builder->add_rail();
00467 
00468 
00469                 ptr< pi_mf_ptr_deref > pointer_factory = pi_mf_ptr_deref::create(               //dereferenced memory placeholder
00470                                         NULL,
00471                                         ss_type2tm_type_convertor::instance()->convert(x->type_get()),
00472                                         rval
00473                                 );
00474 
00475                 returned_pointer=true;          //dereference have to be checked on higher level 
00476                 
00477                 (*expr2operand_map)[x] = result =  pointer_factory->get_mem(rval->origin_get());
00478 
00479          } //ss_reference
00480          
00481                 else    //standard var_ref
00482                  (*expr2operand_map)[x] = result = var->get_mem(compute_origin(var,x->psp_get())); //get pi_mem for variable x
00483         
00484 outry("VR");
00485 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_throw ( ptr< ::lestes::lang::cplus::sem::ss_throw  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1173 of file ss_ss2pi_base.cc.

References lassert2.

01173                                                                   {
01174 lassert2(false,"Visitor of throe expression not implemented in ss2pi\n");
01175 //TODO
01176 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_member_ptr ( ptr< ::lestes::lang::cplus::sem::ss_member_ptr  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1178 of file ss_ss2pi_base.cc.

References lassert2.

01178                                                                             {
01179 lassert2(false,"Visitor of member pointer expression not implemented in ss2pi\n");
01180 //TODO
01181 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_ptr_member_ptr ( ptr< ::lestes::lang::cplus::sem::ss_ptr_member_ptr  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1183 of file ss_ss2pi_base.cc.

References lassert2.

01183                                                                                     {
01184 lassert2(false,"Visitor of current expression not implemented in ss2pi\n");
01185 //TODO
01186 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_access ( ptr< ::lestes::lang::cplus::sem::ss_access  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1188 of file ss_ss2pi_base.cc.

References lassert2.

01188                                                                     {
01189 lassert2(false,"Visitor of accessing operator not implemented in ss2pi\n");
01190 //TODO
01191 }

void lestes::lang::cplus::sem::ss_expr2pi::visit_ss_ptr_access ( ptr< ::lestes::lang::cplus::sem::ss_ptr_access  )  [virtual]

Implements lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 1193 of file ss_ss2pi_base.cc.

References lassert2.

01193                                                                             {
01194 lassert2(false,"Visitor of pointer accessing operator expression not implemented in ss2pi\n");
01195 //TODO
01196 }

ptr< ss_expr2pi > lestes::lang::cplus::sem::ss_expr2pi::create ( ptr< ss_stmt2pi a__ss_expr2pi__caller,
ptr< ::lestes::backend_v2::intercode::pi_operand a__ss_expr2pi__result,
ptr< ss_sp a__ss_expr2pi__psp,
ptr< ss_destructor_table a__ss_expr2pi__temporaries,
ptr< expression_results_map_type a__ss_expr2pi__expr2operand_map,
bool  a__ss_expr2pi__returned_pointer 
) [static]

First generated factory method for class ss_expr2pi.

This factory method for class ss_expr2pi takes values of all fields as arguments.

Author:
lsg

Definition at line 631 of file ss_ss2pi_base.g.cc.

References ss_expr2pi().

Referenced by visit_ss_funcall().

00637 {
00638         return ptr< ss_expr2pi > ( new ss_expr2pi(a__ss_expr2pi__caller,
00639                 a__ss_expr2pi__result,
00640                 a__ss_expr2pi__psp,
00641                 a__ss_expr2pi__temporaries,
00642                 a__ss_expr2pi__expr2operand_map,
00643                 a__ss_expr2pi__returned_pointer) );
00644 }

ptr< ss_expr2pi > lestes::lang::cplus::sem::ss_expr2pi::create ( ptr< ss_stmt2pi a__ss_expr2pi__caller,
ptr< ss_sp a__ss_expr2pi__psp,
ptr< ss_destructor_table a__ss_expr2pi__temporaries,
ptr< expression_results_map_type a__ss_expr2pi__expr2operand_map 
) [static]

Second generated factory method for class ss_expr2pi.

This factory method for class ss_expr2pi uses initializers.

Author:
lsg

Definition at line 650 of file ss_ss2pi_base.g.cc.

References ss_expr2pi().

00654 {
00655         return ptr< ss_expr2pi > ( new ss_expr2pi(a__ss_expr2pi__caller, NULL, a__ss_expr2pi__psp, a__ss_expr2pi__temporaries, a__ss_expr2pi__expr2operand_map, false) );
00656 }

ptr<::lestes::backend_v2::intercode::pi_operand > lestes::lang::cplus::sem::ss_expr2pi::returns ( const ptr< ::lestes::lang::cplus::sem::ss_expression > &   ) 

"visit-return" method

Definition at line 707 of file ss_ss2pi_base.g.cc.

References lassert2, and result_get().

Referenced by is_returned_pointer(), returns_mem(), returns_mem_pointer(), returns_preg(), visit_ss_array_to_pointer(), and visit_ss_get().

00708 {
00709         lassert2( o, "Cannot visit NULL object." );
00710         o->accept_ss_expression_visitor( ptr< ss_expression_visitor >(this) );
00711         return result_get();
00712 }

ptr< object::reflection_list > lestes::lang::cplus::sem::ss_expr2pi::reflection_get (  )  const [virtual]

for purposes of dumping

Reimplemented from lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 671 of file ss_ss2pi_base.g.cc.

References lestes::std::list< T >::create(), reflection, and lestes::lang::cplus::sem::ss_expression_visitor::reflection_get().

00672 {
00673         if (!reflection) {
00674                 typedef class_reflection::field_metadata md;
00675                 typedef class_reflection::field_metadata_list mdlist;
00676                 ptr<mdlist> mdl = mdlist::create();
00677                 mdl->push_back( md::create( "caller", "ss_stmt2pi" ) );
00678                 mdl->push_back( md::create( "result", "pi_operand" ) );
00679                 mdl->push_back( md::create( "psp", "ss_sp" ) );
00680                 mdl->push_back( md::create( "temporaries", "ss_destructor_table" ) );
00681                 mdl->push_back( md::create( "expr2operand_map", "expression_results_map_type" ) );
00682                 mdl->push_back( md::create( "returned_pointer", "bool" ) );
00683                 reflection = reflection_list::create( ss_expression_visitor::reflection_get() );
00684                 reflection->push_back( class_reflection::create( "ss_expr2pi", mdl ) );
00685         }
00686         return reflection;
00687 }

ptr< object::field_list_list > lestes::lang::cplus::sem::ss_expr2pi::field_values_get (  )  const [virtual]

for purposes of dumping

Reimplemented from lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 689 of file ss_ss2pi_base.g.cc.

References lestes::std::list< T >::create(), lestes::lang::cplus::sem::ss_expression_visitor::field_values_get(), and result.

00690 {
00691         ptr < field_list_list > result = ss_expression_visitor::field_values_get();
00692         result->push_back( value_list::create() );
00693         result->back()->push_back( this->caller );
00694         result->push_back( value_list::create() );
00695         result->back()->push_back( this->result );
00696         result->push_back( value_list::create() );
00697         result->back()->push_back( this->psp );
00698         result->push_back( value_list::create() );
00699         result->back()->push_back( this->temporaries );
00700         result->push_back( value_list::create() );
00701         result->back()->push_back( this->expr2operand_map );
00702         result->push_back( value_list::create() );
00703         result->back()->push_back( objectize< bool > ::create( this->returned_pointer ) );
00704         return result;
00705 }

void lestes::lang::cplus::sem::ss_expr2pi::gc_mark ( void   )  [protected, virtual]

Marking routine for class ss_expr2pi.

Marking routine is used for garbage collection.

Author:
lsg

Reimplemented from lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 719 of file ss_ss2pi_base.g.cc.

References lestes::lang::cplus::sem::ss_expression_visitor::gc_mark().

00720 {
00721         ss_expression_visitor::gc_mark();
00722 }


Member Data Documentation

srp< ss_stmt2pi > lestes::lang::cplus::sem::ss_expr2pi::caller [private]

Nearest statement visitor caller(needed for variable access).

Definition at line 627 of file ss_ss2pi_base.g.hh.

Referenced by caller_get(), caller_set(), and visit_ss_var_ref().

srp< ::lestes::backend_v2::intercode::pi_operand > lestes::lang::cplus::sem::ss_expr2pi::result [private]

Result of evaluating current expression.

Usually pseudoregister, where the result is stored. For lvalues appropriate memory placeholder(pi_mem) is stored. For void funcalls NULL is stored.

Definition at line 636 of file ss_ss2pi_base.g.hh.

Referenced by evaluated(), field_values_get(), result_get(), result_set(), visit_ss_address_of(), visit_ss_array_to_pointer(), visit_ss_assign(), visit_ss_bind_reference(), visit_ss_conversion(), visit_ss_dereference(), visit_ss_funcall(), visit_ss_get(), visit_ss_literal(), visit_ss_var_ref(), and visit_ss_vol_get().

srp< ss_sp > lestes::lang::cplus::sem::ss_expr2pi::psp [private]

Previous full-expression sequence point.

It points to the psp of the fullexpression (or the whole expression of the initializer). Used for stop mark of pi_mem origin computation - only side effects inside the whole expression are significant.

Definition at line 645 of file ss_ss2pi_base.g.hh.

Referenced by psp_get(), psp_set(), and visit_ss_vol_get().

srp< ss_destructor_table > lestes::lang::cplus::sem::ss_expr2pi::temporaries [private]

Destructor table for temporary variables.

Temporaries which rise, when evaluating exression. They will be destructed, after evaluating the whole expression(i.e. the whole statement)

Definition at line 653 of file ss_ss2pi_base.g.hh.

Referenced by temporaries_get(), temporaries_set(), and visit_ss_funcall().

srp< expression_results_map_type > lestes::lang::cplus::sem::ss_expr2pi::expr2operand_map [private]

Map for result of subexpressions inside fullexpression.

It prevents of reevaluation of already evaluated subexpressions. Used also for determination of memory destination of side effects.

Definition at line 661 of file ss_ss2pi_base.g.hh.

Referenced by evaluated(), expr2operand_map_get(), and expr2operand_map_set().

bool lestes::lang::cplus::sem::ss_expr2pi::returned_pointer [private]

Temporary variable used by is_returned_pointer method.

Definition at line 663 of file ss_ss2pi_base.g.hh.

Referenced by is_returned_pointer(), returned_pointer_get(), returned_pointer_set(), visit_ss_assign(), visit_ss_dereference(), and visit_ss_var_ref().

ptr< object::reflection_list > lestes::lang::cplus::sem::ss_expr2pi::reflection = reflection [static, private]

Reimplemented from lestes::lang::cplus::sem::ss_expression_visitor.

Definition at line 664 of file ss_ss2pi_base.g.hh.

Referenced by reflection_get().


The documentation for this class was generated from the following files:
Generated on Mon Feb 12 18:25:26 2007 for lestes by doxygen 1.5.1-20070107