Interprocedural analysis (IPA)

GCC builds a “call graph”, recording which functions call which other functions, and it uses this for various optimizations.

It is constructed by the “*build_cgraph_edges” pass.

In case it’s of interest, it is available via the following Python API:

gcc.get_callgraph_nodes()

Get a list of all gcc.CallgraphNode instances

gccutils.callgraph_to_dot()

Return the GraphViz source for a rendering of the current callgraph, as a string.

Here’s an example of such a rendering:

image of a call graph
class gcc.CallgraphNode
decl

The gcc.FunctionDecl for this node within the callgraph

callees

The function calls made by this function, as a list of gcc.CallgraphEdge instances

callers

The places that call this function, as a list of gcc.CallgraphEdge instances

Internally, this wraps a struct cgraph_node *

class gcc.CallgraphEdge
caller

The function that makes this call, as a gcc.CallgraphNode

callee

The function that is called here, as a gcc.CallgraphNode

call_stmt

The gcc.GimpleCall statememt for the function call

Internally, this wraps a struct cgraph_edge *