lestes::backend_v2::workers::ge_generator Class Reference

Generates ge-level intercode structures for a pi-level intecode body. More...

#include <ge_generator.g.hh>

Inheritance diagram for lestes::backend_v2::workers::ge_generator:

lestes::backend_v2::workers::worker_base lestes::std::object lestes::std::mem::keystone List of all members.

Public Member Functions

void process ()
 Generates ge-level intercode for a function body in pi-level intercode.
ptr< ::lestes::backend_v2::structs::func_dataget_result ()
 Returns the function's data with generated body in ge-intercode.
void append_vector_to_list (ptr< list< srp< ::lestes::backend_v2::intercode::ge_pi > > > l, ptr< vector< srp< ::lestes::backend_v2::intercode::ge_pi > > > v)
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< ge_generatorcreate (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data)
 First generated factory method for class ge_generator.

Protected Member Functions

 ge_generator (ptr< ::lestes::backend_v2::structs::func_data > a__worker_base__data)
 Generated constructor for class ge_generator.
virtual void gc_mark ()
 Marking routine for class ge_generator.

Static Private Attributes

static ptr< reflection_listreflection = reflection

Detailed Description

Generates ge-level intercode structures for a pi-level intecode body.

Definition at line 57 of file ge_generator.g.hh.


Constructor & Destructor Documentation

lestes::backend_v2::workers::ge_generator::ge_generator ( ptr< ::lestes::backend_v2::structs::func_data a__worker_base__data  )  [protected]

Generated constructor for class ge_generator.

Generated constructor for class ge_generator.

Author:
lsg

Definition at line 38 of file ge_generator.g.cc.

Referenced by create().

00039         : worker_base(a__worker_base__data)
00040 {}


Member Function Documentation

void lestes::backend_v2::workers::ge_generator::process (  )  [virtual]

Generates ge-level intercode for a function body in pi-level intercode.

Implements lestes::backend_v2::workers::worker_base.

Definition at line 34 of file ge_generator.cc.

References append_vector_to_list(), lestes::backend_v2::workers::worker_base::data_get(), and lestes::msg::eolog.

00034                            {
00035         
00036         log << "ge-code generation - start\n" << eolog;
00037         
00038         
00039         ptr<visitor_pi_pi2pi_operands> pi2op = visitor_pi_pi2pi_operands::create();
00040         ptr<visitor_pi_pi2id> pi_id_getter = visitor_pi_pi2id::create();
00041                 
00042         ptr<pi_pi_list__type> pi_pi_list = data_get()->pi_body_get();
00043         ptr<ge_pi_list__type> ge_pi_list = data_get()->ge_body_get();
00044         
00045         //Count operand uses.
00046         ptr<pi_op2count__type> op_use_count = pi_op2count__type::create();
00047         for(pi_pi_list__type::iterator it_pi_list = pi_pi_list->begin(); it_pi_list!=pi_pi_list->end(); ++it_pi_list) {
00048                 ptr<pi_pi> pi = *it_pi_list;
00049                 ptr<pi_operands> ops = pi->accept_visitor_pi_pi2pi_operands_gen_base(pi2op);
00050                 
00051                 ptr<pi_operand_vector__type> in_ops = ops->operands_input_get();
00052                 for(pi_operand_vector__type::iterator it_op = in_ops->begin(); it_op!=in_ops->end(); ++it_op) {
00053                         ptr<pi_operand> op = *it_op;
00054                         
00055                         pi_op2count__type::iterator it_search = op_use_count->find(op);
00056                         
00057                         if ( it_search==op_use_count->end() ) {
00058                                 (*op_use_count)[op] = 1;
00059                         } else {
00060                                 (*op_use_count)[op] = it_search->second + 1;
00061                         }
00062                 }
00063         }
00064         
00065         ptr<pi_pi2ge_pi> convertor = pi_pi2ge_pi::create(op_use_count);
00066         
00067         ptr<pi_pi2ge_pi_vector__type> pi2ge = pi_pi2ge_pi_vector__type::create();       
00068         //Convert sequencepoints
00069         for(pi_pi_list__type::iterator it_pi_list = pi_pi_list->begin(); it_pi_list!=pi_pi_list->end(); ++it_pi_list) {
00070                 ptr<pi_pi> pi = *it_pi_list;
00071                 
00072                 if ( (visitor_pi_pi2id::kind_type)pi->accept_visitor_pi_pi2ulint_gen_base(pi_id_getter)==visitor_pi_pi2id::PI_SP ) {
00073                         ptr<ge_pi_vector__type> ge_code = pi->accept_visitor_pi_pi2ge_pi_gen_base(convertor);
00074                         (*pi2ge)[pi] = ge_code;
00075                 }
00076         }
00077         
00078         /*
00079                 Convert pseudoinstructions.
00080                 Sequencepoints have to be converted before this.
00081         */
00082         for(pi_pi_list__type::iterator it_pi_list = pi_pi_list->begin(); it_pi_list!=pi_pi_list->end(); ++it_pi_list) {
00083                 ptr<pi_pi> pi = *it_pi_list;
00084                 
00085                 ptr<ge_pi_vector__type> ge_code;
00086                 
00087                 if ( (visitor_pi_pi2id::kind_type)pi->accept_visitor_pi_pi2ulint_gen_base(pi_id_getter)==visitor_pi_pi2id::PI_SP ) {
00088                         ge_code = (*pi2ge)[pi];
00089                 } else {
00090                         ge_code = pi->accept_visitor_pi_pi2ge_pi_gen_base(convertor);
00091                 }
00092                 
00093                 append_vector_to_list(ge_pi_list,ge_code);                              
00094         }
00095         
00096         //Setup dependencies of the ge-pseudoinstructions.
00097         for(ge_pi_list__type::iterator it_ge_list = ge_pi_list->begin(); it_ge_list!=ge_pi_list->end(); ++it_ge_list) {
00098                 convertor->setup_dependencies(*it_ge_list);
00099         }
00100         
00101         log << "ge-code generation - end\n" << eolog;
00102 }

