lestes::md::functions::preasmgen_body_changes Class Reference

#include <preasmgen_body_changes.g.hh>

Inheritance diagram for lestes::md::functions::preasmgen_body_changes:

lestes::md::functions::preasmgen_body_changes_base lestes::std::object lestes::std::mem::keystone List of all members.

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_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< preasmgen_body_changescreate (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_changescreate (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_listreflection = reflection

Detailed Description

Definition at line 48 of file preasmgen_body_changes.g.hh.


Constructor & Destructor Documentation

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.

Author:
lsg

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 {}


Member Function Documentation

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.

Author:
lsg

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.

Author:
lsg

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.

Author:
lsg

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 }


Member Data Documentation

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().


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