3 from __future__ import print_function
4 from pycparser import c_parser, c_ast, parse_file
7 ignore_callee = set(['mutex_acquire', 'mutex_release'])
8 ignore_caller = set(['caller_reinstates_queue_predicate'])
10 'prvCopyDataFromQueue',
12 'prvInitialiseNewQueue',
17 'uxQueueMessagesWaiting',
18 'uxQueueSpacesAvailable',
20 'xQueueGenericCreate',
23 'xQueueGenericSendFromISR',
24 'xQueueIsQueueEmptyFromISR',
25 'xQueueIsQueueFullFromISR',
29 'xQueueReceiveFromISR',
35 'setInterruptMaskFromISR',
36 'clearInterruptMaskFromISR',
44 class FuncCallVisitor(c_ast.NodeVisitor):
45 def __init__(self, caller):
48 def visit_FuncCall(self, node):
49 callee = node.name.name
50 if callee not in ignore_callee:
51 CALLMAP.add((node.name.name, self.caller))
54 class FuncDefVisitor(c_ast.NodeVisitor):
55 def visit_FuncDef(self, node):
56 caller = node.decl.name
57 if caller in ignore_caller:
59 if caller.startswith('wrapper_'):
61 v = FuncCallVisitor(caller)
65 def show_func_calls(filename):
66 ast = parse_file(filename, use_cpp=False)
71 if __name__ == "__main__":
73 show_func_calls(filename)
76 print(' node [style = filled, colorscheme = set13;];')
78 print(' %s [fillcolor = 3];' % f)
80 print(' %s [fillcolor = 2];' % f)
81 for (callee, caller) in CALLMAP:
82 print(' %s -> %s;' % (callee, caller))