PandA-2024.02
function_frontend_flow_step.cpp
Go to the documentation of this file.
1 /*
2  *
3  * _/_/_/ _/_/ _/ _/ _/_/_/ _/_/
4  * _/ _/ _/ _/ _/_/ _/ _/ _/ _/ _/
5  * _/_/_/ _/_/_/_/ _/ _/_/ _/ _/ _/_/_/_/
6  * _/ _/ _/ _/ _/ _/ _/ _/ _/
7  * _/ _/ _/ _/ _/ _/_/_/ _/ _/
8  *
9  * ***********************************************
10  * PandA Project
11  * URL: http://panda.dei.polimi.it
12  * Politecnico di Milano - DEIB
13  * System Architectures Group
14  * ***********************************************
15  * Copyright (C) 2004-2024 Politecnico di Milano
16  *
17  * This file is part of the PandA framework.
18  *
19  * The PandA framework is free software; you can redistribute it and/or modify
20  * it under the terms of the GNU General Public License as published by
21  * the Free Software Foundation; either version 3 of the License, or
22  * (at your option) any later version.
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program. If not, see <http://www.gnu.org/licenses/>.
31  *
32  */
45 
46 #include "Parameter.hpp" // for Parameter
47 #include "application_manager.hpp" // for application_m...
48 #include "basic_block.hpp" // for BBGraphsColle...
49 #include "behavioral_helper.hpp" // for BehavioralHelper
50 #include "call_graph.hpp" // for CallGraph
51 #include "call_graph_manager.hpp" // for CallGraphMana...
52 #include "cdfg_edge_info.hpp" // for CFG_SELECTOR
53 #include "custom_map.hpp"
54 #include "custom_set.hpp"
55 #include "dbgPrintHelper.hpp" // for DEBUG_LEVEL_V...
56 #include "design_flow_graph.hpp" // for DesignFlowGraph
57 #include "design_flow_manager.hpp" // for DesignFlowMan...
58 #include "design_flow_step_factory.hpp" // for DesignFlowMan...
59 #include "edge_info.hpp" // for EdgeInfoRef
60 #include "exceptions.hpp" // for THROW_ASSERT
61 #include "ext_tree_node.hpp" // for gimple_multi_...
62 #include "frontend_flow_step_factory.hpp" // for DesignFlowSte...
63 #include "function_behavior.hpp" // for FunctionBehavior
64 #include "graph.hpp" // for SelectEdge
65 #include "hash_helper.hpp" // for hash
66 #include "string_manipulation.hpp" // for STR GET_CLASS
67 #include "symbolic_application_frontend_flow_step.hpp" // for SymbolicAppli...
68 #include "tree_basic_block.hpp" // for bloc, bloc::E...
69 #include "tree_common.hpp" // for gimple_multi_...
70 #include "tree_manager.hpp" // for ParameterCons...
71 #include "tree_node.hpp" // for function_decl
72 #include "tree_reindex.hpp"
73 #include <boost/iterator/iterator_facade.hpp> // for operator!=
74 #include <boost/tuple/tuple.hpp> // for tie
75 #include <iostream> // for ios_base::fai...
76 #include <utility> // for pair
77 
79  const FrontendFlowStepType _frontend_flow_step_type,
80  const DesignFlowManagerConstRef _design_flow_manager,
81  const ParameterConstRef _parameters)
82  : FrontendFlowStep(_AppM, _frontend_flow_step_type, _design_flow_manager, _parameters),
83  function_behavior(_AppM->GetFunctionBehavior(_function_id)),
84  function_id(_function_id),
85  bb_version(0),
86  bitvalue_version(0)
87 {
88  debug_level = parameters->get_class_debug_level(GET_CLASS(*this));
89 }
90 
92 
94 {
96 }
97 
99  const unsigned int function_id)
100 {
101  return "Frontend::" + STR(frontend_flow_step_type) + "::" + std::to_string(function_id);
102 }
103 
105 {
106 #ifndef NDEBUG
107  const std::string version = bb_version != 0 ? ("(" + STR(bb_version) + ")") : "";
108  const std::string bv_version = bitvalue_version != 0 ? ("[" + STR(bitvalue_version) + "]") : "";
109 #else
110  const std::string version = "";
111  const std::string bv_version = "";
112 #endif
113  return "Frontend::" + GetKindText() + "::" + function_behavior->CGetBehavioralHelper()->get_function_name() +
114  version + bv_version;
115 }
116 
118  const DesignFlowStep::RelationshipType relationship_type)
119 {
120  const DesignFlowGraphConstRef design_flow_graph = design_flow_manager.lock()->CGetDesignFlowGraph();
121  const auto* frontend_flow_step_factory = GetPointer<const FrontendFlowStepFactory>(CGetDesignFlowStepFactory());
123  ComputeFrontendRelationships(relationship_type);
124 
127  if(relationship_type == DEPENDENCE_RELATIONSHIP)
128  {
129  const auto precedence_relationships = ComputeFrontendRelationships(PRECEDENCE_RELATIONSHIP);
130  for(const auto& precedence_relationship : precedence_relationships)
131  {
132  if(precedence_relationship.second == SAME_FUNCTION)
133  {
134  const auto signature =
135  FunctionFrontendFlowStep::ComputeSignature(precedence_relationship.first, function_id);
136  const auto symbolic_signature =
137  SymbolicApplicationFrontendFlowStep::ComputeSignature(precedence_relationship.first);
138  const auto symbolic_step = design_flow_manager.lock()->GetDesignFlowStep(symbolic_signature);
139  if(symbolic_step)
140  {
141 #ifndef NDEBUG
142  if(!(design_flow_manager.lock()->GetStatus(symbolic_signature) == DesignFlowStep_Status::UNEXECUTED ||
143  design_flow_manager.lock()->GetStatus(signature) == DesignFlowStep_Status::SUCCESS ||
144  design_flow_manager.lock()->GetStatus(signature) == DesignFlowStep_Status::UNCHANGED))
145  {
146  design_flow_manager.lock()->CGetDesignFlowGraph()->WriteDot("Design_Flow_Error");
147  const auto design_flow_step_info = design_flow_graph->CGetDesignFlowStepInfo(symbolic_step);
148  THROW_UNREACHABLE("Symbolic step " + design_flow_step_info->design_flow_step->GetName() +
149  " is not unexecuted");
150  }
151 #endif
152  frontend_relationships.insert(precedence_relationship);
153  }
154  }
155  }
156  }
158  frontend_relationship_end = frontend_relationships.end();
159  for(frontend_relationship = frontend_relationships.begin(); frontend_relationship != frontend_relationship_end;
160  ++frontend_relationship)
161  {
162  switch(frontend_relationship->second)
163  {
164  case(ALL_FUNCTIONS):
165  {
167  break;
168  }
169  case(CALLED_FUNCTIONS):
170  {
171  const auto call_graph_manager = AppM->CGetCallGraphManager();
172  const auto acyclic_call_graph = call_graph_manager->CGetAcyclicCallGraph();
173  const auto function_vertex = call_graph_manager->GetVertex(function_id);
174  OutEdgeIterator oe, oe_end;
175  for(boost::tie(oe, oe_end) = boost::out_edges(function_vertex, *acyclic_call_graph); oe != oe_end; oe++)
176  {
177  const vertex target = boost::target(*oe, *acyclic_call_graph);
178  const unsigned int called_function = call_graph_manager->get_function(target);
179  if(AppM->CGetFunctionBehavior(called_function)->CGetBehavioralHelper()->has_implementation() and
180  function_id != called_function)
181  {
182  vertex function_frontend_flow_step = design_flow_manager.lock()->GetDesignFlowStep(
183  FunctionFrontendFlowStep::ComputeSignature(frontend_relationship->first, called_function));
184  DesignFlowStepRef design_flow_step;
185  if(function_frontend_flow_step)
186  {
187  design_flow_step =
188  design_flow_graph->CGetDesignFlowStepInfo(function_frontend_flow_step)->design_flow_step;
189  relationships.insert(design_flow_step);
190  }
191  else
192  {
193  design_flow_step = frontend_flow_step_factory->CreateFunctionFrontendFlowStep(
194  frontend_relationship->first, called_function);
195  relationships.insert(design_flow_step);
196  }
197  }
198  }
199  break;
200  }
201  case(CALLING_FUNCTIONS):
202  {
203  const auto call_graph_manager = AppM->CGetCallGraphManager();
204  const auto acyclic_call_graph = call_graph_manager->CGetAcyclicCallGraph();
205  const auto function_vertex = call_graph_manager->GetVertex(function_id);
206  InEdgeIterator ie, ie_end;
207  for(boost::tie(ie, ie_end) = boost::in_edges(function_vertex, *acyclic_call_graph); ie != ie_end; ie++)
208  {
209  const vertex source = boost::source(*ie, *acyclic_call_graph);
210  const unsigned int calling_function = call_graph_manager->get_function(source);
211  if(calling_function != function_id)
212  {
213  const auto function_frontend_flow_step = design_flow_manager.lock()->GetDesignFlowStep(
214  FunctionFrontendFlowStep::ComputeSignature(frontend_relationship->first, calling_function));
215  DesignFlowStepRef design_flow_step;
216  if(function_frontend_flow_step)
217  {
218  design_flow_step =
219  design_flow_graph->CGetDesignFlowStepInfo(function_frontend_flow_step)->design_flow_step;
220  relationships.insert(design_flow_step);
221  }
222  else
223  {
224  design_flow_step = frontend_flow_step_factory->CreateFunctionFrontendFlowStep(
225  frontend_relationship->first, calling_function);
226  relationships.insert(design_flow_step);
227  }
228  }
229  }
230  break;
231  }
232  case(SAME_FUNCTION):
233  {
234  const auto prec_step = design_flow_manager.lock()->GetDesignFlowStep(
235  FunctionFrontendFlowStep::ComputeSignature(frontend_relationship->first, function_id));
236  DesignFlowStepRef design_flow_step;
237  if(prec_step)
238  {
239  design_flow_step = design_flow_graph->CGetDesignFlowStepInfo(prec_step)->design_flow_step;
240  relationships.insert(design_flow_step);
241  }
242  else
243  {
244  design_flow_step = frontend_flow_step_factory->CreateFunctionFrontendFlowStep(
245  frontend_relationship->first, function_id);
246  relationships.insert(design_flow_step);
247  }
248  break;
249  }
250  case(WHOLE_APPLICATION):
251  {
253  break;
254  }
255  default:
256  {
257  THROW_UNREACHABLE("Function relationship does not exist");
258  }
259  }
260  }
261  FrontendFlowStep::ComputeRelationships(relationships, relationship_type);
262 }
263 
265 {
266  DesignFlowStep_Status status;
267  if(!HasToBeExecuted0())
268  {
270  }
271  else
272  {
273  status = InternalExec();
274  }
275  bb_version = function_behavior->GetBBVersion();
276  bitvalue_version = function_behavior->GetBitValueVersion();
277  return status;
278 }
279 
281 {
282  CallGraphManagerConstRef CGMan = AppM->CGetCallGraphManager();
283  const auto funcs = CGMan->GetReachedBodyFunctions();
284  if(function_id and funcs.find(function_id) == funcs.end())
285  {
286  return false;
287  }
288  return true;
289 }
290 
292 {
293  return bb_version != function_behavior->GetBBVersion();
294 }
295 
297 {
298  auto bb_graph_info = BBGraphInfoRef(new BBGraphInfo(AppM, function_id));
299  BBGraphsCollectionRef GCC_bb_graphs_collection(new BBGraphsCollection(bb_graph_info, parameters));
300  BBGraphRef GCC_bb_graph(new BBGraph(GCC_bb_graphs_collection, CFG_SELECTOR));
301  CustomUnorderedMap<unsigned int, vertex> inverse_vertex_map;
302  const tree_nodeConstRef function_tree_node = AppM->get_tree_manager()->CGetTreeNode(function_id);
303  const auto fd = GetPointer<const function_decl>(function_tree_node);
304  const auto sl = GetPointer<const statement_list>(GET_CONST_NODE(fd->body));
306  for(const auto& block : sl->list_of_bloc)
307  {
308  inverse_vertex_map[block.first] =
309  GCC_bb_graphs_collection->AddVertex(BBNodeInfoRef(new BBNodeInfo(block.second)));
310  }
312  if(inverse_vertex_map.find(bloc::ENTRY_BLOCK_ID) == inverse_vertex_map.end())
313  {
314  inverse_vertex_map[bloc::ENTRY_BLOCK_ID] = GCC_bb_graphs_collection->AddVertex(BBNodeInfoRef(new BBNodeInfo()));
315  }
316  bb_graph_info->entry_vertex = inverse_vertex_map[bloc::ENTRY_BLOCK_ID];
317  if(inverse_vertex_map.find(bloc::EXIT_BLOCK_ID) == inverse_vertex_map.end())
318  {
319  inverse_vertex_map[bloc::EXIT_BLOCK_ID] = GCC_bb_graphs_collection->AddVertex(BBNodeInfoRef(new BBNodeInfo()));
320  }
321  bb_graph_info->exit_vertex = inverse_vertex_map[bloc::EXIT_BLOCK_ID];
322 
324  for(const auto& block : sl->list_of_bloc)
325  {
326  for(const auto pred : block.second->list_of_pred)
327  {
328  if(pred == bloc::ENTRY_BLOCK_ID)
329  {
330  GCC_bb_graphs_collection->AddEdge(inverse_vertex_map[pred], inverse_vertex_map[block.first], CFG_SELECTOR);
331  }
332  }
333  for(const auto succ : block.second->list_of_succ)
334  {
335  THROW_ASSERT(inverse_vertex_map.find(block.first) != inverse_vertex_map.end(),
336  "BB" + STR(block.first) + " does not exist");
337  THROW_ASSERT(inverse_vertex_map.find(succ) != inverse_vertex_map.end(), "BB" + STR(succ) + " does not exist");
338  if(block.second->CGetStmtList().size() and
339  GET_NODE(block.second->CGetStmtList().back())->get_kind() == gimple_multi_way_if_K)
340  {
341  const auto gmwi = GetPointer<const gimple_multi_way_if>(GET_NODE(block.second->CGetStmtList().back()));
343  for(const auto& gmwi_cond : gmwi->list_of_cond)
344  {
345  if(gmwi_cond.second == succ)
346  {
347  if(gmwi_cond.first)
348  {
349  conds.insert(gmwi_cond.first->index);
350  }
351  else
352  {
353  conds.insert(default_COND);
354  }
355  }
356  }
357  THROW_ASSERT(conds.size(), "Inconsistency between cfg and output of gimple_multi_way_if " +
358  gmwi->ToString() + "- condition for BB" + STR(succ) + " not found");
359  const EdgeInfoRef edge_info(new BBEdgeInfo());
360  for(auto cond : conds)
361  {
362  GetPointer<BBEdgeInfo>(edge_info)->add_nodeID(cond, CFG_SELECTOR);
363  }
364  GCC_bb_graphs_collection->InternalAddEdge(inverse_vertex_map[block.first], inverse_vertex_map[succ],
365  CFG_SELECTOR, edge_info);
366  }
367  else
368  {
369  GCC_bb_graphs_collection->AddEdge(inverse_vertex_map[block.first], inverse_vertex_map[succ], CFG_SELECTOR);
370  }
371  }
372  if(block.second->list_of_succ.empty())
373  {
374  GCC_bb_graphs_collection->AddEdge(inverse_vertex_map[block.first], inverse_vertex_map[bloc::EXIT_BLOCK_ID],
375  CFG_SELECTOR);
376  }
377  }
378 
380  GCC_bb_graphs_collection->AddEdge(inverse_vertex_map[bloc::ENTRY_BLOCK_ID], inverse_vertex_map[bloc::EXIT_BLOCK_ID],
381  CFG_SELECTOR);
382  BBGraph(GCC_bb_graphs_collection, CFG_SELECTOR).WriteDot(filename);
383  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "---Written " + filename);
385 #ifndef NDEBUG
386  for(const auto& block : sl->list_of_bloc)
387  {
388  for(const auto& phi : block.second->CGetPhiList())
389  {
390  const auto gp = GetPointer<const gimple_phi>(GET_CONST_NODE(phi));
391  THROW_ASSERT(gp->CGetDefEdgesList().size() == block.second->list_of_pred.size(),
392  "BB" + STR(block.second->number) + " has " + STR(block.second->list_of_pred.size()) +
393  " incoming edges but contains " + STR(phi));
394  }
395  }
396 #endif
397 }
398 
400 {
401  return bb_version;
402 }
403 
405 {
406  return bitvalue_version;
407 }
408 
410 {
411  if(!parameters->IsParameter("print-dot-FF") || parameters->GetParameter<unsigned int>("print-dot-FF"))
412  {
413  WriteBBGraphDot("BB_Before_" + GetName() + ".dot");
414  }
416 }
417 
419 {
420  if(!parameters->IsParameter("print-dot-FF") || parameters->GetParameter<unsigned int>("print-dot-FF"))
421  {
422  WriteBBGraphDot("BB_After_" + GetName() + ".dot");
423  }
425 }
#define GET_NODE(t)
Macro used to hide implementation details when accessing a tree_node from another tree_node...
Definition: tree_node.hpp:343
#define DEBUG_LEVEL_VERY_PEDANTIC
extremely verbose debugging print is performed.
#define INDENT_DBG_MEX(dbgLevel, curDbgLevel, mex)
We are producing a debug version of the program, so the message is printed;.
boost::graph_traits< graph >::out_edge_iterator OutEdgeIterator
out_edge_iterator definition.
Definition: graph.hpp:1312
virtual const CustomUnorderedSet< std::pair< FrontendFlowStepType, FunctionRelationship > > ComputeFrontendRelationships(const DesignFlowStep::RelationshipType relationship_type) const =0
Return the set of analyses in relationship with this design step.
void PrintInitialIR() const override
Dump the initial intermediate representation.
File containing functions and utilities to support the printing of debug messagges.
Step successfully executed.
Definition of the node_info object for the basic_block graph.
string target
Definition: lenet_tvm.py:16
std::string filename
#define GET_CLASS(obj)
Macro returning the actual type of an object.
Information associated with a basic block edge.
Definition of the class representing a generic C application.
std::string GetName() const override
Return the name of this design step.
Step successfully executed but without any IR change.
void WriteDot(const std::string &file_name, const int detail_level=0) const
Writes this graph in dot format.
RelationshipType
The relationship type.
DesignFlowStepFactoryConstRef CGetDesignFlowStepFactory() const override
Return the factory to create this type of steps.
Class specification of the graph structures.
boost::graph_traits< graph >::in_edge_iterator InEdgeIterator
in_edge_iterator definition.
Definition: graph.hpp:1310
exceptions managed by PandA
static const unsigned int EXIT_BLOCK_ID
constant identifying the exit basic block
virtual std::string GetKindText() const
Return the name of the type of this frontend flow step.
This class contains the base representation for a generic frontend flow step which works on a single ...
const FrontendFlowStepType frontend_flow_step_type
The type of this step.
Data structure describing a basic block at tree level.
virtual DesignFlowStep_Status InternalExec()=0
Execute the step.
unsigned int bb_version
The version of the basic block intermediate representation on which this step has been applied...
redefinition of map to manage ordered/unordered structures
#define STR(s)
Macro which performs a lexical_cast to a string.
Auxiliary methods for manipulating string.
bool HasToBeExecuted() const override
Check if this step has actually to be executed.
void ComputeRelationships(DesignFlowStepSet &relationship, const DesignFlowStep::RelationshipType relationship_type) override
Compute the relationships of a step with other steps.
std::string GetSignature() const override
Return the signature of this step.
Pure virtual base class for all the design flow step factory.
#define THROW_UNREACHABLE(str_expr)
helper function used to specify that some points should never be reached
Definition: exceptions.hpp:292
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.
Class used to describe a particular graph with basic blocks as nodes.
absl::flat_hash_map< T, U, Hash, Eq, Alloc > CustomUnorderedMap
Definition: custom_map.hpp:148
static const std::string ComputeSignature(const FrontendFlowStepType frontend_flow_step_type)
Compute the signature of a symbolic application frontend flow step.
This C++ header file contains common macros for the tree structure.
~FunctionFrontendFlowStep() override
Destructor.
refcount< BBNodeInfo > BBNodeInfoRef
refcount definition of the class
void WriteBBGraphDot(const std::string &filename) const
Write the current version of statement list in dot format.
Information associated with the whole basic-block graph.
#define default_COND
constant used to represent label "default" of a switch construct
Classes to describe design flow graph.
redefinition of set to manage ordered/unordered structures
void PrintInitialIR() const override
Dump the initial intermediate representation.
boost::graph_traits< graph >::vertex_descriptor vertex
vertex definition.
Definition: graph.hpp:1303
const Wrefcount< const DesignFlowManager > design_flow_manager
The design flow manager.
#define GET_CONST_NODE(t)
Definition: tree_node.hpp:347
Classes specification of the tree_node data structures.
const ParameterConstRef parameters
Set of input parameters.
DesignFlowStep_Status
The status of a step.
Call graph hierarchy.
Wrapper of design_flow.
This struct specifies the block node.
Definition: tree_node.hpp:1820
enum FrontendFlowStepType { CREATE_TREE_MANAGER, FIND_MAX_TRANSFORMATIONS, FUNCTION_ANALYSIS, SYMBOLIC_APPLICATION_FRONTEND_FLOW_STEP, ADD_BB_ECFG_EDGES, ADD_ARTIFICIAL_CALL_FLOW_EDGES, ADD_OP_EXIT_FLOW_EDGES, ADD_OP_LOOP_FLOW_EDGES, ADD_OP_PHI_FLOW_EDGES, BAMBU_FRONTEND_FLOW, BASIC_BLOCKS_CFG_COMPUTATION, BB_CONTROL_DEPENDENCE_COMPUTATION, BB_FEEDBACK_EDGES_IDENTIFICATION, BB_ORDER_COMPUTATION, BB_REACHABILITY_COMPUTATION, BIT_VALUE, BIT_VALUE_OPT, BITVALUE_RANGE, BIT_VALUE_IPA, BLOCK_FIX, BUILD_VIRTUAL_PHI, CALL_EXPR_FIX, CALL_GRAPH_BUILTIN_CALL, CHECK_SYSTEM_TYPE, COMPLETE_BB_GRAPH, COMPLETE_CALL_GRAPH, COMPUTE_IMPLICIT_CALLS, COMMUTATIVE_EXPR_RESTRUCTURING, COND_EXPR_RESTRUCTURING, CSE_STEP, DATAFLOW_CG_EXT, DEAD_CODE_ELIMINATION, DEAD_CODE_ELIMINATION_IPA, DETERMINE_MEMORY_ACCESSES, DOM_POST_DOM_COMPUTATION, EXTRACT_GIMPLE_COND_OP, EXTRACT_PATTERNS, FIX_STRUCTS_PASSED_BY_VALUE, FUNCTION_CALL_TYPE_CLEANUP, FUNCTION_CALL_OPT, FANOUT_OPT, FIX_VDEF, HDL_FUNCTION_DECL_FIX, HDL_VAR_DECL_FIX, HLS_DIV_CG_EXT, HWCALL_INJECTION, INTERFACE_INFER, IR_LOWERING, LOOP_COMPUTATION, LOOPS_ANALYSIS_BAMBU, LOOPS_COMPUTATION, LUT_TRANSFORMATION, MULTI_WAY_IF, MULTIPLE_ENTRY_IF_REDUCTION, NI_SSA_LIVENESS, OP_CONTROL_DEPENDENCE_COMPUTATION, OP_FEEDBACK_EDGES_IDENTIFICATION, OP_ORDER_COMPUTATION, OP_REACHABILITY_COMPUTATION, OPERATIONS_CFG_COMPUTATION, PARM2SSA, PARM_DECL_TAKEN_ADDRESS, PHI_OPT, PREDICATE_STATEMENTS, ESSA, RANGE_ANALYSIS, REBUILD_INITIALIZATION, REBUILD_INITIALIZATION2, REMOVE_CLOBBER_GA, REMOVE_ENDING_IF, SCALAR_SSA_DATA_FLOW_ANALYSIS, SERIALIZE_MUTUAL_EXCLUSIONS, SPLIT_RETURN, SHORT_CIRCUIT_TAF, SIMPLE_CODE_MOTION, SOFT_FLOAT_CG_EXT, STRING_CST_FIX, SWITCH_FIX, UN_COMPARISON_LOWERING, UNROLLING_DEGREE, USE_COUNTING, VAR_ANALYSIS, VAR_DECL_FIX, VECTORIZE, VERIFICATION_OPERATION, VIRTUAL_AGGREGATE_DATA_FLOW_ANALYSIS, VIRTUAL_PHI_NODES_SPLIT } FrontendFlowStepType
Base class description of data information associated with each edge of a graph.
Data structures used to represent an edge in operation and basic block graphs.
refcount< T > lock() const
Definition: refcount.hpp:212
void ComputeRelationships(DesignFlowStepSet &relationship, const DesignFlowStep::RelationshipType relationship_type) override
Compute the relationships of a step with other steps.
const unsigned int function_id
The index of the function to be analyzed.
const application_managerRef AppM
The application manager.
Class specification of the tree_reindex support class.
static const unsigned int ENTRY_BLOCK_ID
constant identifying the entry basic block
Class specification of the basic_block structure.
This file collects some hash functors.
This class contains the methods to create a frontend flow step.
DesignFlowStep_Status Exec() final
Execute the step.
Template borrowed from the ANTLR library by Terence Parr (http://www.jGuru.com - Software rights: htt...
Definition: refcount.hpp:94
Classes specification of the tree_node data structures not present in the gcc.
this class is used to manage the command-line or XML options.
unsigned int bitvalue_version
The version of the bitvalue information on which this step has been applied.
Wrapper to call graph.
int debug_level
The debug level.
void PrintFinalIR() const override
Dump the final intermediate representation.
void PrintFinalIR() const override
Dump the final intermediate representation.
bool HasToBeExecuted0() const
Check if this function is reachable from the top functions.
#define CFG_SELECTOR
Control flow graph edge selector.
refcount< BBGraphInfo > BBGraphInfoRef
refcount definition of the class
This class models the application of a analysis to all the functions of an application.
Class specification of the manager of the tree structures extracted from the raw file.
A brief description of the C++ Header File.
const FunctionBehaviorRef function_behavior
The function behavior of the function to be analyzed.
int sl
Definition: adpcm.c:105
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.
This structure defines graphs where nodes are basic_blocks.
#define THROW_ASSERT(cond, str_expr)
helper function used to check an assert and if needed to throw an error in a standard way ...
Definition: exceptions.hpp:289

Generated on Mon Feb 12 2024 13:02:51 for PandA-2024.02 by doxygen 1.8.13