#include "suifkernel/suif_env.h"
#include "basicnodes/basic_forwarders.h"
#include "suifnodes/suif_forwarders.h"
#include "cfenodes/cfe_forwarders.h"
#include "common/i_integer.h"
#include "common/common_forwarders.h"
#include "common/suif_indexed_list.h"
Functions | |
IntConstant* | create_int_constant ( SuifEnv* suif_env, IInteger i ) |
Create an integer constant. More... | |
IInteger | get_expression_constant (const Expression *exp) |
Get an integer constant from an expression. More... | |
bool | is_variable_modified (const VariableSymbol* var, ExecutionObject* obj) |
Checks whether the variable var is modified inside obj. More... | |
bool | is_expr_modified (const Expression* expr, ExecutionObject* obj) |
Checks whether the value of expression expr is modified inside obj. More... | |
ProcedureSymbol* | get_procedure_target_from_call (const CallStatement *call) |
Get the procedure to be called by a call statement. | |
ProcedureSymbol* | get_procedure_from_address_op (const Expression *procedure_address) |
ProcedureDefinition* | get_procedure_definition (const ExecutionObject *eo) |
SuifObject* | remove_suif_object (SuifObject *obj) |
Remove an object from its owner, and clear its parent pointer. More... | |
Statement* | remove_statement (Statement *the_statement) |
remove the statement If it's parent is a statement list, we will do the appropriate removal. More... | |
Expression* | replace_expression (Expression *expr, Expression *replacement) |
replace an expression with a new expression A thin and somewhat redundent wrapper around expr->get_parent()->replace(expr,replacement);. | |
Statement* | replace_statement (Statement *stmt, Statement *replacement) |
Replace a statement with a new statement. | |
list<StoreVariableStatement*>* | force_dest_not_expr (Expression *expr) |
Turn the expression into a store of a variable. More... | |
void | force_dest_not_expr (Expression *expr, list<StoreVariableStatement*> &dismantled) |
bool | is_target_label (CodeLabelSymbol *target_label, Statement *the_statement) |
Return true if the target_label could a branch target for the Statement For code labels with their address taken, the result is always true. | |
void | insert_statement_after_loop_body (ForStatement *the_loop, Statement *the_statement) |
Insert a statement at the end of a loop body. More... | |
void | insert_statement_after_loop_body (DoWhileStatement *the_loop, Statement *the_statement) |
Insert a statement at the end of a loop body. More... | |
void | insert_statement_after_loop_body (WhileStatement *the_loop, Statement *the_statement) |
Insert a statement at the end of a loop body. More... | |
Statement* | insert_statement_before (Statement *loc, Statement *the_statement) |
Smart statement insert. More... | |
Statement* | insert_statement_after (Statement *loc, Statement *the_statement) |
Insert statement after the given statement Similar optimizations to insert_statement_before apply. | |
bool | is_void_dest (Expression *expr) |
Return true if there is no destination for an expression. More... | |
Statement* | build_assign (VariableSymbol *dst, Expression *expr) |
Create an assignment statement. | |
Statement* | build_assign (VariableSymbol *dest, VariableSymbol *src) |
Create an assignment statement. | |
Expression* | build_cast (Expression *expr, DataType *t) |
Create a cast. | |
Statement* | get_expression_owner (Expression *expr) |
find the statement at the base of this expression tree. | |
void | inline_call (CallStatement *the_call, ProcedureSymbol *target_proc) |
If target_proc is 0, find the direct target from the call. More... | |
Expression* | build_dyadic_expression (LString op,Expression *left,Expression *right) |
Build a dyadic expression Constant folding is done if needed. More... | |
Expression* | build_monadic_expression (LString op,Expression *subexp) |
Build a monadic expression. More... | |
Expression* | clone_if_needed (Expression *subexp) |
Clone an expression if it has a parent. More... | |
IInteger | restrict_int_to_data_type (DataType *t, const IInteger &ii) |
Restrict an iinteger to the bit_size, signed-ness use 2s complement on overflow. | |
Expression* | fold_and_replace_constants (Expression *expr) |
Return a constant folded version of the source expression. More... | |
Statement* | fold_and_replace_constants (Statement *statement) |
Return a constant folded version of the statement. More... | |
void | add_targets (Statement* stmt, list<CodeLabelSymbol*>& targets) |
Add jump targets that are possibly contained in stmt to the list of targets targets. More... | |
void | get_jumps_from_outside (ScopedObject* scope, searchable_list<CodeLabelSymbol*>& targets) |
Appends all jumps from outside of the scope to targets. | |
bool | has_jumps_going_inside (ScopedObject* scope) |
Returns true of the scoped object has a jump going into it from the outside. | |
Expression* | clone_expression (Expression *expr) |
Clone an expression. More... |
|
Add jump targets that are possibly contained in stmt to the list of targets targets.
If the statement isn't a jump of some sort, nothing is added to the list.
|
Create an assignment statement.
|
Create an assignment statement.
|
Create a cast.
|
Build a dyadic expression Constant folding is done if needed.
(very minimal at present) If constant folding occurs, and the parameter expressions have no parent, they are deleted. If no folding occurs and the parameter expressions have parents, they are cloned
|
Build a monadic expression.
The monadic equivalent of the above
|
Clone an expression.
All references to non-owned objects will remain
|
Clone an expression if it has a parent.
\warning. Think before doing this. Cloning an expression will result in two evaluations of the expression. Perhaps you want to assign to a variable and use that instead. Most often used with constants
|
Create an integer constant.
The type will be the type for word_type taken fromt the target information block
|
Return a constant folded version of the statement.
Branches or If Statements will be simplified, Empty StatementLists will be removed. The expressions used by the statementes will be simplified. WARNING. This may update the IR node that the statement is attached to. Be careful when using this while walking.
This constant folder is extensible. To add a new IR node
folding routine:
FoldTable *fold_table = FoldTable::get_fold_table(suif_env);
fold_table->add_statement_fold_fn(IR_meta_class_name, fn);
include "utils/fold_table.h"
|
Return a constant folded version of the source expression.
Any portion of the expression determined to be constant will be replaced with a constant expression. Any replaced expressions (including the source expression) will be either re-used or tossed in the trash
These routines do not yet fold Floating Point constants.
WARNING. This may update the IR node that the expression is attached to. Be careful when using this while walking.
This constant folder is extensible. To add a new IR Expression node
folding routine or a new Binary or Unary opcode routine:
FoldTable *fold_table = FoldTable::get_fold_table(suif_env);
fold_table->add_binary_fold_fn(opcode, fn);
fold_table->add_unary_fold_fn(opcode, fn);
fold_table->add_expression_fold_fn(IR_meta_class_name, fn);
include "utils/fold_table.h"
|
|
Turn the expression into a store of a variable.
followed by a reference. This can cause major code changes if the expression is in a do-while or while-do loop test.
If new statements are required, they will be returned It is possible to create Multiple statements from a single expression.
|
Get an integer constant from an expression.
Returns indeterminate if the expression is not an integer constant
|
find the statement at the base of this expression tree.
|
Appends all jumps from outside of the scope to targets.
|
|
|
Get the procedure to be called by a call statement.
|
Returns true of the scoped object has a jump going into it from the outside.
|
If target_proc is 0, find the direct target from the call.
otherwise, the target proc should be consistent with the call's address operand. (Original comment preserved - no idea what this does)
|
Insert statement after the given statement Similar optimizations to insert_statement_before apply.
|
Insert a statement at the end of a loop body.
If the loop continue label is used a new continue label will be created and an explicit label will be placed before the inserted statement.
|
Insert a statement at the end of a loop body.
If the loop continue label is used a new continue label will be created and an explicit label will be placed before the inserted statement.
|
Insert a statement at the end of a loop body.
If the loop continue label is used a new continue label will be created and an explicit label will be placed before the inserted statement.
|
Smart statement insert.
Puts the existing statement into a statement list and inserts in that statement list, if neccessary. If loc is already in a statement list, or is a statement list itself, the existing statement is used.
Returns the list into which the insertion was made
|
Checks whether the value of expression expr is modified inside obj.
Notice that the results are likely to be overly consirvsative at this point, as no real mod analysis is performed.
|
Return true if the target_label could a branch target for the Statement For code labels with their address taken, the result is always true.
|
Checks whether the variable var is modified inside obj.
Notice that the results are likely to be overly consirvsative at this point, as no real mod analysis is performed.
|
Return true if there is no destination for an expression.
Currently, this means that it is an Eval Statement.
|
remove the statement If it's parent is a statement list, we will do the appropriate removal.
If not, we will replace it with a new empty statement list.
|
Remove an object from its owner, and clear its parent pointer.
This should be moved to somewhere else
|
replace an expression with a new expression A thin and somewhat redundent wrapper around expr->get_parent()->replace(expr,replacement);.
|
Replace a statement with a new statement.
|
Restrict an iinteger to the bit_size, signed-ness use 2s complement on overflow.