PandA-2024.02
|
#include <compute_implicit_calls.hpp>
Public Member Functions | |
compute_implicit_calls (const ParameterConstRef parameters, const application_managerRef AppM, unsigned int _function_id, const DesignFlowManagerConstRef design_flow_manager) | |
Constructor. More... | |
~compute_implicit_calls () override | |
Destructor. More... | |
DesignFlowStep_Status | InternalExec () override |
Determines the variables that require a memory access. More... | |
Public Member Functions inherited from FunctionFrontendFlowStep | |
FunctionFrontendFlowStep (const application_managerRef AppM, const unsigned int function_id, const FrontendFlowStepType frontend_flow_step_type, const DesignFlowManagerConstRef design_flow_manager, const ParameterConstRef parameters) | |
Constructor. More... | |
~FunctionFrontendFlowStep () override | |
Destructor. More... | |
void | ComputeRelationships (DesignFlowStepSet &relationship, const DesignFlowStep::RelationshipType relationship_type) override |
Compute the relationships of a step with other steps. More... | |
std::string | GetSignature () const override |
Return the signature of this step. More... | |
std::string | GetName () const override |
Return the name of this design step. More... | |
DesignFlowStep_Status | Exec () final |
Execute the step. More... | |
bool | HasToBeExecuted () const override |
Check if this step has actually to be executed. More... | |
unsigned int | CGetBBVersion () const |
unsigned int | GetBitValueVersion () const |
void | PrintInitialIR () const override |
Dump the initial intermediate representation. More... | |
void | PrintFinalIR () const override |
Dump the final intermediate representation. More... | |
Public Member Functions inherited from FrontendFlowStep | |
FrontendFlowStep (const application_managerRef AppM, const FrontendFlowStepType frontend_flow_step_type, const DesignFlowManagerConstRef design_flow_manager, const ParameterConstRef parameters) | |
Constructor. More... | |
~FrontendFlowStep () override | |
Destructor. More... | |
virtual std::string | GetKindText () const |
Return the name of the type of this frontend flow step. More... | |
DesignFlowStepFactoryConstRef | CGetDesignFlowStepFactory () const override |
Return the factory to create this type of steps. More... | |
void | PrintTreeManager (const bool before) const |
Dump the tree manager. More... | |
Public Member Functions inherited from DesignFlowStep | |
DesignFlowStep (const DesignFlowManagerConstRef design_flow_manager, const ParameterConstRef parameters) | |
Constructor. More... | |
virtual | ~DesignFlowStep () |
Destructor. More... | |
virtual void | Initialize () |
Initialize the step (i.e., like a constructor, but executed just before exec. More... | |
DesignFlowStep_Status | GetStatus () const |
Return the status of this design step. More... | |
virtual void | WriteDot (std::ostream &out) const |
Write the label for a dot graph. More... | |
bool | IsComposed () const |
Returns if this step is composed. More... | |
int | CGetDebugLevel () const |
Return the debug level of the step. More... | |
Private Member Functions | |
const CustomUnorderedSet< std::pair< FrontendFlowStepType, FunctionRelationship > > | ComputeFrontendRelationships (const DesignFlowStep::RelationshipType relationship_type) const override |
Return the set of analyses in relationship with this design step. More... | |
void | replace_with_memcpy (tree_nodeRef stmt, const statement_list *sl, tree_manipulationRef tree_man) const |
void | replace_with_memset (tree_nodeRef stmt, const statement_list *sl, tree_manipulationRef tree_man) const |
Private Attributes | |
tree_managerRef | TM |
The tree manager. More... | |
bool | update_bb_ver |
Additional Inherited Members | |
Public Types inherited from FrontendFlowStep | |
using | FunctionRelationship = enum { ALL_FUNCTIONS, CALLED_FUNCTIONS, CALLING_FUNCTIONS, SAME_FUNCTION, WHOLE_APPLICATION } |
The different relationship type between function analysis. More... | |
Public Types inherited from DesignFlowStep | |
enum | RelationshipType { DEPENDENCE_RELATIONSHIP, INVALIDATION_RELATIONSHIP, PRECEDENCE_RELATIONSHIP } |
The relationship type. More... | |
Static Public Member Functions inherited from FunctionFrontendFlowStep | |
static const std::string | ComputeSignature (const FrontendFlowStepType frontend_flow_step_type, const unsigned int function_id) |
Compute the signature of a function frontend flow step. More... | |
Static Public Member Functions inherited from FrontendFlowStep | |
static void | CreateSteps (const DesignFlowManagerConstRef design_flow_manager, const CustomUnorderedSet< std::pair< FrontendFlowStepType, FunctionRelationship >> &frontend_relationships, const application_managerConstRef application_manager, DesignFlowStepSet &relationships) |
Create the relationship steps of a step with other steps starting from already specified dependencies between frontend flow steps. More... | |
static const std::string | EnumToKindText (const FrontendFlowStepType frontend_flow_step_type) |
Given a frontend flow step type, return the name of the type. More... | |
Protected Member Functions inherited from FunctionFrontendFlowStep | |
void | WriteBBGraphDot (const std::string &filename) const |
Write the current version of statement list in dot format. More... | |
Protected Attributes inherited from FunctionFrontendFlowStep | |
const FunctionBehaviorRef | function_behavior |
The function behavior of the function to be analyzed. More... | |
const unsigned int | function_id |
The index of the function to be analyzed. More... | |
unsigned int | bb_version |
The version of the basic block intermediate representation on which this step has been applied. More... | |
unsigned int | bitvalue_version |
The version of the bitvalue information on which this step has been applied. More... | |
Protected Attributes inherited from FrontendFlowStep | |
const application_managerRef | AppM |
The application manager. More... | |
const FrontendFlowStepType | frontend_flow_step_type |
The type of this step. More... | |
unsigned int | print_counter |
Print counter. More... | |
Protected Attributes inherited from DesignFlowStep | |
bool | composed |
True if this step represents a composition of design flow steps (e.g., a flow); must be set by specialized constructors. More... | |
const Wrefcount< const DesignFlowManager > | design_flow_manager |
The design flow manager. More... | |
const ParameterConstRef | parameters |
Set of input parameters. More... | |
int | debug_level |
The debug level. More... | |
const int | output_level |
The output level. More... | |
Definition at line 63 of file compute_implicit_calls.hpp.
compute_implicit_calls::compute_implicit_calls | ( | const ParameterConstRef | _parameters, |
const application_managerRef | _AppM, | ||
unsigned int | _function_id, | ||
const DesignFlowManagerConstRef | _design_flow_manager | ||
) |
Constructor.
This step do the lowering of two types of implicit memory operations: memset and memcpy implicit patterns.
parameters | is the set of input parameters |
AppM | is the application manager |
function_id | is the node id of the function analyzed. |
design_flow_manager | is the design flow manager |
Currently, only the memset implicit pattern is managed.
For the memset we look for this pattern: BB1: (xxxxa)* var = {}; (xxxxb)*
and we translate such code into this one: BB1: (xxxxa)* upperlimit=varsize+var; BBN1: i0=phi(var,i1) i1=i0+sizeof(item of var); i0* = 0; if(i1!= upperlimit) goto BBN1; BBN2: (xxxxb)* Note that implicit memory virtual definition has to be translated from "var = {};" into "var[i0] = 0;".Header include Behavior include Parameter include Tree include
Definition at line 95 of file compute_implicit_calls.cpp.
References DesignFlowStep::debug_level, DEBUG_LEVEL_NONE, GET_CLASS, DesignFlowStep::parameters, and ~compute_implicit_calls().
|
overridedefault |
|
overrideprivatevirtual |
Return the set of analyses in relationship with this design step.
relationship_type | is the type of relationship to be considered |
Implements FrontendFlowStep.
Definition at line 108 of file compute_implicit_calls.cpp.
References DesignFlowStep::DEPENDENCE_RELATIONSHIP, DesignFlowStep::INVALIDATION_RELATIONSHIP, DesignFlowStep::PRECEDENCE_RELATIONSHIP, SAME_FUNCTION, THROW_UNREACHABLE, and WHOLE_APPLICATION.
|
overridevirtual |
Determines the variables that require a memory access.
The tree manipulation
check for implicit memset/memcpy calls
compute the size of memory to be set with memset
do the memset transformations
create BBN1
Add BBN1 predecessor as BB1
create BBN2
Add BBN2 predecessor as BBN1 basic block
Add BBN2 successor as BB1 basic block
fix true and false edges
Add BBN1 successor as succ basic block
Fix BBN2 successors
Update all the phis
retrieve the starting variable
add a cast
Create phi for the induction variable of BBN1
The list of def edge which contains for the moment only the value coming from the forward edge
compute the size of memory to be set with memset
the comparison
the gimple cond
restructure of the implicit memset statement
We must use pointer since we are erasing elements in the list
move var = {}; to BBN1
Going one step step forward to avoid invalidation of the pointer
Moving statement
Going one step back since pointer is already increment in for loop
move (xxxxb)* to BBN2
Going one step step forward to avoid invalidation of the pointer
Moving statement
Going one step back since pointer is already increment in for loop
Implements FunctionFrontendFlowStep.
Definition at line 138 of file compute_implicit_calls.cpp.
References FrontendFlowStep::AppM, BB_ENTRY, BB_EXIT, tree_helper::CGetElements(), tree_manager::CGetTreeReindex(), tree_helper::CGetType(), tree_manager::CreateUniqueIntegerCst(), DesignFlowStep::debug_level, DEBUG_LEVEL_PEDANTIC, DEBUG_LEVEL_VERY_PEDANTIC, FunctionFrontendFlowStep::function_id, GET_CONST_NODE, GET_INDEX_CONST_NODE, GET_INDEX_NODE, tree_node::get_kind(), GET_NODE, tree_manager::get_tree_node_const(), tree_helper::GetBaseVariable(), tree_manager::GetFunction(), FunctionFrontendFlowStep::GetSignature(), tree_node::GetString(), INDENT_DBG_MEX, tree_node::index, tree_helper::IsVectorType(), max, MEMCPY, MEMSET, DesignFlowStep::parameters, phi, PRINT_DBG_MEX, replace_with_memcpy(), replace_with_memset(), tree_manager::ReplaceTreeNode(), tree_helper::Size(), sl, STR, SUCCESS, THROW_ASSERT, TM, ToString(), UNCHANGED, and update_bb_ver.
|
private |
Definition at line 524 of file compute_implicit_calls.cpp.
References FrontendFlowStep::AppM, test_panda::args, tree_helper::CGetType(), tree_manipulation::create_gimple_call(), tree_manipulation::CreateGimpleAssignAddrExpr(), tree_manager::CreateUniqueIntegerCst(), DesignFlowStep::debug_level, DEBUG_LEVEL_VERY_PEDANTIC, FunctionFrontendFlowStep::function_id, GET_CONST_NODE, tree_helper::GetConstValue(), tree_helper::GetFormalIth(), tree_manager::GetFunction(), tree_manipulation::GetPointerType(), INDENT_DBG_MEX, statement_list::list_of_bloc, max, MEMCPY, tree_helper::Size(), STR, THROW_ASSERT, TM, and U.
Referenced by InternalExec().
|
private |
Definition at line 676 of file compute_implicit_calls.cpp.
References FrontendFlowStep::AppM, test_panda::args, tree_helper::CGetType(), tree_manipulation::create_gimple_call(), tree_manager::CreateUniqueIntegerCst(), DesignFlowStep::debug_level, DEBUG_LEVEL_VERY_PEDANTIC, FunctionFrontendFlowStep::function_id, GET_CONST_NODE, tree_helper::GetConstValue(), tree_helper::GetFormalIth(), tree_manager::GetFunction(), INDENT_DBG_MEX, statement_list::list_of_bloc, max, MEMSET, tree_helper::Size(), STR, THROW_ASSERT, TM, and U.
Referenced by InternalExec().
|
private |
The tree manager.
Definition at line 67 of file compute_implicit_calls.hpp.
Referenced by InternalExec(), replace_with_memcpy(), and replace_with_memset().
|
private |
Definition at line 69 of file compute_implicit_calls.hpp.
Referenced by InternalExec().