Commit | Line | Data |
---|---|---|
451db126 CP |
1 | /* |
2 | * call-path.h: Manipulate a tree data structure containing function call paths | |
3 | * Copyright (c) 2014, Intel Corporation. | |
4 | * | |
5 | * This program is free software; you can redistribute it and/or modify it | |
6 | * under the terms and conditions of the GNU General Public License, | |
7 | * version 2, as published by the Free Software Foundation. | |
8 | * | |
9 | * This program is distributed in the hope it will be useful, but WITHOUT | |
10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
12 | * more details. | |
13 | * | |
14 | */ | |
15 | ||
16 | #ifndef __PERF_CALL_PATH_H | |
17 | #define __PERF_CALL_PATH_H | |
18 | ||
19 | #include <sys/types.h> | |
20 | ||
21 | #include <linux/types.h> | |
22 | #include <linux/rbtree.h> | |
23 | ||
24 | /** | |
25 | * struct call_path - node in list of calls leading to a function call. | |
26 | * @parent: call path to the parent function call | |
27 | * @sym: symbol of function called | |
28 | * @ip: only if sym is null, the ip of the function | |
29 | * @db_id: id used for db-export | |
30 | * @in_kernel: whether function is a in the kernel | |
31 | * @rb_node: node in parent's tree of called functions | |
32 | * @children: tree of call paths of functions called | |
33 | * | |
34 | * In combination with the call_return structure, the call_path structure | |
35 | * defines a context-sensitve call-graph. | |
36 | */ | |
37 | struct call_path { | |
38 | struct call_path *parent; | |
39 | struct symbol *sym; | |
40 | u64 ip; | |
41 | u64 db_id; | |
42 | bool in_kernel; | |
43 | struct rb_node rb_node; | |
44 | struct rb_root children; | |
45 | }; | |
46 | ||
47 | #define CALL_PATH_BLOCK_SHIFT 8 | |
48 | #define CALL_PATH_BLOCK_SIZE (1 << CALL_PATH_BLOCK_SHIFT) | |
49 | #define CALL_PATH_BLOCK_MASK (CALL_PATH_BLOCK_SIZE - 1) | |
50 | ||
51 | struct call_path_block { | |
52 | struct call_path cp[CALL_PATH_BLOCK_SIZE]; | |
53 | struct list_head node; | |
54 | }; | |
55 | ||
56 | /** | |
57 | * struct call_path_root - root of all call paths. | |
58 | * @call_path: root call path | |
59 | * @blocks: list of blocks to store call paths | |
60 | * @next: next free space | |
61 | * @sz: number of spaces | |
62 | */ | |
63 | struct call_path_root { | |
64 | struct call_path call_path; | |
65 | struct list_head blocks; | |
66 | size_t next; | |
67 | size_t sz; | |
68 | }; | |
69 | ||
70 | struct call_path_root *call_path_root__new(void); | |
71 | void call_path_root__free(struct call_path_root *cpr); | |
72 | ||
73 | struct call_path *call_path__findnew(struct call_path_root *cpr, | |
74 | struct call_path *parent, | |
75 | struct symbol *sym, u64 ip, u64 ks); | |
76 | ||
77 | #endif |