# HG changeset patch # User Mario de Sousa # Date 1349558944 -3600 # Node ID dee28c5bdc7332c32ee7859c18f8ecabb8b5ecb5 # Parent d28c7ebaca21ec037ccb69d01f4394fbb8e7de13 Use doubly linked connections for flow control graph (will be used later). diff -r d28c7ebaca21 -r dee28c5bdc73 absyntax/absyntax.def --- a/absyntax/absyntax.def Thu Oct 04 18:54:15 2012 +0100 +++ b/absyntax/absyntax.def Sat Oct 06 22:29:04 2012 +0100 @@ -908,11 +908,11 @@ SYM_LIST(instruction_list_c) /* | label ':' [il_incomplete_instruction] eol_list */ -/* NOTE: The parameter 'prev_il_instruction' is used to point to all previous il instructions that may be executed imedaitely before this instruction. - * In case of an il instruction preceded by a label, this will include all IL instructions that jump to this label! +/* NOTE: The parameters 'prev_il_instruction'/'next_il_instruction' are used to point to all previous/next il instructions that may be executed imedaitely before/after this instruction. + * In case of an il instruction preceded by a label, the previous_il_instruction will include all IL instructions that jump to this label! * It is filled in by the flow_control_analysis_c during stage 3. */ -SYM_REF2(il_instruction_c, label, il_instruction, std::vector prev_il_instruction;) +SYM_REF2(il_instruction_c, label, il_instruction, std::vector prev_il_instruction, next_il_instruction;) /* | il_simple_operator [il_operand] */ diff -r d28c7ebaca21 -r dee28c5bdc73 stage3/flow_control_analysis.cc --- a/stage3/flow_control_analysis.cc Thu Oct 04 18:54:15 2012 +0100 +++ b/stage3/flow_control_analysis.cc Sat Oct 06 22:29:04 2012 +0100 @@ -131,6 +131,25 @@ } +void flow_control_analysis_c::link_insert(symbol_c *prev_instruction, symbol_c *next_instruction) { + il_instruction_c *next = dynamic_cast(next_instruction); + il_instruction_c *prev = dynamic_cast(prev_instruction); + if ((NULL == next) || (NULL == prev)) ERROR; + + next->prev_il_instruction.insert(next->prev_il_instruction.begin(), prev); + prev->next_il_instruction.insert(prev->next_il_instruction.begin(), next); +} + + +void flow_control_analysis_c::link_pushback(symbol_c *prev_instruction, symbol_c *next_instruction) { + il_instruction_c *next = dynamic_cast(next_instruction); + il_instruction_c *prev = dynamic_cast(prev_instruction); + if ((NULL == next) || (NULL == prev)) ERROR; + + next->prev_il_instruction.push_back(prev); + prev->next_il_instruction.push_back(next); +} + /************************************/ /* B 1.5 Program organization units */ @@ -209,7 +228,7 @@ /* We try to guarantee that the previous il instruction that is in the previous line, will occupy the first element of the vector. * In order to do that, we use insert() instead of push_back() */ - symbol->prev_il_instruction.insert(symbol->prev_il_instruction.begin() , prev_il_instruction); + link_insert(prev_il_instruction, symbol); /* check if it is an il_expression_c, a JMP[C[N]], or a RET, and if so, handle it correctly */ prev_il_instruction_is_JMP_or_RET = false; @@ -255,9 +274,8 @@ /* give the visit(JMP_operator *) an oportunity to set the prev_il_instruction_is_JMP_or_RET flag! */ symbol->il_jump_operator->accept(*this); - /* add, to that il_instruction's list of prev_il_intsructions, the curr_il_instruction */ if (NULL != destination) - destination->prev_il_instruction.push_back(curr_il_instruction); + link_pushback(curr_il_instruction, destination); return NULL; } @@ -297,7 +315,8 @@ /* We try to guarantee that the previous il instruction that is in the previous line, will occupy the first element of the vector. * In order to do that, we use insert() instead of push_back() */ - symbol->prev_il_instruction.insert(symbol->prev_il_instruction.begin() , prev_il_instruction); + link_insert(prev_il_instruction, symbol); + return NULL; } diff -r d28c7ebaca21 -r dee28c5bdc73 stage3/flow_control_analysis.hh --- a/stage3/flow_control_analysis.hh Thu Oct 04 18:54:15 2012 +0100 +++ b/stage3/flow_control_analysis.hh Sat Oct 06 22:29:04 2012 +0100 @@ -49,10 +49,14 @@ private: search_il_label_c *search_il_label; - symbol_c *prev_il_instruction; - symbol_c *curr_il_instruction; + symbol_c *prev_il_instruction; + symbol_c *curr_il_instruction; bool prev_il_instruction_is_JMP_or_RET; + private: + void link_insert (symbol_c *prev_instruction, symbol_c *next_instruction); + void link_pushback(symbol_c *prev_instruction, symbol_c *next_instruction); + public: flow_control_analysis_c(symbol_c *ignore); virtual ~flow_control_analysis_c(void);