PandA-2024.02
Public Member Functions | Static Public Member Functions | Data Fields | Private Member Functions | Private Attributes | Friends
CallGraphManager Class Reference

This class manages the accesses to the CallGraph. More...

#include <call_graph_manager.hpp>

Collaboration diagram for CallGraphManager:
Collaboration graph
[legend]

Public Member Functions

 CallGraphManager (const FunctionExpanderConstRef function_expander, const bool allow_recursive_functions, const tree_managerConstRef tree_manager, const ParameterConstRef Param)
 Constructor. More...
 
 ~CallGraphManager ()
 Destructor. More...
 
CallGraphConstRef CGetAcyclicCallGraph () const
 Return an acyclic version of the call graph. More...
 
CallGraphConstRef CGetCallGraph () const
 Return the call graph. More...
 
CallGraphConstRef CGetCallSubGraph (const CustomUnorderedSet< vertex > &vertices) const
 Return a subset of the call graph. More...
 
CustomSet< unsigned int > get_called_by (unsigned int index) const
 Returns the set of functions called by a function. More...
 
CustomSet< unsigned int > get_called_by (const OpGraphConstRef cfg, const vertex &caller) const
 Returns the set of functions called by an operation vertex. More...
 
unsigned int get_function (vertex node) const
 Given a vertex of the call graph, this returns the index of the corresponding function. More...
 
vertex GetVertex (const unsigned int index) const
 Return the vertex given the function id. More...
 
void SetRootFunctions (const CustomSet< unsigned int > &root_functions)
 Set the root functions. More...
 