ptr< func_data > lestes::backend_v2::workers::ge_generator::get_result (  )  [virtual]

Returns the function's data with generated body in ge-intercode.

Implements lestes::backend_v2::workers::worker_base.

Definition at line 107 of file ge_generator.cc.

References lestes::backend_v2::workers::worker_base::data_get().

00107                                         {
00108         return data_get();
00109 }

void lestes::backend_v2::workers::ge_generator::append_vector_to_list ( ptr< list< srp< ::lestes::backend_v2::intercode::ge_pi > > >  l,
ptr< vector< srp< ::lestes::backend_v2::intercode::ge_pi > > >  v 
)

Referenced by process().

ptr< ge_generator > lestes::backend_v2::workers::ge_generator::create ( ptr< ::lestes::backend_v2::structs::func_data a__worker_base__data  )  [static]

First generated factory method for class ge_generator.

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

Author:
lsg

Definition at line 29 of file ge_generator.g.cc.

References ge_generator().

00030 {
00031         return ptr< ge_generator > ( new ge_generator(a__worker_base__data) );
00032 }

ptr< object::reflection_list > lestes::backend_v2::workers::ge_generator::reflection_get (  )  const [virtual]

for purposes of dumping

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 42 of file ge_generator.g.cc.

References lestes::std::list< T >::create(), reflection, and lestes::backend_v2::workers::worker_base::reflection_get().

00043 {
00044         if (!reflection) {
00045                 typedef class_reflection::field_metadata md;
00046                 typedef class_reflection::field_metadata_list mdlist;
00047                 ptr<mdlist> mdl = mdlist::create();
00048                 reflection = reflection_list::create( worker_base::reflection_get() );
00049                 reflection->push_back( class_reflection::create( "ge_generator", mdl ) );
00050         }
00051         return reflection;
00052 }

ptr< object::field_list_list > lestes::backend_v2::workers::ge_generator::field_values_get (  )  const [virtual]

for purposes of dumping

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 54 of file ge_generator.g.cc.

References lestes::backend_v2::workers::worker_base::field_values_get().

00055 {
00056         ptr < field_list_list > result = worker_base::field_values_get();
00057         return result;
00058 }

void lestes::backend_v2::workers::ge_generator::gc_mark ( void   )  [protected, virtual]

Marking routine for class ge_generator.

Marking routine is used for garbage collection.

Author:
lsg

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 65 of file ge_generator.g.cc.

References lestes::backend_v2::workers::worker_base::gc_mark().

00066 {
00067         worker_base::gc_mark();
00068 }


Member Data Documentation

ptr< object::reflection_list > lestes::backend_v2::workers::ge_generator::reflection = reflection [static, private]

Reimplemented from lestes::backend_v2::workers::worker_base.

Definition at line 86 of file ge_generator.g.hh.

Referenced by reflection_get().


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