#include <preasmgen_body_changes.g.hh>
Inheritance diagram for lestes::md::functions::preasmgen_body_changes:

Public Member Functions | |
| virtual void | process_body () |
| Emits code to the function's body.. | |
| virtual ptr< list< srp< ::lestes::backend_v2::intercode::ge_pi > > > | get_result () |
| Returns the function's body with the additional code. | |
| virtual ptr< reflection_list > | reflection_get () const |
| for purposes of dumping | |
| virtual ptr< field_list_list > | field_values_get () const |
| for purposes of dumping | |
Static Public Member Functions | |
| static ptr< preasmgen_body_changes > | create (ptr< ::lestes::lang::cplus::sem::ss_function_declaration > a__preasmgen_body_changes_base__function, ptr< ::lestes::std::list< srp< ::lestes::backend_v2::intercode::ge_pi > > > a__preasmgen_body_changes_base__body) |
| First generated factory method for class preasmgen_body_changes. | |
| static ptr< preasmgen_body_changes > | create (ptr< ::lestes::lang::cplus::sem::ss_function_declaration > a__preasmgen_body_changes_base__function) |
| Second generated factory method for class preasmgen_body_changes. | |
Protected Member Functions | |
| preasmgen_body_changes (ptr< ::lestes::lang::cplus::sem::ss_function_declaration > a__preasmgen_body_changes_base__function, ptr< ::lestes::std::list< srp< ::lestes::backend_v2::intercode::ge_pi > > > a__preasmgen_body_changes_base__body) | |
| Generated constructor for class preasmgen_body_changes. | |
| virtual void | gc_mark () |
| Marking routine for class preasmgen_body_changes. | |
Static Private Attributes | |
| static ptr< reflection_list > | reflection = reflection |
Definition at line 48 of file preasmgen_body_changes.g.hh.
| lestes::md::functions::preasmgen_body_changes::preasmgen_body_changes | ( | ptr< ::lestes::lang::cplus::sem::ss_function_declaration > | a__preasmgen_body_changes_base__function, | |
| ptr< ::lestes::std::list< srp< ::lestes::backend_v2::intercode::ge_pi > > > | a__preasmgen_body_changes_base__body | |||
| ) | [protected] |
Generated constructor for class preasmgen_body_changes.
Generated constructor for class preasmgen_body_changes.
Definition at line 48 of file preasmgen_body_changes.g.cc.
Referenced by create().
00050 : preasmgen_body_changes_base(a__preasmgen_body_changes_base__function, 00051 a__preasmgen_body_changes_base__body) 00052 {}
| void lestes::md::functions::preasmgen_body_changes::process_body | ( | ) | [virtual] |
Emits code to the function's body..
Implements lestes::md::functions::preasmgen_body_changes_base.
Definition at line 27 of file preasmgen_body_changes.cc.
References lestes::md::functions::preasmgen_body_changes_base::body_get(), lestes::md::types::DT_COND, lestes::md::types::DT_INT_32U, lestes::md::functions::preasmgen_body_changes_base::function_get(), lestes::md::instructions::INSTRUCTION_BACKUPESP__1, lestes::md::instructions::INSTRUCTION_ESPADD__1, lestes::md::instructions::INSTRUCTION_PUSH__2, lestes::md::registers::R_COND, lestes::md::registers::R_EBP, and lestes::md::registers::R_ESP.
00027 { 00028 ptr<ge_pi> psp = ge_sp::create(NULL, NULL); 00029 ptr<ge_pi> nsp = body_get()->front().dncast<ge_sp>(); 00030 00031 ptr<tm_data_type_base> type_32u = tm_dt_simple::instance(DT_INT_32U); 00032 ptr<ge_operand_reg> reg_ebp = ge_operand_reg::create(type_32u,psp,NULL); 00033 ptr<ge_operand_reg> reg_esp = ge_operand_reg::create(type_32u,psp,NULL); 00034 00035 //PUSH EBP 00036 ptr<ge_pi> push_ebp = ge_pi::create(tm_instr::instance(INSTRUCTION_PUSH__2),NULL); 00037 push_ebp->operands_input_get()->push_back(reg_esp); 00038 (*reg_esp->assigned_registers_get())[push_ebp] = R_ESP; 00039 push_ebp->operands_input_get()->push_back(reg_ebp); 00040 (*reg_ebp->assigned_registers_get())[push_ebp] = R_EBP; 00041 push_ebp->operands_output_get()->push_back(reg_esp); 00042 00043 00044 //MOV EBP,ESP 00045 ptr<ge_pi> mov_esp_to_ebp = ge_pi::create(tm_instr::instance(INSTRUCTION_BACKUPESP__1),NULL); 00046 mov_esp_to_ebp->operands_input_get()->push_back(reg_esp); 00047 (*reg_esp->assigned_registers_get())[mov_esp_to_ebp] = R_ESP; 00048 mov_esp_to_ebp->operands_output_get()->push_back(reg_ebp); 00049 (*reg_ebp->assigned_registers_get())[mov_esp_to_ebp] = R_EBP; 00050 00051 ptr<local_variable_allocator> allocator = local_variable_allocator::instance(function_get()); 00052 lint vars_size = allocator->local_end_offset_get(); 00053 00054 if (vars_size!=0) { 00055 //ADD ESP, $VARS_SPACE_SIZE 00056 ::std::ostringstream oss; 00057 oss << vars_size/8; 00058 00059 ptr<li_simple> vars_size_value = li_simple::create(type_32u,ucn_string(oss.str().c_str())); 00060 ptr<ge_operand> vars_size = ge_operand_imm::create(type_32u,NULL,NULL,vars_size_value); 00061 00062 ptr<ge_operand_reg> cond = ge_operand_reg::create(tm_dt_simple::instance(DT_COND),NULL,NULL); 00063 00064 ptr<ge_pi> add = ge_pi::create(tm_instr::instance(INSTRUCTION_ESPADD__1),NULL); 00065 add->operands_input_get()->push_back(reg_esp); 00066 (*reg_esp->assigned_registers_get())[add] = R_ESP; 00067 add->operands_input_get()->push_back(vars_size); 00068 add->operands_output_get()->push_back(reg_esp); 00069 add->operands_output_get()->push_back(cond); 00070 (*cond->assigned_registers_get())[add] = R_COND; 00071 cond->origin_set(add); 00072 00073 body_get()->push_front(add); 00074 add->dependencies_get()->insert(mov_esp_to_ebp); 00075 nsp->dependencies_get()->insert(add); 00076 } 00077 00078 body_get()->push_front(mov_esp_to_ebp); 00079 mov_esp_to_ebp->dependencies_get()->insert(push_ebp); 00080 nsp->dependencies_get()->insert(mov_esp_to_ebp); 00081 00082 body_get()->push_front(push_ebp); 00083 push_ebp->dependencies_get()->insert(psp); 00084 nsp->dependencies_get()->insert(push_ebp); 00085 00086 body_get()->push_front(psp); 00087 nsp->dependencies_get()->insert(psp); 00088 }
| ptr< ge_pi_list__type > lestes::md::functions::preasmgen_body_changes::get_result | ( | ) | [virtual] |
Returns the function's body with the additional code.
Implements lestes::md::functions::preasmgen_body_changes_base.
Definition at line 90 of file preasmgen_body_changes.cc.
References lestes::md::functions::preasmgen_body_changes_base::body_get().
00090 { 00091 return body_get(); 00092 }
| ptr< preasmgen_body_changes > lestes::md::functions::preasmgen_body_changes::create | ( | ptr< ::lestes::lang::cplus::sem::ss_function_declaration > | a__preasmgen_body_changes_base__function, | |
| ptr< ::lestes::std::list< srp< ::lestes::backend_v2::intercode::ge_pi > > > | a__preasmgen_body_changes_base__body | |||
| ) | [static] |
First generated factory method for class preasmgen_body_changes.
This factory method for class preasmgen_body_changes takes values of all fields as arguments.
Definition at line 28 of file preasmgen_body_changes.g.cc.
References preasmgen_body_changes().
00030 { 00031 return ptr< preasmgen_body_changes > ( new preasmgen_body_changes(a__preasmgen_body_changes_base__function, 00032 a__preasmgen_body_changes_base__body) ); 00033 }
| ptr< preasmgen_body_changes > lestes::md::functions::preasmgen_body_changes::create | ( | ptr< ::lestes::lang::cplus::sem::ss_function_declaration > | a__preasmgen_body_changes_base__function | ) | [static] |
Second generated factory method for class preasmgen_body_changes.
This factory method for class preasmgen_body_changes uses initializers.
Definition at line 39 of file preasmgen_body_changes.g.cc.
References preasmgen_body_changes().
00040 { 00041 return ptr< preasmgen_body_changes > ( new preasmgen_body_changes(a__preasmgen_body_changes_base__function, NULL) ); 00042 }
| ptr< object::reflection_list > lestes::md::functions::preasmgen_body_changes::reflection_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::md::functions::preasmgen_body_changes_base.
Definition at line 54 of file preasmgen_body_changes.g.cc.
References lestes::std::list< T >::create(), reflection, and lestes::md::functions::preasmgen_body_changes_base::reflection_get().
00055 { 00056 if (!reflection) { 00057 typedef class_reflection::field_metadata md; 00058 typedef class_reflection::field_metadata_list mdlist; 00059 ptr<mdlist> mdl = mdlist::create(); 00060 reflection = reflection_list::create( preasmgen_body_changes_base::reflection_get() ); 00061 reflection->push_back( class_reflection::create( "preasmgen_body_changes", mdl ) ); 00062 } 00063 return reflection; 00064 }
| ptr< object::field_list_list > lestes::md::functions::preasmgen_body_changes::field_values_get | ( | ) | const [virtual] |
for purposes of dumping
Reimplemented from lestes::md::functions::preasmgen_body_changes_base.
Definition at line 66 of file preasmgen_body_changes.g.cc.
References lestes::md::functions::preasmgen_body_changes_base::field_values_get().
00067 { 00068 ptr < field_list_list > result = preasmgen_body_changes_base::field_values_get(); 00069 return result; 00070 }
| void lestes::md::functions::preasmgen_body_changes::gc_mark | ( | void | ) | [protected, virtual] |
Marking routine for class preasmgen_body_changes.
Marking routine is used for garbage collection.
Reimplemented from lestes::md::functions::preasmgen_body_changes_base.
Definition at line 77 of file preasmgen_body_changes.g.cc.
References lestes::md::functions::preasmgen_body_changes_base::gc_mark().
00078 { 00079 preasmgen_body_changes_base::gc_mark(); 00080 }
ptr< object::reflection_list > lestes::md::functions::preasmgen_body_changes::reflection = reflection [static, private] |
Reimplemented from lestes::md::functions::preasmgen_body_changes_base.
Definition at line 81 of file preasmgen_body_changes.g.hh.
Referenced by reflection_get().
1.5.1-20070107