CustomSet< unsigned int > GetRootFunctions () const
 Returns the root functions (i.e., the functions that are not called by any other ones. More...
 
const CustomSet< unsigned int > & GetReachedBodyFunctions () const
 Returns the source code functions called by the root functions. More...
 
CustomSet< unsigned int > GetReachedFunctionsFrom (unsigned int from_f, bool with_body=true) const
 compute the list of reached function starting from a given function More...
 
unsigned int GetRootFunction (unsigned int fid) const
 Get the parent root function. More...
 
CustomSet< unsigned int > GetReachedLibraryFunctions () const
 Returns the library functions called by the root functions. More...
 
bool IsVertex (unsigned int functionID) const
 return true in case the vertex has been already created More...
 
void AddFunction (unsigned int new_function_id, const FunctionBehaviorRef fun_behavior)
 
void AddFunctionAndCallPoint (const application_managerRef AppM, unsigned int caller_id, unsigned int called_id, unsigned int call_id, enum FunctionEdgeInfo::CallType call_type)
 Creates a new called function and directly adds the call to the call graph. More...
 
void RemoveCallPoint (const unsigned int caller_id, const unsigned int called_id, const unsigned int call_id)
 Remove a function call, like RemoveCallPoint with a different API. More...
 
void RemoveCallPoint (EdgeDescriptor e, const unsigned int callid)
 Removes a call point. More...
 
void ReplaceCallPoint (const EdgeDescriptor e, const unsigned int orig, const unsigned int repl)
 Replaces a call point. More...
 
bool ExistsAddressedFunction () const
 Returns true is there is at least a reachable function that is called through a function pointer or its address is taken. More...
 
CustomSet< unsigned int > GetAddressedFunctions () const
 Returns a set containing all the reachable addressed_functions. More...
 

Static Public Member Functions

static void call_graph_computation_recursive (CustomUnorderedSet< unsigned int > &AV, const application_managerRef AM, unsigned int current, const tree_managerRef &TM, const tree_nodeRef &tn, unsigned int node_stmt, enum FunctionEdgeInfo::CallType call_type, int DL)
 Recursive analysis of the tree nodes looking for call expressions. More...
 
static void expandCallGraphFromFunction (CustomUnorderedSet< unsigned int > &AV, const application_managerRef AM, unsigned int f_id, int DL)
 
static void addCallPointAndExpand (CustomUnorderedSet< unsigned int > &AV, const application_managerRef AM, unsigned int caller_id, unsigned int called_id, unsigned int call_id, enum FunctionEdgeInfo::CallType call_type, int DL)
 

Data Fields

const FunctionExpanderConstRef function_expander
 Functor used to check if the analysis should consider the body of a function. More...
 

Private Member Functions

void AddCallPoint (unsigned int caller_id, unsigned int called_id, unsigned int call_id, enum FunctionEdgeInfo::CallType call_type)
 Creates a new call point. More...
 
void AddFunctionAndCallPoint (unsigned int caller_id, unsigned int called_id, unsigned int call_id, const FunctionBehaviorRef called_function_behavior, enum FunctionEdgeInfo::CallType call_type)
 Creates a new called function and directly adds the call to the call graph. More...
 
bool IsCallPoint (unsigned int caller_id, unsigned int called_id, unsigned int call_id, enum FunctionEdgeInfo::CallType call_type) const
 Returns true if the call point is present. More...
 
void ComputeRootAndReachedFunctions ()
 Compute the root and reached functions, maintaining the internal data structures coherent. More...
 

Private Attributes

const CallGraphsCollectionRef call_graphs_collection
 
const CallGraphRef call_graph
 The view of call graph with all the edges. More...
 
const tree_managerConstRef tree_manager
 The tree manager. More...
 
std::map< unsigned int, CustomSet< unsigned int > > called_by
 put into relation function F_i and the list of functions called by F_i More...
 
std::map< unsigned int, vertexfunctionID_vertex_map
 put into relation function F_i and the vertex in the call graph representing it More...
 
const bool allow_recursive_functions
 True if recursive calls are allowed. More...
 
CustomSet< unsigned int > root_functions
 Root functions. More...
 
CustomSet< unsigned int > reached_body_functions
 source code functions directly or indirectly called by the root functions More...
 
CustomSet< unsigned int > reached_library_functions
 library functions directly or indirectly called by the root functions More...
 
CustomSet< unsigned int > addressed_functions
 set of functions whose address is taken More...
 
const ParameterConstRef Param
 set of input parameters More...
 
const int debug_level
 the debug level More...
 

Friends

class call_graph_computation
 

Detailed Description

This class manages the accesses to the CallGraph.

Definition at line 71 of file call_graph_manager.hpp.

Constructor & Destructor Documentation

◆ CallGraphManager()

CallGraphManager::CallGraphManager ( const FunctionExpanderConstRef  function_expander,
const bool  allow_recursive_functions,
const tree_managerConstRef  tree_manager,
const ParameterConstRef  Param 
)

Constructor.

The data structure is initialized.

Parameters
function_expanderis the functor used to determine if a function has to be considered during construction of call graph
allow_recursive_functionsspecifies if recursive functions are allowed
tree_manageris the tree manager
Paramis the set of input parameters

Definition at line 153 of file call_graph_manager.cpp.

References ~CallGraphManager().

Here is the call graph for this function:

◆ ~CallGraphManager()

CallGraphManager::~CallGraphManager ( )
default

Destructor.

Referenced by CallGraphManager().

Here is the caller graph for this function:

Member Function Documentation

◆ AddCallPoint()

void CallGraphManager::AddCallPoint ( unsigned int  caller_id,
unsigned int  called_id,
unsigned int  call_id,
enum FunctionEdgeInfo::CallType  call_type 
)
private

Creates a new call point.

Parameters
caller_idis the function id of the caller
called_idis the function id of the called function
call_idis the tree node index of the call statement
call_typeis the type of call

Definition at line 193 of file call_graph_manager.cpp.

References addressed_functions, FunctionEdgeInfo::call_any, call_graph, call_graphs_collection, called_by, CGetCallGraph(), tree_manager::CGetTreeNode(), ComputeRootAndReachedFunctions(), debug_level, DEBUG_LEVEL_VERY_PEDANTIC, FunctionEdgeInfo::direct_call, FEEDBACK_SELECTOR, FunctionEdgeInfo::function_address, GetVertex(), INDENT_DBG_MEX, FunctionEdgeInfo::indirect_call, IsCallPoint(), IsVertex(), tree_helper::print_function_name(), STD_SELECTOR, STR, THROW_ASSERT, THROW_UNREACHABLE, and graph::TopologicalSort().

Referenced by AddFunctionAndCallPoint(), and ReplaceCallPoint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ addCallPointAndExpand()

void CallGraphManager::addCallPointAndExpand ( CustomUnorderedSet< unsigned int > &  AV,
const application_managerRef  AM,
unsigned int  caller_id,
unsigned int  called_id,
unsigned int  call_id,
enum FunctionEdgeInfo::CallType  call_type,
int  DL 
)
static

◆ AddFunction()

void CallGraphManager::AddFunction ( unsigned int  new_function_id,
const FunctionBehaviorRef  fun_behavior 
)
Parameters
new_function_idis the index of the function to add
fun_behavioris the corresponding function behavior

Definition at line 168 of file call_graph_manager.cpp.

References call_graph, call_graphs_collection, called_by, ComputeRootAndReachedFunctions(), debug_level, DEBUG_LEVEL_VERY_PEDANTIC, functionID_vertex_map, refcount< T >::get(), GET_NODE_INFO, INDENT_DBG_MEX, IsVertex(), STR, and THROW_ASSERT.

Referenced by AddFunctionAndCallPoint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ AddFunctionAndCallPoint() [1/2]

void CallGraphManager::AddFunctionAndCallPoint ( unsigned int  caller_id,
unsigned int  called_id,
unsigned int  call_id,
const FunctionBehaviorRef  called_function_behavior,
enum FunctionEdgeInfo::CallType  call_type 
)
private

Creates a new called function and directly adds the call to the call graph.

Parameters
caller_idis the function id of the caller
called_idis the function id of the called function
call_idis the tree node index of the call statement
called_function_behavioris the FunctionBehavior of the called function
call_typeis the type of call

Definition at line 331 of file call_graph_manager.cpp.

References AddCallPoint(), and AddFunction().

Referenced by AddFunctionAndCallPoint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ AddFunctionAndCallPoint() [2/2]

void CallGraphManager::AddFunctionAndCallPoint ( const application_managerRef  AppM,
unsigned int  caller_id,
unsigned int  called_id,
unsigned int  call_id,
enum FunctionEdgeInfo::CallType  call_type 
)

Creates a new called function and directly adds the call to the call graph.

Parameters
AppMis the application manager
caller_idis the function id of the caller
called_idis the function id of the called function
call_idis the tree node index of the call statement
call_typeis the type of call

Definition at line 339 of file call_graph_manager.cpp.

References AddCallPoint(), AddFunctionAndCallPoint(), BUILTIN_WAIT_CALL, tree_manager::CGetTreeNode(), tree_manager::get_implementation_node(), IsVertex(), and tree_helper::print_function_name().

Here is the call graph for this function:

◆ call_graph_computation_recursive()

void CallGraphManager::call_graph_computation_recursive ( CustomUnorderedSet< unsigned int > &  AV,
const application_managerRef  AM,
unsigned int  current,
const tree_managerRef TM,
const tree_nodeRef tn,
unsigned int  node_stmt,
enum FunctionEdgeInfo::CallType  call_type,
int  DL 
)
static

Recursive analysis of the tree nodes looking for call expressions.

Parameters
TMis the tree manager.
tnis current tree node.
node_stmtis the analyzed tree node
call_typeis the type of call to be added

check for nested function

var decl performs an assignment when init is not null

Definition at line 714 of file call_graph_manager.cpp.

References test_panda::arg, CASE_BINARY_EXPRESSION, CASE_CPP_NODES, CASE_FAKE_NODES, CASE_PRAGMA_NODES, CASE_QUATERNARY_EXPRESSION, CASE_TYPE_NODES, CASE_UNARY_EXPRESSION, DEBUG_LEVEL_PEDANTIC, FunctionEdgeInfo::direct_call, expandCallGraphFromFunction(), tree_helper::find_obj_type_ref_function(), fun(), tree_manager::get_implementation_node(), GET_INDEX_NODE, tree_node::get_kind(), GET_NODE, tree_manager::get_tree_node_const(), INDENT_DBG_MEX, NESTED_FUNCTIONS_EC, STR, THROW_ASSERT, THROW_ERROR, THROW_ERROR_CODE, THROW_UNREACHABLE, and tree_node::ToString().

Referenced by expandCallGraphFromFunction().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ CGetAcyclicCallGraph()

CallGraphConstRef CallGraphManager::CGetAcyclicCallGraph ( ) const

Return an acyclic version of the call graph.

Definition at line 522 of file call_graph_manager.cpp.

References call_graphs_collection, and STD_SELECTOR.

◆ CGetCallGraph()

CallGraphConstRef CallGraphManager::CGetCallGraph ( ) const

Return the call graph.

Definition at line 527 of file call_graph_manager.cpp.

References call_graph.

Referenced by AddCallPoint(), IsCallPoint(), and RemoveCallPoint().

Here is the caller graph for this function:

◆ CGetCallSubGraph()

CallGraphConstRef CallGraphManager::CGetCallSubGraph ( const CustomUnorderedSet< vertex > &  vertices) const

Return a subset of the call graph.

Parameters
verticesis the subset of vertices to be considered

Definition at line 532 of file call_graph_manager.cpp.

References call_graphs_collection, FEEDBACK_SELECTOR, and STD_SELECTOR.

◆ ComputeRootAndReachedFunctions()

void CallGraphManager::ComputeRootAndReachedFunctions ( )
private

Compute the root and reached functions, maintaining the internal data structures coherent.

Definition at line 569 of file call_graph_manager.cpp.

References allow_recursive_functions, call_graph, GetVertex(), IsVertex(), reached_body_functions, reached_library_functions, and root_functions.

Referenced by AddCallPoint(), AddFunction(), and RemoveCallPoint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ExistsAddressedFunction()

bool CallGraphManager::ExistsAddressedFunction ( ) const

Returns true is there is at least a reachable function that is called through a function pointer or its address is taken.

Definition at line 501 of file call_graph_manager.cpp.

References addressed_functions, and reached_body_functions.

◆ expandCallGraphFromFunction()

void CallGraphManager::expandCallGraphFromFunction ( CustomUnorderedSet< unsigned int > &  AV,
const application_managerRef  AM,
unsigned int  f_id,
int  DL 
)
static

◆ get_called_by() [1/2]

CustomSet< unsigned int > CallGraphManager::get_called_by ( unsigned int  index) const

Returns the set of functions called by a function.

Parameters
indexis the index of the caller function

Definition at line 554 of file call_graph_manager.cpp.

References called_by.

◆ get_called_by() [2/2]

CustomSet< unsigned int > CallGraphManager::get_called_by ( const OpGraphConstRef  cfg,
const vertex caller 
) const

Returns the set of functions called by an operation vertex.

Parameters
cfgis the pointer to the graph which the operation belongs to
calleris the caller vertex

Definition at line 564 of file call_graph_manager.cpp.

References OpGraph::CGetOpNodeInfo().

Here is the call graph for this function:

◆ get_function()

unsigned int CallGraphManager::get_function ( vertex  node) const

Given a vertex of the call graph, this returns the index of the corresponding function.

Parameters
nodeis the vertex of the function
Returns
the index of the function

Definition at line 549 of file call_graph_manager.cpp.

References call_graph.

Referenced by CalledFunctionsVisitor::back_edge().

Here is the caller graph for this function:

◆ GetAddressedFunctions()

CustomSet< unsigned int > CallGraphManager::GetAddressedFunctions ( ) const

Returns a set containing all the reachable addressed_functions.

Definition at line 513 of file call_graph_manager.cpp.

References addressed_functions, and reached_body_functions.

◆ GetReachedBodyFunctions()

const CustomOrderedSet< unsigned int > & CallGraphManager::GetReachedBodyFunctions ( ) const

Returns the source code functions called by the root functions.

Returns
the set of top function

Definition at line 606 of file call_graph_manager.cpp.

References reached_body_functions.

◆ GetReachedFunctionsFrom()

CustomOrderedSet< unsigned int > CallGraphManager::GetReachedFunctionsFrom ( unsigned int  from_f,
bool  with_body = true 
) const

compute the list of reached function starting from a given function

Parameters
from_fis the starting function
with_bodyconsider only functions with body IR
Returns
the set of top function

Definition at line 611 of file call_graph_manager.cpp.

References allow_recursive_functions, call_graph, GetVertex(), and root_functions.

Here is the call graph for this function:

◆ GetReachedLibraryFunctions()

CustomOrderedSet< unsigned int > CallGraphManager::GetReachedLibraryFunctions ( ) const

Returns the library functions called by the root functions.

Returns
the set of library function (without implementation)

Definition at line 669 of file call_graph_manager.cpp.

References reached_library_functions.

◆ GetRootFunction()

unsigned int CallGraphManager::GetRootFunction ( unsigned int  fid) const

Get the parent root function.

Parameters
fidFunction id
Returns
unsigned int Parent root function id

Definition at line 632 of file call_graph_manager.cpp.

References allow_recursive_functions, call_graph, GetVertex(), root_functions, and THROW_ASSERT.

Here is the call graph for this function:

◆ GetRootFunctions()

CustomSet< unsigned int > CallGraphManager::GetRootFunctions ( ) const

Returns the root functions (i.e., the functions that are not called by any other ones.

Returns
the set of top function

Definition at line 599 of file call_graph_manager.cpp.

References call_graph, root_functions, and THROW_ASSERT.

◆ GetVertex()

vertex CallGraphManager::GetVertex ( const unsigned int  index) const

Return the vertex given the function id.

Parameters
indexis the function index
Returns
the corresponding vertex in the call graph

Definition at line 537 of file call_graph_manager.cpp.

References functionID_vertex_map, STR, and THROW_ASSERT.

Referenced by AddCallPoint(), ComputeRootAndReachedFunctions(), GetReachedFunctionsFrom(), GetRootFunction(), IsCallPoint(), and RemoveCallPoint().

Here is the caller graph for this function:

◆ IsCallPoint()

bool CallGraphManager::IsCallPoint ( unsigned int  caller_id,
unsigned int  called_id,
unsigned int  call_id,
enum FunctionEdgeInfo::CallType  call_type 
) const
private

Returns true if the call point is present.

Parameters
caller_idis the function id of the caller
called_idis the function id of the called function
call_idis the tree node index of the call statement
call_typeis the type of call

Definition at line 269 of file call_graph_manager.cpp.

References FunctionEdgeInfo::call_any, call_graph, called_by, CGetCallGraph(), tree_manager::CGetTreeNode(), debug_level, DEBUG_LEVEL_VERY_PEDANTIC, FunctionEdgeInfo::direct_call, FunctionEdgeInfo::function_address, GetVertex(), INDENT_DBG_MEX, FunctionEdgeInfo::indirect_call, IsVertex(), tree_helper::print_function_name(), STR, THROW_ASSERT, and THROW_UNREACHABLE.

Referenced by AddCallPoint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ IsVertex()

bool CallGraphManager::IsVertex ( unsigned int  functionID) const

return true in case the vertex has been already created

Parameters
functionIDis the function identifier

Definition at line 544 of file call_graph_manager.cpp.

References functionID_vertex_map.

Referenced by AddCallPoint(), AddFunction(), AddFunctionAndCallPoint(), ComputeRootAndReachedFunctions(), and IsCallPoint().

Here is the caller graph for this function:

◆ RemoveCallPoint() [1/2]

void CallGraphManager::RemoveCallPoint ( const unsigned int  caller_id,
const unsigned int  called_id,
const unsigned int  call_id 
)

Remove a function call, like RemoveCallPoint with a different API.

Parameters
caller_idis the index of the calling function
called_idis the index of the called function
call_idis the index of the statement containing the call

Definition at line 446 of file call_graph_manager.cpp.

References BUILTIN_WAIT_CALL, CGetCallGraph(), tree_manager::CGetTreeNode(), GetVertex(), tree_helper::print_function_name(), STR, and THROW_ASSERT.

Referenced by ReplaceCallPoint().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ RemoveCallPoint() [2/2]

void CallGraphManager::RemoveCallPoint ( EdgeDescriptor  e,
const unsigned int  callid 
)

Removes a call point.

  • The edge is completely removed if necessary
    Parameters
    eis the edge in the call graph
    call_idis the call graph point to remove

Definition at line 361 of file call_graph_manager.cpp.

References addressed_functions, BUILTIN_WAIT_CALL, call_graph, call_graphs_collection, called_by, tree_manager::CGetTreeNode(), ComputeRootAndReachedFunctions(), debug_level, DEBUG_LEVEL_VERY_PEDANTIC, INDENT_DBG_MEX, tree_helper::print_function_name(), STR, lenet_tvm::target, and THROW_ASSERT.

Here is the call graph for this function:

◆ ReplaceCallPoint()

void CallGraphManager::ReplaceCallPoint ( const EdgeDescriptor  e,
const unsigned int  orig,
const unsigned int  repl 
)

Replaces a call point.

Parameters
eis the edge in the call graph
old_call_idis the old call tree node id
new_call_idis the new call tree node id

Definition at line 470 of file call_graph_manager.cpp.

References AddCallPoint(), call_graph, FunctionEdgeInfo::direct_call, FunctionEdgeInfo::function_address, FunctionEdgeInfo::indirect_call, RemoveCallPoint(), lenet_tvm::target, and THROW_ASSERT.

Here is the call graph for this function:

◆ SetRootFunctions()

void CallGraphManager::SetRootFunctions ( const CustomSet< unsigned int > &  root_functions)

Set the root functions.

Parameters
root_functionsSet of root function ids

Definition at line 594 of file call_graph_manager.cpp.

References root_functions.

Friends And Related Function Documentation

◆ call_graph_computation

friend class call_graph_computation
friend

Definition at line 74 of file call_graph_manager.hpp.

Field Documentation

◆ addressed_functions

CustomSet<unsigned int> CallGraphManager::addressed_functions
private

set of functions whose address is taken

Definition at line 103 of file call_graph_manager.hpp.

Referenced by AddCallPoint(), ExistsAddressedFunction(), GetAddressedFunctions(), and RemoveCallPoint().

◆ allow_recursive_functions

const bool CallGraphManager::allow_recursive_functions
private

True if recursive calls are allowed.

Definition at line 91 of file call_graph_manager.hpp.

Referenced by ComputeRootAndReachedFunctions(), GetReachedFunctionsFrom(), and GetRootFunction().

◆ call_graph

const CallGraphRef CallGraphManager::call_graph
private

◆ call_graphs_collection

const CallGraphsCollectionRef CallGraphManager::call_graphs_collection
private

◆ called_by

std::map<unsigned int, CustomSet<unsigned int> > CallGraphManager::called_by
private

put into relation function F_i and the list of functions called by F_i

Definition at line 85 of file call_graph_manager.hpp.

Referenced by AddCallPoint(), AddFunction(), get_called_by(), IsCallPoint(), and RemoveCallPoint().

◆ debug_level

const int CallGraphManager::debug_level
private

the debug level

Definition at line 109 of file call_graph_manager.hpp.

Referenced by AddCallPoint(), AddFunction(), IsCallPoint(), and RemoveCallPoint().

◆ function_expander

const FunctionExpanderConstRef CallGraphManager::function_expander

Functor used to check if the analysis should consider the body of a function.

Definition at line 149 of file call_graph_manager.hpp.

◆ functionID_vertex_map

std::map<unsigned int, vertex> CallGraphManager::functionID_vertex_map
private

put into relation function F_i and the vertex in the call graph representing it

Definition at line 88 of file call_graph_manager.hpp.

Referenced by AddFunction(), GetVertex(), and IsVertex().

◆ Param

const ParameterConstRef CallGraphManager::Param
private

set of input parameters

Definition at line 106 of file call_graph_manager.hpp.

◆ reached_body_functions

CustomSet<unsigned int> CallGraphManager::reached_body_functions
private

source code functions directly or indirectly called by the root functions

Definition at line 97 of file call_graph_manager.hpp.

Referenced by ComputeRootAndReachedFunctions(), ExistsAddressedFunction(), GetAddressedFunctions(), and GetReachedBodyFunctions().

◆ reached_library_functions

CustomSet<unsigned int> CallGraphManager::reached_library_functions
private

library functions directly or indirectly called by the root functions

Definition at line 100 of file call_graph_manager.hpp.

Referenced by ComputeRootAndReachedFunctions(), and GetReachedLibraryFunctions().

◆ root_functions

CustomSet<unsigned int> CallGraphManager::root_functions
private

◆ tree_manager

const tree_managerConstRef CallGraphManager::tree_manager
private

The tree manager.

Definition at line 82 of file call_graph_manager.hpp.


The documentation for this class was generated from the following files:

Generated on Mon Feb 12 2024 13:03:46 for PandA-2024.02 by doxygen 1.8.13