#include <ss_ss2pi_base.g.hh>
Inheritance diagram for lestes::lang::cplus::sem::ss_expr2pi:

Definition at line 439 of file ss_ss2pi_base.g.hh.
| 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.
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 {}
| 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.
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.
| [in] | x | The new value to set ss_expr2pi::caller to. |
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.
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.
| [in] | x | The new value to set ss_expr2pi::result to. |
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.
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.
| [in] | x | The new value to set ss_expr2pi::psp to. |
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.
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.
| [in] | x | The new value to set ss_expr2pi::temporaries to. |
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.
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.
| [in] | x | The new value to set ss_expr2pi::expr2operand_map to. |
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.
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.
| [in] | x | The new value to set ss_expr2pi::returned_pointer to. |
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.
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.
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.
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 }
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().
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().
1.5.1-20070107