| 87 | # Try to arrange output so that functions that call each other are |
| 88 | # near each other. |
| 89 | def orderfuncs(funcaddrs, availfuncs): |
| 90 | l = [(availfuncs[funcaddr].total_calls |
| 91 | , availfuncs[funcaddr].funcname, funcaddr) |
| 92 | for funcaddr in funcaddrs if funcaddr in availfuncs] |
| 93 | l.sort() |
| 94 | l.reverse() |
| 95 | out = [] |
| 96 | while l: |
| 97 | count, name, funcaddr = l.pop(0) |
| 98 | info = availfuncs.get(funcaddr) |
| 99 | if info is None: |
| 100 | continue |
| 101 | calladdrs = [calls[1] for calls in info.called_funcs] |
| 102 | del availfuncs[funcaddr] |
| 103 | out = out + orderfuncs(calladdrs, availfuncs) + [info] |
| 104 | return out |
| 105 | |
| 106 | hex_s = r'[0-9a-f]+' |
| 107 | re_func = re.compile(r'^(?P<funcaddr>' + hex_s + r') <(?P<func>.*)>:$') |