]> begriffs open source - cmsis-freertos/blob - Test/VeriFast/scripts/callgraph.py
Updated pack to FreeRTOS 10.4.4
[cmsis-freertos] / Test / VeriFast / scripts / callgraph.py
1 #!/usr/bin/env python3
2
3 from __future__ import print_function
4 from pycparser import c_parser, c_ast, parse_file
5 import sys
6
7 ignore_callee = set(['mutex_acquire', 'mutex_release'])
8 ignore_caller = set(['caller_reinstates_queue_predicate'])
9 proven = [
10     'prvCopyDataFromQueue',
11     'prvCopyDataToQueue',
12     'prvInitialiseNewQueue',
13     'prvIsQueueEmpty',
14     'prvIsQueueFull',
15     'prvLockQueue',
16     'prvUnlockQueue',
17     'uxQueueMessagesWaiting',
18     'uxQueueSpacesAvailable',
19     'vQueueDelete',
20     'xQueueGenericCreate',
21     'xQueueGenericReset',
22     'xQueueGenericSend',
23     'xQueueGenericSendFromISR',
24     'xQueueIsQueueEmptyFromISR',
25     'xQueueIsQueueFullFromISR',
26     'xQueuePeek',
27     'xQueuePeekFromISR',
28     'xQueueReceive',
29     'xQueueReceiveFromISR',
30 ]
31
32 modeled = [
33     'setInterruptMask',
34     'clearInterruptMask',
35     'setInterruptMaskFromISR',
36     'clearInterruptMaskFromISR',
37     'vTaskSuspendAll',
38     'xTaskResumeAll',
39 ]
40
41 CALLMAP = set()
42
43
44 class FuncCallVisitor(c_ast.NodeVisitor):
45     def __init__(self, caller):
46         self.caller = caller
47
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))
52
53
54 class FuncDefVisitor(c_ast.NodeVisitor):
55     def visit_FuncDef(self, node):
56         caller = node.decl.name
57         if caller in ignore_caller:
58             return
59         if caller.startswith('wrapper_'):
60             caller = caller[8:]
61         v = FuncCallVisitor(caller)
62         v.visit(node)
63
64
65 def show_func_calls(filename):
66     ast = parse_file(filename, use_cpp=False)
67     v = FuncDefVisitor()
68     v.visit(ast)
69
70
71 if __name__ == "__main__":
72     filename = 'out.pp'
73     show_func_calls(filename)
74     print('digraph G {')
75     print('  rankdir=LR;')
76     print('  node [style = filled, colorscheme = set13;];')
77     for f in proven:
78         print('  %s [fillcolor = 3];' % f)
79     for f in modeled:
80         print('  %s [fillcolor = 2];' % f)
81     for (callee, caller) in CALLMAP:
82         print('  %s -> %s;' % (callee, caller))
83     print('}')